- Docker-Compose 简介
- Docker Compose 的定义和目的
- Docker-Compose 用来实现 Docker 容器快速编排
- Docker-Compose 模板文件简介
- eg:
- Docker-Compose 的编排处出来的部署架构
- Docker-Compose 的编排结构
- 安装 Docker-Compose
- 验证Docker-compose是否安装成功
- 卸载docker compose:
- Docker compose使用
- 创建和编写 Docker Compose配置文件(docker-compose.yml)
- 通过 docker-compose.yml 运行服务
- YAML 模板文件语法
- Docker-Compose.yml 语法说明
- image
- build
- command
- links
- external_links
- ports
- expose
- volumes(卷)
- volunes_from
- environment(环境变量(Environment Variables))
- env_file
- extends
- net
- pid
- dns
- networks(网络)
- cap_add,cap_drop
- dns_search
- healthcheck
- depends_on
- deploy
- docker-compose.yml 实例
- YAML 文件格式 及 编写注意事项
- 在 Docker Compose 中使用多个服务之间的依赖关系
- 定义服务及其依赖关系
- 使用 depends_on 关键字
- 使用健康检查
- Docker-compose 常用命令
- docker-compose
- docker-compose up
- docker-compose ps
- docker-compose stop
- docker-compose -h
- docker-compose down
- docker-compose logs
- docker-compose build
- docker-compose pull
- docker-compose restart
- docker-compose rm
- docker-compose start
- docker-compose run
- docker-compose scale
- docker-compose pause
- docker-compose kill
- dokcer-compose config
- docker-compose create
- docker-compose exec
- docker-compose port
- docker-compose push
- docker-compose unpause
- docker-compose version
- 查看日志
- 全屏到底部结束
- 全屏滚到底部并继续持续输出日志
- 全屏滚到底部并继续持续输出日志并显示时间戳
- 全屏滚到底部显示最后 N 行并继续持续输出日志并显示时间戳
- 最佳实践和注意事项
- 使用 Docker Compose 时的最佳实践建议
- 安全性和性能方面的考虑
- 总结
Docker-Compose 简介
Docker-Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
Docker-Compose 项目由 Python 编写,调用 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。
Docker Compose 的定义和目的
- Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它基于 YAML 文件来配置应用程序所需的所有服务,并使用单个命令来创建和启动这些服务。Docker Compose 的主要目的是简化多容器 Docker 应用程序的部署和管理。
- Docker Compose 允许开发者将多个容器组合成一个项目,并在一个单独的 docker-compose.yml 文件中定义所有容器的配置。这个文件包含了每个容器的镜像、环境变量、端口映射、卷挂载等信息。通过使用 Docker Compose,开发者可以轻松地启动、停止、重启或重建整个应用程序,而无需手动逐个管理每个容器。
Docker-Compose 用来实现 Docker 容器快速编排
通过 Docker-Compose ,不需要使用 shell 脚本来启动容器,而使用 YAML 文件来配置应用程序需要的所有服务,然后使用一个命令,根据 YAML 的文件配置创建并启动所有服务。
Docker-Compose 模板文件简介
Compose 允许用户通过一个 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose 模板文件是一个定义服务、网络和卷的 YAML 文件。
Compose 模板文件默认路径是当前目录下的 docker-compose.yml,可以使用 .yml或 .yaml 作为文件扩展名。
Docker-Compose 标准模板文件应该包含 version、services、networks 三大部分,最关键的是 services 和 networks 两个部分。
eg:
version: '3.5'
services:nacos1:restart: alwaysimage: nacos/nacos-server:${NACOS_VERSION}container_name: nacos1privileged: trueports:- "8001:8001"- "8011:9555"deploy:resources:limits:cpus: '0.50'memory: 1024M env_file: - ./nacos.env environment:NACOS_SERVER_IP: ${NACOS_SERVER_IP_1}NACOS_APPLICATION_PORT: 8001NACOS_SERVERS: ${NACOS_SERVERS} volumes:- ./logs_01/:/home/nacos/logs/- ./data_01/:/home/nacos/data/- ./config/:/home/nacos/config/networks:- ha-network-overlaynacos2:restart: alwaysimage: nacos/nacos-server:${NACOS_VERSION}container_name: nacos2privileged: trueports:- "8002:8002"- "8012:9555"deploy:resources:limits:cpus: '0.50'memory: 1024M env_file: - ./nacos.env environment:NACOS_SERVER_IP: ${NACOS_SERVER_IP_2}NACOS_APPLICATION_PORT: 8002NACOS_SERVERS: ${NACOS_SERVERS}volumes:- ./logs_02/:/home/nacos/logs/- ./data_02/:/home/nacos/data/- ./config/:/home/nacos/config/networks:- ha-network-overlaynacos3:restart: alwaysimage: nacos/nacos-server:${NACOS_VERSION}container_name: nacos3privileged: trueports:- "8003:8003"- "8013:9555"deploy:resources:limits:cpus: '0.50'memory: 1024M env_file: - ./nacos.env environment:NACOS_SERVER_IP: ${NACOS_SERVER_IP_3}NACOS_APPLICATION_PORT: 8003NACOS_SERVERS: ${NACOS_SERVERS} volumes:- ./logs_03/:/home/nacos/logs/- ./data_03/:/home/nacos/data/- ./config/:/home/nacos/config/networks:- ha-network-overlay
networks:ha-network-overlay:external: true
Docker-Compose 的编排处出来的部署架构
Docker-Compose 的编排结构
Docker-Compose 将所管理的容器分为三层
- 工程(project):一个工程包含多个服务
- 服务(service):一个服务当中可包括多个容器实例
- 容器(container)
Docker Compose 的核心概念和术语主要包括工程(Project)、服务(Service)和容器(Container)。 - 工程(Project): 工程是由一组关联的应用容器组成的一个完整业务单元。在 Docker Compose 中,整个项目由一个 docker-compose.yml 文件定义,该文件包含了项目所需的所有服务及其配置信息。通过执行 docker-compose 命令,可以轻松地创建、启动、停止、重启或重建整个项目。
- 服务(Service) : 服务是 Docker Compose 中的一个核心概念,它定义了一个应用容器及其运行方式。在 docker-compose.yml 文件中,每个服务通常对应一个或多个容器的配置信息,包括镜像、环境变量、端口映射、卷挂载等。服务是 Docker Compose 进行容器编排的基本单位,通过定义不同的服务,可以实现复杂的多容器应用程序的部署和管理。
- 容器(Container): 容器是 Docker 技术的核心,也是 Docker Compose 中实际运行应用程序的实体。每个容器都是相互隔离的,包含了应用程序及其依赖项,以及运行所需的环境。在 Docker Compose 中,通过定义服务并构建相应的镜像,可以创建出容器并启动应用程序。
Docker-Compose 运行目录下的所有文件(docker-compose.yml、extends文件 或 环境变量文件等)组成一个工程,若无特殊指定 工程名即为当前目录名。
Docker Compose 的核心就是其配置文件,采用 YAML 格式,默认为docker-compose.yml
。
一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。
一个服务当中可包括多个容器实例,但是:Docker-Compose 并没有解决负载均衡的问题, 因此需要借助其它工具实现服务发现及负载均衡,比如 Consul 技术。
Docker-Compose 的工程配置文件默认为 docker-compose.yml,可通过环境变量COMPOSB_FILE
或-f
参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器为一个项目 (project)。
安装 Docker-Compose
curl -SL https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
wget https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
创建软链接,以便全局使用
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
验证Docker-compose是否安装成功
docker-compose version
Docker Compose version v2.24.6
# 安装成功,版本是 v2.24.6
卸载docker compose:
rm -f /usr/local/bin/docker-compose
Docker compose使用
创建和编写 Docker Compose配置文件(docker-compose.yml)
Docker Compose 配置文件(docker-compose.yml)是一个用于定义和管理多个Docker容器的文本文件。它使用 YAML 格式来描述应用程序的服务、网络和卷等方面的配置
version: '3.8'services:web:image: nginx:latestports:- "8080:80"volumes:- ./html:/usr/share/nginx/htmldb:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: exampleMYSQL_DATABASE: mydatabasevolumes:- db_data:/var/lib/mysqlvolumes:db_data:
- version:指定 Compose 文件的版本,这里使用的是版本 3.8。
- services:定义了应用程序的各个服务,每个服务可以包含多个配置项。
- web 和 db:服务的名称。
- image:指定了服务所使用的 Docker 镜像。
- ports:指定了服务的端口映射关系。
- volumes:指定了服务的卷挂载配置。
- volumes:定义了数据卷,这里的 db_data 是一个数据卷的名称。
通过 docker-compose.yml 运行服务
docker-compose up -d# 启动服务nginx与mysql容器
YAML 模板文件语法
默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像,也可以通过 build 指令(需要 Dockerfile)来自动构建。
其他大部分都跟 docker run 中类似。 如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等)将自动被获取,无需在 docker-compose.yml 中再次被设置。
Docker-Compose.yml 语法说明
image
指定为镜像名称或镜像 ID。
如果镜像不存在,Compose 将尝试从互联网拉取这个镜像,例如: image: ubuntu image: orchardup/postgresql image: a4bc65fd
指定服务的镜像名,若本地不存在,则 Compose 会去仓库拉取这个镜像:
services:web:image: nginx
build
指定 Dockerfile 所在文件夹的路径。Compose 将会利用他自动构建这个镜像,然后使用这个镜像。 build: ./dir
command
覆盖容器启动后默认执行的命令。 command: bundle exec thin -p 3000
links
链接到其他服务容器,使用服务名称(同时作为别名)或服务别名(SERVICE:ALIAS)都可以
links:- db- db:database- redis
注意:使用别名会自动在服务器中的 /etc/hosts 里创建,如:172.17.2.186 db,相应的环境变量也会被创建。
external_links
链接到 docker-compose.yml 外部的容器,甚至并非是 Compose 管理的容器。参数格式和 links 类似。 external_links:
- redis_1- project_db_1:mysql- project_db_2:sqlserver
ports
暴露端口信息。格式
宿主机器端口:容器端口(HOST:CONTAINER)
或者仅仅指定容器的端口(宿主机器将会随机分配端口)都可以。
ports:- "3306"- "8080:80"- "127.0.0.1:8090:8001"
注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。
expose
暴露端口,与 posts 不同的是 expose 只可以暴露端口而不能映射到主机,只供外部服务连接使用;仅可以指定内部端口为参数。
expose:- "3000"- "8000"
volumes(卷)
设置卷挂载的路径。
卷允许容器和宿主机之间共享数据,并且可以确保数据的持久性和可靠性。在 Docker Compose 中,可以通过 volumes 关键字来定义卷的挂载
可以设置宿主机路径:容器路径(host:container)或加上访问模式(host:container:ro)ro就是readonly的意思,只读模式。
volumes:- /var/lib/mysql:/var/lib/mysql- /configs/mysql:/etc/configs/:roservices:myservice:image: myimagevolumes:- /path/on/host:/path/in/container
这样,容器内的 /path/in/container 目录将会和宿主机上的 /path/on/host 目录进行数据共享。
volunes_from
挂载另一个服务或容器的所有数据卷。
volumes_from:- service_name- container_name
environment(环境变量(Environment Variables))
设置环境变量。可以属于数组或字典两种格式。
如果只给定变量的名称则会自动加载它在Compose主机上的值,可以用来防止泄露不必要的数据。
environment:- RACK_ENV=development- SESSION_SECRETservices:myservice:image: myimageenvironment:- ENV_VAR1=value1- ENV_VAR2=value2
env_file
从文件中获取环境变量,可以为单独的文件路径或列表。 如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。 如果有变量名称与 environment 指令冲突,则以后者为准。
env_file: .env
env_file:- ./common.env- ./apps/web.env- /opt/secrets.env
环境变量文件中每一行都必须有注释,支持#开头的注释行。
# common.env: Set Rails/Rack environment
RACK_ENV=development
extends
基于已有的服务进行服务扩展。例如我们已经有了一个 webapp 服务,模板文件为 common.yml.
# common.yml
webapp:build: ./webappenvironment:- DEBUG=false- SEND_EMAILS=false
编写一个新的 development.yml 文件,使用 common.yml 中的 webapp 服务进行扩展。 development.yml
web:extends:file: common.ymlservice: webapp:ports:- "8080:80"links:- dbenvelopment:- DEBUG=truedb:image: mysql:5.7
后者会自动继承 common.yml 中的 webapp 服务及相关的环境变量。
net
设置网络模式。使用和 docker client 的 --net 参数一样的值。
# 容器默认连接的网络,是所有Docker安装时都默认安装的docker0网络.
net: "bridge"
# 容器定制的网络栈.
net: "none"
# 使用另一个容器的网络配置
net: "container:[name or id]"
# 在宿主网络栈上添加一个容器,容器中的网络配置会与宿主的一样
net: "host"
Docker 会为每个节点自动创建三个网络: 网络名称 作用 bridge 容器默认连接的网络,是所有 Docker 安装时都默认安装的 docker0 网络 none 容器定制的网络栈 host 在宿主网络栈上添加一个容器,容器中的网络配置会与宿主的一样 附录: 操作名称 命令 创建网络 docker network create -d bridge mynet 查看网络列表 docker network ls
pid
和宿主机系统共享进程命名空间,打开该选项的容器可以相互通过进程 id 来访问和操作。
pid: "host"
dns
配置 DNS 服务器。可以是一个值,也可以是一个列表。
dns: 8.8.8.8
dns:- 8.8.8.8- 9.9.9.9
networks(网络)
网络配置允许容器之间相互通信,以及与外部网络进行连接。在 Docker Compose 中,可以通过 networks 关键字来定义容器的网络配置
networks:mynetwork:driver: bridgeservices:myservice:image: myimagenetworks:- mynetwork
这样,myservice 容器将会加入到名为 mynetwork 的网络中,从而与其他加入相同网络的容器进行通信
cap_add,cap_drop
添加或放弃容器的 Linux 能力(Capability)。
cap_add:- ALL
cap_drop:- NET_ADMIN- SYS_ADMIN
dns_search
配置 DNS 搜索域。可以是一个值也可以是一个列表。
dns_search: example.com
dns_search:- domain1.example.com\ - domain2.example.com working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shareses
这些都是和 docker run 支持的选项类似。
cpu_shares: 73
working_dir: /code
entrypoint: /code/entrypoint.sh
user: postgresql
hostname: foo
domainname: foo.com
mem_limit: 1000000000
privileged: true
restart: always
stdin_open: true
tty: true
healthcheck
健康检查,这个非常有必要,等服务准备好以后再上线,避免更新过程中出现短暂的无法访问。
healthcheck:test: ["CMD", "curl", "-f", "http://localhost/alive"]interval: 5stimeout: 3s
其实大多数情况下健康检查的规则都会写在 Dockerfile 中:
FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=5s --timeout=3s CMD curl -f http://localhost/alive || exit 1
depends_on
依赖的服务,优先启动,例:
depends_on:
- redis
deploy
部署相关的配置都在这个节点下,例:
deploy:mode: replicatedreplicas: 2restart_policy:condition: on-failuremax_attempts: 3update_config:delay: 5sorder: start-first # 默认为 stop-first,推荐设置先启动新服务再终止旧的resources:limits:cpus: "0.50"memory: 1gdeploy:mode: global # 不推荐全局模式(仅个人意见)。placement:constraints: [node.role == manager]
若非特殊服务,以上各节点的配置能够满足大部分部署场景了。
docker-compose.yml 实例
version: '3.5'
services:nacos1:restart: alwaysimage: nacos/nacos-server:${NACOS_VERSION}container_name: nacos1privileged: trueports:- "8001:8001"- "8011:9555"deploy:resources:limits:cpus: '0.50'memory: 1024M env_file: - ./nacos.env environment:NACOS_SERVER_IP: ${NACOS_SERVER_IP_1}NACOS_APPLICATION_PORT: 8001NACOS_SERVERS: ${NACOS_SERVERS} volumes:- ./logs_01/:/home/nacos/logs/- ./data_01/:/home/nacos/data/- ./config/:/home/nacos/config/networks:- ha-network-overlaynacos2:restart: alwaysimage: nacos/nacos-server:${NACOS_VERSION}container_name: nacos2privileged: trueports:- "8002:8002"- "8012:9555"deploy:resources:limits:cpus: '0.50'memory: 1024M env_file: - ./nacos.env environment:NACOS_SERVER_IP: ${NACOS_SERVER_IP_2}NACOS_APPLICATION_PORT: 8002NACOS_SERVERS: ${NACOS_SERVERS}volumes:- ./logs_02/:/home/nacos/logs/- ./data_02/:/home/nacos/data/- ./config/:/home/nacos/config/networks:- ha-network-overlaynacos3:restart: alwaysimage: nacos/nacos-server:${NACOS_VERSION}container_name: nacos3privileged: trueports:- "8003:8003"- "8013:9555"deploy:resources:limits:cpus: '0.50'memory: 1024M env_file: - ./nacos.env environment:NACOS_SERVER_IP: ${NACOS_SERVER_IP_3}NACOS_APPLICATION_PORT: 8003NACOS_SERVERS: ${NACOS_SERVERS} volumes:- ./logs_03/:/home/nacos/logs/- ./data_03/:/home/nacos/data/- ./config/:/home/nacos/config/networks:- ha-network-overlay
networks:ha-network-overlay:external: true
YAML 文件格式 及 编写注意事项
使用compose对Docker容器进行编排管理时,需要编写 docker-compose.yml 文件,初次编写时,容易遇到一些比较低级的问题,导致执行 docker-compose up 时先解析 yml 文件的错误。
比较常见的是 yml 对缩进的严格要求。
yml 文件还行后的缩进,不允许使用 tab 键字符,只能使用空格,而空格的数量也有要求,经过实际测试,发现每一行增加一个空格用于缩进是正常的。
aml 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 XML 数据描述语言,语法比 XMAL 简单的很多。
YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号[]
括起来, hash 用花括号{}
括起来。
使用 YAML 时需要注意下面事项:
● 使用缩进表示层级关系,不支持制表符 tab 键缩进,只能使用空格键缩进;
● 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级
● 通常开头缩进 2 个空格;
● 字符后缩进 1 个空格,如冒号:空格
逗号,空格
横杠-空格
文本之间的空格>
;
● 用 # 号注释;
● 如果包含特殊字符用单引号' '
引起来;
● 布尔值必须用引号" "
括起来;
● 区分大小写
● 字符串可以不用引号标注
在 Docker Compose 中使用多个服务之间的依赖关系
在 Docker Compose 中使用多个服务之间的依赖关系是非常常见的需求,特别是当一个服务依赖于另一个服务运行时。
定义服务及其依赖关系
使用 Docker Compose 文件(通常为 docker-compose.yml),定义多个服务及其之间的依赖关系。
version: '3.8'
services:web:build: ./webdepends_on:- dbports:- "8080:8080"db:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: example
在上面的例子中,web 服务依赖于 db 服务,因此 web 服务在启动之前会等待 db 服务启动
使用 depends_on 关键字
depends_on 关键字用于定义服务之间的依赖关系。但是,需要注意的是,depends_on 并不会等待服务完全启动之后再启动依赖于它的服务。它只是确保依赖关系正确,即在启动 web 服务之前,会先启动 db 服务。
使用健康检查
可以通过实现健康检查来确保服务已经就绪。例如,使用 healthcheck 在服务启动后执行一些自定义的健康检查,并在服务就绪后返回健康状态。然后,可以在依赖于该服务的服务中等待健康状态。
version: '3.8'
services:web:build: .ports:- "80:80"healthcheck:test: ["CMD", "curl", "-f", "http://localhost/"]interval: 5stimeout: 3sretries: 3
Docker-compose 常用命令
常用命令清单
docker-compose 命令 --help 获得一个命令的帮助docker-compose up -d nginx 构建启动 nignx 容器docker-compose exec nginx bash 登录到 nginx 容器中docker-compose down 此命令将会停止 up 命令所启动的容器,并移除网络docker-compose ps 列出项目中目前的所有容器docker-compose restart nginx 重新启动 nginx 容器docker-compose build nginx 构建镜像 docker-compose build --no-cache nginx 不带缓存的构建docker-compose top 查看各个服务容器内运行的进程 docker-compose logs -f nginx 查看 nginx 的实时日志docker-compose images 列出 Compose 文件包含的镜像docker-compose config 验证文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。 docker-compose events --json nginx 以 json 的形式输出 nginx 的docker日志docker-compose pause nginx 暂停 nignx 容器docker-compose unpause nginx 恢复 ningx 容器docker-compose rm nginx 删除容器(删除前必须关闭容器,执行 stop)docker-compose stop nginx 停止 nignx 容器docker-compose start nginx 启动 nignx 容器docker-compose restart nginx 重启项目中的 nignx 容器docker-compose run --no-deps --rm php-fpm php -v 在 php-fpm 中不启动关联容器,并容器执行php -v 执行完成后删除容器
docker-compose
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
命令选项如下:
- -f,–file FILE 指定 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
- -p,–project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
- -x-network-driver 使用 Docker 的可拔插网络后端特性(需要Docker 1.9+版本) -x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge(需要 Docker 1.9+版本)
- -verbose 输出更多调试信息
- -v,–version 打印版本并退出
docker-compose up
这个命令一定要记住,每次启动都要用到,只要学会使用的人记住这个就好了
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
选项包括:
- -d 在后台运行服务容器
- –no-color 不使用颜色来区分不同的服务的控制输出
- –no-deps 不启动服务所链接的容器
- –force-recreate 强制重新创建容器,不能与 –no-recreate 同时使用 –no-recreate 如果容器已经存在,则不重新创建,不能与 –force-recreate 同时使用
- –no-build 不自动构建缺失的服务镜像
- –build 在启动容器前构建服务镜像
- –abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
- -t, –timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)
- –remove-orphans 删除服务中没有在 compose 文件中定义的容器
- –scale SERVICE=NUM 设置服务运行容器的个数,将覆盖在 compose 中通过 scale 指定的参数
docker-compose up 启动所有服务
docker-compose up -d 在后台所有启动服务 - -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d
docker-compose ps
docker-compose ps [options] [SERVICE...]
docker-compose ps 列出项目中目前的所有容器
docker-compose stop
docker-compose stop [options] [SERVICE...]
选项包括:
- -t, –timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)
docker-compose stop 停止正在运行的容器,可以通过 docker-compose start 再次启动
docker-compose -h
docker-compose -h 查看帮助
docker-compose down
docker-compose down [options]
停止和删除容器、网络、卷、镜像。
选项包括:
- –rmi type,删除镜像,类型必须是:all,删除 compose 文件中定义的所有镜像;local,删除镜像名为空的镜像
- -v, –volumes,删除已经在 compose 文件中定义的和匿名的附在容器上的数据卷
- –remove-orphans,删除服务中没有在 compose 中定义的容器
docker-compose down 停用移除所有容器以及网络相关
docker-compose logs
docker-compose logs [options] [SERVICE...]
查看服务容器的输出。
默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 –no-color 来关闭颜色。
docker-compose build
docker-compose build [options] [--build-arg key=val...] [SERVICE...]
构建(重新构建)项目中的服务容器。
选项包括:
- –compress 通过gzip压缩构建上下环境
- –force-rm 删除构建过程中的临时容器
- –no-cache 构建镜像过程中不使用缓存
- –pull 始终尝试通过拉取操作来获取更新版本的镜像
- -m, –memory MEM 为构建的容器设置内存大小
- –build-arg key=val 为服务设置 build-time 变量
服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行 docker-compose build 来重新构建服务
docker-compose pull
docker-compose pull [options] [SERVICE...]
拉取服务依赖的镜像。
选项包括:
- –ignore-pull-failures,忽略拉取镜像过程中的错误
- –parallel,多个镜像同时拉取
- –quiet,拉取镜像过程中不打印进度信息
docker-compose restart
docker-compose restart [options] [SERVICE...]
重启项目中的服务。
选项包括:
- -t, –timeout TIMEOUT,指定重启前停止容器的超时(默认为 10 秒)
docker-compose rm
docker-compose rm [options] [SERVICE...]
删除所有(停止状态的)服务容器。
选项包括:
- –f, –force,强制直接删除,包括非停止状态的容器
- -v,删除容器所挂载的数据卷
docker-compose rm 删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
docker-compose start
docker-compose start [SERVICE...]
启动已经存在的服务容器。
docker-compose run
docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服务上执行一个命令。
docker-compose run ubuntu ping www.baidu.com 在指定容器上执行一个ping命令。
docker-compose scale
docker-compose scale web=3 db=2 设置指定服务运行的容器个数。通过 service=num 的参数来设置数量
docker-compose pause
docker-compose pause [SERVICE...]
暂停一个服务容器
docker-compose kill
docker-compose kill [options] [SERVICE...]
通过发送 SIGKILL 信号来强制停止服务容器。 支持通过 -s 参数来指定发送的信号,例如通过如下指令发送 SIGINT 信号: docker-compose kill -s SIGINT
dokcer-compose config
docker-compose config [options]
验证并查看 compose 文件配置。
选项包括:
- –resolve-image-digests 将镜像标签标记为摘要
- -q, –quiet 只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
- –services 打印服务名,一行一个
- –volumes 打印数据卷名,一行一个
docker-compose create
docker-compose create [options] [SERVICE...]
为服务创建容器。
选项包括:
- –force-recreate:重新创建容器,即使配置和镜像没有改变,不兼容 –no-recreate 参数
- –no-recreate:如果容器已经存在,不需要重新创建,不兼容 –force-recreate 参数
- –no-build:不创建镜像,即使缺失
- –build:创建容器前,生成镜像
docker-compose exec
docker-compose exec [options] SERVICE COMMAND [ARGS...]
选项包括:
- -d 分离模式,后台运行命令。
- –privileged 获取特权。
- –user USER 指定运行的用户。
- -T 禁用分配 TTY,默认docker-compose exec 分配 TTY。
- –index=index,当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务,例如:docker-compose exec –index=1 web /bin/bash ,web 服务中包含多个容器
docker-compose port
docker-compose port [options] SERVICE PRIVATE_PORT
显示某个容器端口所映射的公共端口。
选项包括:
- –protocol=proto,指定端口协议,TCP(默认值)或者 UDP
- –index=index,如果同意服务存在多个容器,指定命令对象容器的序号(默认为 1)
docker-compose push
docker-compose push [options] [SERVICE...]
推送服务依的镜像。
选项包括:
- –ignore-push-failures 忽略推送镜像过程中的错误
docker-compose unpause
docker-compose unpause [SERVICE...]
恢复处于暂停状态中的服务。
docker-compose version
docker-compose version
打印版本信息。
查看日志
docker-compose logs 查看实时日志(日志最后的 N 行、某刻后日志) 实践笔记
参数说明
View output from containers.Usage: logs [options] [SERVICE...]Options:--no-color Produce monochrome output.-f, --follow Follow log output. 实时输出日志,最后一行为当前时间戳的日志-t, --timestamps Show timestamps. 显示时间戳--tail="all" Number of lines to show from the end of the logs for each container. 显示最后多少行日志, 默认是all (如: -tail=10 : 查看最后的 10 行日志。)
全屏到底部结束
docker-compose logs
rabbitmq | 2021-01-08 06:33:09.091 [error] <0.1007.2> Channel error on connection <0.25180.0>
rabbitmq | operation basic.ack caused a channel exception precondition_failed: unknown delivery tag
全屏滚到底部并继续持续输出日志
docker-compose logs -f
rabbitmq | 2021-01-08 06:33:09.091 [error] <0.1007.2> Channel error on connection <0.25180.0>
rabbitmq | operation basic.ack caused a channel exception precondition_failed: unknown delivery tag
相当于
tail -f
全屏滚到底部并继续持续输出日志并显示时间戳
docker-compose logs -f -t
rabbitmq | 2021-01-08T06:33:09.092091217Z 2021-01-08 06:33:09.091 [error] <0.1007.2> Channel
rabbitmq | 2021-01-08T06:33:09.092109187Z operation basic.ack caused a channel exception
全屏滚到底部显示最后 N 行并继续持续输出日志并显示时间戳
docker-compose logs -f -t --tail=10
rabbitmq | 2021-01-08T06:33:09.092091217Z 2021-01-08 06:33:09.091 [error] <0.1007.2> Channel
rabbitmq | 2021-01-08T06:33:09.092109187Z operation basic.ack caused a channel exception
最佳实践和注意事项
使用 Docker Compose 时的最佳实践建议
- 版本控制 Docker Compose 文件:
将 Docker Compose 文件纳入版本控制,以便跟踪和管理对服务配置的更改,并确保团队成员之间的一致性。 - 将环境变量设置在 .env 文件中:
使用 .env 文件来管理环境变量,以便在不同环境中轻松配置应用程序。这样可以避免在 Docker Compose 文件中硬编码敏感信息,并增加了灵活性。 - 使用 Dockerfile 分层构建:
在 Dockerfile 中使用多阶段构建,尽量减少镜像的大小,同时保持镜像的可重用性和可维护性。 - 指定适当的资源限制:
在服务定义中指定适当的资源限制,例如内存和 CPU。这有助于避免容器之间的资源争用,并提高容器的性能和可靠性。 - 使用健康检查:
对于重要的服务,使用健康检查来监视容器的健康状态,并及时发现和处理故障。 - 理解依赖关系:
了解并定义服务之间的依赖关系,以确保服务在正确的顺序启动,并在必要时等待依赖服务就绪。 - 使用网络别名:
使用 Docker Compose 的网络别名功能,以便服务之间可以通过服务名进行通信,而不必关心容器的 IP 地址。 - 日志和监控:
确保服务生成的日志可以被集中记录和监控,以便快速诊断和解决问题。 - 定期清理无用资源:
定期清理无用的容器、镜像和卷,以节省存储空间并保持系统的整洁性。 - 编写清晰的文档:
为 Docker Compose 文件和服务编写清晰的文档,以便团队成员能够理解和维护应用程序的架构和配置。
安全性和性能方面的考虑
- 安全性考虑:
- 容器漏洞和镜像安全性: 使用经过审查的官方镜像或受信任的第三方镜像,并定期更新镜像以修补潜在的漏洞。
- 容器间隔离: 确保容器之间有适当的隔离,以防止恶意容器攻击其他容器。
- 容器运行权限: 限制容器的运行权限,仅提供必要的权限,并尽量避免使用特权容器。
- 网络安全: 使用安全的网络配置,防止容器之间的未经授权通信,例如使用网络隔离、网络策略等。
- 保护敏感信息: 不要在 Dockerfile 或 Docker Compose 文件中硬编码敏感信息,使用安全的方式管理和传递敏感信息,例如使用 Docker Secrets 或环境变量。
- 监控和日志: 定期监控容器的运行状况和日志,及时发现和处理异常情况。
- 性能考虑:
- 资源限制: 为每个容器设置适当的资源限制,包括内存、CPU、网络和存储资源,以避免容器之间资源争用和性能下降。
- 容器大小和层数: 尽量减小容器的大小和层数,避免不必要的依赖和组件,以加快容器的构建和部署速度。
- 镜像缓存和构建优化: 使用镜像缓存和多阶段构建来优化镜像的构建过程,尽量减少镜像的重复构建。
- 容器编排优化: 确保容器编排工具(如 Docker Compose)配置合理,避免不必要的依赖和复杂的服务拓扑,以提高容器的启动速度和性能。
- 网络性能: 使用高性能的网络驱动程序和网络配置,确保容器之间的通信性能良好。
- 存储优化: 使用高性能的存储驱动程序和存储配置,以满足应用程序对存储的高性能和可靠性要求。
总结
- Docker Compose的重要性和优势:
- 简化容器管理:Docker Compose通过 YAML 文件定义并管理多个 Docker 容器,这使得容器管理变得简单明了。通过单个命令,可以轻松地启动、停止、重启或删除所有服务,大大简化了开发、测试和部署流程。
- 自动化部署:Docker Compose 支持自动化构建和部署,可以自动处理容器之间的依赖关系和启动顺序。这使得在多容器环境下部署应用程序变得非常容易,大大提高了开发效率。
- 环境一致性:通过 Docker Compose,可以确保应用程序在不同环境下(如开发、测试和生产环境)的一致性。开发人员可以定义并分享完整的配置文件,从而确保应用程序在不同环境中的表现一致。
- 支持版本控制:Docker Compose 文件通常存储在项目存储库中,并受到版本控制。这使得团队成员可以轻松地协作和共享配置更改,确保应用程序始终使用最新的配置和依赖项。
- 易于扩展和维护:Docker Compose 支持轻松扩展应用程序,只需通过修改 YAML 文件即可添加或删除服务。此外,由于配置和代码分离,使得维护变得更加容易。
- 提高开发效率:Docker Compose 通过提供统一的配置和管理界面,减少了开发人员和管理员在多个容器之间手动配置和管理的时间。这使得开发人员可以更加专注于应用程序的开发和测试,提高了开发效率。
- Docker Compose 未来发展趋势:
- 更广泛的集成和应用:随着 Docker 容器技术的普及和成熟,越来越多的企业和组织将开始采用 Docker Compose 来管理和部署多容器应用程序。Docker Compose 将更深入地集成到各种开发、测试和生产环境中,成为应用程序交付的重要工具。
- 与云平台的进一步整合:随着云计算的普及和发展,Docker Compose 将更紧密地与各种云平台进行整合。例如,Docker Compose 可能会进一步支持 Kubernetes、Amazon Elastic Container Service 等容器编排和管理工具,以提供更强大的容器部署和管理能力。
- 安全性和可靠性的增强:随着容器技术的广泛应用,安全性和可靠性将成为 Docker Compose 发展的重要考虑因素。Docker Compose 可能会引入更多的安全特性和机制,例如容器隔离、访问控制、加密通信等,以确保应用程序的安全和稳定运行。
- 支持更多类型的服务和应用:目前,Docker Compose 主要支持基于 Docker 容器的服务和应用。未来,随着容器技术的进一步发展和应用场景的扩大,Docker Compose 可能会支持更多类型的服务和应用,例如无服务器计算、边缘计算等。
- 更好的用户体验和工具支持:为了提高开发人员的生产力和便利性,Docker Compose 可能会提供更好的用户界面和工具支持。例如,Docker Compose 可能会提供更丰富的命令行选项和参数、图形化界面、IDE 插件等,以简化配置和管理过程。!