学习资料:
10.Docker Compose
用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
安装docker compose
:
# 使用镜像加速下载
$sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$cd /usr/local/bin/
$l
total 17M
drwxr-xr-x 2 root root 4.0K Apr 20 20:40 .
drwxr-xr-x 10 root root 4.0K Feb 20 07:48 ..
-rw-r--r-- 1 root root 17M Apr 20 20:40 docker-compose
$sudo chmod +x docker-compose
$docker-compose version
docker-compose version 1.25.1, build a82fef07
docker-py version: 4.1.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
#getting start
# 配置依赖
$cd /home/hongsen/data
$mkdir composetest
$cd composetest
# 通过Python来写一个能够记录页面访问次数的 web 网站
$vi 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)
$vi requirements.txt
flask
redis
# Dockerfile将应用打包为镜像
$vi Dockerfile
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install flask redis
CMD ["python", "app.py"]
# 定义services需要的环境(web、redis)
$vi docker-compose.yml
version: "3.5"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: "redis:apline"
$l
total 24K
drwxrwxr-x 2 hongsen hongsen 4.0K Apr 20 20:55 .
drwxrwxr-x 8 hongsen hongsen 4.0K Apr 20 20:46 ..
-rw-rw-r-- 1 hongsen hongsen 251 Apr 20 20:52 Dockerfile
-rw-rw-r-- 1 hongsen hongsen 513 Apr 20 20:48 app.py
-rw-rw-r-- 1 hongsen hongsen 110 Apr 20 20:55 docker-compose.yml
-rw-rw-r-- 1 hongsen hongsen 11 Apr 20 20:50 requirements.txt
# 启动 compose项目
# 报错,网络原因?即便配置了pip镜像,仍然有安装问题?
$docker-compose up
Building web
Step 1/5 : FROM python:3.6-alpine
---> 68fbe3f5d554
Step 2/5 : ADD . /code
---> eb01cd62f9e3
Step 3/5 : WORKDIR /code
---> Running in a27b7183c44f
Removing intermediate container a27b7183c44f
---> 7f7417680e21
Step 4/5 : RUN pip install flask redis -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
---> Running in c2ce895de207
Looking in indexes: http://pypi.douban.com/simple
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPConnection object at 0x7f8ef5a6ce80>: Failed to establish a new connection: [Errno -3] Try again',)': /simple/flask/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPConnection object at 0x7f8ef583d390>: Failed to establish a new connection: [Errno -3] Try again',)': /simple/flask/
^CGracefully stopping... (press Ctrl+C again to force)
# 解决方法:
www.freesion.com/article/3390655079/
配置DNS
$docker-compose build
redis uses an image, skipping
Building web
Step 1/5 : FROM python:3.6
---> 9f98e1be91a4
Step 2/5 : ADD . /code
---> Using cache
---> 90dd1a18eb07
Step 3/5 : WORKDIR /code
---> Using cache
---> 2a681fd67249
Step 4/5 : RUN pip install flask redis
---> Using cache
---> ed12532f81d4
Step 5/5 : CMD ["python", "app.py"]
---> Using cache
---> bdba81fef8fc
Successfully built bdba81fef8fc
Successfully tagged composetest_web:latest
# 还是挂了?
$docker-compose up
# 只开启了一个composetest_redis_1项目?缺少一个 composetest_web_1项目
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc784469864c redis "docker-entrypoint.s…" About a minute ago Up 24 seconds 6379/tcp composetest_redis_1
在创建好docker-compose.yml文件后,可以通过docker-compose up
这个命令将文件中定义的容器都启动起来,在docker compose中我们更习惯于将每一个容器叫做service。
命令后会自动接一个默认值-f docker-compose.yml
,也就是默认是使用docker-compose.yml文件的。我们也可以给文件起名为docke-test.yml,这样在使用时指定文件名,但是为了符合规范,还是统一为docker-compose.yml。
查看服务状态
接下来可以查看一下我们创建的service状态
$docker-compose ps
要是想要查看所有service的状态可以使用-a参数:
$docker-compose ps -a
停止或删除服务
如何停止已经运行的services呢,可以使用以下两个命令
docker-compose stop
docker-compose down
其中stop是直接停止services,而down则会停止并删除创建的service,volume和network。
查看服务输出日志
有些情况下一些服务可能无法正常启动,这时可以使用命令查看日志并定位发生错误的原因
docker-compose logs