Docker三劍客之docker-compose

簡介

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/web

ports

: -

"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

module

in

"

${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/discovery

hostname

: discovery

ports

: -

"8761:8761"

server

:

image

: microservice/server

ports

: -

"9000:9000"

client

:

image

: microservice/client

ports

: -

"9001:9001"

zuul

:

image

: microservice/zuul

ports

: -

"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>

訪問註冊中心:


Docker三劍客之docker-compose


訪問網關服務

zuul->client->server

<code>http: 

hi gmg,i am 

from

/<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、查看註冊中心:


Docker三劍客之docker-compose

源碼鏈接:

https://github.com/gmg0829/SpringcloudLearningExample/tree/E/spring-cloud-docker-ha


分享到:


相關文章: