1. 程式人生 > >DOCKER 學習筆記4 認識DockerCompose 多容器編排

DOCKER 學習筆記4 認識DockerCompose 多容器編排

前言

通過上一節的學習,學會了如何在Linux 環境下搭建Docker並且部署Springboot 專案,並且成功的跑了起來,當然,在生產環境中,不只是需要一個後端的Web 專案,還需要比如 Nginx 作為反向代理。資料庫也需要單獨部署在一個容器裡面,要是我們像之前學過的那樣一個個部署,那豈不是很麻煩。

所以,我們需要一套東西來幫助我們實現這個功能,那就是今天要學習的Docker Compose 容器編排技術。

Docker Compose

Docker Compose 用於定義和執行多容器Docker應用程式的工具,通過YAML檔案來定義應用程式裡面的服務。而後,通過一個命令,即可啟動這些容器所產生的服務。

基本步驟:

  1. 定義 Dockerfile 自定義映象
  2. 編輯 docker-compose.yml 進行容器服務的編排
  3. docker-compose up 建立和啟動容器服務

安裝 Compose

Github 安裝

從github 拉取最新版本的Compose 本地編譯安裝。推薦方式,錯誤少,可直接安裝。

github https://github.com/docker/compose/releases

當前Github 最新版本為 1.25.4

## 下載最新版的Docker Compose 二進位制包
curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

## 賦予可執行許可權
chmod +x /usr/local/bin/docker-compose

## 檢查版本資訊
docker-compose -v

pip 安裝

這是種比較保守的安裝方法,相較於上面的安裝方法,建議還是採用上面的安裝方法。

## 安裝epel 額外的源
yum -y install epel-release

## 安裝python-pip
yum -y install python-pip

## 更新pip 到最新版本
pip install -U pip

## install
pip install docker-componse

## 檢查安裝情況
docker-compose -v

測試使用

確保我們已經正常的安裝了Docker Compose,我們將採用官網的DEMO 進行演示,在此,你不需要安裝Python 以及Redis

1. 建立目錄


mkdir -p composetest

cd composetest

2. 建立一個pyton web


## 建立app.py
vi app.py

## 複製以下內容到檔案內儲存退出

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)


def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)


@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)


## 建立一個檔案用於儲存命令
vi requirements.txt

## 儲存以下內容
flask
redis

自定義映象


## 建立新的Dockerfile 
vi Dockerfile

## 加入以下內容

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

這告訴Docker:

從Python 3.7映像開始構建映像。
將工作目錄設定為。/code
設定命令使用的環境變數。flask
安裝gcc,以便諸如MarkupSafe和SQLAlchemy之類的Python包可以編譯加速。
複製並安裝Python依賴項。requirements.txt
將專案中的當前目錄複製到映像中的工作目錄。..
將容器的預設命令設定為。flask run

撰寫容器編排


## 建立docker-compose.yml 檔案
vi docker-compose.yml

## 加入以下內容

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

網路服務

該web服務使用從Dockerfile當前目錄中構建的映像。然後,它將容器和主機繫結到暴露的埠5000。此示例服務使用Flask Web伺服器的預設埠5000。

Redis服務

該redis服務使用 從Docker Hub登錄檔中提取的公共Redis映像。

執行服務

docker-compose up

Starting composetest_redis_1 ... done
Recreating composetest_web_1 ... done
Attaching to composetest_redis_1, composetest_web_1
redis_1  | 1:C 09 Feb 2020 02:14:31.462 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 09 Feb 2020 02:14:31.462 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 09 Feb 2020 02:14:31.462 # 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 09 Feb 2020 02:14:31.463 * Running mode=standalone, port=6379.
redis_1  | 1:M 09 Feb 2020 02:14:31.463 # 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 09 Feb 2020 02:14:31.463 # Server initialized
redis_1  | 1:M 09 Feb 2020 02:14:31.463 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1  | 1:M 09 Feb 2020 02:14:31.463 # 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 09 Feb 2020 02:14:31.463 * DB loaded from disk: 0.000 seconds
redis_1  | 1:M 09 Feb 2020 02:14:31.463 * Ready to accept connections
web_1    |  * Serving Flask app "app.py"
web_1    |  * Environment: production
web_1    |    WARNING: This is a development server. Do not use it in a production deployment.
web_1    |    Use a production WSGI server instead.
web_1    |  * Debug mode: off
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

服務成功的執行在5000埠下,訪問嘗試,而後重新整理,觀察計數器的變化!

常用命令

docker-compose up -d 後臺執行服務

[root@mrclinux composetest]# docker-compose up -d
Starting composetest_web_1   ... done
Starting composetest_redis_1 ... done

docker-compose ps 檢視當前的執行容器

[root@mrclinux composetest]# docker-compose ps
       Name                      Command               State           Ports         
-------------------------------------------------------------------------------------
composetest_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp              
composetest_web_1     flask run                        Up      0.0.0.0:8080->5000/tcp

docker-compose images 檢視已存在的映象資訊

[root@mrclinux composetest]# docker-compose images
     Container          Repository       Tag       Image Id       Size  
------------------------------------------------------------------------
composetest_redis_1   docker.io/redis   alpine   b68707e68547   29.78 MB
composetest_web_1     composetest_web   latest   0a812986cca6   221.8 MB

docker-compose stop 用來停止容器,不刪除它,可以再次使用start啟用

[root@mrclinux composetest]# docker-compose stop
Stopping composetest_web_1   ... done
Stopping composetest_redis_1 ... done

docker-compose start 使用start 啟動存在的容器服務

[root@mrclinux composetest]# docker-compose start
Starting web   ... done
Starting redis ... done

docker-compose down 停止服務並且移除容器


[root@mrclinux composetest]# docker-compose down
Stopping composetest_web_1   ... done
Stopping composetest_redis_1 ... done
Removing composetest_web_1   ... done
Removing composetest_redis_1 ... done
Removing network composetest_default

docker-compose up 建立以及啟動服務

參考

https://docs.docker.com/compose/

https://www.cnblogs.com/ityouknow/p/8648467.h