寫在前面的話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 了。固然這都是後話,飯得一口一口得吃。