1. 程式人生 > 其它 >Docker-Compose容器叢集的快速編排

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
  1. no,預設策略,在容器退出時不重啟容器
  2. on-failure:在容器非正常退出時(退出裝填非0),才會重啟容器
  3. on-failure:3:在容器非正常退出時重啟容器,最多重啟3次
  4. always:在容器退出時總是重啟容器
  5. 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