Docker基础
什么是容器
简单的来说就是包含一个完整的的运行时环境,除了应用程序本身之外,还包括这个应用所需的全部依赖、类库、二进制文件、配置文件等比如Linxu、JVM等
Why Docker
发展史
容器隔离思路
容器规范
用于描述docker容器运行时环境和配置信息的标准格式和规范
以下是容器规范中的一些重要元素和属性:
- 容器镜像:容器镜像是一个只读的文件系统,包含了容器运行所需的所有文件、库、配置等信息。Docker容器镜像遵循OCI(Open Container Initiative)标准规范,可以使用Docker CLI或其他OCI兼容工具来构建、管理和操作。
- 容器元数据:容器元数据包括容器的名称、标签、版本、作者、描述等信息,用于标识和描述容器本身。这些信息可以在容器启动时传递给Docker守护进程,并在容器运行时用于识别和管理容器。
- 容器配置:容器配置包括容器运行时环境、命令行参数、环境变量、端口映射、数据卷挂载等信息。这些信息可以通过Dockerfile或Docker CLI等工具来定义和配置,并在容器启动时传递给Docker守护进程,用于启动容器。
- 容器状态:容器状态描述了容器当前的运行状态,包括容器是否正在运行、容器的PID、容器的CPU和内存使用情况等信息。可以使用Docker CLI或其他工具来查询容器状态,并对容器进行操作和管理。
规范 |
说明 |
所属组织 |
OCI Runtime Spec |
容器运行时规范,旨在指定容器配置、执行环境、生命周期及公共操作 |
OCI |
OCI Image Spec |
镜像格式规范,主要包括镜像元数据、镜像索引(URL)、配置、文件系统层 |
OCI |
单OCI Distribution Spec元格 |
镜像分发策略 |
OCI |
RunC |
基于OCI标准的实现,与底层系统进行交互,负责容器启动、管理、将空等功能,并提供一套标准化接口 |
Docker |
ContainerD |
基于Runc实现使用 OCI规范定义的容器高级功能,比如镜像管理、容器执行等调用功能 |Docker| |
|
Docker原理
Docker是一个基于Linux容器技术的开源容器平台,可以为应用程序提供一种轻量、便携和可移植的运行环境。
Docker通过将应用程序、其依赖项和运行时环境打包到一个可移植的容器中,将应用程序从底层基础设施分离出来。
Docker容器是轻量的、可移植的,可以在不同的操作系统、云平台和物理主机上运行。
Docker容器工作原理
Docker容器是基于Linux容器技术实现的,每个Docker容器都是独立的、轻量的应用运行环境。Docker容器使用了Linux内核的命名空间(namespace)和控制组(cgroup)功能,将每个容器的文件系统、网络、进程、用户和其他系统资源隔离开来,从而实现容器间的隔离。
具体来说,Docker容器的工作原理如下:
- 创建镜像:Docker镜像是Docker容器的模板,包含了应用程序、其依赖项和运行时环境等。
- 创建容器:使用Docker镜像创建一个新的容器,每个容器都有唯一的ID和名称,容器之间相互隔离,互不影响。
- 启动容器:启动Docker容器时,Docker守护进程会创建一个新的命名空间和控制组,为容器分配一组独立的系统资源。
- 应用程序运行:将应用程序和其依赖项复制到容器中,并在容器中启动
- 容器隔离:每个Docker容器都有自己的文件系统、进程、用户和网络等隔离的命名空间和控制组,从而保证容器之间互相隔离,互不影响。
- 容器管理:Docker守护进程负责管理和监控所有的容器,用户可以使用Docker客户端来管理和操作容器,包括启动、停止、暂停、删除和查询容器等操作。
总结:
Docker是一个基于Linux容器技术的开源容器平台,可以为应用程序提供一种轻量、便携和可移植的运行环境。Docker的架构由Docker客户端、Docker守护进程和Docker镜像库三个核心组件组成。Docker容器使用了Linux内核的命名空间和控制组功能,将每个容器的文件系统、网络、进程、用户和其他系统资源隔离开来,从而实现容器间的隔离和互相隔离。
NameSpace
我们知道Linux中的PID、IPC、网络等资源是全局的,而NameSpace机制是一种资源隔离方案,在该机制下这些资源就不再是全局的了,而是属于某个特定的NameSpace,各个NameSpace下的资源互不干扰,这就使得每个NameSpace看上去就像一个独立的操作系统一样,但是只有NameSpace是不够
Cgroup
虽然有了NameSpace技术可以实现资源隔离,但进程还是可以不受控的访问系统资源,比如CPU、内存、磁盘、网络等,为了控制容器中进程对资源的访问,Docker采用control groups技术(也就是cgroup),有了cgroup就可以控制容器中进程对系统资源的消耗了,比如你可以限制某个容器使用内存的上限、可以在哪些CPU上运行等等。
Docker 三板斧
Docker架构
- Client: 提供用户交互的入口,可以使用client给docker发送各种操作API
- Docker Daemon: 用于监听Docker的API请求并管理docker镜像、容器、文件等结构,同时也是可以和其他的Docker Daemon交互的
- Registry: 仓库 ,docker hub是一个公共的仓库
- Images: 镜像,创建容器的制度模版说明,通常建立在一个镜像之上
- Container: 镜像的运行实例,你可以控制它的网络、存储
Docker的使用方法
官方在线环境: https://labs.play-with-docker.com/
安装
安装Docker Destop会直接安装docker compose
常用命令
docker images
docker ps
docker rm
docker rmi
docker logs id
docker exex id [cmd] //docker exec my-app ls
eg: docker exec -it 6527a5c8cfd4 /bin/bash
docker build -t name . //.代表当前路径
docker run --rm -p 3000:3000 simple-app //左边是宿主机,容器右边
DockerFile
FROM node:gallium-slim
WORKDIR /code-server #工作目录 后续所有的命令在该目录下执行
ADD . /code-server #将代码拷贝到工作目录
RUN npm install
EXPOSE 3000
CMD npm start
docker compose
Docker Compose是一种用于定义和运行多个容器应用程序的工具,可以使得启动多个容器变得更加容易
docker compose = docker build + docker run
可以很方便的进行多个容器的配置启动
docker-compose up --build //每次启动前构建
docker-compose.yaml
version: "3"
services:
nginx-app:
# build: 从当前路径构建镜像
build: #从哪里开始构建
context: .
dockerfile: nginx.Dockerfile
ports:
- 3111:80
node-app:
# build: 从当前路径构建镜像
build: #从哪里开始构建
context: . #文件位置
dockerfile: node.Dockerfile
ports:
- 3222:3000
# 替代了之前构建 运行的步骤
# 1.build image 2.docker run => docker-compose up --build
nginx.Dockerfile
FROM nginx:stable-alpine3.17-slim
COPY ./src/index.html /usr/share/nginx/html
EXPOSE 80
node.Dockerfile
FROM node:gallium-slim
WORKDIR /code-server
ADD . /code-server
RUN npm install
EXPOSE 3000
CMD npm run start
CMD 和RUN的区别
Docker 高级命令
docker run [option] images [command] [args]
docker run --name=demo -d nginx // -d后台运行 --name 名称
docker ps //查看运行的 -a 查看所有的
docker stop id //
docker stats id //
docker start id
docker run --restart='always' nginx //开机自启
docker update id --restart='always' //更新容器重启功能
docker exec -it id /bin/bash //进入容器 echo "dsda" > index.html
## Docker 提交改变
docker commit [option] container [repository[:tag]]
docker commit -m "tips" id new:v1
## Docker Save
docker save -o yys.tar nginx
## Docker Load 加载镜像
docker load -i yys.tar
## Docker push
docker push liuketh/yys:v2 //注意:必需是 【用户名/仓库名:tag】
## Docker 挂载
docker run -d -v 主机PATH:容器PaTH -p 主机PORT:容器PORT
docker run --name=mynginx -d --restart=always -v /html:/usr/share/nginx/html:ro
// RO 只读 容器内部不能更改。RW 读写
## Docker CP
docker cp id:/etc/nginx/nginx.conf /data
docker cp /data/nginx.conf id:/etc/nginx/nginx.conf
docker build -t yys:v1 . //.当前目录
docker tag image_name YOUR_DOCKERHUB_NAME/image_name