Docker-Compose容器叢集的快速編排
一、docker-compose
我們知道使用一個dockerfile模板檔案可以定義一個單獨的應用容器,如果需要定義多個容器就需要服務編排,服務編排有多種技術方案。
1.1、docker-compose簡介
docker-compose專案是docker官方的開源專案,負責實現對docker容器叢集的快速編排
docker-compose將所管理的容器分為三層,分別是工程(project),服務(service)以及容器(container)。docekr-compse執行目錄下的所有檔案(docker-compose.yml,extends檔案或環境變數檔案等)組成一個工程,若無特殊指定工程名即為當前目錄名。一個工程當中包含多個服務,每個服務中定義了容器執行的映象、引數、以來。一個服務當中可包括多個容器例項,Docker-compose並沒有解決負載均衡的問題,因此需要藉助其他工具實現服務發現及負載均衡,比如consul
dokcer-compose的工程配置檔案預設為docker-compose。yml,可通過環境變數compose_file或-f引數自定義配置檔案,其定義了多個有依賴關係的服務及每個服務執行的容器
使用一個dockerfile模板檔案,可以讓使用者很方便的定義一個單獨的應用容器。在工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如是要實現一個web專案,除了web服務容器本身,往往還需要再加上後端的資料庫服務容器,甚至還包括負載均衡容器等
conpsoe允許使用者通過一個單獨的docker-compose.yml模板檔案(yaml格式)來定義一組相關聯的應用容器為一個專案(project)
docker-compose專案由python編寫,呼叫docker服務提供的API來對容器進行管理。因此,只要所操作的平臺支援docker API,就可以在其上利用compose來進行編排管理
1.2、compose部署
docker compose環境安裝
docker compose是docker的獨立產品,因此需要安裝docker之後在單獨安裝docker compose
#下載
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-'uname -s'-'uname -m' -o /usr/local/bin/docker-compose
#安裝
chmod +x /usr/local/bin/docker-compose
#檢視版本
docker-compose --version
1.3、YAML 檔案格式及編寫注意事項
YAML是一種標記語言,它可以很直觀的展示資料序列化格式,可讀性高。類似於XML資料藐視語言,語法比XML簡單的很多。YAML資料結構通過縮排來表示,連續的專案通過減號來表示,鍵值對用冒號分割,陣列用中括號[]括起來,hash用花括號{}括起來。
使用YAML時需要注意下面事項
- 大小寫敏感
- 通過縮排表示層級關係
- 不支援製表符tab鍵縮排,只能使用空格縮排
- 縮排的空格數目不重要,只要相同層級左對齊,通常開頭縮排2個空格
- 用#號註釋
- 符號字元後縮排1個空格,如冒號、逗號、橫槓
- 如果包含特殊字元用單引號硬起來會作為普通字串處理,雙引號:特殊字元作為本身想表示的意思
1.4、docker compose配置常用欄位
欄位 | 描述 |
---|---|
build | 指定dockerfile檔名,要制定dockerfile檔案需要在build標籤的子級標籤中使用dockerfile標籤指定 |
dockerfile | 構建映象上下文路徑 |
context | 可以是dockerfile的路徑,或是指向git倉庫的url地址 |
image | 指定映象 |
command | 執行命令,覆蓋容器啟動後預設執行的命令 |
container name | 指定容器名稱,由於容器名稱是唯一的,如果指定自定義名稱,則無法scale |
deploy | 指定部署和執行服務相關配置,只能在swarm模式使用 |
environment | 新增環境變數 |
networks | 加入網路,引入頂級networks下條目 |
ports | 暴露容器埠,與-p相同,但埠不能低於60 |
volumes | 掛載一個宿主機目錄或命令捲到容器,命令卷要在頂級volumes定義卷名稱 |
volumes_from | 從另一個服務或容器掛載卷,可選引數:ro和:rw |
hsotname | 容器主機名 |
sysctls | 在容器內設定核心引數 |
links | 連線到另一個容器,-服務名稱[:服務別名] |
restart | 重啟策略,預設no,always,no-failure,unless-stoped |
- no,預設策略,在容器退出時不重啟容器
- on-failure:在容器非正常退出時(退出裝填非0),才會重啟容器
- on-failure:3:在容器非正常退出時重啟容器,最多重啟3次
- always:在容器退出時總是重啟容器
- unless-stoped:在容器退出時總是重啟容器,但是不考慮在docker守護程序啟動時就已經停止了的容器
1.5、docker compose常用命令
欄位 | 描述 |
---|---|
build | 重新構建服務 |
ps | 列出容器 |
up | 建立和啟動容器 |
exec | 在容器裡面執行命令 |
scale | 制定一個服務容器啟動數量 |
top | 顯示容器程序 |
logs | 產看容器輸出 |
down | 刪除容器、網路、資料卷和映象 |
stop/start/restart:停止/啟動/重啟服務
二、compose部署lnmp
2.1、環境準備
###nginx###
mkidr -p /opt/compose-lnmp/nginx
cd /opt/compose-lnmp/nginx
匯入相關軟體包、Dockerfile及配置檔案nginx.conf
###mysql###
mkidr -p /opt/compose-lnmp/myslq
cd /opt/compose-lnmp/mysql
匯入相關軟體包、Dockerfile及配置檔案my.cnf
###php###
mkidr -p /opt/compose-lnmp/php
cd /opt/compose-lnmp/php
匯入相關軟體包、Dockerfile及配置檔案php.ini php-fpm.conf www.conf
2.2、構建compose檔案
cd /opt/compose-lnmp #compose的工作目錄
vim docke-compose.yml #構建compose的lnmp檔案
version: '2' #版本2能使用volumes_from命令
services:
nginx: #指定服務名
hostname: nginx #指定容器主機名
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 1122:80
- 2211:443
container_name: nginx
networks:
lnmp:
ipv4_address: 172.80.0.10
volumes:
- ./nginx/html/:/usr/local/nginx/html
mysql:
hostname: mysql
build:
context: ./mysql
dockerfile: Dockerfile
ports:
- 3306:3306
container_name: mysql
networks:
lnmp:
ipv4_address: 172.80.0.20
php:
hostname: php
build:
context: ./php
dockerfile: Dockerfile
ports:
- 9000:9000
container_name: php
networks:
lnmp:
ipv4_address: 172.80.0.30
volumes_from:
- nginx
- mysql
networks:
lnmp:
driver: bridge
ipam:
config:
- subnet: 172.80.0.0/16
2.3、啟動compose搭建lnmp
cd /opt/compose-lnmp/
docker-compose -f docker-compose.yml up -d
-f --file FILE:使用特定的compose模板檔案,預設為 docker-compose.yml
-p --project-name NAME:指定專案名稱,預設使用目錄名稱
-d:在後臺執行
2.4、進入資料庫容器給與許可權
docker exec -it mysql bash
mysql #進入資料庫
create database wordpress;
grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';
grant all privileges on *.* to 'root'@'%' identified by '123456';
flush privileges;
2.5、瀏覽器訪問
http://192.168.80.13:1122/wordpress/index.php