1. Dockerfile使用总结
  2. AuthorLiNing

创建一个容器,我们可以通过Dockerfile模板文件对镜像进行创建并按照配置要求启动。然而,一般项目往往需要多个容器相互配合才能完成某项任务,比如说在一个web项目中,除了web服务容器,往往还需要后端的数据库服务容器,甚至还需要负载均衡容器等。如何有效地做好容器之间的编排,是Docker Compose要做的内容。

Docker Compose是定义和运行多个Docker容器的工具,它主要管理一个项目(project),这个项目是由一组关联的应用容器组成的一个完整业务单元,而每个应用容器则对应一个服务(service),当然服务可能只包含一个容器(container)实例,也可能包括若干运行相同镜像的容器(container)实例。

Docker Compose的核心就在于“一个文件”“一条命令”。所谓“一个文件”,是指docker-compose.yml,在这个文件中我们可以进行项目的配置,包括服务的定义。而“一条命令”则指,我们只需要类似docker-compose up这样简单的命令即可管理项目。其他帮助和命令,我们可以通过docker-compose -h进行查询。

image

image

为了更好地理解docker-compose如何进行容器编排,下面运行一个python web应用,其中web框架基于flask,计数器基于redis。

我们要实现的效果就是,每访问一次web服务网址,计数器对应加1。

创建项目目录

如果在启动项目时,如果没有指定具体的项目名称,则项目所在的目录名作为默认的项目名称。

  1. mkdir composetest
  2. cd composetest

使用Dockerfile定义镜像配置

在composetest目录下,创建3个文件,内容依次为:

app.py

  1. #coding: utf-8
  2. from flask import Flask
  3. from redis import Redis
  4. app = Flask(__name__)
  5. redis = Redis(host='redis', port=6379) # ''中的redis对应服务名
  6. @app.route('/')
  7. def hello():
  8. count = redis.incr('hits')
  9. return 'Hello World! I have been seen {} times.\n'.format(count)
  10. if __name__ == "__main__":
  11. app.run(host="0.0.0.0", debug=True)

requirements.txt

  1. flask
  2. redis

Dockefile

  1. FROM python:2.7
  2. ADD . /code
  3. WORKDIR /code
  4. RUN pip install -r requirements.txt
  5. CMD ["python", "app.py"]

这样,我们定义了web服务镜像的配置。在第一次启动项目的时候,docker-compose会使用Dockerfile创建一个名为composetest_web的镜像。

使用Docker Compose来管理项目

定义项目配置文件docker-compose.yml

在composetest目录下,创建docker-compose.yml,内容为:

  1. version: '3'
  2. services:
  3. web:
  4. build: .
  5. ports:
  6. - "5000:5000"
  7. volumes:
  8. - .:/code
  9. redis:
  10. image: redis

docker-compose.yml中定义了web和redis服务,对于web服务:

  1. build 在当前目录从Dockerfile创建一个镜像
  2. ports 端口映射,开放容器5000端口映射到宿主机5000端口
  3. volumes 挂载数据卷,挂载容器目录/code对应到宿主机当前目录

image

此时我们需要的文件都准备好了,开始启动项目:

  1. docker-compose up

image

此时我们可以通过浏览器访问对应的 http://ip:5000 地址,如果在服务本地访问,则对应 http://localhost:5000

image

可以看到每访问一次web服务地址,计数器对应加1。如果要更新应用,因为挂载了数据卷,只需修改app.py保存即可。

使用容器互联

除了使用docker-compose来进行容器编排,如果情况不太复杂,我们也可以使用容器互联的手段实现项目需求。容器互联要求针对多个容器,分别按顺序启动并指明依赖关系,也就是利用好“—link”这个参数。

同样,在composetest目录下,先启动redis服务容器:

  1. docker run -d --name redis redis

创建web服务镜像:

  1. docker build -t dockerfile_web .

通过查看镜像,可以看到生成的dockerfile_web镜像,在docker-compose.yml中定义的服务依赖的镜像也已经具备了,如composetest_web。由于dockerfile_web和composetest_web镜像都是由同一个Dockerfile模板文件生成的,本质上它们是一样的。

image

启动web服务容器,并关联redis服务容器:

  1. docker run --name web -p 5000:5000 -v $(pwd):/code --link redis:webredis dockerfile_web

这样也能得到同样的效果,但是,对于复杂的容器编排情况,还是乖乖地使用docker-compose等利器吧。