Docker(4)-ComposeInstall Docker ComposePrerequisitesInstall ComposeDocker Compose实例使用python创建一个应用编写Dockerfile构建镜像在Compose 文件中定义服务使用Compose构建并运行应用常用命令参考文档
Compose是定义和运行多容器Docker应用程序的工具。
我们部署一个应用时,需要先安装配置mysql,nginx...
等应用,然后才可以运行应用,这样显得非常麻烦,Compose
帮解决了这个问题,通过使用YAML文件配置应用服务,然后通过一个命令从配置中创建并启动所有服务。
使用Compose
:
Dockerfile
定义应用环境定义程序依赖的服务,
docker-compose.yml
,可以使服务在隔离环境中一起运行docker-compose up
命令启动并运行整个应用程序
A docker-compose.yml
looks like this:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}复制
Install Docker Compose
Prerequisites
Docker Compose
依赖于Docker
运行,需要先安装Docker
Install Compose
下载DockerCompose稳定版本
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose复制
安装其他版本Docker Compose ,需要替换 1.25.0
为Compose版本号。
$ sudo chmod +x /usr/local/bin/docker-compose复制
测试安装是否完成
$ docker-compose --version
docker-compose version 1.25.0, build 1110ad01复制
bash
andzsh
shell 命令补全(可选)
卸载Docker Compose
$ sudo rm /usr/local/bin/docker-compose
复制
Docker Compose实例
使用python创建一个应用
创建项目目录
$ mkdir composetest
$ 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构建镜像
在项目目录中,创建文件名为Dockerfile的文件
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"]复制
这个文件表示:
从
Python 3.7
构建镜像设置工作目录为
/code
设置环境变量
安装gcc
复制
requirements.txt
,安装依赖复制当前项目目录到镜像的工作目录
设置默认运行命令为
flask run
在Compose 文件中定义服务
创建docker-compose.yml
文件:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"复制
web服务通过Doclerfile构建镜像,然后绑定容器和主机的端口5000。
使用Compose构建并运行应用
在项目目录中,运行启动应用程序docker-compose up
。
项目目录结构如下:
$ pwd
/home/test/composetest
$ ls
app.py docker-compose.yml Dockerfile requirements.txt复制
启动并运行项目:
$ docker-compose up
Creating network "composetest_default" with the default driver
Creating composetest_web_1 ...
Creating composetest_redis_1 ...
Creating composetest_web_1
Creating composetest_redis_1 ... done
Attaching to composetest_web_1, composetest_redis_1
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
redis_1 | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 17 Aug 22:11:10.480 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
web_1 | * Restarting with stat
redis_1 | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379.
redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
web_1 | * Debugger is active!
redis_1 | 1:M 17 Aug 22:11:10.483 # Server initialized
redis_1 | 1:M 17 Aug 22:11:10.483 # 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.
web_1 | * Debugger PIN: 330-787-903
redis_1 | 1:M 17 Aug 22:11:10.483 * Ready to accept connections复制
在浏览器输入http://111.231.89.202:5000/ 可以看到程序已经启动运行,输出
Hello World! I have been seen 1 times.复制
刷新页面,数字增加。
Hello World! I have been seen 30 times.复制
此时查看镜像目录,会发现出现了刚刚构建的镜像
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
composetest_web latest 8d6cc9c12cd4 6 days ago 213 MB
docker.io/python 3.7-alpine 8922d588eec6 12 days ago 98.4 MB
docker.io/redis alpine 6f63d037b592 5 weeks ago 29.3 MB复制
查看镜像
$ docker inspect <tag or id>复制
停止服务
$ docker-compose down复制
我们已经通过Docker Compose构建了一个简单的应用程序。
接下来我们尝试对web服务添加绑定安全
添加绑定安全
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: development
redis:
image: "redis:alpine"复制
environment
设置环境变量,表示在开发模式下运行,并在更改时重新加载代码。
volumes
将主机项目目录安装到容器/code
目录,可以直接修改代码而不需要再次重新构建镜像。
重新构建
$ docker-compose up
Creating network "composetest_default" with the default driver
Creating composetest_web_1 ...
Creating composetest_redis_1 ...
Creating composetest_web_1
Creating composetest_redis_1 ... done
Attaching to composetest_web_1, composetest_redis_1
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
...复制
更新应用程序
在这里将app.py
中最后一行修改为
return 'Hello from baymux, I have been seen {} times.\n'.format(count)复制
由于我们已将程序代码安装到容器中,所以这里不需要在重新构建镜像,直接打开浏览器http://111.231.89.202:5000/,显示如下内容
Hello from baymux, I have been seen 25 times.复制
常用命令
# 后台构建应用并启动
$ docker-compose up -d
Starting composetest_redis_1 ... done
Starting composetest_web_1 ... done
# 验证启动的服务
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
composetest_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
composetest_web_1 flask run Up 0.0.0.0:5000->5000/tcp
# 停止服务
$ docker-compose stop
# 完全停止删除容器
$ docker-compose down --volumes
Stopping composetest_web_1 ... done
Stopping composetest_redis_1 ... done
Removing composetest_web_run_1 ... done
Removing composetest_web_1 ... done
Removing composetest_redis_1 ... done
Removing network composetest_default
# docker-compose run 运行一次性命令,哪些环境变量可用于 web服务
$ docker-compose run web env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=f47e2b7395a3
TERM=xterm
FLASK_ENV=development
LANG=C.UTF-8
GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D
PYTHON_VERSION=3.7.5
PYTHON_PIP_VERSION=19.3.1
PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/ffe826207a010164265d9cc807978e3604d18ca0/get-pip.py
PYTHON_GET_PIP_SHA256=b86f36cc4345ae87bfd4f10ef6b2dbfa7a872fbff70608a1e43944d283fd0eee
FLASK_APP=app.py
FLASK_RUN_HOST=0.0.0.0
HOME=/root复制
参考文档
[Overview of Docker Compose]: https://docs.docker.com/compose/