安裝 Docker-Compose
Compose有多種安裝方式,例如通過 shell, pip以及將 Compose作為容器安裝等。本次安裝以Shell 為主。
- 通過以下命令自動下載并安裝適應系統版本的 Compose:
curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 為安裝腳本添加執行權限
chmod +x/usr/local/bin/docker-compose
這樣, Compose就安裝完成了。
可使用以下命令測試安裝結果:
docker-compose --version
可輸出類似于如下的內容:4 586bhjnkmv
docker-compose version 1.10.0, build 4bd6f1a
說明 Compose已成功安裝。
安裝 Compose命令補全工具
現在已成功安裝 Compose,然而當輸 Docker Compose并按下Tab鍵時, Compose并沒有補全命令。要想使用 Compose的命令補全,需要安裝命令補全工具。
命令補全工具在Bash和zsh下的安裝方式不同,本次以Bash安裝為主。
執行以下命令,即可安裝命令補全工具:
curl -l https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
這樣,在重新登錄后,輸入 docker-compose并按下Tab鍵,compose就可自動補全命令了。
Docker Compose 快速入門
基本步驟
使用 Docker Compose 大致有 3 個步驟:
- 使用 Dockerfile (或其他方式)定義應用程序環境,以便在任何地方重現該環境。
- 在 docker-compose.yml 文件中定義組成應用程序的服務,以便各個服務在一個隔離的環境中一起運行。
- 運行 docker-compose up 命令,啟動并運行整個應用程序。
人門示例
下面以 wzq-swagger-mng 為例講解 compose 的基本步驟。
- 使用 mvn clean package 命令打包項目,獲得 wzq-swagger-mng.jar。
- 在 wzq-swagger-mng.jar 所在路徑(默認是項目的 target 目錄)創建 Dockerfile 文件,并在其中添加如下內容。
FROM java:8
VOLUME /tmp
ADD wzq-swagger-mng.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 10086
ENTRYPOINT ["java","-Djava.security.edg=file:/dev/.urandom","-jar","/app.jar"]
- 在 wzq-swagger-mng.jar 所在路徑創建文件 docker-compose.yml,在其中添加如下內容。
version: '2'# 表示該docker-compose.yml文件使用的是version 2 file
services:wzq-swagger-mng:# 指定服務名稱build:#指定Dockerfile所在文件夾的路徑context: ./dockerfile: ./Dockerfileports:- "10086:10086"# 指定端口映射,類似 docker run 的 -p 選項,注意使用字符串形式。
- 在 docker-compose.yml 所在路徑執行以下命令:
docker-compose up
Compose就會自動構建鏡像并使用鏡像啟動容器。也可使用 docker-compose up -d后臺啟動并運行這些容器。 - 測試訪問
工程、服務、容器
Docker Compose將所管理的容器分為三層,分別是工程(project),服務(service)以及容器(container)。Docker Compose運行目錄下的所有文件( docker-compose.yml、extends文件或環境變量文件等)組成一個工程(默認為 docker-compose.yml所在目錄的目錄名稱)。一個工程可包含多個服務,每個服務中定義了容器運行的鏡像、參數和依賴,一個服務可包括多個容器實例。
對應上面案例中工程名稱是 docker-compose.yml 所在的目錄名。該工程包含了1個服務,服務名稱是 wzq-swagger-mng。執行 docker-compose up -d 時,啟動了 wzq-swagger-mng 服務的1個容器實例。
docker-compose.yml 常用命令
docker-compose.yml是 Compose的默認模板文件。該文件有多種寫法,例如 Version 1 file format、 Version2 file format、Version2. 1 file format、 Version3 file format等。其中, Version 1 file format將逐步被被棄用, Version2x及 Version3x基本兼容,是未來的趨勢。本次只討論 Version2 file format下的常用命令。
- build
配置構建時的選項, Compose會利用它自動構建鏡像。buld的值可以是一個路徑
例如
build:./Dockerfile
也可以是一個對象,用于指定 Dockerfile和參數,
例如
build:context: ./dockerfile: ./Dockerfile
agrs:jacob: 1
- command
覆蓋容器啟動后默認執行的命令,示例
command: bundle exec thin -p 3000
也可以是一個list,類似于 Dockerfile中的CMD指令,格式如下:
command: [bundle, exec, thin,-p, 3000]
- 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
- environment
環境變量設置,可使用數組或字典兩種方式。示例:
environmentRACK_ENV: developmentSHOW: trueSESSION SECRETenvironment- RACK_ENV=development- SHOW=true- SESSION_SECRET
- env_file
從文件中獲取環境變量,可指定一個文件路徑或路徑列表。如果通過 docker-compose FILe指定了 Compose 文件,那么 eny_file中的路徑是 Compose 文件所在目錄的相對路徑。使用 environment 指定的環境變量會覆蓋 eny_file指定的環境變量。示例
eny_file: .env
eny_file- /common.env- /apps/web.env- /opt/secrets. env
- expose
暴露端口,只將端口暴露給連接的服務,而不暴露給宿主機。示例:
expose:- "3000"- "8090"
- external_links
連接到 docker-compose.yml外部的容器,甚至并非 Compose 管理的容器,特別是提供共享或公共服務的容器。格式跟 links類似,例如:
external_links:- redis_1- project_db_1: mysql- project_db_1: postgresql
- image
指定鏡像名稱或鏡像Id,如果本地不存在該鏡像, Compose會嘗試下載該鏡像。
示例
image: Java
- links
連接到其他服務的容器。可以指定服務名稱和服務別名( SERVICE: ALIAS),也可只指定服務名稱。例如:
web:links:- db- db:database- redis
-
networks
詳細查看:Docker-compose 常用命令及網絡設置(五) -
network_mode
設置網絡模式。示例
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
- ports
暴露端口信息,可使用H0ST:CONTAINER的格式,也可只指定容器端口(此時宿主機將會隨機選擇端口),類似于 docker run-p。
需要注意的是,當使用H0ST:CONTAINER格式映射端口時,容器端口小于60將會得到錯誤的接口,因為yaml會把xx:yy的數字解析為60進制。因此,建議使用字符串的形式。示例:
ports- "3000"- "3000-3905"- "8000:8000"- "9099-9091:8080-8081"- "49100:22"- "127.0.0.1:8001:8001"- "127,0.0.1:5000-5010:5000-5010"
- volumes
卷掛載路徑設置。可以設置宿主機路徑(HOST:CONTAINER),也可指定訪問模式(HOST:C0ONTAINER:ro)。示例:
volumes# Just specify a path and let the Engine create a volume- /var/lib/mysql# Specify an absolute path mapping- /opt/data:/var/lib/mysql# Path on the host relative to the Compose file- ./cache:/tmp/cache# User-relative path- ~/configs:/etc/configs/:ro#f Named volume- datavolume:/var/lib/mysql
- volumes_from
從另一個服務或容器掛載卷。可指定只讀(ro)或讀寫(rw),默認是讀寫(rw)。
示例
volumes from- service_name- service_name:ro- container:container_name- container:container_name:rw
docker-compose.yml還有很多其他命令,比如 depends_on、pid、 devices等。
本次僅挑選常用的命令進行講解,其他命令不再贅述。感興趣的讀者們可參考官方文檔:https://docs.docker.com/compose/compose-file/