上一篇文章介紹了docker鏡像的製做與發佈,本文主要介紹實際docker工程部署中常常用到的docker-compose工具,以及docker的網絡配置和負載均衡。前端
實際開發過程當中,在一個項目中,咱們常將不一樣的模塊放在單獨的docker中,方便維護和擴展。好比咱們一個項目可能有MySQL鏡像、Nginx鏡像、Spring Boot後端鏡像,咱們在實際部署中能夠採用上篇文章介紹的方法,分別打包,分別啓動;可是這樣太費精力,並且還容易出錯。 所以Docker-compose工具應運而生,就是爲了解決工程部署中的多個Docker鏡像的管理問題。java
相似於build鏡像須要Dockerfile同樣,使用docker-compose時也須要相似的配置文件,叫作docker-compose.yaml。git
下面是一個Docker-file的例子:github
通常docker-compose文件中須要注意以下幾點:面試
上面提到了depends_on,一般用於須要順序啓動不一樣鏡像,好比後臺須要等待數據庫初始化完畢之後才啓動,可是這個depends_on並不能保證前序容器徹底初始化,意思是隻要前序容器啓動了,就會嘗試啓動當前容器。這樣仍是會形成前序容器未初始化完成,後續容器啓動後出現鏈接失敗等錯誤。spring
所以最好的方式是官方(docs.docker.com/compose/sta…)比較推薦的wait腳本,腳本的詳細使用能夠看這裏 github.com/vishnubob/w…,docker
wait-for-it.sh host:port [-s] [-t timeout] [-- command args]
-h HOST | --host=HOST Host or IP under test
-p PORT | --port=PORT TCP port under test
Alternatively, you specify the host and port as host:port
-s | --strict Only execute subcommand if the test succeeds
-q | --quiet Don't output any status messages -t TIMEOUT | --timeout=TIMEOUT Timeout in seconds, zero for no timeout -- COMMAND ARGS Execute command with args after the test finishes 複製代碼
通常也能夠在製做鏡像的時候指定等待必定時間,在下面的例子中,在運行test.jar以前,會一直等到elasticsearch初始化完成。數據庫
FROM openjdk:8
ADD ["target/test-1.0.0.jar", "test.jar"]
ADD ["wait-for-it.sh", "wait-for-it.sh"]
RUN ["chmod", "+x", "wait-for-it.sh"]
EXPOSE 1234
ENTRYPOINT ["./wait-for-it.sh", "elastic:9200", "--", "java", "-jar", "/test.jar"]
複製代碼
關於更多docker-compose文件的詳細介紹,能夠參考官方的文檔 docs.docker.com/compose/get…後端
docker-compose的啓動與中止很是簡單,直接使用docker-compose up
啓動,docker-compose down
關閉工程,同時會刪除全部容器。bash
docker的網絡方面是相對較弱的,新手若是不清楚,常常會出現爲何容器A訪問不到容器B的問題。
有個很常見的場景,咱們須要在本機同時調試前端和後端程序,一般咱們會在localhost某個端口啓動前端,好比8080;同時在local的另外一端口好比1234啓動後端。若是不用容器,前端直接在代碼裏訪問localhost:1234的全部接口都是能夠的,沒有任何問題。
可是若是前端和後端都封裝在不一樣的容器中,這個時候前端直接訪問localhost:1234,會報錯,沒法訪問。緣由就是兩個容器之間是獨立的,沒法直接localhost訪問。
官方推薦的解決辦法就是,先新建一個網絡,而後啓動先後端容器的時候,分別指定在該網絡中運行。
docker network create mynet
docker run --network mynet --name frontend ...
docker run --network mynet --name backend ...
複製代碼
如今前端就能夠經過 http://backend:1234 訪問後端的接口了。
注意:有些博客指出,能夠經過
docker inspect [container_name]
來獲取後端容器的ip,而後直接訪問ip加端口就能夠了。這個在Linux上也許可行,可是mac下因爲容器的實現原理不一樣,沒法直接經過ip訪問。
默認狀況下,當你利用docker-compose啓動多個容器時,docker-compose會自動幫你建立一個網絡,並將多個service在這個網絡中運行。所以不一樣容器之間,直接利用容器名+端口就能夠訪問了。
實際生產環境中,確定會啓動多個後端service,同時進行負載均衡以保證服務質量。利用docker-compose咱們能夠方便的實現這種功能。
下面是一個很簡單的docker-compose文件,啓動以後能夠在本地打開localhost:5000,來訪問後端的service;在front容器內部,咱們也能夠經過backend:5000來訪問backend service。
version: "3"
services:
front:
image: front:latest
backend:
image: "backend:latest"
ports:
- "5000:5000"
複製代碼
爲了啓動多個後端程序以實現負載均衡,docker-compose已經爲咱們提供--scale
參數,利用這個參數能夠輕鬆實現同時啓動多個service。 下面是該參數的使用說明。
--scale SERVICE=NUM Scale SERVICE to NUM instances. Overrides the
`scale` setting in the Compose file if present.
複製代碼
在這裏,咱們直接在啓動的時候,指定生成3個後端的service,
docker-compose up --scale backend=3
複製代碼
可是這樣會報錯,由於本機上的5000端口,只能分配給一個service,若是你想同時在本機上調試,能夠將上面的ports改成5000,修改後的docker-compose文件以下:
version: "3"
services:
front:
image: front:latest
backend:
image: "backend:latest"
ports:
- "5000"
複製代碼
這樣按照上面一樣的指令啓動以後,你你能夠看到以下的輸出結果,有3個不一樣的本機端口綁定到容器的5000端口,
Name Command State Ports
--------------------------------------------------------------------------------------------
example_backend_1 /usr/bin/dumb-init -- /sbi ... Up (healthy) 0.0.0.0:32776->5000/tcp
example_backend_2 /usr/bin/dumb-init -- /sbi ... Up (healthy) 0.0.0.0:32775->5000/tcp
example_backend_3 /usr/bin/dumb-init -- /sbi ... Up (healthy) 0.0.0.0:32777->5000/tcp
複製代碼
固然,若是你只想從容器內部訪問後端的5000端口,你能夠去掉port配置,改爲以下的配置:
version: "3"
services:
front:
image: front:latest
backend:
image: "backend:latest"
複製代碼
這樣docker-compose up --scale backend=3
啓動後,咱們就只能在容器內部訪問http:\\backend:5000
來訪問後端service,由於咱們啓動了三個,前端的請求會隨機的分配到後端的三個service上,保證了總體的服務質量。
參考連接:
搜索『後端精進之路』並關注,馬上獲取最新文章和價值2000元的BATJ精品面試課程。