背景
??以前部署應用,需要各種環境配置,各種shell操作才能搭建一套可用的服務。現在有了Docker之后,部署方式變了更加容易,不容易出現配置錯誤,環境不一致問題。解決了在本地環境可以運行,遷移到線上出現各種問題,這些問題大多出現在線上和本地環境有差異,配置容易出現錯誤等情況。那么docker-compose 和 docker 之間存在著什么聯系呢?
先來看看docker-compose 的定義:
「定義和運行多個 Docker 容器的應用(Defining and running multi-container Docker applications)」
??我們知道 docker 可以通過 Dockerfile 模板文件來定義一個應用容器。實際應用中,經常遇到多個容器相配合運行一套應用程序的情況。比如,實現一個Flask應用,除了 Flask 服務本身之外,還需要一些數據庫服務容器等。Compose 恰好滿足了這樣的需求。它允許用戶通過一個單獨的 docker-compose.yml 模板文件(YAML 格式)來定義一組相關聯的應用容器為一個項目(project)。
??通過 Docker-Compose 用戶可以很容易地用一個配置文件定義一個多容器的應用,然后使用一條指令安裝這個應用的所有依賴,完成構建。Docker-Compose解決了容器與容器之間如何管理編排的問題。
實施步驟
使用 Dockerfile 定制鏡像
??鏡像的定制實際上就是定制每一層所添加的配置、文件,因為 Flask 應用需要一些環境依賴才能運行起來。所以想要將 Flask 應用運行在 Docker 容器中,該容器必須將該應用所有的環境依賴安裝好。而 Dockerfile 就是提供給我們配置相關的環境依賴等操作。Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
下面以我的GitHub項目 flask-v2ex 應用的 Dockerfile 文件為例:
FROM daocloud.io/python:3.5MAINTAINER 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.0FROM: 指定了基礎鏡像,以該鏡像為基礎,在其上進行定制操作
MAINTAINER: 用來指定鏡像創建者信息
RUN: 創建了 **/home/guoweikuang/app** 文件夾 (后面 RUN pip3 安裝Python擴展庫)
WORKDIR: 切換目錄,可以多次切換(相當于cd命令)
ADD: 從本地目錄相應文件拷貝到容器路徑里
CMD: 設置container啟動時執行的操作,運行 Flask 應用并設置host為0.0.0.0
編寫 docker-compose.yml 文件
docker-compose.yml 文件將把所有的東西關聯起來。它描述了應用的構成(一個 web 服務和一個數據庫)、使用的 Docker 鏡像、鏡像之間的連接、掛載到容器的卷,以及服務開放的端口。
下面以我的GitHub項目 flask-v2ex 應用的 docker-compose.yml 文件為例:
version: '2'services:web:build: .container_name: flask_v2exports:- "5000:5000"redis:image: "redis:alpine"
compose 中定義了兩個服務 web 和 redis。
-
web 服務
- build: 使用當前目錄的 Dockerfile build 的鏡像
- ports: 映射宿主機 5000 端口到容器的 5000 端口
- container_name: 指定了容器的名字
-
redis 服務
- image: 使用 Docker Hub 中的 redis 鏡像
使用 compose 構建并運行 Flask 應用
在運行 docker-compose up 之前,需要做一些修改,把項目里關于redis連接配置進行修改
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 upStarting 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 使用
- docker-compose up -d : 后臺運行
- docker-compose stop: 停止正在運行的服務
- docker-compose down: 關閉所有容器并刪除,默認保留 數據卷
- docker-compose ps:列出當前運行的服務狀態和相關信息
$ docker-compose psName 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 服務的環境變量:
$ 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 來停止服務。
參考
Docker從入門到實踐 --實戰Django
使用Dockerfile構建Docker鏡像