部署了兩個獨立的容器:
Container #1 - Web Client
Container #2 - SQL Server
不同容器間如何互訪?
無法從 Container #1 訪問到 Container #2,ping 不通。
檢查網絡狀態
安裝 Docker 時,會自動創建 3 個網絡。
docker network ls 命令可以列出這些網絡。
bridge 網絡:表示所有 Docker 安裝中都存在的 docker0 網絡。除非使用 docker run --net=<NETWORK>選項另行指定,否則 Docker 守護進程默認情況下會將容器連接到此網絡。在主機上使用 ifconfig命令,可以看到此網橋是主機的網絡堆棧的一部分。
none 網絡:在一個特定於容器的網絡堆棧上添加了一個容器。該容器缺少網絡接口。
host 網絡:在主機網絡堆棧上添加一個容器。您可以發現,容器中的網絡配置與主機相同。
docker network inspect 命令用於顯示一個或多個網絡的詳細信息。
它返回有關一個或多個網絡的信息。 默認情況下,此命令將所有結果呈現在JSON對象中。
docker network ls NETWORK ID NAME DRIVER 7fca4eb8c647 bridge bridge 9f904ee27bf5 none null cf03ee007fb4 host host
docker network inspect bridge
[ { "Name": "bridge", "Id": "b2c85e46cb4fad5603c1614d04e73f6fc07a27b0d4c6a026f03b28a50a6e869b", "Created": "2019-11-03T09:14:31.8501331Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "0d5338cf858f58e6dcffa489229d1b2f2b35cdc6ce3076bd2eccba305186dce9": { "Name": "exciting_perlman", "EndpointID": "48aca2d7558edf69d1e6bfbcb6c47f4f3446d64e278600ffaf8a9b47cf7e60c2", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ]
Issue 原因
Container #1 包含在 bridge 網絡中,而 Container #2 並沒有被包含進來。
解決方案
重啟容器,將 #2 接入 #1 同一網絡(bridge)中即可。
docker run --name mssql -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=yourStrong(!)Password" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-CTP3.2-ubuntu docker ps docker network connect bridge 4f91e220c912 docker network inspect bridge [ { ......"ConfigOnly": false, "Containers": { "0d5338cf858f58e6dcffa489229d1b2f2b35cdc6ce3076bd2eccba305186dce9": { "Name": "exciting_perlman", "EndpointID": "48aca2d7558edf69d1e6bfbcb6c47f4f3446d64e278600ffaf8a9b47cf7e60c2", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" }, "4f91e220c9126a443143d7e98f2bc8afdbd82211402c581a6a411c197a77ea25": { "Name": "mssql", "EndpointID": "050fc8a64e774480e8728292d14778ba86beea433e37ca28cd03414de000f739", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" } }, ...... } ]
在 Docker 的 Ubuntu 鏡像中如何使用 ifconfig 和 ping 命令?
進入 Docker 容器
docker exec -it 容器ID或容器名 bash
安裝 ifconfig 和 ping 工具包
apt-get update apt-get install net-tools apt-get install iputils-ping
Docker 常規操作命令?
啟動容器
docker start 容器ID或容器名
參數
-i:以 交互模式啟動
-t:以 附加進程方式啟動
停止容器
docker stop 容器ID或容器名
參數
-t:關閉容器的限時,如果超時未能關閉則用kill強制關閉,默認值10s,這個時間用於容器的自己保存狀態
關閉容器
docker kill 容器ID或容器名
重啟容器
docker restart 容器ID或容器名
參數
-t:關閉容器的限時,如果超時未能關閉則用kill強制關閉,默認值10s,這個時間用於容器的自己保存狀態
參考資料
https://www.cnblogs.com/lihan829/p/11483594.html
https://forums.docker.com/t/how-to-reach-a-container-from-another-container-without-ip-of-dockernat/21083/4
https://www.ibm.com/developerworks/cn/linux/l-docker-network/index.html
https://www.cnblogs.com/jsonhc/p/7823286.html
https://www.yiibai.com/docker/network_connect.html
https://blog.csdn.net/Michel4Liu/article/details/80889977