这是我参与 8 月更文挑战的第 18 天,活动详情查看: 8月更文挑战
简介
Docker-Compose
项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose将所管理的容器分为三层,分别是工程(project)
,服务(service)
以及容器(container
)。
Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。
Docker-Compose的工程配置文件默认为docker-compose.yml
,可通过环境变量COMPOSE_FILE
或-f
参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose允许用户通过一个单独的docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。
安装docker-compose
1.下载 Docker Compose 的当前稳定版本
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2.对二进制文件应用可执行权限
chmod +x /usr/local/bin/docker-compose
3.查看是否安装成功
docker-compose --version
基本使用
参数选项:
-f --file FILE指定Compose模板文件,默认为docker-compose.yml
-p --project-name NAME 指定项目名称,默认使用当前所在目录为项目名
--verbose 输出更多调试信息
-v,-version 打印版本并退出
--log-level LEVEL 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)
常用命令:
docker-compose up #启动容器
docker-compose down #关闭并删除容器
docker-compose [start | stop | pause | restart] #启动/停止/暂停/重启 容器
docker-compose run NAME ping baidu.com #在指定容器运行命令
docker-compose kill #机制停止容器
docker-compose scale #设置服务运行的容器个数
docker-compose ps #列出项目中所有的容器
docker-compose rm #删除容器
docker-compose logs #查看日志
docker-compose bulid #构建项目中的容器
docker-compose push #推送镜像
docker-compose pull #拉取依赖镜像
docker-compose config #查看项目容器配置
docker-compose create #为服务创建容器
docker-compose exec NAME /bin/bash #进入指定容器
docker-compose port NAME 端口号 #显示某个容器端口所映射的公共端口
Docker-compose模板文件
Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的docker-compose.yml,可以使用.yml或.yaml作为文件扩展名。
Docker-Compose标准模板文件应该包含version
、services
、networks
三大部分,最关键的是services
和networks
两个部分。
参数介绍
version
:Compose目前有三个版本分别为Version 1,Version 2,Version 3,Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。
image
:指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。
build
:服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up启动时执行构建任务,构建标签是build,可以指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器。
context
:选项可以是Dockerfile的文件路径,也可以是到链接到git仓库的url,当提供的值是相对路径时,被解析为相对于撰写文件的路径,此目录也是发送到Docker守护进程的context
dockerfile
:使用dockerfile文件来构建,必须指定构建路径
commond
:使用command可以覆盖容器启动后默认执行的命令。
container_name
:可以自定义项目名称、服务名称
depends_on
:在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题
ports
:映射服务与主机的端口
extra_hosts
:添加主机名的标签,会在/etc/hosts文件中添加一些记录。
volumes
:挂载一个目录或者一个已存在的数据卷容器
dns
:自定义DNS服务器。可以是一个值,也可以是一个列表。
expose
:暴露端口,但不映射到宿主机,只允许能被连接的服务访问。
net
:设置网络模式。
实例
下面演示一下官方的一个实例
1.创建项目文件夹
mkdir composetest
cd composetest
2.边写一个演示的项目
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)
3.编写requirements.txt
依赖列表文件
flask
redis
4.编写Dockerfile
文件
# syntax=docker/dockerfile:1
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
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
5.编写docker-compose.yml
文件
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
6.启动项目
docker-compose up -d
7.测试
这个演示程序会显示这个网页访问的次数
查看容器的日志
通过docker-compose scale
增加容器数量