在实际生产环境中,一个应用往往由许多服务构成,而 docker 的最佳实践是一个容器只运行一个进程,因此运行多个微服务就要运行多个容器。多个容器协同工作需要一个有效的工具来管理他们,定义这些容器如何相互关联。compose 应运而生。
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它通过一个YAML文件来配置应用程序的服务、网络和卷,然后使用一个命令即可创建并启动所有容器
下载地址: https://github.com/docker/compose/releases
在 Docker Compose 的世界里,主要有三个核心概念:
-
服务 (Services):定义应用中的各个组件。每个服务对应一个或多个容器(通常是一个容器),你可以指定它使用哪个镜像、暴露哪些端口、需要哪些环境变量等。
-
网络 (Networks) :定义容器之间如何通信。Compose 会自动为你的应用创建一个默认网络,容器之间可以通过服务名直接互相访问,这解决了手动链接容器的麻烦。
-
卷 (Volumes):用于持久化存储数据。当容器删除后,卷中的数据不会丢失,这对于数据库等服务至关重要
解决的核心痛点
-
简化操作 :将原本需要多条
docker run命令的复杂操作,简化成一条docker compose up。 -
环境一致性:通过一个配置文件固化所有容器的配置,确保开发、测试、生产环境高度一致,解决"在我电脑上明明是好的"这类问题。
-
依赖管理 :通过
depends_on配置项,可以定义服务之间的启动顺序,确保数据库等依赖服务先启动
1、创建docker-compose文件
root@Anolis2 compose\]# cat docker-compose.yaml version: '1.0' services: httpd: restart: always image: nginx container_name: my-nginx ports: - 8888:80 environment: TZ: Asia/Shanghai volumes: - /webroot:/var/www/html
启动
root@Anolis2 compose\]# docker-compose up -d WARN\[0000\] /opt/compose/docker-compose.yaml: the attribute \`version\` is obsolete, it will be ignored, please remove it to avoid potential confusion \[+\] up 2/2 ✔ Network compose_default Created 0.3s ✔ Container my-nginx Started
删除
root@Anolis2 compose\]# docker-compose down WARN\[0000\] /opt/compose/docker-compose.yaml: the attribute \`version\` is obsolete, it will be ignored, please remove it to avoid potential confusion \[+\] down 2/2 ✔ Container my-nginx Removed 0.2s ✔ Network compose_default Removed 查看 \[root@Anolis2 compose\]# docker-compose ps -f动态查看日志 \[root@Anolis2 compose\]# docker-compose logs -f
关键字:
image
指定为镜像名称或者镜像ID,如果本地不存在则自动拉取
image: httpd
image: a2b2c3d4
ports
暴露的端口(推荐字符串形式)
ports:
"3000"
"80:80"
"127.0.0.1:80:80"
sysctls
配置容器内核参数
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
net.core.somaxconn=1024
net.ipv4.tcp_syncookies=0
volumes
数据卷所挂载的路径设置,可以设置为宿主机路径,并可以设置访问模式(HOST:CONTAINER:ro)
volumes: #绝对路径映射
/var/www/html
/webroot:/var/www/html
~/webroot:/var/www/html:ro
networks
定义网桥
配置容器连接的网络
environment:
MYSQL_ROOT_PASSWORD: 123456
command: 覆盖镜像默认命令
docker run --name redis -d redis redis-server --appendonly yes
ulimits:
指定容器的ulimits限制的值
如: 进程最大数: 65535 soft软限制 应用可以修改 硬限不能超过
depends_on:
解决容器的依赖,启动顺序的问题
healthcheck:
检查命令,检查容器是否健康运行
build:
配合Dockerfile使用
查看网桥
root@Anolis2 compose\]# docker network ls NETWORK ID NAME DRIVER SCOPE 4cf9a5498e7e bridge bridge local 048a56fdbe2b compose_default bridge local 14c5ca7b6bf7 docker_gwbridge bridge local f514dce8f745 host host local vx087gslj0a0 ingress overlay swarm 76ff95406838 my-bridge-141 bridge local fece4dc44e5b my-net bridge local ca515278a1e2 none null local
redis:
image: redis:5.0.10
container_name: redis
ports:
- "6379:6379"
volumes:
- redisdata:/data
command: "redis-server --appendonly yes"
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
services:
httpd:
image: httpd
container_name: apache
depends_on:
- db #服务名
- redis
redis:
image: redis
db:
image: mysql
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost']
interval: 30s
timeout: 10s
version: '1.0'
services:
httpd:
restart: always
build: #构建自定义镜像
context: ../ #dockerfile路径
dockerfile: Dockerfile #指定dockerfile名字
container_name: myweb
ports:
- 80:80
environment:
TZ: Asia/Shanghai
volumes:
- /webroot:/var/www/html