容器在当今的云计算中极为重要,是构建微服务的重要组成部分。而一个微服务如果由多个容器,比如Nginx+php+MySQL,单个容器分开管理会非常麻烦 。目前华为云、阿里云等厂商都提供了很多Docker容器的管理工具。Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。
一个使用docker-compose的架构示例
linux下的安装命令:
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v
mac环境在使用安装文件安装Docker时会自带Compose
# 列出所有容器
docker-compose ps
# 看服务日志
docker-compose logs
# 打印绑定的公共端口,下面是个示例
docker-compose port eureka 8761
# 构建服务
docker-compose build
# 启动指定服务已存在的容器
docker-compose start eureka
# 停止已运行的服务的容器
docker-compose stop eureka
# 删除指定服务的容器
docker-compose rm eureka
# 构建启动容器,更新容器
docker-compose up
# kill:通过发送 SIGKILL 信号来停止指定服务的容器
docker-compose kill eureka
# pull:下载服务镜像
# scale:设置指定服务运气容器的个数,以 service=num 形式指定
docker-compose scale user=3 movie=3
# run:在一个服务上执行一个命令
docker-compose run web bash
mkdir composetest
cd composetest
vim App.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.n'.format(count)
这个示例Python去访问redis服务,端口6379。
在 composetest 目录中创建另一个名为 requirements.txt 的文件,内容如下:
flask
redis
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
这个Dockerfile是构建Python容器使用。字段解释如下:
在测试目录中创建一个名为 docker-compose.yml 的文件:
# yaml 配置
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
该 Compose 文件定义了两个服务:web 和 redis。
version: '2'
services:
web:
build: .
links:
- "db:database"
db:
image: postgres
Web 服务就可以使用 db 或 database 作为 hostname 访问 db 服务了。
在测试目录中,执行以下命令来启动应用程序:
docker-compose up
后台执行该服务可以加上 -d 参数:
docker-compose up -d
运行效果:
指定本 yml 依从的 compose 哪个版本制定的。
指定为构建镜像上下文路径:例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
version: "3.7"
services:
webapp:
build: ./dir
或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
target: prod
添加或删除容器拥有的宿主机的内核功能。
cap_add:
- ALL # 开启全部权限
cap_drop:
- SYS_PTRACE # 关闭 ptrace权限
为容器指定父 cgroup 组,意味着将继承该组的资源限制。
cgroup_parent: m-executor-abcd
覆盖容器启动的默认命令。
command: ["bundle", "exec", "thin", "-p", "3000"]
指定自定义容器名称,而不是生成的默认名称。
设置依赖关系。
指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。
访问集群服务的方式。
指定设备映射列表。
自定义 DNS 服务器,可以是单个值或列表的多个值。
自定义 DNS 搜索域。可以是单个值或列表。
覆盖容器默认的 entrypoint。
从文件添加环境变量。可以是单个值或列表的多个值。
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
暴露端口,但不映射到宿主机,只被连接的服务访问。
添加主机名映射。类似 docker client --add-host。
用于检测 docker 服务是否健康运行。
指定容器运行的镜像。
服务的日志记录配置。
设置网络模式。
重启策略
存储敏感数据
修改容器默认的 schema 标签。
指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。
设置停止容器的替代信号。
设置容器中的内核参数,可以使用数组或字典格式。
在容器内安装一个临时文件系统。可以是单个值或列表的多个值。
覆盖容器默认的 ulimit。
将主机的数据卷或着文件挂载到容器里。