Docker Compose
容器
说明
以前Docker,流程是单个容器通过编写Dockerfile, build,run来手动操作。
使用DockerCompose来轻松高效管理容器,定义运行多个容器。
Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。
官方文档https://docs.docker.com/compose/
使用流程
- Dockerfile来保证项目可运行
- 定义组成应用程序服务
service
。 文件docker-compose.yml
- 启动项目
docker-compose up
示例yml
version: '2.0'
services:
web: # Web服务
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis: # Redis服务
image: redis
volumes:
logvolume01: {}
安装
Docker Compose依靠Docker Engine. 所以确保已安装Docker.
默认Mac系统已经安装了。或者也可以使用pip包安装
pip install docker-compose
Linux加速安装
# 1.下载
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 2.授权
sudo chmod +x /usr/local/bin/docker-compose
➜ ~ docker-compose version
docker-compose version 1.26.2, build eefe0d31
docker-py version: 4.2.2
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.1g 21 Apr 2020
➜ ~ docker-compose
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file
(default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name
(default: directory name)
-c, --context NAME Specify a context name
--verbose Show more output
--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
--no-ansi Do not print ANSI control characters
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the
name specified in the client certificate
--project-directory PATH Specify an alternate working directory
(default: the path of the Compose file)
--compatibility If set, Compose will attempt to convert keys
in v3 files to their non-Swarm equivalent
--env-file PATH Specify an alternate environment file
Commands:
build Build or rebuild services
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version 展示docker-compose的版本信息
快速体验
步骤
- 应用
➜ Desktop mkdir composetest
➜ Desktop cd composetest
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 3.7.4-alpine3.10
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_appHOST 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"]
- Docker-compose.yaml 定义整个服务
- 启动Docker-compose
定义一个docker-compose.yaml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
在项目根目录打开终端,构建并且运行项目
docker-compose build
docker-compose up
停止运行
docker-compose down
然后我们再看看Docker网络
下面代码是运行时的
➜ composetest docker-compose build
redis uses an image, skipping
Building web
Step 1/10 : FROM python:3.7-alpine
3.7-alpine: Pulling from library/python
df20fa9351a1: Pull complete
36b3adc4ff6f: Pull complete
4db9de03f499: Pull complete
cd38a04a61f4: Pull complete
6bbb0c43b470: Pull complete
Digest: sha256:d1375bf0b889822c603622dc137b24fb7064e6c1863de8cc4262b61901ce4390
Status: Downloaded newer image for python:3.7-alpine
---> 078114edb6be
Step 2/10 : WORKDIR /code
---> Running in fd9621a21c66
Removing intermediate container fd9621a21c66
---> 3fb596445a6d
Step 3/10 : ENV FLASK_APP app.py
---> Running in 59774f148143
Removing intermediate container 59774f148143
---> c8ddb45af25e
Step 4/10 : ENV FLASK_RUN_HOST 0.0.0.0
---> Running in 6f33dd2d0008
Removing intermediate container 6f33dd2d0008
---> ccd759a4a9bf
Step 5/10 : RUN apk add --no-cache gcc musl-dev linux-headers
---> Running in 7b3c7abb835d
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
(1/13) Installing libgcc (9.3.0-r2)
(2/13) Installing libstdc++ (9.3.0-r2)
(3/13) Installing binutils (2.34-r1)
(4/13) Installing gmp (6.2.0-r0)
(5/13) Installing isl (0.18-r0)
(6/13) Installing libgomp (9.3.0-r2)
(7/13) Installing libatomic (9.3.0-r2)
(8/13) Installing libgphobos (9.3.0-r2)
(9/13) Installing mpfr4 (4.0.2-r4)
(10/13) Installing mpc1 (1.1.0-r1)
(11/13) Installing gcc (9.3.0-r2)
(12/13) Installing linux-headers (5.4.5-r1)
(13/13) Installing musl-dev (1.1.24-r9)
Executing busybox-1.31.1-r16.trigger
OK: 153 MiB in 48 packages
Removing intermediate container 7b3c7abb835d
---> 20773301e6af
Step 6/10 : COPY requirements.txt requirements.txt
---> 43c4fdd4899f
Step 7/10 : RUN pip install -r requirements.txt
---> Running in b3aad024091c
Collecting flask
Downloading Flask-1.1.2-py2.py3-none-any.whl (94 kB)
Collecting redis
Downloading redis-3.5.3-py2.py3-none-any.whl (72 kB)
Collecting itsdangerous>=0.24
Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting Jinja2>=2.10.1
Downloading Jinja2-2.11.2-py2.py3-none-any.whl (125 kB)
Collecting Werkzeug>=0.15
Downloading Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
Collecting click>=5.1
Downloading click-7.1.2-py2.py3-none-any.whl (82 kB)
Collecting MarkupSafe>=0.23
Downloading MarkupSafe-1.1.1.tar.gz (19 kB)
Building wheels for collected packages: MarkupSafe
Building wheel for MarkupSafe (setup.py): started
Building wheel for MarkupSafe (setup.py): finished with status 'done'
Created wheel for MarkupSafe: filename=MarkupSafe-1.1.1-cp37-cp37m-linux_x86_64.whl size=16913 sha256=905a2d3551601b1bdabf54e7d39408a7ed322407d1462d0affd27e415fe80449
Stored in directory: /root/.cache/pip/wheels/b9/d9/ae/63bf9056b0a22b13ade9f6b9e08187c1bb71c47ef21a8c9924
Successfully built MarkupSafe
Installing collected packages: itsdangerous, MarkupSafe, Jinja2, Werkzeug, click, flask, redis
Successfully installed Jinja2-2.11.2 MarkupSafe-1.1.1 Werkzeug-1.0.1 click-7.1.2 flask-1.1.2 itsdangerous-1.1.0 redis-3.5.3
Removing intermediate container b3aad024091c
---> 8a1840ed2c6f
Step 8/10 : EXPOSE 5000
---> Running in aea130f1e6ee
Removing intermediate container aea130f1e6ee
---> fe200f749e07
Step 9/10 : COPY . .
---> e9e54c6fb4ad
Step 10/10 : CMD ["flask", "run"]
---> Running in 2845bd8fdb17
Removing intermediate container 2845bd8fdb17
---> 84fc6ba7b059
Successfully built 84fc6ba7b059
Successfully tagged composetest_web:latest
➜ composetest docker-compose up
Creating network "composetest_default" with the default driver
Pulling redis (redis:alpine)...
alpine: Pulling from library/redis
df20fa9351a1: Already exists
9b8c029ceab5: Pull complete
e983a1eb737a: Pull complete
3ff995df75b6: Pull complete
53083afa127f: Pull complete
2509483afa4c: Pull complete
Digest: sha256:5326e0af4341affe12c544b546f17e4fcb5db2d9204a83e5c28d8b8a98d69778
Status: Downloaded newer image for redis:alpine
Creating composetest_web_1 ... done
Creating composetest_redis_1 ... done
Attaching to composetest_redis_1, composetest_web_1
redis_1 | 1:C 04 Sep 2020 10:36:23.245 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 04 Sep 2020 10:36:23.245 # Redis version=6.0.7, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 04 Sep 2020 10:36:23.245 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | 1:M 04 Sep 2020 10:36:23.246 * Running mode=standalone, port=6379.
redis_1 | 1:M 04 Sep 2020 10:36:23.247 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1 | 1:M 04 Sep 2020 10:36:23.247 # Server initialized
redis_1 | 1:M 04 Sep 2020 10:36:23.247 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1 | 1:M 04 Sep 2020 10:36:23.247 * Ready to accept connections
web_1 | * Serving Flask app "app.py"
web_1 | * Environment: production
web_1 | WARNING: This is a development server. Do not use it in a production deployment.
web_1 | Use a production WSGI server instead.
web_1 | * Debug mode: off
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1 | 172.18.0.1 - - [04/Sep/2020 10:41:25] "GET / HTTP/1.1" 200 -
web_1 | 172.18.0.1 - - [04/Sep/2020 10:41:25] "GET /favicon.ico HTTP/1.1
yaml规则
官方文档
https://docs.docker.com/compose/compose-file/
# 版本 与Docker版本对应 比如1.x 2.x 3.x
version: ''
# 服务
services:
# 服务1:web
# 服务2:redis
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
# 其他配置 比如 网络/卷 全局规则
volumes:
networks:
configs:
说明
官方文档
https://docs.docker.com/compose/
DaoCloud