序言
在使用容器的时候,我们总是要运行很多的容器,才能组成一个服务,例如当写一个python程序的时候,使用了redis,那么就要运行两个容器,两个容器的之间的数据交互使用link进行连接,而在一台主机上,每次新建一个环境,都要进行docker run然后一大堆参数,对于记忆来说,是一种挑战。
docker-compose是一种用来运行所有有依赖关系的容器的工具,使用一个命令即可运行所有的服务,运行多个容器,而配置文件则只有一个。
安装docer-compose
安装docker-compose很简单,只要几条指令即可,如下所示:
[root@docker2 ~]# curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose(下载docker-compose的执行文件)
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 617 0 617 0 0 471 0 --:--:-- 0:00:01 --:--:-- 473
100 8288k 100 8288k 0 0 322k 0 0:00:25 0:00:25 --:--:-- 805k
[root@docker2 ~]# chmod +x /usr/local/bin/docker-compose (修改执行权限)
[root@docker2 ~]# docker-compose --version(查看版本信息,验证安装成功)
docker-compose version 1.19.0, build 9e633ef
使用docker-compose来运行服务
总体架构如下所示:
1、 写flask简单服务
主要就是当访问根目录的时候,会显示访问的次数,而此数据记录在redis的容器中。
[root@docker2 kel]# cat app.py
mport 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)
2、 python程序的依赖文件
主要是提供flask相关的依赖程序包。
[root@docker2 kel]# cat requirements.txt
flask
redis
3、 书写dockerfile
主要就是用来生成image镜像。
[root@docker2 kel]# cat Dockerfile
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
4、 书写docker-compose.yml配置文件
主要就是提供相关的配置来运行容器。
[root@docker2 kel]# cat docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
5、 启动测试
查看生成的目录如下:
在启动的时候,只要一条指令就好了,如下:
[root@docker2 kel]# docker-compose up
在这个步骤中,会进行编译dockerfile成image文件,然后创建相关的容器,创建网络,最后运行容器提供服务。
[root@docker2 kel]# docker-compose ps(查看运行中的服务)
Name Command State Ports
-----------------------------------------------------------------------------
kel_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
kel_web_1 python app.py Up 0.0.0.0:5000->5000/tcp
[root@docker2 kel]# curl http://localhost:5000(访问进行测试)
Hello World! I have been seen 1 times.
[root@docker2 kel]# curl http://localhost:5000(访问的时候,数字发生变化,说明已经将相关的数据存储到redis之中)
Hello World! I have been seen 2 times.
6、 需要注意的问题
在docker-compose up之后,如果出现错误,修改了相关的源文件之后,必须进行重新编译,如下:
[root@docker2 kel]# docker-compose down(删除出现错误的容器)
Removing kel_web_1 ... done
Removing kel_redis_1 ... done
Removing network kel_default
[root@docker2 kel]# docker-compose build(重新编译服务)
7、 改进
在开发环境中,如果每次修改了代码,那么每次都要重新进行build,从而可以使用volume进行挂载使用,只要修改docker-compose的配置文件即可,如下:
[root@docker2 kel]# cat docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: "redis:alpine"
然后重新进行build,然后up即可,那么每次修改代码app.py之后,都不用进行重新编译,只要进行测试就OK了。
总结
1、 docker-compose的出现,让运行一个完整的服务变的很简单,只要写一个配置就好了,其他的工作docker-compose会帮你做完。
2、 docker-compose是用python写的,而我。。。并没有看源代码,我写不出来。。。我很忧伤。。。
3、 本文基本上属于官方文档翻译而来。