Docker Compose学习

Docker Compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具,用于快速在集群中部署分布式应用。

Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格
式)中定义一组相关联的应用容器(被称为一个 project ,即项目),例如一个 Web 服务容器再加上
后端的数据库服务容器等。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
创建docker-compose.yml
version: '3'
services:
  web:
    build: ./web
    ports:
     - "8080:8080"
  redis:
    image: "redis:alpine"

Compose 文件定义了两个服务:web 和 redis。

web:该 web 服务使用从 web目录下的Dockerfile构建的镜像。然后,它将容器和主机绑定到暴露的端口8080。
redis:该 redis 服务使用 Docker Hub 的公共 Redis 映像。

运行compose

docker-compose up

加上-d参数在后台运行

Compose命令说明
命令

build
构建或者重新构建服务
服务一旦构建后,将会带上一个标记名,例如 web_db。
可以随时在项目目录下运行 docker-compose build 来重新构建服务。

help
获得一个命令的帮助。

kill
通过发送 SIGKILL 信号来强制终止服务容器。支持通过参数来指定发送的信号,例:
docker-compose kill -s SIGINT

logs
查询服务的输出。

port
打印绑定的公共端口。

ps
列出所有容器。

pull
拉取服务镜像。

rm
删除停止的服务容器。

run
在一个服务上执行一个命令。例:
docker-compose run ubuntu ping docker.com

将会启动一个ubuntu 服务,执行 ping docker.com 命令。
默认情况下,所有关联的服务将会自动被启动,除了这些服务已经在运行中。
该命令类似启动容器后运行指令的命令,相关卷、链接等等都会按照期望创建。
两个不同点:

  • 给定命令将会覆盖原有的自动运行命令
  • 不会自动创建端口,以避免冲突

如果不希望自动启动关联的容器,可以使用 --no-deps 选项,例如:
docker-compose run --no-deps web python manage.py shell

将不会启动 web 容器所关联的其它容器。

scale
设置同一个服务运行的容器个数。
通过 service=num 的参数来设置数量。例:

start
启动一个已经存在的服务容器。

stop
停止一个已经运行的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。

up
构建,(重新)创建,启动,链接一个服务相关的容器。
链接的服务都将会启动,除非他们已经运行。

默认情况, docker-compose up 将会整合所有容器的输出,并且退出时,所有容器将会停止。
如果使用 docker-compose up -d ,将会在后台启动并运行所有的容器。

默认情况,如果该服务的容器已经存在, docker-compose up 将会停止并尝试重新创建他们(保持
使用 volumes-from 挂载的卷),以保证 docker-compose.yml 的修改生效。如果你不想容器被停止
并重新创建,可以使用 docker-compose up --no-recreate 。如果需要的话,这样将会启动已经停止
的容器。

YAML模板文件

默认的模板文件是 docker-compose.yml ,其中定义的每个服务都必须通过 image 指令指定镜像或
build 指令(需要 Dockerfile)来自动构建。

version
指定本 yml 依从的 compose 哪个版本制定的。

image
指定为镜像名称或镜像ID,如果镜像在本地不存在, Compose 将会尝试拉取这个镜像。

build
指定 Dockerfile 所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

container_name
指定自定义容器名称,而不是生成的默认名称。
container_name: my-web-container

links
链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名(SERVICE:ALIAS) 格式都可以。

external_links
链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 管理的容器。参数格式跟 links 类
似。

ports
暴露端口信息。
使用宿主:容器 (HOST:CONTAINER) 格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可
以。

ports:
	- "3000:3000"

注:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误 得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。

expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数。

volumes
卷挂载路径设置。可以设置宿主机路径 ( HOST:CONTAINER ) 或加上访问模式。

volumes_from
从另一个服务或容器挂载它的所有卷。

environment
设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。

env_file
从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。
如果有变量名称与 environment 指令冲突,则以后者为准。
在这里插入图片描述
环境变量文件中每一行必须符合格式,支持 # 开头的注释行。
在这里插入图片描述
extends
基于已有的服务进行扩展。例如我们已经有了一个 webapp 服务,模板文件为 common.yml 。
在这里插入图片描述
编写一个新的 development.yml 文件,使用 common.yml 中的 webapp 服务进行扩展。

在这里插入图片描述
后者会自动继承 common.yml 中的 webapp 服务及相关环节变量。

network_mode
设置网络模式。使用和 docker client 的 --net 参数一样的值。

network_mode: "bridge" 
network_mode: "host" 
network_mode: "none" 
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

pid
跟主机系统共享进程命名空间。打开该选项的容器可以相互通过进程 ID 来访问和操作。

dns
配置 DNS 服务器。可以是一个值,也可以是一个列表。
在这里插入图片描述
cap_add, cap_drop
添加或放弃容器的 Linux 能力(Capabiliity)。
在这里插入图片描述
dns_search
配置 DNS 搜索域。可以是一个值,也可以是一个列表。
在这里插入图片描述
depends_on
设置依赖关系。

  • docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动
    web。
  • docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose
    up web 还将创建并启动 db 和 redis。
  • docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停
    止。
version: "3.7" 
	services: 
		web:
			build: . 
			depends_on: 
				- db 
				- redis 
		redis: 
			image: redis 
		db:
			image: postgres

注意:web 服务不会等待 redis db 完全启动 之后才启动。

extra_hosts
添加主机名映射。类似 docker client --add-host。

extra_hosts: 
	- "somehost:162.242.195.82" 
	- "otherhost:50.31.209.229"

以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:

162.242.195.82 somehost 
50.31.209.229 otherhost 

healthcheck
用于检测 docker 服务是否健康运行。

healthcheck: 
	test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序 
	interval: 1m30s # 设置检测间隔 
	timeout: 10s # 设置检测超时时间 
	retries: 3 # 设置重试次数 
	start_period: 40s # 启动后,多少秒开始启动检测程序

logging
服务的日志记录配置。
driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项

driver: "json-file" 
driver: "syslog" 
driver: "none"

仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。

logging: 
	driver: json-file 
	options: 
		max-size: "200k" # 单个文件大小为200k 
		max-file: "10" # 最多10个文件

当达到文件限制上限,会自动删除旧得文件。
syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。

logging: 
	driver: syslog 
	options: 
		syslog-address: "tcp://192.168.0.42:123" 

networks
配置容器连接的网络,引用顶级 networks 下的条目 。

services: 
	some-service: 
		networks: 
			some-network: 
				aliases: 
					- alias1 
			other-network: 
				aliases: - alias2 
networks: 
	some-network: # Use a custom driver 
		driver: custom-driver-1 
	other-network: # Use a custom driver which takes special options 
		driver: custom-driver-2

aliases
同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares
这些都是和 docker run 支持的选项类似。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值