之前部署应用,须要各类环境配置,各类shell操做才能搭建一套可用的服务。如今有了Docker以后,部署方式变了更加容易,不容易出现配置错误,环境不一致问题。解决了在本地环境能够运行,迁移到线上出现各类问题,这些问题大多出如今线上和本地环境有差别,配置容易出现错误等状况。那么docker-compose 和 docker 之间存在着什么联系呢?html
先来看看docker-compose 的定义: 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」
咱们知道 docker 能够经过 Dockerfile 模板文件来定义一个应用容器。实际应用中,常常遇到多个容器相配合运行一套应用程序的状况。好比,实现一个Flask应用,除了 Flask 服务自己以外,还须要一些数据库服务容器等。Compose 刚好知足了这样的需求。它容许用户经过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
经过 Docker-Compose 用户能够很容易地用一个配置文件定义一个多容器的应用,而后使用一条指令安装这个应用的全部依赖,完成构建。Docker-Compose解决了容器与容器之间如何管理编排的问题。python
镜像的定制实际上就是定制每一层所添加的配置、文件,由于 Flask 应用须要一些环境依赖才能运行起来。因此想要将 Flask 应用运行在 Docker 容器中,该容器必须将该应用全部的环境依赖安装好。而 Dockerfile 就是提供给咱们配置相关的环境依赖等操做。Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,所以每一条指令的内容,就是描述该层应当如何构建。git
下面以个人GitHub项目 flask-v2ex 应用的 Dockerfile 文件为例:github
FROM daocloud.io/python:3.5 MAINTAINER Guoweikuang <guoweikuang2015@gmail.com> RUN mkdir -p /home/guoweikuang/app WORKDIR /home/guoweikuang/app ADD ./requirements.txt /home/guoweikuang/app/requirements.txt RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt ADD . /home/guoweikuang/app CMD python manage.py runserver -h 0.0.0.0 FROM: 指定了基础镜像,以该镜像为基础,在其上进行定制操做 MAINTAINER: 用来指定镜像建立者信息 RUN: 建立了 **/home/guoweikuang/app** 文件夹 (后面 RUN pip3 安装Python扩展库) WORKDIR: 切换目录,能够屡次切换(至关于cd命令) ADD: 从本地目录相应文件拷贝到容器路径里 CMD: 设置container启动时执行的操做,运行 Flask 应用并设置host为0.0.0.0
docker-compose.yml 文件将把全部的东西关联起来。它描述了应用的构成(一个 web 服务和一个数据库)、使用的 Docker 镜像、镜像之间的链接、挂载到容器的卷,以及服务开放的端口。web
下面以个人GitHub项目 flask-v2ex 应用的 docker-compose.yml 文件为例:redis
version: '2' services: web: build: . container_name: flask_v2ex ports: - "5000:5000" redis: image: "redis:alpine"
compose 中定义了两个服务 web 和 redis。docker
web 服务shell
redis 服务数据库
在运行 docker-compose up 以前,须要作一些修改,把项目里关于redis链接配置进行修改django
r = redis.Redis(host='localhost', port=6379, decode_responses=True) 修改成: r = redis.Redis(host='redis', port=6379, decode_responses=True)
在flask-v2ex 项目的根目录下使用 docker-compose up 命令,以下所示:
$ docker-compose up Starting flask_v2ex ... done Starting flask_v2ex_redis_1 ... done Attaching to flask_v2ex_redis_1, flask_v2ex redis_1 | 1:C 01 Jul 07:46:52.053 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo redis_1 | 1:C 01 Jul 07:46:52.053 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=1, just started redis_1 | 1:C 01 Jul 07:46:52.053 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf redis_1 | 1:M 01 Jul 07:46:52.064 * Running mode=standalone, port=6379. redis_1 | 1:M 01 Jul 07:46:52.064 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. redis_1 | 1:M 01 Jul 07:46:52.064 # Server initialized redis_1 | 1:M 01 Jul 07:46:52.065 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. redis_1 | 1:M 01 Jul 07:46:52.065 * DB loaded from disk: 0.000 seconds redis_1 | 1:M 01 Jul 07:46:52.065 * Ready to accept connections flask_v2ex | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) flask_v2ex | * Restarting with stat flask_v2ex | * Debugger is active! flask_v2ex | * Debugger PIN: 742-073-002
能够看到 Docker 守护进程里监听着 5000 端口了。能够经过http://localhost:5000 访问 Flask 应用。
$ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------ flask_v2ex /bin/sh -c python manage.p ... Up 0.0.0.0:5000->5000/tcp flask_v2ex_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
$ docker-compose run web env PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=e4b6b17f39dc TERM=xterm LANG=C.UTF-8 GPG_KEY=97FC712E4C024BBEA48A61ED3A5CA953F73C700D PYTHON_VERSION=3.5.4 PYTHON_PIP_VERSION=9.0.1 HOME=/root
若是须要中止已经运行中的服务,能够经过ctrl + c 或者 docker-compose stop 来中止服务。