之前部署應用,須要各類環境配置,各類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 來中止服務。