Docker Compose
Docker Compose是官方開源的一個Docker容器編排軟件,定位于將多個容器編排在起義行程一組服務。
關鍵概念
項目
通過compose生成的一組服務我們稱之為項目,項目一般由多個容器組成,共享生命周期。
安裝
// 直接通過下載compose的執行文件即可
sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
// 下載完成后,進行授權即可使用
sudo chmod +x /usr/local/bin/docker-compose
// 查看一下版本,輸出以下內容則說明安裝成功
docker-compose version 1.18.0, build 8dd22a9
docker-py version: 2.6.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t 3 May 2016
使用
首先來一個簡單的例子
// 創建一個新目錄
cd /var/local
// 創建compose的目錄
mkdir tomcat_compose
// 創建compose的生成文件
touch docker-compose.yml
// 進入docker-compose.yml,寫入以下內容
version: '3'
services:
web:
image: "tomcat"
ports:
- "33338:8080"
// 保存文件后,執行docker-compose up運行案例
docker-compose up
// 然后docker-compose就會開始構建你的項目了
// 構建輸出...
// 構建完成后,訪問33338端口可以看到輸出信息
可以看的出來,其實docker-compose是另一種方式的docker容器構建方式。
別人給的一個例子
- 創建一個app.py文件
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! 該頁面已被訪問 {} 次。\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
- 創建一個Dockerfile文件
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]
- 創建一個docker-compose.yml文件
version: '3' // 注意,這里的3是指docker-compose識別的yml格式,一般用3就可以了
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- redis
redis:
image: "redis:alpine"
注意,yml文件里面的縮進為2個空格
- 執行docker-compose up構建
// 構建輸出
- 構建完成后,訪問 ip:5000,返回 Hello World! 該頁面已被訪問 N 次。
從docker-compose.yml的結構上看出,這里用了兩個鏡像來實現這組服務,APP中調用了redis的自增命令來實現計數。
==另外有一個沒有說到的點是,compose會把這兩個容器放置到一個網絡中,所以web端是可以請求到redis的。==
// 查詢一下生成的兩個容器
docker ps | grep compose01
// 輸出
ID ... NAMES
82731293d9de ... compose01_web_1
8d9d8b80de9f ... compose01_redis_1
// 查詢一下先有docker網絡
docker network ls | grep compose01 // 這個compose01是我構建時的目錄
// 輸出
1f38316baee8 compose01_default bridge local
// 查詢web的網絡
docker inspect compose01_web_1
// 輸出
...
"Networks": {
"compose01_default": {
...
// 查詢redis的網絡
docker inspect compose01_redis_1
// 輸出
...
"Networks": {
"compose01_default": {
...
由此看出兩容器使用的網絡相同,驗證上面的結論。
wordpress案例
創建wordpress的目錄,然后創建docker-compose.yml文件,運行docker-compose up命令,然后訪問就可以看到wordpress的安裝頁面了。
version: "3"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
刪除項目
在compose的構建目錄下直接運行 docker-compose rm即可生成的項目
compose命令詳解
docker-compose的支持了docker的大部分命令,其使用方式也大同小異,具體可以看這里。https://yeasy.gitbooks.io/docker_practice/content/compose/commands.html#rm
compose模板命令詳解
這里指的是寫在yml里面的命令,詳見:https://yeasy.gitbooks.io/docker_practice/content/compose/compose_file.html