在我編輯好 .yml 檔案 docker-compose up 後,遇上了一項錯誤訊息。
User specified IP address is supported only when connecting to networks with user configured subnets
我的 .yml 原始檔案如下:
version: '3.3' networks: web_subnet: external: true services: ################## # database 工具 ################## adminer: image: adminer container_name: adminer restart: always networks: web_subnet: ipv4_address: 192.168.80.53 ports: - "18080:8080" ################################################################################
說明處理方法前,先來講解一下 Docker Network 一些概念。
在執行 docker run 指令時,有一個參數是 --net,它可以設定在執行 Docker Container 是要使用哪一種的網路模式,
目前所知道的 網路模式(DRIVER)
有 none、container、host、bridge、overlay… 等等的模式,
它們是透過使用 Linux 的 libnetwork 所建立出來的網路模式,以下分別說明這些網路模式:
1. none: 在執行 container 時,網路功能是關閉的,所以無法與此 container 連線
2. container: 使用相同的 Network Namespace,
所以 container1 的 IP 是 172.17.0.2 那 container2 的 IP 也會是 172.17.0.2
3. host: container 的網路設定和實體主機使用相同的網路設定,所以 container 裡面也就可以修改實體機器的網路設定,
因此使用此模式需要考慮網路安全性上的問題
4. bridge: Docker 預設就是使用此網路模式,這種網路模式就像是 NAT 的網路模式,
例如實體主機的 IP 是 192.168.1.10 它會對應到 Container 裡面的 172.17.0.2,
在啟動 Docker 的 service 時會有一個 docker0 的網路卡就是在做此網路的橋接。
5. overlay: container 之間可以在不同的實體機器上做連線,
例如 Host1 有一個 container1,
然後 Host2 有一個 container2,container1 就可以使用 overlay 的網路模式和 container2 做網路的連線。
我的解決方法如下:
## 1. 首先檢查 Docker Network $ docker network ls NETWORK ID NAME DRIVER SCOPE 9311de66b224 bridge bridge local 10f55487f21f host host local 4382b6e4ee03 none null local ## ########################################################################## ## ## 2. 當指向網絡時,我們應該使用標誌【外部】告訴撰寫網絡已經創建並且應該被帶到外面( 否則將使用項目前綴動態創建 ) ``` networks: app_subnet: external: true ``` ## ########################################################################## ## ## 3. 所以在此之後, docker-compose 會將容器附加到現有的 web_subnet 在此之前必須創建子網: $ docker network create --gateway 192.168.80.1 --subnet 192.168.80.0/24 web_subnet f7e2ddd461b19a6021283cc6d198698ed910d297c6f797fec938f41a999bdf2d ## ########################################################################## ## ## 4. 在檢查 Docker Network,確認是否已經成功創建子網 web_subnet $ docker network ls ``` NETWORK ID NAME DRIVER SCOPE 9311de66b224 bridge bridge local 10f55487f21f host host local 4382b6e4ee03 none null local f7e2ddd461b1 web_subnet bridge local ``` ## ########################################################################## ## ## 5. 詳列子網 web_subnet 信息,加以確認 $ docker network inspect web_subnet ``` [ { "Name": "web_subnet", "Id": "f7e2ddd461b19a6021283cc6d198698ed910d297c6f797fec938f41a999bdf2d", "Created": "2019-08-20T03:05:43.057798831Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.80.0/24", "Gateway": "192.168.80.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ] ``` ## ########################################################################## ## ## 6. 重新啟動 docker-compose $ docker-compose up
沒有留言:
張貼留言