文章目录
Docker Compose
是一个可以定义和运行多个docker应用的工具,你可以使用yaml文件来配置你的应用服务。只需执行简单的一个命令就可以从配置中创建并启动所有服务。
Compose 适用于所有环境:生产、持续集成、开发、测试以及CI工作流
使用三步骤:
-
需要安装docker ,以便使用Dockerfile 进行多次运行
-
在docker-compose中定义组成应用程序的服务。这样它们就可以在一个隔离的环境中一起运行。
-
运行
docker-compose up
启动你所有的应用
下面进入正题: 如何安装并部署一个简单的应用
Install Docker Compose(linux)
安装Docker Compose 必须先安装 docker,详情可以参考Get Started with Docker
# 下载
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 授权
sudo chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose --version
看到版本信息说明安装成功
[root@localhost composetest]# docker-compose --version
docker-compose version 1.23.2, build 1110ad01
构建一个简单的应用
参照官网compose-demo
先创建项目路径composetest
$ mkdir composetest
$ cd composetest
1 构建python应用
创建一个名为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)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
文件内容大致是:设置redis默认端口6379 主机为本机,启动后连接redis并执行hello(),将访问次数输出到页面。
2 构建Dockerfile文件
在项目路径下创建Dockerfile
,内容如下
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
大致意思就是:
- 使用基础镜像 Python 3.4
- 将当前目录映射到镜像/code目录下
- 设置工作目录为 /code
- 安装 Python 依赖包
- 启动 app.py 程序
其中有个坑,使用python-3.4构建是会报错
Fatal Python error: getentropy() failed
ERROR: Service 'web' failed to build: The command '/bin/sh -c pip install -r requirements.txt' returned a non-zero code: 139
修改python版本为python-3.5即可
3 构建docker-compose.yml 文件
在当前目录下创建docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
Compose定义了两个服务一个web 一个redis
- 构建web应用,从当前目录下的Dockerfile 构建,并开放5000端口
- 使用官方redis 镜像库,默认端口6379
这样就可以实现python脚本中的访问6379,hits加一。
4 运行并构建docker compose
执行 docker-compose up
Building web
Step 1/5 : FROM python:3.4-alpine3.8
3.4-alpine3.8: Pulling from library/python
c87736221ed0: Pull complete
c3f51b0d0765: Pull complete
e919dffdee54: Pull complete
f0766e77b512: Pull complete
bcf776216162: Pull complete
Digest: sha256:e88f2ce19bcabb986adb3a87b5effc7eaf5900b8d6049ffb85ca3dd59df0c466
Status: Downloaded newer image for python:3.4-alpine3.8
---> f6d3872c2a66
Step 2/5 : ADD . /code
---> 7a4e55428219
...
Creating composetest_redis_1 ... done
Creating composetest_web_1 ... done
Attaching to composetest_web_1, composetest_redis_1
访问http://192.168.124.16:5000/
5 修改compose.yml 并添加挂载
针对web服务添加绑定
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: "redis:alpine"
6 重启docker-compose
[root@localhost composetest]# docker-compose restart
Recreating composetest_web_1 ... done
Starting composetest_redis_1 ... done
Attaching to composetest_redis_1, composetest_web_1
redis_1 | 1:C 21 Mar 2019 02:38:38.862 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 21 Mar 2019 02:38:38.862 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 21 Mar 2019 02:38:38.862 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
7 修改应用配置
修改app.py 的返回信息
return 'Hello Chen! I have been seen {} times.\n'.format(count)
再次访问
8 Docker Compose 常用命令
构建建启动nignx容器
docker-compose up -d nginx
登录到nginx容器中
docker-compose exec nginx bash
删除所有nginx容器,镜像
docker-compose down
显示所有容器
docker-compose ps
重新启动nginx容器
docker-compose restart nginx
在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器
docker-compose run --no-deps --rm php-fpm php -v
构建镜像
docker-compose build nginx
不带缓存的构建
docker-compose build --no-cache nginx
查看nginx的日志
docker-compose logs nginx
查看nginx的实时日志
docker-compose logs -f nginx
验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。
docker-compose config -q
以json的形式输出nginx的docker日志
docker-compose events --json nginx
暂停nignx容器
docker-compose pause nginx
恢复ningx容器
docker-compose unpause nginx
删除容器(删除前必须关闭容器)
docker-compose rm nginx
停止nignx容器
docker-compose stop nginx
启动nignx容器
docker-compose start nginx
参考文档
Docker Compose官方安装
Docker-Compose 官方命令大全
docker-compose v3版本命令参考
Not matter of the today will drag tomorrow!