简介
什么是Docker Compose
Docker Compose是针对容器的编排工具,是针对容器生命周期的管理。
Docker Compose对容器的声明周期进行更快速更方便的管理方式。
Docker Compose是单机环境下的容器编排。
为什么要使用Docker Compose
- 依赖管理:
- 当一个容器必须依赖另一个容器运行完成后才能运行时,就需要进行依赖管理。
- 副本控制:
- 容器有时候需要集群,可以使用Docker Compose对容器集群进行快速的弹性伸缩。
- 配置共享:
- 通过配置文件统一描述需要运行的服务相关信息,自动化的解析配置内容并构建对应服务。
相关网站
docker-compose下载:https://github.com/docker/compose/releases
docker-compose文档:https://docs.docker.com/reference/cli/docker/compose/
docker-compose文档:https://docs.docker.com/compose/compose-file/05-services/
docker-compos与docker版本对照:
安装
下载docker-compose
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
赋权docker-compos
chmod +x /usr/local/bin/docker-compose
补全docker-compos
curl -L https://raw.githubusercontent.com/docker/compose/1.1.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
#关闭xshell再登录即可实现命令补全
命令
常用指令
version
version指定 Compose 文件的版本。
version: '3'
services
services定义了 Docker 服务的配置。
services:
nginx-web:
redis-db:
mysql-db:
image
image: 指定 Docker 镜像。如果镜像在本地不存在,Compose 会尝试拉取它。
image: redis
ports
ports: 将容器的端口映射到主机的端口。
ports:
- "3000"
- "3000-3005"
- "8000:8000" #固定使用某个
volumes
volumes: 将宿主机的路径或命名卷挂载到容器中。
volumes:
- /var/lib/mysql
- cache:/tmp/cache
build
build: 指定 Dockerfile 文件所在的路径(相对路径或绝对路径)以及构建时使用的参数。如果你需要从源代码构建镜像,而不是使用现成的镜像,这个参数就非常有用。
build:
context: .
dockerfile: Dockerfile-alternate
args:
buildno: 1
command
command: 覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
container_name
container_name: 指定容器的名称。如果没有指定,则 Compose 会自动生成一个名称。
container_name: my-web-container
depends_on
depends_on: 解决容器的启动顺序问题。它告诉 Compose 服务应按照依赖顺序启动。
depends_on:
- db
- redis
environment
environment: 设置环境变量。它可以是一个数组或一个字典。
environment:
- RACK_ENV=development
- SHOW=true
networks
networks: 将服务连接到指定网络。
networks:
- frontend
restart
restart: 配置容器的重启策略。
networks:
- frontend
healthcheck
healthcheck: 配置容器的健康检查。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
labels
labels: 向容器添加元数据标签。
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
logging
logging: 配置日志驱动。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
dns
dns: 自定义 DNS 服务器。可以是一个字符串,也可以是一个列表。
dns: 8.8.8.8
或
dns:
- 8.8.8.8
- 8.8.4.4
dns_search
dns_search: 配置 DNS 搜索域。可以是一个字符串,也可以是一个列表。
dns_search: example.com
或
dns_search:
- dc1.example.com
- dc2.example.com
entrypoint
entrypoint: 覆盖容器默认的 ENTRYPOINT。
entrypoint: /code/entrypoint.sh
env_file
env_file: 从文件中引入环境变量。可以是一个文件路径,也可以是一个列表。
env_file: .env
或
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
expose
expose: 暴露端口,但不将它们映射到宿主机,只是允许它们被连接的服务访问。
expose:
- "3000"
extra_hosts
extra_hosts: 添加主机名映射。类似于 hosts 文件。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
working_dir
working_dir: 设置容器的工作目录。
working_dir: /code
ulimits
ulimits: 设置容器的 ulimit 限制。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
命令集合
docker-compose --help
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file
(default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name
(default: directory name)
--verbose Show more output
--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
--no-ansi Do not print ANSI control characters
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the
name specified in the client certificate
--project-directory PATH Specify an alternate working directory
(default: the path of the Compose file)
--compatibility If set, Compose will attempt to convert deploy
keys in v3 files to their non-Swarm equivalent
Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
docker-compose up
- docker-compose up
- 用途:启动或重新启动服务。
- 语法:docker-compose up [options] [SERVICE…]
- 示例:docker-compose up 或 docker-compose up web
- docker-compose up --scale
- 用途:启动或重新启动服务,并设置服务容器的数量。
- 语法:docker-compose up --scale SERVICE=NUM
- 示例:docker-compose up --scale web=2
docker-compose down
- 用途:停止并移除所有由 Compose 管理的容器。
- 语法:docker-compose down [options]
- 示例:docker-compose down
docker-compose stop
- docker-compose stop
- 用途:停止所有正在运行的服务容器。
- 语法:docker-compose stop [options] [SERVICE…]
- 示例:docker-compose stop 或 docker-compose stop web
- docker-compose stop --all:
- 用途:停止所有正在运行的服务容器。
- 语法:docker-compose stop --all
- 示例:docker-compose stop --all
docker-compose start
- 用途:启动所有已经停止的服务容器。
- 语法:docker-compose start [options] [SERVICE…]
- 示例:docker-compose start 或 docker-compose start web
docker-compose restart
- 用途:重启所有服务容器。
- 语法:docker-compose restart [options] [SERVICE…]
- 示例:docker-compose restart 或 docker-compose restart web
docker-compose create
- 用途:创建服务的容器
- 语法:docker-compose create [options] [SERVICE…]
- 示例:docker-compose create web
docker-compose exec
- 用途:在服务容器内部执行命令。
- 语法:docker-compose exec [options] [SERVICE] [COMMAND]
- 示例:docker-compose exec web bash 或 docker-compose create
docker-compose run
- 用途:创建一个一次性容器,并执行命令。
- 语法:docker-compose run [options] [SERVICE] [COMMAND]
- 示例:docker-compose run web bash
docker-compose build
- 用途:重新构建服务容器。
- 语法:docker-compose build [options] [SERVICE…]
- 示例:docker-compose build 或 docker-compose build web
docker-compose pull
- 用途:拉取服务镜像到本地。
- 语法:docker-compose pull [options] [SERVICE…]
- 示例:docker-compose pull 或 docker-compose pull web
docker-compose ps
- 用途:列出所有服务及其当前状态。
- 语法:docker-compose ps [options] [SERVICE…]
- 示例:docker-compose ps 或 docker-compose ps web
docker-compose config
- 用途:验证 docker-compose.yml 文件。
- 语法:docker-compose config [options]
- 示例:docker-compose config
docker-compose logs
- 用途:显示服务容器的日志。
- 语法:docker-compose logs [options] [SERVICE…]
- 示例:docker-compose logs web
docker-compose kill
- 用途:杀死所有服务容器。
- 语法:docker-compose kill [options] [SERVICE…]
- 示例:docker-compose kill 或 docker-compose kill web
docker-compose scale
- 用途:设置服务容器的数量。
- 语法:docker-compose scale [options] SERVICE=NUM
- 示例:docker-compose scale web=2
docker-compose version
- 用途:显示 Docker Compose 的版本信息。
- 语法:docker-compose version
- 示例:docker-compose version
应用
应用举例
使用思路
- 三大核心:服务(Service)、网络(Network)、数据卷(Volume);
- 编排任务:服务、镜像、变量、网络、副本、数据卷
- 启动容器:构建容器
编辑文件
version: "3"
services:
nginx:
image: "nginx:1.22.0"
#container_name: "nginx-web"
restart: "always"
depends_on:
- redis
- mysql
networks:
- LNMP
volumes:
- /data/nginx/data:/usr/share/nginx/html
- /data/nginx/logs:/var/log/nginx
ports:
- 80
redis:
image: "redis:3.2.0"
#container_name: "redis-db"
restart: "always"
networks:
- LNMP
volumes:
- /data/mysql/data:/var/lib/mysql
- /data/mysql/conf:/etc/mysql/
- /data/mysql/logs:/var/log/mysql
mysql:
image: "mysql:5.7.31"
#container_name: "mysql-db"
restart: "always"
networks:
- LNMP
volumes:
- /data/mysql/data:/var/lib/mysql
- /data/mysql/mysql-files:/var/lib/mysql-files
- /data/mysql/logs:/var/log/mysql
- /data/mysql/conf:/etc/mysql
environment:
- MYSQL_ROOT_PASSWORD='1qaz!QAZ'
- MYSQL_DATABASE='practice_db'
- MYSQL_USER='Practice'
- MYSQL_PASSWORD='Pra@db_123'
networks:
LNMP:
driver: bridge
ipam:
driver: default
config:
- subnet: 170.20.21.0/24
- version: 指定了 Docker Compose 文件的版本,这是必须的。
- services: 定义了三个服务:web、db 和 redis。
- web:
- build: 指定了构建 web 服务的 Dockerfile 的路径和上下文,以及构建时的参数。
- image: 指定了 web 服务的镜像名称。
- command: 覆盖了容器的默认启动命令。
- container_name: 为容器指定了明确的名称。
- depends_on: 指定了 web 服务依赖于 db 服务。
- environment: 设置了 web 服务的环境变量。
- ports: 将容器的 3000 端口映射到宿主机的 3000 端口。
- volumes: 将宿主机的 web 目录挂载到容器的 /app 目录。
- networks: 将 web 服务连接到 frontend 网络。
- restart: 指定了重启策略。
- healthcheck: 配置了健康检查。
- labels: 为容器添加了元数据标签。
- db:
- 使用了 PostgreSQL 镜像,并设置了数据库的用户和密码。
- container_name: 为数据库容器指定了名称。
- volumes: 将数据库数据持久化到名为 db-data 的卷中。
- networks: 将数据库服务连接到 backend 网络。
- healthcheck: 配置了健康检查。
- redis:
- 使用了 Redis 镜像,并将 Redis 端口映射到宿主机。
- container_name: 为 Redis 容器指定了名称。
- networks: 将 Redis 服务连接到 backend 网络。
- restart: 指定了重启策略。
- networks: 定义了两个网络:frontend 和 backend,供服务连接使用。
- volumes: 定义了一个名为 db-data 的卷,用于数据库数据持久化。
运行服务
- 验证yml文件
cd /data/docker-compose-files/lrnm
docker-compose config
- 拉取镜像
#拉取docker-compose.yml中的所有镜像
docker-compose pull
#docker-compose.yml中包含的某个镜像
docker-compose pull nginx
- 创建服务
#创建docker-compose.yml中的所有服务
docker-compose create
#指定创建docker-compose.yml中包含的某个服务
docker-compose create mysql-db
- 查看服务
docker-compose ps
- 创建并启动服务
#启动docker-compose.yml中所有的服务
docker-compose up
#启动docker-compose.yml中包含的某个服务
docker-compose up -d mysql
- 查看容器
docker ps
- 停止服务
#启动docker-compose.yml中所有的服务
docker-compose stop
#启动docker-compose.yml中包含的某个服务
docker-compose stop redis
- 启动服务
#启动docker-compose.yml中所有的服务
docker-compose start
#启动docker-compose.yml中包含的某个服务
docker-compose start redis
- 重启服务
#重启docker-compose.yml中所有的服务
docker-compose restart
#重启docker-compose.yml中包含的某个服务
docker-compose restart redis
- 查看日志
#重启docker-compose.yml中所有的服务
docker-compose logs
#重启docker-compose.yml中包含的某个服务
docker-compose logs redis
弹性伸缩
编辑文件
version: "3"
services:
nginx:
image: "nginx:1.22.0"
#container_name: "nginx-web"
restart: "always"
depends_on:
- redis
- mysql
networks:
- LNMP
volumes:
- /data/nginx/data:/usr/share/nginx/html
- /data/nginx/logs:/var/log/nginx
ports:
- 80
redis:
image: "redis:3.2.0"
#container_name: "redis-db"
restart: "always"
networks:
- LNMP
volumes:
- /data/mysql/data:/var/lib/mysql
- /data/mysql/conf:/etc/mysql/
- /data/mysql/logs:/var/log/mysql
mysql:
image: "mysql:5.7.31"
#container_name: "mysql-db"
restart: "always"
networks:
- LNMP
volumes:
- /data/mysql/data:/var/lib/mysql
- /data/mysql/mysql-files:/var/lib/mysql-files
- /data/mysql/logs:/var/log/mysql
- /data/mysql/conf:/etc/mysql
environment:
- MYSQL_ROOT_PASSWORD='1qaz!QAZ'
- MYSQL_DATABASE='practice_db'
- MYSQL_USER='Practice'
- MYSQL_PASSWORD='Pra@db_123'
networks:
LNMP:
driver: bridge
ipam:
driver: default
config:
- subnet: 170.20.21.0/24
弹性扩容
docker-compose scale nginx=3
弹性收缩
docker-compose scale nginx=2
配置解释
#指定Compose文件的版本
version: '3.8'
#指定Docker服务的配置
services:
# 一个简单的 web 服务器服务
web:
build:
context: ./web
dockerfile: Dockerfile
args:
buildno: 1
image: webapp:latest
command: npm start
container_name: webapp-container
depends_on:
- db
environment:
- NODE_ENV=production
ports:
- "3000:3000"
volumes:
- ./web:/app
networks:
- frontend
restart: on-failure
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000"]
interval: 10s
timeout: 5s
retries: 3
labels:
- "com.example.description=Web Application"
- "com.example.department=Engineering"
# 一个数据库服务
db:
image: postgres:13
container_name: db-container
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user"]
interval: 10s
timeout: 5s
retries: 5
# 一个 Redis 缓存服务
redis:
image: redis:latest
container_name: redis-container
ports:
- "6379:6379"
networks:
- backend
restart: unless-stopped
#指定Docker网络的配置
networks:
#一个
frontend:
driver: bridge
backend:
driver: bridge
#指定Docker数据卷的配置
volumes:
db-data: