容器组织服务docker-compose

序言

在使用容器的时候,我们总是要运行很多的容器,才能组成一个服务,例如当写一个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、 本文基本上属于官方文档翻译而来。

原文发布于微信公众号 - SRE运维实践(gh_319dd73ec076)

原文发表时间:2018-02-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券