Docker Certified Associate(DCA)認證考試學習- Docker Network Host Mode Docker Certified Associate(DCA)認證相關資源、Docker Network Host Mode

Published on Friday, March 3, 2023

Docker Network Host Mode

在上一篇文章中: Docker Certified Associate(DCA)認證考試學習- Docker Network Bridge Mode 學習到了 Docker Network 中最常使用的 Bridge Mode,今天要來試試看 Host Mode 有什麼不同

先看看 Host 的文檔 , 按照文檔的說法使用 Host 模式的 container 會直直接使用 Host 主機的網路
並不會像 Bridge 模式會在分配一個 IP 給 container, 也就是說當初在 Dockerfile 開放的端口, 會直接跟 Host 主機的端口連接在一起
例如建立一個 nginx container 並且使用網路 Host 模式,之後只要訪問 Host 的 80 port,就直接能看到 nginx 的網頁了
不用在額外做端口映射,之前使用 Bridge 模式的時候我們使用 docker run 啟動 container 時都需要額外在輸入 -p 參數,指定 container 的 port 要指定到哪一個 host 的 port 只要使用 host 模式就可以跳過這個參數,如果你還是有帶 -p 參數, docker 也會直接忽略

接下來做幾個測試,首先先建立一個 nginx container,並且網路指定使用 host 模式

docker run -d --network=host --name nginx nginx

可以使用此命令來查看 host 模式的相關資訊

docker network inspect host

看到 Containers 裡面已經有我們的 nginx container,代表 nginx 正在使用 host 網路

[node1] (local) root@192.168.0.18 ~
$ docker network inspect host
[
    {
        "Name": "host",
        "Id": "8ed5b22f6c27923bed73043fa76e45ad2872e32c650310e0afe91ce565c93e0d",
        "Created": "2023-03-03T16:13:58.465549175Z",
        "Scope": "local",
        "Driver": "host",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "fd55f26c115dd74b55337e0e78e499aaadf438a3cec8ca17c332ee90e015e0c4": {
                "Name": "nginx",
                "EndpointID": "1c3f3becda0f38d5925ead26c881bc7c04c9c80d10f3f7b34d3e3719be8a01c6",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

最後只要訪問 Host 主機的 IP 加上 80 port,就可以成功看到頁面了非常簡單

我們可以在啟動一個 tomcat container,這次帶上 -p 參數並指定開放 8081 port

docker run -d -p 8081 --network=host --name tomcat tomcat

這次下方會多出一段警告,說明 Host 模式之下會忽略端口映射,container 還是會正常啟動,不過開放的端口還是當初 Dockerfile 設定的端口,這邊 tomcat 預設的端口為 8080

WARNING: Published ports are discarded when using host network mode

我們嘗試訪問 Host IP 加上 8081 port,會顯示錯誤改成訪問 Host IP 加上 8080 port,就可以看到 tomcat 回傳的頁面了


Summary

今天學習到了 Host 模式與 Bridge 模式的不同之處, Host 模式使用起來相當簡單很適合在測試環境中使用,例如我們可以啟動一個 SQL Server 的 container
並且使用 Host 模式之後就可以直接使用訪問 1433 port,就好像本機裝了SQL Serve一樣,不過需要注意的是可能會造成端口衝突的問題
因為不像Bridge模式網路區段有分開,再加上本機如果已經佔用很多端口這時啟用 Host模式常用的 port 會很容易衝突,使用者需要自行而外注意這個問題