2.1-docker compose
Create by fall on 24 Jul 2023
Recently revised in 24 Jul 2023
docker-compose
如果将配置全在命令行里书写,不容易保存,且一次只能生成一个容器,修改和查找上下文也不方便。
以 docker-compose 来运行命令,可以解决上面的问题。即,通过一个 docker-compose.yml 文件生成多个容器。
不同于命令 docker run <image>,docker compose 创建的内容,将自动处于同一个网络环境。
官方文档:
命令
运行 docker-compose.yaml
使用 docker-compose up  命令即可运行 docker-compose.yaml
-d表示在后台运行- 默认会将 
compose.yaml所在的文件夹的名称作为项目名称,将所用到的容器放置在该项目中 -f可以指定对应的运行
# 查看日志
docker compose logs
关闭 compose
docker compose down 或者直接在可视化界面删除(项目和项目下的容器)。
- 添加 
--volumes连同 volume 一起删除。 
compose 命令可以使用
-或者(空格符号) 进行连接
# 列出所有的容器,以及运行状态和所有端口
docker-compose ps
   Name               Command                 State           Ports
------------------------------------------------------------------------------
demo_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
demo_web_1     docker-entrypoint.sh /bin/ ...   Up      0.0.0.0:8080->8080/tcp
# 查看某个服务的信息
docker-compose ps [service name]
配置项
顶层配置
- services 定义各个服务的配置,可以指定每个服务的镜像、容器名称、启动命令、端口映射、环境变量等。
 - version 指定 Docker Compose 的版本号
 - volumes 定义数据卷,必须在顶层进行定义,才能在容器中进行使用。
 
| 配置项 | 描述 | 
|---|---|
| networks | 定义各个网络的配置,常见的如 bridge、host、overlay 等 | 
| volumes | 定义数据卷的配置,指定数据卷的使用方式。 | 
| build | 指定 Dockerfile 的路径或者一个 URL,用于构建镜像。 | 
| image | 指定镜像的名称或者 ID,用于拉取或者使用一个已经存在的镜像。 | 
| ports | 指定容器内部端口和主机端口之间的映射关系。 | 
| environment | 指定容器的环境变量。 | 
| depends_on | 指定容器之间的依赖关系,如谁依赖谁,启动顺序等。 | 
| command | 指定容器启动时要运行的命令。 | 
| restart | 指定容器在出现故障时应该如何重新启动。常见的配置如,always | 
| healthcheck | 定义容器的健康检查。 | 
| deploy | 指定服务在 Docker Swarm 中的部署配置。 | 
| secrets | 指定容器中使用的加密密钥和证书等。 | 
| configs | 指定容器中使用的配置文件。 | 
| working_dir | 工作路径 | 
配置对比
docker run -dp 127.0.0.1:3000:3000 \
  -w /app -v "$(pwd):/app" \
  --network todo-app \
  -e MYSQL_HOST=mysql \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=secret \
  -e MYSQL_DB=todos \
  node:18-alpine \
  sh -c "yarn install && yarn run dev"
# docker-compose.yml
services:
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 127.0.0.1:3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos
完整配置示例
version: '3'
services:
	web:
	  build: .
    networks:
    - front
  service:
    image: node:18-alpine # 镜像名称以及版本
    container_name: my-node # 生成的容器名称
    restart: always  # 重启 docker 后该容器也重启 # unless-stopped 手动停止的容器不会重启,其余情况和 always 一致
    command: sh -c "yarn install && yarn run dev" # 覆盖容器启动后默认执行的命令。
    ports:
      - 127.0.0.1:3000:3000
    working_dir: /app
    volumes:
      - ./app:/app # 将当前目录下的 app 文件夹映射到容器的 /app
      - ./.env:/app/.env:ro # 将当前目录下的 env 文件夹映射到容器的 /app,并且是只读的
    environment: # 环境变量
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos
    networks:
      - front
      - back
  mysql:
    image: mysql:8.0
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos
    networks:
      - back
# 需要在最顶层定义 volumes 并且在确定的位置进行引用
volumes:
  todo-mysql-data:
  
networks:
  front:
    driver: bridge
  back:
    driver: bridge
自动化部署
使用 docker + jenkins 能实现代码提交到 github 后自动部署环境
docker login进行登录docker login -u username指定用户名称docker push username/image-name将镜像推送到 docker hub
关联 Dockerfile
使用 build 参数可以指定Dockerfile所在文件夹的路径,可以是绝对路径,也可以是相对docker-compose.yml文件的路径
version: '3'
services:
  web:
    build: /path/to/build/dir
version: '3'
services:
  web:
    build:
      context: ./
      dockerfile: Dockerfile-alternate
      args:
        var1: 1
        var2: c
应用的使用
参考文章
| 作者 | 文章名称 | 
|---|---|
| 爱笑的架构师 | 5分钟带你快速了解Docker和k8s | 
| 佳庆 | docker-compose讲解与安装 | 
| 官方文档 | https://docs.docker.com/get-started/02_our_app/ |