networks使用方式之官網教程
官網的docker-compose.yml參考文檔:Compose file version 3 reference
較為準確的中文翻譯版:Compose file version 3 reference
networks通常應用于集群服務,從而使得不同的應用程序得以在相同的網絡中運行,從而解決網絡隔離問題。這種應用在swarm部署中,非常常見。不過,本文并不做討論。
一般對于集群服務,常常通過docker-compose.yml文檔快速編排、部署應用服務。官網中給出了如下的使用場景和方式:
1. 未顯式聲明網絡環境的docker-compose.yml
例如,在目錄app
下創建docker-compose.yml,內容如下:
version: '3'
services:
web:
mage: nginx:latest
container_name: web
depends_on:
- db
ports:
- "9090:80"
links:
- db
db:
image: mysql
container_name: db1234567891011121314
使用docker-compose up
啟動容器后,這些容器都會被加入app_default
網絡中。使用docker network ls
可以查看網絡列表,docker network inspect <container id>
可以查看對應網絡的配置。
$ docker net work ls
NETWORK ID NAME DRIVER SCOPE
6f5d9bc0b0a0 app_default bridge local
0fb4027b4f6d bridge bridge local
567f333b9de8 docker-compose_default bridge local
bb346324162a host host local
a4de711f6915 mysql_app bridge local
f6c79184ed27 mysql_default bridge local
6358d9d60e8a none null local
12345678910
2. networks關鍵字指定自定義網絡
例如下面的docker-compose.yml文件,定義了front和back網絡,實現了網絡隔離。其中proxy和db之間只能通過app來實現通信。其中,custom-driver-1
并不能直接使用,你應該替換為host, bridge, overlay
等選項中的一種。
version: '3'
services:
proxy:
build: ./proxy
networks:
- front
app:
build: ./app
networks:
- front
- back
db:
image: postgres
networks:
- back
networks:
front:
# Use a custom driver
driver: custom-driver-1
back:
# Use a custom driver which takes special options
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"123456789101112131415161718192021222324252627
值得注意的是,這里定義了back和front兩個網絡,似乎它們的名字就定義成了back和font,但是你使用docker network ls
命令并不能找到它們。假如你是在myApp
目錄下運行的docker-compose up
命令,那么這兩個網絡應該分別對應myApp_back
和myApp_front
。
3. 配置默認網絡
version: '2'
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
# Use a custom driver
driver: custom-driver-11234567891011121314
4. 使用已存在的網絡
networks:
default:
external:
name: my-pre-existing-network1234
遇到的問題
學習了上面的東西,筆者準備將自己的項目付諸實踐。我的項目包含了兩個docker-compose.yml,且使用了links
選項,所以必須使用networks配置。
其中,一個docker-compose.yml用于啟動mysql服務,位于mysql/
目錄下:
version: "3"
services:
dbmaster:
image: master/mysql:latest
container_name: dbmaster
ports:
- "3308:3306"
volumes:
- $HOME/Work/data/dbmaster:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: master
logging:
driver: "json-file"
options:
max-size: "1000k"
max-file: "20"
networks:
- app
dbslave:
image: slave/mysql:latest
container_name: dbslave
ports:
- "3309:3306"
depends_on:
- dbmaster
volumes:
- $HOME/Work/data/dbslave:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: slave
logging:
driver: "json-file"
options:
max-size: "1000k"
max-file: "20"
links:
- dbmaster
networks:
- app
networks:
default:
external:
name: app12345678910111213141516171819202122232425262728293031323334353637383940414243
另一個docker-compose.yml用于啟動服務程序,位于cloudgo/
目錄下:
version: "3"
services:
web:
image: nginx:latest
container_name: web
depends_on:
- cloudgo
ports:
- "9090:80"
volumes:
- $HOME/Work/docker/docker-compose/nginx/conf.d:/etc/nginx/conf.d
links:
- cloudgot
logging:
driver: "json-file"
options:
max-size: "1000k"
max-file: "20"
networks:
- app
cloudgo:
image: cloudgo:latest
container_name: cloudgo
ports:
- "8080:8080"
logging:
driver: "json-file"
options:
max-size: "1000k"
max-file: "20"
external_links:
- dbmaster
- dbslave
networks:
- app
networks:
app:
external: true123456789101112131415161718192021222324252627282930313233343536373839
我決定使用預先創建的網絡,然后把他們加入這個已經創建好的網絡,從而實現通信。為此,我運行了如下命令:
$ docker network create app1
之后,開始運行編寫好的docker-compose.yml文件。首先運行啟動mysql的配置文件,結果如下:
l$ docker-compose up
ERROR: Service "dbmaster" uses an undefined network "app"12
明明已經創建好了,卻還是報了錯,說該網絡未定義。嘗試改變名稱mysql_app,但是依舊報出同樣的錯誤。最終證明,這種方法無法實現,至今沒有找到官方文檔給出的例子。
所以,最終決定將第一個docker-compose.yml文件中的networks配置改為如下內容:
networks:
mysql_app:
driver: bridge123
在這個文件中定義一個網絡,以便在后面使用。這里修改完畢,該文件其他地方凡是引用到了該網絡的地方均要作出相同的修改。同樣,第二個文件也一樣。
其他的一些用法
使用aliases代替link
一般的使用格式如下:
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias212345678910
在下面的例子中,我的web
容器可以直接通過database:3306
或者db:3306
訪問db
容器了。它們同時屬于一個網絡,并且db
設置了主機別名,所以這樣的訪問方式是完全可以的。
version: '2'
services:
web:
depends_on:
- worker
networks:
- new
worker:
depends_on:
- db
networks:
- legacy
db:
image: mysql
networks:
new:
aliases:
- database
legacy:
aliases:
- mysql
networks:
new:
legacy:123456789101112131415161718192021222324252627
此時直接使用depends_on已經不再需要link,如果woker需要訪問db,可以直接通過mysql:port的方式。
使用networks的要點在于:
1. 注意自定義網絡的方式
2. 注意docker-compose.yml文件的位置與網絡默認命名的關系
3. 注意遇到問題嘗試幾種替代方式去解決
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。