Better

Ethan的博客,欢迎访问交流

docker 了解

了解下 docker 的简单使用。

基础概念

container 是什么:container 容器是机器上与主机上所有其他进程隔离的另一个进程。

container image 是什么:当运行容器时,它使用隔离的文件系统,这个自定义文件系统是由容器镜像提供的,它必须包含运行应用程序所需的所有内容——所有依赖项、配置、脚本、二进制文件等等。

container 文件系统:每个容器还具有自己的暂存空间来创建/更新/删除文件。即使使用相同的图像,也不会在另一个容器中看到任何更改。

创建与运行

创建以及运行应用镜像

  1. 新建 Dockerfile 配置文件,用于创建容器镜像
    • FROM 命令可以从指定一个基础镜像开始,而无需从零开始构建
  2. 运行 docker build 新建镜像,如 docker build -t getting-started .
    • -t 用于指定一个有语义的镜像名词
    • . 表示从哪里查找 Dockerfile 配置文件,这里表示当前目录
  3. 运行镜像 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:


留言