在实际生产环境中一个应用往往由许多服务构成而 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文件[rootAnolis2 compose]# cat docker-compose.yamlversion: 1.0services:httpd:restart: alwaysimage: nginxcontainer_name: my-nginxports:- 8888:80environment:TZ: Asia/Shanghaivolumes:- /webroot:/var/www/html2、启动删除启动[rootAnolis2 compose]# docker-compose up -dWARN[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删除[rootAnolis2 compose]# docker-compose downWARN[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查看[rootAnolis2 compose]# docker-compose ps-f动态查看日志[rootAnolis2 compose]# docker-compose logs -f关键字image指定为镜像名称或者镜像ID,如果本地不存在则自动拉取image: httpdimage: a2b2c3d4ports暴露的端口(推荐字符串形式)ports:- 3000- 80:80- 127.0.0.1:80:80sysctls配置容器内核参数sysctls:net.core.somaxconn: 1024net.ipv4.tcp_syncookies: 0sysctls:- net.core.somaxconn1024- net.ipv4.tcp_syncookies0volumes数据卷所挂载的路径设置,可以设置为宿主机路径,并可以设置访问模式(HOST:CONTAINER:ro)volumes: 绝对路径映射- /var/www/html- /webroot:/var/www/html- ~/webroot:/var/www/html:ronetworks定义网桥配置容器连接的网络environment:MYSQL_ROOT_PASSWORD: 123456command: 覆盖镜像默认命令docker run --name redis -d redis redis-server --appendonly yesulimits:指定容器的ulimits限制的值如: 进程最大数: 65535 soft软限制 应用可以修改 硬限不能超过depends_on:解决容器的依赖,启动顺序的问题healthcheck:检查命令,检查容器是否健康运行build:配合Dockerfile使用查看网桥[rootAnolis2 compose]# docker network lsNETWORK ID NAME DRIVER SCOPE4cf9a5498e7e bridge bridge local048a56fdbe2b compose_default bridge local14c5ca7b6bf7 docker_gwbridge bridge localf514dce8f745 host host localvx087gslj0a0 ingress overlay swarm76ff95406838 my-bridge-141 bridge localfece4dc44e5b my-net bridge localca515278a1e2 none null local示例redis: image: redis:5.0.10 container_name: redis ports: - 6379:6379 volumes: - redisdata:/data command: redis-server --appendonly yesulimits: nproc: 65535 nofile: soft: 20000 hard: 40000services: httpd: image: httpd container_name: apache depends_on: - db #服务名 - redis redis: image: redis db: image: mysqlhealthcheck: test: [CMD, curl, -f, http://localhost] interval: 30s timeout: 10sversion: 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