Skip to content

Docker 的总结与使用之 docker-compose(三)

Published: at 00:00

前言

《Docker 的总结与使用之 Dockerfile(二)》

说明

在一个项目中,常常需要使用多个组件或程序,比如前端、后端、数据库(例如 MySQL)、缓存(例如 Redis)等。尽管我们可以通过编写 Dockerfile 构建镜像,或者直接从镜像仓库拉取镜像,但如果对每个镜像都手动使用 docker run 命令来启动容器,将会显得相当繁琐。这时候,docker-compose 就派上了用场。使用 docker-compose,我们可以通过编写一个简洁的 docker-compose.yml 配置文件来统一编排和部署多个镜像,然后通过简单的命令就能启动它们。

使用

常用指令

指令说明
up启动所有服务,默认前台启动,-d 后台启动
down关闭所有服务
start启动指定服务
restart重启指定服务
stop关闭指定服务
pause暂停指定服务
unpause取消暂停指定服务
exec进入指定服务容器
rm删除指定服务
top查看指定服务容器内的进程状况
logs查看指定服务的日志信息

示例

说明

此处通过一个示例来说明 docker-compose.yml 配置文件的内容,该示例是一个经典的场景:前端(Vue)+ 后端(Golang)+ 数据库(MySQL)+ 缓存(Redis)。

配置文件说明
  1. 确认 docker 与 docker-compose的版本 https://docs.docker.com/compose/compose-file/compose-file-v3/ ,在此网址可查看到。
  2. 创建目录和数据卷
$ docker network create -d bridge web_net
$ docker volume create logs_data
$ docker volume create conf_data
  1. 在项目目录内创建 docker-compose.yml 文件,内容如下:
version: "3.8"

services: # 定义服务
  vue-srv: # vue 服务对应前端程序
    build: # 使用 Dockerfile 来构建镜像
      context: ./web-vue-2/demo # 指定 Dockerfile 所在的上下文目录
      dockerfile: Dockerfile # Dockerfile 名称
    container_name: vue-app # 容器名称
    ports: # 端口映射
      - "8088:80"
    depends_on: # 依赖顺序
      - go-srv
      - mysql-srv
      - redis-srv
    healthcheck: # 健康检查
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3
  go-srv: # go 服务对应后端程序
    image: hwsdien/yhz-golang:v1.0.0
    container_name: golang-api
    restart: always
    # command: demo-app -f /www/conf/config.toml
    ports: # 端口映射
      - "8089:1323"
    volumes: # 数据卷映射
      - logs_data:/www/logs
      - conf_data:/www/conf
    depends_on: # 依赖顺序
      - mysql-srv
      - redis-srv
    sysctls: # 指定内核参数
      - net.core.somaxconn=262144
      - net.ipv4.tcp_syncookies=1
      - net.ipv4.ip_local_port_range=2000 65000
    ulimits: # 设置资源限制
      nproc: 65535
      nofile:
        soft: 20000
        hard: 40000
  mysql-srv: # MySQL 服务
    image: mysql:8.0 # 指定使用的镜像
    container_name: mysql # 指定容器名称
    restart: on-failure:3
    command: --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
    ports: # 宿主机与容器的端口映射
      - "3305:3306"
    volumes: # 数据卷的映射
      - mysql_data:/var/lib/mysql
      - mysql_conf:/etc/mysql
    environment: # 环境变量
      - MYSQL_ROOT_PASSWORD=123123
      - MYSQL_INITDB_SKIP_TZINFO="Asia/Shanghai"
    networks: # 指定使用网络
      - web_net # 需在 networks 处定义出来
  redis-srv: # Redis 服务
    image: redis:7.2.4 # 指定使用的镜像
    container_name: redis # 指定容器名称
    ports: # 端口映射
      - "6379:6379"
    volumes: # 数据卷映射
      - redis_data:/data # 需在 volumes 处定义出来
    networks: # 指定使用网络
      - web_net
  portainer-srv:
    image: portainer/portainer
    container_name: portainer
    ports:
      - "8000:8000"
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - portainer_data:/data
    networks:
      - web_net

volumes: # 定义数据卷
  logs_data: # 数据卷ID
    external: true # 使用已存在的外部数据卷,需提前用 docker volume create 创建出来
  conf_data:
    external: true # 使用已存在的外部数据卷,需提前用 docker volume create 创建出来
  mysql_data: # 由 docker-compose 创建数据卷
  mysql_conf: # 由 docker-compose 创建数据卷
  redis_data: # 由 docker-compose 创建数据卷
  portainer_data: # 由 docker-compose 创建数据卷

networks: # 定义网络
  web_net: # 网络ID,默认创建网桥类型的网络
    external: true # 使用已存在的外部网络,需提前用 docker network create 创建出来
  1. 用 up 指令启动
# 前台启动所有服务
$ docker-compose up
  1. 测试查看
$ curl http://127.0.0.1:8088