【08】按部就班學 docker:docker compose

寫在前面的話python

 

在以前的操做中,即便是單個容器每次都須要敲很長的命令,當須要多個容器組合着用的時候更加麻煩,此時咱們急需找到一種一次配置,隨便運行的方法。mysql

這就是這一節重點,單機容器編排工具:docker-compose。git

 

 

安裝使用 docker-composegithub

 

官方文檔以下:web

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

安裝 docker-compose,其實就是一個腳本:sql

# 下載腳本和修改權限
curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 查看結果
docker-compose --version

在 docker-compose 中,最重要的就是 docker-compose.yml 文件。該文件指明瞭有哪些容器,運行規則是怎樣。docker

在 docker-compose.yml 中,最重要的幾個概念:數據庫

services:在該項下面的每一項就表明着一個容器。flask

networks:定義了容器會用到哪些網絡。

volumes:定義了容器持久化規則。

另外,docker-compose.yml 文件是有版本概念的,推薦目前最新的 3 版本,不然可能出現不兼容的狀況,如下是以前 Wordpress 服務的 docker-compose.yml 文件,先看後寫:

老規矩,仍是先刪除全部的容器和全部的 volume:

docker container rm -f $(docker ps -aq)
docker volume rm $(docker volume ls -q)

 

而後編輯 docker-compose.yml 文件:

version: '3'

services:
  
  wordpress-db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
    volumes:
      - wordpress-data:/var/lib/mysql
    networks:
      - my-network

  wordpress-web:
    image: wordpress
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: wordpress-db
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: 123456
      WORDPRESS_DN_NAME: wordpress
    networks:
      - my-network

volumes:
  wordpress-data:

networks:
  my-network:
    driver: bridge

配置文件說明:

關鍵字 說明
容器名字 指定容器名稱,全部的操做都應該隸屬於這個名稱之下,這裏給 MySQL 容器命名爲 wordpress-db。
image 指定鏡像,若是不是最新版,能夠跟上版本號,和 docker 命令運行規則同樣。
ports

端口映射,值得注意,在配置中,端口映射,數據卷,網絡都是能夠存在多個的,因此這些單詞都是複數,

如 networks,volumes。其值的寫法也和其餘項不一樣,須要在前面加一個 - 符號,由於值是一個字符串。

因此在 : 以後絕對不能有空格,不然會報錯。

volumes 持久化操做。
networks 指定使用的網絡,至關於 --networks 參數。
environment 環境變量參數,能夠多個,換行寫
頂級 volumes 單獨聲明咱們上面持久化的卷的名稱。
頂級 networks 設置須要的網絡,並指定該網絡的 driver。若是該網絡不存在,在執行的時候會自動建立。

 

 啓動容器:

docker-compose -f docker-compose.yml up -d

使用 -f 參數加配置名字配上 up 啓動,若是在當前目錄,且名字就是 docker-compose.yml 就能夠省略 -f 參數,-d 是爲了後臺啓動,若是處於調試階段,爲了方便看日誌,能夠不加 -d 參數,可是會直接輸出日誌,ctrl + C 就會讓全部容器都退出。

啓動結果:

訪問測試:

 

其餘經常使用的命令:

# 查看有哪些容器
docker-compose -f docker-compose.yml ps

# 中止全部容器
docker-compose -f docker-compose.yml stop 

# 啓動全部容器
docker-compose -f docker-compose.yml start

# 中止並刪除全部容器
docker-compose -f docker-compose.yml down

 

直接查看容器:

能夠發現,容器的名稱並非以前所定義的容器名字,而是由一系列的組合而成,但在鏈接數據庫的時候又不會有問題。

這樣的好處能夠經過以後的一個實踐項目測試一下。

 

 

docker-compose 負載均衡實戰

 

這個實戰的項目的代碼就是以前的 Flask redis 的代碼:app.py

from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route(
'/') def hello(): redis.incr('hits') return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname()) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=True)

 

Dockerfile 文件:

FROM python:2.7
LABEL maintainer="Dylan <1214966109@qq.com>"
COPY app.py /app/
RUN pip install flask && pip install redis
WORKDIR /app/
EXPOSE 5000
CMD ["python", "app.py"]

 

編寫 docker-compose.yml 文件:

version: '3'

services:

  redis-demo:
    image: redis

  flask-demo:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      REDIS_HOST: redis-demo
    
  load-balance-demo:
    image: dockercloud/haproxy
    links:
      - flask-demo
    ports:
      - 8888:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

這裏用到了一個新的鏡像 dockercloud/haproxy,用於製做負載均衡,使用 links 直接將 80 端口代理到容器 flask-demo 的端口上,而不是 ports 映射。 

ports 映射最終被用於將 haproxy 的 80 端口映射到外部。

簡單的示意圖:

 

同時,因爲這裏並非公有鏡像,而是 Dockerfile 構建的,全部在 dlask-demo 中也告訴你們一種新的構建方式。

這裏將 flask-demo 啓動多個節點

docker-compose -f docker-compose.yml up --scale flask-demo=3 -d

注意,這裏全部的額外參數都須要放在 up 以後命令才能執行~ 

查看啓動結果:

能夠看到 flask-demo 容器啓動 3 個,並實現了負載均衡。訪問測試:

 

 

小結

 

docker-compose 在單機部署的時候會用到,並且如今不少開源項目的部署方式其實採用的也是 docker-compose 的方式。

這種方法須要瞭解。可是在工做中可能更多的是多主機,集羣的形式。這個時候 docker-compose 就有些限制了。

至於這樣的需求怎麼實現,就得依靠以後的容器編排工具 docker swarm 甚至更牛逼的 K8S 了。固然這都是後話,飯得一口一口得吃。

相關文章
相關標籤/搜索