簡介
Compose 項目是 Docker 官方的開源項目,負責實現對 Docker 容器集群的快速編排。
通過之前的介紹,我們知道使用一個 Dockerfile 模板文件,可以讓用戶很方便的定義一個單獨的應用容器。然而,在日常工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現一個 Web 項目,除了 Web 服務容器本身,往往還需要再加上後端的數據庫服務容器,甚至還包括負載均衡容器等。
Compose 恰好滿足了這樣的需求。它允許用戶通過一個單獨的 docker-compose.yml 模板文件(YAML 格式)來定義一組相關聯的應用容器為一個項目(project)。
Compose 中有兩個重要的概念:
- 服務 (service):一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例。
- 項目 (project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。
Compose 的默認管理對象是項目,通過子命令對項目中的一組容器進行便捷地生命週期管理。
使用微服務架構的系統一般包含若干個微服務,每個微服務一般部署多個實例。如果每個服務都要手動啟停,那麼效率低,維護量大。
命令
docker-compose.yml常用命令
docker-compose.yml格式為:
<code>version
:"3"
services
:webapp
:image
: examples/webports
: -"80:80"
volumes
: -"/data"
/<code>
注意每個服務都必須通過 image 指令指定鏡像或 build 指令(需要 Dockerfile)等來自動構建生成鏡像。
- build指定 Dockerfile 所在文件夾的路徑(可以是絕對路徑,或者相對 docker-compose.yml 文件的路徑)。 Compose 將會利用它自動構建這個鏡像,然後使用這個鏡像。 version: '3' services: webapp: build: ./dir 你也可以使用 context 指令指定 Dockerfile 所在文件夾的路徑。 使用 dockerfile 指令指定 Dockerfile 文件名。 version: '3' services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate
- command覆蓋容器啟動後默認執行的命令。 command: echo "hello world"
- dns自定義 DNS 服務器。可以是一個值,也可以是一個列表。 dns: 8.8.8.8 dns: - 8.8.8.8 - 114.114.114.114
- dns_search配置 DNS 搜索域。可以是一個值,也可以是一個列表。 dns_search: example.com dns_search: - domain1.example.com - domain2.example.com
- expose暴露端口,但不映射到宿主機,只被連接的服務訪問。 expose: - "3000" - "8000"
- image指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。 image: ubuntu image: orchardup/postgresql image: a4bc65fd
- links連接其他服務的容器,可以指定服務名稱。 web: links: -db -redis
- ports暴露端口信息。 使用宿主端口:容器端口格式,或者僅僅指定容器的端口(宿主將會隨機選擇端口)都可以。 ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"
- volumes數據卷所掛載路徑設置。可以設置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式。 加載本地目錄下的配置文件到容器目標地址下。 volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro
- environment 設置環境變量。你可以使用數組或字典兩種格式。只給定名稱的變量會自動獲取運行 Compose 主機上對應變量的值,可以用來防止洩露不必要的數據。 environment: RACK_ENV: development SESSION_SECRET: environment: - RACK_ENV=development - SESSION_SECRET
- networks配置容器連接的網絡。 version: "3" services: some-service: networks: - some-network - other-network
- depends_on解決容器的依賴、啟動先後的問題。以下例子中會先啟動 redis db 再啟動 web version: '3' services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres 注意:web 服務不會等待 redis db 「完全啟動」之後才啟動。
- container_name指定容器名稱。默認將會使用 項目名稱_服務名稱_序號 這樣的格式。 container_name: docker-web-container 注意: 指定容器名稱後,該服務將無法進行擴展(scale),因為 Docker 不允許多個容器具有相同的名稱。
- restartrestart: always 表示如果服務啟動不成功會一直嘗試。
- working_dir指定容器中工作目錄。 working_dir: /code
docker-compose常用命令
docker-compose 命令的基本的使用格式是
<code>docker-compose
[-f=...]
[options]
[COMMAND]
[ARGS...]
/<code>
命令選項:
<code>-f, --file FILE 指定使用的 Compose 模板文件,默認為 docker-compose.yml,可以多次指定。
-p, --project-name NAME 指定項目名稱,默認將使用所在目錄名稱作為項目名。
--x-networking 使用 Docker 的可拔插網絡後端特性
--x-network-driver DRIVER 指定網絡後端的驅動,默認為 bridge
--verbose 輸出更多調試信息。
-v, --version 打印版本並退出。
/<code>
- build格式為 docker-compose build [options] [SERVICE…]。構建(重新構建)項目中的服務容器。服務容器一旦構建後,將會帶上一個標記名,例如對於 web 項目中的一個 db 容器,可能是 web_db。可以隨時在項目目錄下運行 docker-compose build 來重新構建服務。選項包括: --force-rm 刪除構建過程中的臨時容器。 --no-cache 構建鏡像過程中不使用 cache(這將加長構建過程)。 --pull 始終嘗試通過 pull 來獲取更新版本的鏡像。
- config驗證 Compose 文件格式是否正確,若正確則顯示配置,若格式錯誤顯示錯誤原因。
- down此命令將會停止 up 命令所啟動的容器,並移除網絡
- exec進入指定的容器。
- help獲得一個命令的幫助。
- images列出 Compose 文件中包含的鏡像。
- kill格式為 docker-compose kill [options] [SERVICE…]。通過發送 SIGKILL 信號來強制停止服務容器。支持通過 -s 參數來指定發送的信號,例如通過如下指令發送 SIGINT 信號。 $ docker-compose kill -s SIGINT
- logs格式為 docker-compose logs [options] [SERVICE…]。查看服務容器的輸出。默認情況下,docker-compose 將對不同的服務輸出使用不同的顏色來區分。可以通過 –no-color 來關閉顏色。該命令在調試問題的時候十分有用。
- pause格式為 docker-compose pause [SERVICE…]。暫停一個服務容器。
- ps格式為 docker-compose ps [options] [SERVICE…]。列出項目中目前的所有容器。選項:-q 只打印容器的 ID 信息。
- pull格式為 docker-compose pull [options] [SERVICE…]。拉取服務依賴的鏡像。選項:–ignore-pull-failures 忽略拉取鏡像過程中的錯誤。 push 推送服務依賴的鏡像到 Docker 鏡像倉庫。
- restart格式為 docker-compose restart [options] [SERVICE…]。重啟項目中的服務。選項:-t, –timeout TIMEOUT 指定重啟前停止容器的超時(默認為 10 秒)。
- rm格式為 docker-compose rm [options] [SERVICE…]。刪除所有(停止狀態的)服務容器。推薦先執行 docker-compose stop 命令來停止容器。選項:-f, –force 強制直接刪除,包括非停止狀態的容器。一般儘量不要使用該選項。-v 刪除容器所掛載的數據卷。
- start格式為 docker-compose start [SERVICE…]。啟動已經存在的服務容器。
- stop格式為 docker-compose stop [options] [SERVICE…]。停止已經處於運行狀態的容器,但不刪除它。通過 docker-compose start 可以再次啟動這些容器。選項:-t, –timeout TIMEOUT 停止容器時候的超時(默認為 10 秒)。
- up格式為 docker-compose up [options] [SERVICE…]。該命令十分強大,它將嘗試自動完成包括構建鏡像,(重新)創建服務,啟動服務,並關聯服務相關容器的一系列操作。鏈接的服務都將會被自動啟動,除非已經處於運行狀態。可以說,大部分時候都可以直接通過該命令來啟動一個項目。默認情況,docker-compose up 啟動的容器都在前臺,控制檯將會同時打印所有容器的輸出信息,可以很方便進行調試。當通過 Ctrl-C 停止命令時,所有容器將會停止。如果使用 docker-compose up -d,將會在後臺啟動並運行所有的容器。一般推薦生產環境下使用該選項。選項:-d 在後臺運行服務容器。–no-color 不使用顏色來區分不同的服務的控制檯輸出。–no-deps 不啟動服務所鏈接的容器。–force-recreate 強制重新創建容器,不能與 –no-recreate 同時使用。–no-recreate 如果容器已經存在了,則不重新創建,不能與 –force-recreate 同時使用。–no-build 不自動構建缺失的服務鏡像。-t, –timeout TIMEOUT 停止容器時候的超時(默認為 10 秒)。
- version格式為 docker-compose version。打印版本信息。
- port格式為 docker-compose port [options] SERVICE PRIVATE_PORT。打印某個容器端口所映射的公共端口。
- scale格式為 docker-compose scale [options] [SERVICE=NUM…]。 設置指定服務運行的容器個數。通過 service=num 的參數來設置數量。例如:$ docker-compose scale web=3 db=2將啟動 3 個容器運行 web 服務,2 個容器運行 db 服務。
使用Docker Compose編排Spring Cloud 服務。
編排時用到的微服務項目:
<code>discovery
:註冊中心
server:服務提供者
client
:服務消費者
zuul
:網關
/<code>
1、由於Docker 默認的網絡模式是bridge,各個容器的IP都不同。因此在Eureka Server配置一個主機名(discovery),讓各個微服務使用主機名訪問Eureka Server:
<code>eureka
:instance
:hostname
: discovery /<code>
然後將如下配置
<code>eureka
:client
:serviceUrl
:defaultZone
:http
: /<code>
替換為:
<code>eureka
:client
:serviceUrl
:defaultZone
:http
: /<code>
2、編寫構建鏡像腳本
bash腳本的用途是分別執行幾個module下的Dockerfile文件,分別打成鏡像,不用一個個手工執行,文件如下:
buildDockerImage.sh:
<code>set
-eo pipefail modules=( discovery server client zuul )for
modulein
"
${modules[@]}
";do
docker build -t"microservice/
${module}
:latest"${module}
done
/<code>
tree查看microservice文件夾下模塊目錄:
<code> $ tree . ├── buildDockerImage.sh ├── client │ ├── client-0
.0
.1
-SNAPSHOT.jar │ └── Dockerfile ├── discovery │ ├── Dockerfile │ └── eureka-server-0
.0
.1
-SNAPSHOT.jar ├── docker-compose.yml ├── server │ ├── Dockerfile │ └── server-0
.0
.1
-SNAPSHOT.jar └── zuul ├── Dockerfile └── zuul-0
.0
.1
-SNAPSHOT.jar /<code>
modules為各個模塊目錄,模塊目錄下存放該模塊的jar包和Dockerfile文件。
執行sh buildDockerImage.sh命令,執行完,使用docker images 查看鏡像。
<code>$
docker
images
REPOSITORY
TAG
IMAGE
ID
CREATED
SIZE
microservice/zuul
latest
d0fcb94e203e
30
seconds
ago
204MB
microservice/client
latest
a3ff8e192ee6
33
seconds
ago
200MB
microservice/server
latest
8f04580f6063
35
seconds
ago
200MB
microservice/discovery
latest
d8b9347a8229
38
seconds
ago
204MB
frolvlad/alpine-oraclejdk8
slim
3ee5e1ce00fc
9
days
ago
164MB
/<code>
3、編寫docker-compose-yml
<code>version
:"3"
services
:discovery
:image
: microservice/discoveryhostname
: discoveryports
: -"8761:8761"
server
:image
: microservice/serverports
: -"9000:9000"
client
:image
: microservice/clientports
: -"9001:9001"
zuul
:image
: microservice/zuulports
: -"9002:9002"
/<code>
執行以下命令啟動項目。
<code>microservice]# docker-compose up -d
Creating
microservice_discovery_1 ...
Creating
microservice_discovery_1 ... done
Creating
microservice_client_1 ...
Creating
microservice_server_1 ...
Creating
microservice_client_1
Creating
microservice_client_1 ... done
Creating
microservice_zuul_1 ...
Creating
microservice_zuul_1 ... done
/<code>
查看鏡像:
<code>$
docker
ps
CONTAINER
ID
IMAGE
COMMAND
CREATED
STATUS
PORTS
NAMES
ef16f3cccfdb
microservice/zuul
"java -Djava.securit…"
38
minutes
ago
Up
38
minutes
0.0
.0
.0
:9002->9002/tcp
microservice_zuul_1
657b28a5f17b
microservice/server
"java -Djava.securit…"
38
minutes
ago
Up
38
minutes
0.0
.0
.0
:9000->9000/tcp
microservice_server_1
e048e4d69f49
microservice/client
"java -Djava.securit…"
38
minutes
ago
Up
38
minutes
0.0
.0
.0
:9001->9001/tcp
microservice_client_1
66f9c53ec2b5
microservice/discovery
"java -Djava.securit…"
38
minutes
ago
Up
38
minutes
0.0
.0
.0
:8761->8761/tcp
microservice_discovery_1
/<code>
訪問註冊中心:
訪問網關服務
zuul->client->server
<code>http: hi gmg,i amfrom
/<code>
源碼連接
編排高可用的Spring cloud微服務集群及動態伸縮
1、將所有的服務的註冊中心改為
<code>eureka
:client
:serviceUrl
:defaultZone
:http
: /<code>
2、docker-compose-yml修改為
<code>version
:"3"
services
:peer1
:image
:microservice/discovery
ports
:"8761:8761"
environment
:spring.profiles.active=peer1
peer2
:image
:microservice/discovery
hostname
:peer2
ports
:"8762:8762"
environment
:spring.profiles.active=peer2
server
:image
:microservice/server
ports
:"9000:9000"
client
:image
:microservice/client
ports
:"9001:9001"
zuul
:image
:microservice/zuul
ports
:"9002:9002"
/<code>
3、構建鏡像
執行sh buildDockerImage.sh命令構建鏡像。
4、創建容器
執行 docker-compose up -d查看鏡像:
<code>docker
ps
CONTAINER
ID
IMAGE
COMMAND
CREATED
STATUS
PORTS
NAMES
8dfff5cf705f
microservice/discovery
"java -Djava.securit…"
About
a
minute
ago
Up
About
a
minute
0.0
.0
.0
:8762->8762/tcp
microserviceha_peer2_1
a89594944490
microservice/client
"java -Djava.securit…"
About
a
minute
ago
Up
About
a
minute
0.0
.0
.0
:9001->9001/tcp
microserviceha_client_1
29e941b18623
microservice/zuul
"java -Djava.securit…"
About
a
minute
ago
Up
About
a
minute
0.0
.0
.0
:9002->9002/tcp
microserviceha_zuul_1
18580a21ab2f
microservice/discovery
"java -Djava.securit…"
About
a
minute
ago
Up
About
a
minute
0.0
.0
.0
:8761->8761/tcp
microserviceha_peer1_1
1bcaaadac4a4
microservice/server
"java -Djava.securit…"
About
a
minute
ago
Up
About
a
minute
0.0
.0
.0
:9000->9000/tcp
microserviceha_server_1
/<code>
5、查看註冊中心:
源碼鏈接:
https://github.com/gmg0829/SpringcloudLearningExample/tree/E/spring-cloud-docker-ha