了解下 docker 的简单使用。
基础概念
container 是什么:container 容器是机器上与主机上所有其他进程隔离的另一个进程。
container image 是什么:当运行容器时,它使用隔离的文件系统,这个自定义文件系统是由容器镜像提供的,它必须包含运行应用程序所需的所有内容——所有依赖项、配置、脚本、二进制文件等等。
container 文件系统:每个容器还具有自己的暂存空间来创建/更新/删除文件。即使使用相同的图像,也不会在另一个容器中看到任何更改。
创建与运行
创建以及运行应用镜像
- 新建 Dockerfile 配置文件,用于创建容器镜像
- FROM 命令可以从指定一个基础镜像开始,而无需从零开始构建
- 运行 docker build 新建镜像,如 docker build -t getting-started .
- -t 用于指定一个有语义的镜像名词
- . 表示从哪里查找 Dockerfile 配置文件,这里表示当前目录
- 运行镜像 docker run -d -p 80:80 getting-started
- 其中 -d 表示 detach 模式,可以理解成后台运行
- -p 用于指定端口,这里表示主机的 80 端口映射到容器的 80 端口
- 末尾参数是指定运行哪个镜像
其他命令
- docker ps 查看运行中的所有容器
- docker stop CONTAINER_ID 用于停止容器
- docker rm CONTAINER_ID 用于移除容器,使用
-f
参数可以在为 stop 时强行移除容器 - docker image ls 查看所有镜像
- docker image history CONTAINER_ID 查看所有 layers
- docker login -u YOUR-NAME 登录 hub 平台
- docker tag IMAGE_NAME NEW_IMAGE_NAME
- docker push IMAGE_NAME 推送镜像
- docker logs -f CONTAINER_ID 查看日志信息
- docker exec CONTAINER_ID cmd 指定容器内执行一个命令,如进入 bash、sh 等
其他概念
Layer Caching
- Dockerfile 中的每个命令都会创建一个新的层,每层都包含执行命令前后的状态之间镜像的文件系统更改
- 如果 Dockerfile 和相关文件未更改,则重建(rebuild)时可以重用本地镜像缓存中的某些现有层。因此巧妙的组织相关命令,可以激活缓存机制
- 如果某层无法应用层缓存,则后续层都不能从层缓存加载
- 如果 COPY 命令的任何文件改变了,则会使后续所有层缓存失效
通过 Volumes 机制突破容器文件系统隔离机制,达到持久化数据目的。提供了将容器的特定文件系统路径连接回主机的能力。
- docker volume create VOLUME_NAME 创建 volume
- docker run 启动时,通过 -v 指定 volume,如 -v todo-db:/etc/todos,将 volume 挂载在 /etc/todos
- docker volume inspect VOLUME_NAME 审查 volume 信息
使用 bind mounts 机制
- 可以控制主机的特定挂载点,通常用于向容器提供额外的数据,在处理应用程序时,我们可以使用绑定挂载将源代码挂载到容器中,让容器看到代码更改、做出响应,并让我们立即看到更改。
- 依旧通过 -v 进行设置,参数格式改为 /path:/path
对于本地开发设置,使用绑定安装非常常见。优点是开发机不需要安装所有构建工具和环境。
Multi-Container:如果我们需要多个服务协作怎么办
- 比如我需要 MySQL,安装在一个容器里,还是单独运行呢。通常而言,每个容器只有好一件事情
- 容器之间通信 network
- docker network create NETWORK_NAME
- docker run 启动时,通过 --network 指定,--network-alias 指定一个别名,其他服务需要链接时,直接将 host 设置为别名即可,会自动进行解析对应
- 启动多个容器时,通过 --network 指定同一个即可
docker-compose
docker compose
- 帮助定义和共享多容器应用程序的工具,创建一个 YAML 文件来定义服务,只需一个命令,就可以启动或删除所有服务
- 根目录新建 docker-compose.yml 文件,通过 services 字段定义一系列服务
- docker compose up -d 启动所有服务
- docker compose logs -f 查看所有服务日志
- docker compose down 关闭所有服务
docker compose 例子
services:
app: # 随意设置服务名词,会自动成为 network alias
image: node:18-alpine # 指定基础镜像
command: sh -c "yarn install && yarn run dev" # 指定执行命令
ports:
- 3000:3000 # 指定端口映射关系
working_dir: /app
volumes: # 指定 volume 映射
- ./:/app
environment: # 指定环境变量
MYSQL_HOST: mysql
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
volumes: # 定义命名 volume
todo-mysql-data: