前言
接《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)。
配置文件说明
- 确认 docker 与 docker-compose的版本 https://docs.docker.com/compose/compose-file/compose-file-v3/ ,在此网址可查看到。
- 创建目录和数据卷
$ docker network create -d bridge web_net
$ docker volume create logs_data
$ docker volume create conf_data
- 在项目目录内创建 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 创建出来
- 用 up 指令启动
# 前台启动所有服务
$ docker-compose up
- 测试查看
$ curl http://127.0.0.1:8088