iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0

容器技術具備了隔離性,若要與其他容器或是外部網路存取的話,那便需要一個虛擬的網路環境。docker 運用 Network Namespace 的方式,替每一個容器建立獨立的環境,與宿主主機是完全隔離的。

Network Namespace

Network Namespace 可以提供獨立的網路設備、IP路由表、連接埠通訊端...等支援。所以執行於 Network Namespace 下的應用程式,就如同有獨立的網路硬體和設定。

虛擬網路 docker0

預設情況下,docker 啟動時會在伺服器上架設一個名為 docker0 的橋接器,並透過其內的 veth 跟每一個容器內的 eth0 相連接。如此一來便實現了容器和外部網路存取的可能,以及容器間彼此間的通訊。因為容器間會存在於同一個子網路中。
docker0

來源:https://www.linuxjournal.com/

查詢網路設定

輸入 sudo docker inspect <container id or name> 就可以查詢。結果是位在 NetworkSettings 的欄位中。

{
    "NetworkSettings": {
    "Bridge": "",
    "SandboxID": "ded74f4bfdb7a6fe7f22ff7ccb37835fe7def71b95c087562f69bcfe48a3b071",
    "HairpinMode": false,
    "LinkLocalIPv6Address": "",
    "LinkLocalIPv6PrefixLen": 0,
    "Ports": {
        "443/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "443"
            },
            {
                "HostIp": "::",
                "HostPort": "443"
            }
        ],
        "80/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "80"
            },
            {
                "HostIp": "::",
                "HostPort": "80"
            }
        ]
    }
}

常用的指令

讓外部網路得以存取容器

sudo docker run -d -P <container ID or name>
-P 是一種隨機的連結策略,若你不想要如此的話,也可以自行指定
sudo docker run -d -p 80:80 -p 116.22.3.106:443:443 <container ID or name>
-p 需要一對對的輸入,結構為 <限制特定IP?>:<宿主port?>:<容器port>
-p 116.22.3.106:443:443 代表的意思為:限制由 116.22.3.106 來源的請求,以 443 port 存取 docker 的 443 port

容器間的存取

# 建立一個 web 容器,允許其和 mysql 和 nginx 服務相連接
sudo docker run -d -p 80:80 -p 443:443 --name web --link mysql nginx

容器間的通訊僅需要告知容器名稱,並不用告知連接埠和映射。這樣便能確保容器內的連接埠僅應用於容器間,不會對外暴露於外網。

接下來的幾篇,會從作業系統安裝 docker 開始,一步步地加上 nginx 服務、 https 設定,然後進入 matomo, mautic ...等開源軟體安裝。


上一篇
Day 4 倉庫 Repository
下一篇
Day 6 不免俗的來個 Hello World Docker
系列文
以 Docker 為始的多種開源服務初探30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言