众所周知,一个大型的Docker容器组成的微服务应用中,容器的数量是非常巨大的,如果依赖传统的人工配置方式进行维护,对于开发和运维来说简直就是噩梦。docker-compose的出现正是为了解决这个问题。
docker-compose是一个用于定义和运行多容器Docker应用的工具,只需要一个Compose的配置文件和一个简单的命令就可以创建并运行应用所需的所有容器。在配置文件中,所有容器通过services来定义,并使用docker-compose命令启动或停止容器以及所有依赖容器。
如何安装请参照这篇文章:在Centos7.6上部署Docker环境以及安装docker-compose
我们的目标是:在docker容器内部创建一个基于tornado的web应用服务
需要注意一点,在 Docker 中有一个由官方提供的中央镜像仓库,不过,由于众所周知的原因,有时它除了慢的可怜以外,还经常莫名其妙的完全无法访问。
在 Linux 环境下,我们可以通过修改 /etc/docker/daemon.json ( 如果文件不存在,你可以直接创建它 ) 这个 Docker 服务的配置文件达到效果,从而将国外的源转向国内,使下载速度和效率提高。
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
然后重启docker,令其生效:
sudo systemctl restart docker
首先需要一个文件夹作为项目文件夹:
mkdir composetest
cd composetest
在项目文件夹下创建一个app.py:
from tornado.web import RequestHandler
import tornado.ioloop
import tornado.web
class IndexHandler(RequestHandler):
def get(self):
self.write('hello world')
def make_app():
return tornado.web.Application(handlers=[
(r'/', IndexHandler)
],debug=True)
if __name__ == '__main__':
app = make_app()
app.listen(8000)
tornado.ioloop.IOLoop.current().start()
在项目文件夹下创建一个requirements.txt的文件,这是你的web项目依赖,这里我们只需要一个tornado
tornado==5.1.1
到此,我们已经完成了新建项目,编码,添加依赖等工作
下面我们创建一个Dockerfile文件用于构建Docker镜像,该镜像包含了运行该Web应用的所有依赖,包括Python运行环境。
在项目文件夹下创建一个Dockerfile文件
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
上面的命令的意思是:
使用python-3.4-alpine作为基础镜像
将当前目录添加到镜像中/code目录下
将/code设置为工作目录
安装Python依赖
设置默认执行命令
在项目文件夹下创建一个docker-compose.yml文件
version: '2.0'
services:
web:
build: .
ports:
- "8000:8000"
volumes:
- .:/code
该配置文件中包含一个services,即web服务。web会使用当前目录中的Dockerfile文件构建镜像,并将容器的8000端口暴露给主机,然后将项目文件夹挂载到容器中的/code目录下
至此,所有配置都已经弄好了,项目结构如下:
执行命令运行容器,则docker-compose将会根据docker-file所写的脚本一键构建web应用的镜像以及启动容器
sudo docker-compose up
此时,访问localhost:8000
说明我们构建的镜像已经运行起来,如此一来,我们只需要关注代码逻辑的编写,而不用考虑环境的搭建了,环境只需要依赖docker帮我们做就好了。
上面提到的Componse使用命令构建并启动容器,是以前台的方式启动的,如果希望以后台启动,可以添加参数-d,比如下面这样
sudo docker-compose up -d
而且可以查看目前正在运行的容器,有点类似docker-ps
docker-compose ps
如果使用sudo docker-compose up -d命令以后台方式启动,可以用docker-compose stop命令停止。docker-compose down 命令可以停止容器并将其删除。
有关Compose的更多命令,可以通过sudo docker-compose --help查看
可以发现,docker-compose将docker run命令整合到了一个docker-compose.yml配置文件中,对于大型Docker集群的管理是很方便的,例可以将多个service组合成更复杂的service组,为每个service指定不同的Dockerfile,然后把它们link在一起。