1、Docker-Compose介紹
Docker-Compose項目是Docker官方的開源項目,負責實現對Docker容器集羣的快速編排。
Docker-Compose將所管理的容器分爲三層,分別是工程(project),服務(service)以及容器(container)。Docker-Compose運行目錄下的所有文件(docker-compose.yml,extends文件或環境變量文件等)組成一個工程,若無特殊指定工程名即爲當前目錄名。一個工程當中可包含多個服務,每個服務中定義了容器運行的鏡像,參數,依賴。一個服務當中可包括多個容器實例,Docker-Compose並沒有解決負載均衡的問題,因此需要藉助其它工具實現服務發現及負載均衡。
Docker-Compose的工程配置文件默認爲docker-compose.yml,可通過環境變量COMPOSE_FILE或-f參數自定義配置文件,其定義了多個有依賴關係的服務及每個服務運行的容器。
使用一個Dockerfile模板文件,可以讓用戶很方便的定義一個單獨的應用容器。在工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現一個Web項目,除了Web服務容器本身,往往還需要再加上後端的數據庫服務容器,甚至還包括負載均衡容器等。
Compose允許用戶通過一個單獨的docker-compose.yml模板文件(YAML 格式)來定義一組相關聯的應用容器爲一個項目(project)。
Docker-Compose項目由Python編寫,調用Docker服務提供的API來對容器進行管理。因此,只要所操作的平臺支持Docker API,就可以在其上利用Compose來進行編排管理。
2、Docker-Compose安裝
安裝方法一:
下載Docker-Compose:
sudo curl -L https://github.com/docker/compose/releases/download/1.23.0-rc3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
安裝Docker-Compose:sudo chmod +x /usr/local/bin/docker-compose
查看版本 :docker-compose version
安裝方法二:
安裝pip
yum -y install epel-release
yum -y install python-pip
確認版本pip --version
更新pippip install --upgrade pip
安裝docker-composepip install docker-compose
查看版本docker-compose version
安裝補全工具:
爲了方便輸入命令,也可以安裝Docker的補全提示工具幫忙快速輸入命令:
安裝yum install bash-completion
下載docker-compose腳本
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
3、Docker-Compose卸載
如果是二進制包方式安裝的,刪除二進制文件即可:sudo rm /usr/local/bin/docker-compose
如果通過Python pip工具安裝的,則執行如下命令刪除:sudo pip uninstall docker-compose
常見命令
ps:列出所有運行容器
docker-compose ps
logs:查看服務日誌輸出
docker-compose logs
port:打印綁定的公共端口,下面命令可以輸出 eureka 服務 8761 端口所綁定的公共端口
docker-compose port eureka 8761
build:構建或者重新構建服務
docker-compose build
start:啓動指定服務已存在的容器
docker-compose start eureka
stop:停止已運行的服務的容器
docker-compose stop eureka
rm:刪除指定服務的容器
docker-compose rm eureka
up:構建、啓動容器
docker-compose up
kill:通過發送 SIGKILL 信號來停止指定服務的容器
docker-compose kill eureka
pull:下載服務鏡像
scale:設置指定服務運氣容器的個數,以 service=num 形式指定
docker-compose scale user=3 movie=3
run:在一個服務上執行一個命令
docker-compose run web bash
docker-compose.yml 屬性
version:指定 docker-compose.yml 文件的寫法格式
services:多個容器集合
image:image是指定服務的鏡像名稱或鏡像ID。如果鏡像在本地不存在,Compose將會嘗試拉取鏡像。
services:
web:
image: hello-world
build:配置構建時,Compose 會利用它自動構建鏡像,該值可以是一個路徑,也可以是一個對象,用於指定 Dockerfile 參數
build: ./dir
---------------
build:
context: ./dir
dockerfile: Dockerfile
args:
buildno: 1
context:context選項可以是Dockerfile的文件路徑,也可以是到鏈接到git倉庫的url,當提供的值是相對路徑時,被解析爲相對於撰寫文件的路徑,此目錄也是發送到Docker守護進程的context
build:
context: ./dir
dockerfile:使用dockerfile文件來構建,必須指定構建路徑
build:
context: .
dockerfile: Dockerfile-alternate
command:覆蓋容器啓動後默認執行的命令
command: bundle exec thin -p 3000
----------------------------------
command: [bundle,exec,thin,-p,3000]
container_name:Compose的容器名稱格式是:<項目名稱><服務名稱><序號>
可以自定義項目名稱、服務名稱,但如果想完全控制容器的命名,可以使用標籤指定:container_name: app
depends_on:在使用Compose時,最大的好處就是少打啓動命令,但一般項目容器啓動的順序是有要求的,如果直接從上到下啓動容器,必然會因爲容器依賴問題而啓動失敗。例如在沒啓動數據庫容器的時候啓動應用容器,應用容器會因爲找不到數據庫而退出。depends_on標籤用於解決容器的依賴、啓動先後的問題
volumes:掛載一個目錄或者一個已存在的數據卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOST:CONTAINER:ro]格式,後者對於容器來說,數據卷是隻讀的,可以有效保護宿主機的文件系統。
Compose的數據卷指定路徑可以是相對路徑,使用 . 或者 .. 來指定相對目錄。
數據卷的格式可以是下面多種形式:
volumes:
// 只是指定一個路徑,Docker 會自動在創建一個數據卷(這個路徑是容器內部的)。
- /var/lib/mysql
// 使用絕對路徑掛載數據卷
- /opt/data:/var/lib/mysql
// 以 Compose 配置文件爲中心的相對路徑作爲數據卷掛載到容器。
- ./cache:/tmp/cache
// 使用用戶的相對路徑(~/ 表示的目錄是 /home/<用戶目錄>/ 或者 /root/)。
- ~/configs:/etc/configs/:ro
// 已經存在的命名的數據卷。
- datavolume:/var/lib/mysql
如果不使用宿主機的路徑,可以指定一個volume_driver。volume_driver: mydriver
volumes_from:從另一個服務或容器掛載其數據卷:
volumes_from:
- service_name
- container_name
environment:環境變量配置,可以用數組或字典兩種方式
environment:
RACK_ENV: development
SHOW: 'ture'
-------------------------
environment:
- RACK_ENV=development
- SHOW=ture
env_file:從文件中獲取環境變量,可以指定一個文件路徑或路徑列表,其優先級低於 environment 指定的環境變量
env_file: .env
---------------
env_file:
- ./common.env
expose:暴露端口,只將端口暴露給連接的服務,而不暴露給主機
expose:
- "3000"
- "8000"
network_mode:設置網絡模式
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
ports:對外暴露的端口定義,和 expose 對應
ports: # 暴露端口信息 - "宿主機端口:容器暴露端口"
- "8763:8763"
- "8763:8763"
links:將指定容器連接到當前連接,可以設置別名,避免ip方式導致的容器重啓動態改變的無法連接情況
links: # 指定服務名稱:別名
- docker-compose-eureka-server:compose-eureka
logs:日誌輸出信息
--no-color 單色輸出,不顯示其他顏.
-f, --follow 跟蹤日誌輸出,就是可以實時查看日誌
-t, --timestamps 顯示時間戳
--tail 從日誌的結尾顯示,--tail=200
dns:配置 dns 服務器,可以是一個值或列表
dns: 8.8.8.8
------------
dns:
- 8.8.8.8
- 9.9.9.9
dns_search:配置 DNS 搜索域,可以是一個值或列表
dns_search: example.com
------------------------
dns_search:
- dc1.example.com
- dc2.example.com
Docker Compose 其它
更新容器
- 當服務的配置發生更改時,可使用 docker-compose up 命令更新配置
- 此時,Compose 會刪除舊容器並創建新容器,新容器會以不同的 IP 地址加入網絡,名稱保持不變,任何指向舊容起的連接都會被關閉,重新找到新容器並連接上去
links
- 服務之間可以使用服務名稱相互訪問,links 允許定義一個別名,從而使用該別名訪問其它服務
version: '2'
services:
web:
build: .
links:
- "db:database"
db:
image: postgres
- 這樣 Web 服務就可以使用 db 或 database 作爲 hostname 訪問 db 服務了