概述
Docker Compose可以轻松高效地定义、运行、管理多个容器。Compose通过yaml文件来配置应用程序服务。然后使用一些命令来启动Compose。
使用Compose有三个步骤
- 使用Dockfile来定义应用的运行环境
- 使用docker-compose.yml 定义组成应用的各服务
docker-compose up
启动整个应用
Compose是Docker官方的开源项目,需要安装。Dockerfile让容器在任何地方运行,但如果要运行多个容器就十分麻烦,这就需要使用docker-compose.yml
文件。一个 docker-compose.yml
类似下面所示
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
两个概念
- services(服务):容器、应用(mysql、nginx…)
- project(项目):一组关联的容器
安装Compose
下载Compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
授权
sudo chmod +x /usr/local/bin/docker-compose
Compose的使用
部署Python+Redis
创建project文件夹
mkdir compose-test
cd compose-test/
创建PythonWeb应用文件
#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)
创建依赖清单
#requirements.txt
flask
redis
编写Dockerfile
FROM python:3.7-alpine
RUN echo -e http://mirrors.ustc.edu.cn/alpine/v3.12/main/ > /etc/apk/repositories
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 -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
编写Compose文件
#docker-compose.yml
version: "3"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
启动Docker-Compose
docker-compose up [-d 后台运行]
#查看正在运行的compose
docker-compose ps
#使用后台模式时停止
docker-compose stop
可以看到程序正常启动
执行流程
- 创建网络
- 执行
docker-compose.yml
- 启动服务service(服务名为:文件名_服务名_num)
网络规则
docker network ls
NETWORK ID NAME DRIVER SCOPE
443a88c2886f bridge bridge local
34b078d70766 compose-test_default bridge local
d7d5810dcb43 host host local
31d5effd27a3 mynet bridge local
53fb3ec12878 none null local
docker network inspect compose-test_default
...
"Containers": {
"aa956d407d920e6ec0293a5abbceda37bef4934c39f19684bb62558f71672afd": {
"Name": "compose-test_web_1",
"EndpointID": "557a95231df9e1b75018491674b3f81ec49501d17a0e748e8c64743c1d72ba70",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
},
"ab784d217fd269d7b3e7c4810bd4d5866a5b9dbd658eb57273434c23a33993ea": {
"Name": "compose-test_redis_1",
"EndpointID": "067c633c2d6190477ee611ce518c1d47f9fbbf4b4aa4bd0b046fec61457dfe6a",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
}
...
可以看到项目的内容都在同一个网络compose-test_default
下
停止Compose
docker-compose down 或者 Ctrl+C
Docker compose常用命令
up 启动容器,终端运行
images 列出镜像
down 停止和删除容器、网络、卷、镜像
start 启动项目中容器,后台运行
logs 查看项目中容器日志
stop 停止项目中容器
restart 重启项目中容器
ps 查看启动的容器
#选项如下
-f file 指定Compose模板文件,默认为docker-compose.yml,可以多次指定
-p project 指定项目名称,默认将使用所在目录名称作为项目名
-d 后台运行容器
YAML规则
docker-compose.yml可以分为三层
#三层
version:'' #版本
services: #服务
服务1:
#服务配置
服务2:
服务3:
#其他配置 网络、卷、全局规则
具体配置可以参考 Compose file version 3 reference。
依赖
services
字段使用depends_on
字段来定义依赖。容器之间如果有相互依赖关系,定义了依赖之后,docker就会先启动依赖。
使用Compose搭建Wordpress
创建Project
#创建Project文件夹
root@ubuntu:~# mkdir my_wordpress
root@ubuntu:~# cd my_wordpress/
#编写docker-compose.yml
version: "3.8" #版本
services:
#数据库服务
db:
image: mysql:5.7
volumes: #挂载数据卷
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on: #配置依赖
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
启动Compose
docker-compose up
启动成功
小结
利用Docker-Compose可以一键部署多个容器,并且只需要一个编写完善的yaml文件。如果在本地没有所需服务的镜像,会自动从远程下载所需镜像,此后部署服务速度会更快。
参考文章