クラウドネイティブ時代に求められるコアスキル Docker Advanced (Dockerネットワーク詳解)
前節では、プロジェクトに必要なDockerの基本を紹介しました
Dockerの基礎知識
続いて、Docker Advancedを体系的に紹介します。ネットワークコア、Dockerプラクティス、DockerCompose、Harbor、Swarmです。
Dockerネットワーキング入門
Dockerは、Linux Kernelの名前空間、CGroups、UnionFileSystemなどの技術をベースに、カスタムコンテナにラップして、一連の仮想実行環境を提供するカスタムコンテナ・フォーマットである。
<ブロッククオート名前空間:分離のために使用される。例:pid [プロセス]、net [ネットワーク]、mnt [マウントポイント]など。
CGroups。メモリやCPUなどのリソース制限に使用されるコントローラグループ
ユニオン・ファイル・システム。イメージとコンテナのレイヤリングに使用
1. コンピュータネットワークモデル
Dockerの公式ネットワークサイトhttps://docs.docker.com/network/。
OSI : Open System Interconnect参照モデル
TCP/IP TCP/IPは、TCPとIPという2つのプロトコルだけではなく、FTP、SMTP、TCP、UDP、IPなどのプロトコルの集合体である。TCP/IPプロトコルは、TCPとIPの中で最も代表的なプロトコルであるため、TCP/IPプロトコルと呼ばれています。
レイヤリングの考え方 レイヤリングの基本的な考え方は、各レイヤーがその下位レイヤーが提供するサービスの上に、より高いレベルの付加価値を提供し、トップレイヤーは分散アプリケーションを実行できるサービスを提供することである
クライアントがリクエストを送信する。
サーバーサイドでリクエストを受け付ける。
Liunxで2枚のNICを搭載
2.1 NICの情報を見る
NICを表示するコマンド:ip a
[vagrant@localhost ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:4d:77:d3 brd ff:ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
valid_lft 85987sec preferred_lft 85987sec
inet6 fe80::5054:ff:fe4d:77d3/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:6e:31:45 brd ff:ff:ff:ff:ff:ff:ff
inet 192.168.56.10/24 brd 192.168.56.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe6e:3145/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:bf:79:9f:de brd ff:ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
ip aで、現在のcentosの4つのNICが以下の役割を担っていることがわかります。
<テーブル 名称 役割 ロ ローカルNIC [loはloopbackの略で、ループバックを意味し、Linuxシステムはデフォルトでloという名前のループバックネットワークインターフェイスを持っています]。 エスゼロ ネットワークに接続するネットワークカード エスワン ホストと通信するNIC ドッカー0 ドッカー用NICip link showを表示します。
[vagrant@localhost ~]$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:4d:77:d3 brd ff:ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:6e:31:45 brd ff:ff:ff:ff:ff:ff:ff
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:bf:79:9f:de brd ff:ff:ff:ff:ff:ff:ff
NICをファイルとして表示する: ls /sys/class/net
[vagrant@localhost ~]$ ls /sys/class/net
docker0 eth0 eth1 lo
2.2 コンフィギュレーションファイル
Linuxでは、NICはファイルに対応しているので、パスに格納されている対応するNICファイルを見つけるだけです。
[vagrant@localhost network-scripts]$ cd /etc/sysconfig/network-scripts/
[vagrant@localhost network-scripts]$ ls
ifcfg-eth0 ifdown-eth ifdown-ppp ifdown-tunnel ifup-ippp ifup-post ifup-TeamPort network-functions-ipv6
ifcfg-eth1 ifdown-ippp ifdown-routes ifup ifup-ipv6 ifup-ppp ifup-tunnel
ifcfg-lo ifdown-ipv6 ifdown-sit ifup-aliases ifup-isdn ifup-routes ifup-wireless
ifdown ifdown-isdn ifdown-team ifup-bnep ifup-plip ifup-sit init.ipv6-global
ifdown-bnep ifdown-post ifdown-TeamPort ifup-eth ifup-plusb ifup-Team network-functions
2.3 NICの動作
ネットワークカードにipアドレスを追加する
[root@localhost ~]# ip addr add 192.168.100.120/24 dev eth0
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:4d:77:d3 brd ff:ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
valid_lft 84918sec preferred_lft 84918sec
inet 192.168.100.120/24 scope global eth0 #### added an IP address
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe4d:77d3/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:6e:31:45 brd ff:ff:ff:ff:ff:ff:ff
inet 192.168.56.10/24 brd 192.168.56.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe6e:3145/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:bf:79:9f:de brd ff:ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
IPアドレスの削除:ip addr delete 192.168.100.120/24 dev eth0
[root@localhost ~]# ip addr delete 192.168.100.120/24 dev eth0
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:4d:77:d3 brd ff:ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
valid_lft 84847sec preferred_lft 84847sec
inet6 fe80::5054:ff:fe4d:77d3/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:6e:31:45 brd ff:ff:ff:ff:ff:ff:ff
inet 192.168.56.10/24 brd 192.168.56.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe6e:3145/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
lik/ether 02:42:bf:79:9f:de brd ff:ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
2.4 NIC情報のパース
ステータス UP/DOWN/UNKOWNなど。
リンク/エーテル MACアドレス
inet: バインドIPアドレス
3 ネットワークの名前空間
Network Namespaceは、ネットワーク仮想化を実現するための重要な機能で、ネットワークスタック情報を個別に持つ、分離された複数のネットワーク空間を作り出します。仮想マシンであれコンテナであれ、あたかも別のネットワークにいるかのように実行されます。
3.1 Network Namespceの動作
ネームスペースの追加
ip netns add ns1
現在持っている名前空間を表示する
ip netns list
[root@localhost ~]# ip netns add ns1
[root@localhost ~]# ip netns list
ns1
ip netns delete ns1
[root@localhost ~]# ip netns add ns1
[root@localhost ~]# ip netns list
ns1
[root@localhost ~]# ip netns delete ns1
[root@localhost ~]# ip netns list
[root@localhost ~]# ip netns delete ns1 [root@localhost ~]# ip netns list
ネームスペースの削除
ip netns exec ns1 ip a
[root@localhost ~]# ip netns exec ns1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
ip netns exec ns1 ifup lo
[root@localhost ~]# ip netns exec ns1 ip link show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
[root@localhost ~]# ip netns exec ns1 ifup lo
[root@localhost ~]# ip netns exec ns1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
[root@localhost ~]#
[root@localhost ~]# ip netns exec ns1 ifdown lo
[root@localhost ~]# ip netns exec ns1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noqueue state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
名前空間[ns1]のNICを表示します。
[root@localhost ~]# ip netns exec ns1 ip link set lo up
[root@localhost ~]# ip netns exec ns1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
[root@localhost ~]# ip netns exec ns1 ip link set lo down
[root@localhost ~]# ip netns exec ns1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noqueue state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
[root@localhost ~]#
[root@localhost ~]# ip netns add ns2
[root@localhost ~]# ip netns list
ns2
ns1
<イグ
ネットワークの状態を開始する
ip link add veth-ns1 type veth peer name veth-ns2
ip link set veth-ns1 netns ns1
ip link set veth-ns2 netns ns2
[root@localhost ~]# ip netns exec ns1 ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
6: veth-ns1@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 7e:bb:ee:13:a2:9a brd ff:ff:ff:ff:ff:ff:ff link-netnsid 1
[root@localhost ~]# ip netns exec ns2 ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth-ns2@if6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 7e:f8:18:5a:ef:1f brd ff:ff:ff:ff:ff:ff:ff link-netnsid 0
ネットワーク状態をオフにする
ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1
ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2
[root@localhost ~]# ip netns exec ns1 ip link set veth-ns1 up
[root@localhost ~]# ip netns exec ns2 ip link set veth-ns2 up
ステータスは、リンクからも設定できます
ip netns exec ns1 ping 192.168.0.12 ip netns exec ns2 ping 192.168.0.11
再び名前空間を追加する[ns2]。
ip a
それでは、2つの名前空間間の通信を実装してみましょう。
2つのネットワーク・ネームスペース間の通信を実装するために、必要な技術は以下の通りです。
ベス・ペア 仮想イーサネットペア、上記の機能を実現するペアポート
vethペアを介して次に接続されるリンクペアを作成します。
[root@localhost tomcat]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:4d:77:d3 brd ff:ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
valid_lft 66199sec preferred_lft 66199sec
inet6 fe80::5054:ff:fe4d:77d3/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:6e:31:45 brd ff:ff:ff:ff:ff:ff:ff
inet 192.168.56.10/24 brd 192.168.56.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe6e:3145/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:52:d4:0a:9f brd ff:ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:52ff:fed4:a9f/64 scope link
valid_lft forever preferred_lft forever
24: veth78a90d0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 7e:6b:8c:bf:7e:30 brd ff:ff:ff:ff:ff:ff:ff:ff link-netnsid 2
inet6 fe80::7c6b:8cff:febf:7e30/64 scope link
valid_lft forever preferred_lft forever
26: vetha2bfbf4@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether ce:2f:ed:e5:61:32 brd ff:ff:ff:ff:ff:ff:ff:ff link-netnsid 3
inet6 fe80::cc2f:edff:fee5:6132/64 scope link
valid_lft forever preferred_lft forever
次に、ホストに追加のNICのペアが存在します。
そして、作成した veth-ns1 を namespace1 に、veth-ns2 を namespace2 に渡します。
[root@localhost tomcat]# docker exec -it tomcat01 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
23: eth0@if24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
<イグ
ns1、ns2のリンクをもう一度見てみましょう。
[root@localhost tomcat]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.038 ms
^C
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.038/0.038/0.038/0.000 ms
この時点では、veth-ns1とveth-ns2はまだipアドレスを持っていないので、明らかに通信がまだ何か不足しています
yum install bridge-utils
brctl show
<イグ
もう一度見てみると、状態がDOWNになっているので、対応するNICを有効にする必要があります。
[root@localhost tomcat]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024252d40a9f no veth78a90d0
vetha2bfbf4
次に、ステータスを確認します。
その後、お互いにPingを通すことができます
[root@localhost tomcat]# docker network ls
NETWORK ID NAME DRIVER SCOPE
92242fc0f805 bridge bridge local
96b999d7fcc2 host host local
17b86f9caa33 none null local
<イグ
3.2 コンテナの名前空間
上記のように、実際には、各コンテナは、独自のネットワーク名前空間を持ち、独立しているので、コンテナに入って、以下のことを確認することができます。
2つのTomcatコンテナを作成する
docker run -d --name tomcat01 -p 8081:8080 tomcat
docker run -d --name tomcat02 -p 8082:8080 tomcat
両方のコンテナに移動して、ipを確認します。
docker exec -it tomcat01 ip a
docker exec -it tomcat02 ip a
お互いにpingを打つことが可能
質問です。tomcat01 と tomcat02 が 2 つのネットワークネームスペースに属している場合、どのように Ping を打てばよいのでしょうか。と思われる方もいらっしゃるかもしれませんが、上記の名前空間の実践と同じではないでしょうか?ここでは,ヴェス・ペア技術がないことに注意してください
4 コンテナネットワーク「Bridge」の徹底分析
4.1 Dockerのデフォルトのブリッジ
まず
"Containers": {
"4b3500fed6b99c00b3ed1ae46bd6bc33040c77efdab343175363f32fbcf42e63": {
"Name": "tomcat01",
"EndpointID": "40fc0925fcb59c9bb002779580107ab9601640188bf157fa57b1c2de9478053a",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"92d2ff3e9be523099ac4b45058c5bf4652a77a27b7053a9115ea565ab43f9ab0": {
"Name": "tomcat02",
"EndpointID": "1d6c3bd73e3727dd368edf3cc74d2f01b5c458223f844d6188486cb26ea255bc",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
}
現在のホストのネットワーク状態を見るために
docker network create tomcat-net
or
docker network create tomcat-net --subnet=172.18.0.0/24 tomcat-net
次に、tomcat01 のネットワークを見てください: docker exec -it tomcat01 ip a you can find
[root@localhost ~]# docker network create tomcat-net
43915cba1f9204751b48896d7d28b83b4b6cf35f06fac6ff158ced5fb9ddb5b3
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b5c9cfbc0410 bridge bridge local
96b999d7fcc2 host host local
17b86f9caa33 none null local
43915cba1f92 tomcat-net bridge local
ホストからTomcat01のネットワークにpingを打つことが可能であることがわかります。
[root@localhost ~]# docker network inspect tomcat-net
[
{
"Name": "tomcat-net",
"Id": "43915cba1f9204751b48896d7d28b83b4b6cf35f06fac6ff158ced5fb9ddb5b3",
"Created": "2021-10-11T12:10:19.543766962Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
Centos と tomcat01 は 2 つの異なる NetWork NameSpace に属しており、Ping は通るので、どのように接続されるのでしょうか?図を見てください。
実際には、tomcat01のeth0とcentosのdocker0のvethがペアになっており、前回の実践のveth-ns1とveth-ns2と同様であり、確認は簡単である
[root@localhost ~]# docker run -d --name custom-net-tomcat --network tomcat-net tomcat-ip:1.0
264b3901f8f12fd7f4cc69810be6a24de48f82402b1e5b0df364bd1ee72d8f0e
実行
12: br-43915cba1f92: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:71:a6:67:c7 brd ff:ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-43915cba1f92
valid_lft forever preferred_lft forever
inet6 fe80::42:71ff:fea6:67c7/64 scope link
valid_lft forever preferred_lft forever
14: veth282a555@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-43915cba1f92 state UP group default
link/ether 3a:3d:83:15:3f:ed brd ff:ff:ff:ff:ff:ff:ff link-netnsid 3
inet6 fe80::383d:83ff:fe15:3fed/64 scope link
valid_lft forever preferred_lft forever
ip a caseと比較する
続いて、図面で説明します。
このネットワーク接続方法は、私たちがBridgeと呼んでいるもので、実際にはdocker network lsというコマンドで見ることができます , bridgeはdockerのデフォルトのネットワークモードでもあります。
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br-43915cba1f92 8000.024271a667c7 no veth282a555
docker0 8000.02423964f095 no veth4526c0c
vethaa2f6f4
vethc6ad4c2
ブリッジを確認してみましょう: docker network inspect bridge
[root@localhost ~]# docker exec -it custom-net-tomcat ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
^C
--- 172.17.0.2 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2000ms
インターネットはtomcat01のコンテナでアクセスします。ちなみにこの図は、NATはiptablesで実装されています
4.2 NetWorkのカスタマイズ
ネットワーク(Bridgeタイプ)を作成する
docker network connect tomcat-net tomcat01
[root@localhost ~]# docker exec -it tomcat01 ping custom-net-tomcat
PING custom-net-tomcat (172.18.0.2) 56(84) bytes of data.
64 bytes from custom-net-tomcat.tomcat-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.138 ms
^C
--- custom-net-tomcat ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.138/0.138/0.138/0.000 ms
[root@localhost ~]# docker exec -it custom-net-tomcat ping tomcat01
PING tomcat01 (172.18.0.3) 56(84) bytes of data.
64 bytes from tomcat01.tomcat-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.031 ms
既存のNetWorkを表示する:Docker network ls
docker run -d --name my-tomcat-host --network host tomcat-ip:1.0
tomcat-net の詳細の表示: docker network inspect tomcat-net
docker exec -it my-tomcat-host ip a
ネットワークの削除: docker network rm tomcat-net
tomcat コンテナを作成し、tomcat-net を使用するように指定します。
docker network inspect host
"Containers": {
"f495a6892d422e61daab01e3fcfa4abb515753e5f9390af44c93cae376ca7464": {
"Name": "my-tomcat-host",
"EndpointID": "77012b1ac5d15bde3105d2eb2fe0e58a5ef78fb44a88dc8b655d373d36cde5da",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
}
}
custom-net-tomcatのネットワーク情報(傍受鍵情報)を表示します。
docker run -d --name my-tomcat-none --network none tomcat-ip:1.0
NICインターフェース情報を表示する
docker exec -it my-tomcat-none
この時点で、custom-net-tomcat コンテナ内のいくつかの tomcat01 に ping を実行すると、ping が効かないことがわかります
docker network inspect none
"Containers": {
"c957b61dae93fbb9275acf73c370e5df1aaf44a986579ee43ab751f790220807": {
"Name": "my-tomcat-none",
"EndpointID": "16bf30fb7328ceb433b55574dc071bf346efa58e2eb92b6f40d7a902ddc94293",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
}
}
この時点で、tomcat01 コンテナが tomcat-net に接続できていれば、問題ありません。
docker run -d --name port-tomcat tomcat-ip:1.0
docker exec -it port-tomcat bash
curl localhost:8080
5 徹底的な分析 コンテナ・ネットワーク-ホスト&アンプなし
5.1 ホスト
ホストモードでは、コンテナはホストのネットワークスタックを共有し、ホストのすべてのインターフェイスがコンテナで利用可能になります。コンテナのホスト名は、ホストシステム上のホスト名と一致します。
コンテナを作成し、ネットワークをホストとして指定する
docker exec -it port-tomcat ip a
curl 172.17.0.4:8080
ipアドレスの表示
docker rm -f port-tomcat
docker run -d --name port-tomcat -p 8090:8080 tomcat-ip:1.0
curl localhost:8090
ホストネットワークの確認
#At this point it is required that the centos and win networks are on the same network segment, so in the Vagrantfile file
#This approach is equivalent to bridging the network. You can also specify which physical NIC to use for this network, for example
#config.vm.network"public_network",:bridge=>'en1: Wi-Fi (AirPort)'
config.vm.network"public_network"
centos7: ip a --->192.168.8.118
win10:browser access 192.168.8.118:9080
"Containers": {
"f495a6892d422e61daab01e3fcfa4abb515753e5f9390af44c93cae376ca7464": {
"Name": "my-tomcat-host",
"EndpointID": "77012b1ac5d15bde3105d2eb2fe0e58a5ef78fb44a88dc8b655d373d36cde5da",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
}
}
5.2 なし
Noneモードでは、コンテナ用のIPは設定されず、外部ネットワークや他のコンテナにアクセスすることはできません。ループバックアドレスを持ち、バッチジョブの実行に使用することができます。
tomcatコンテナを作成し、ネットワークをnoneに指定します。
docker run -d --name my-tomcat-none --network none tomcat-ip:1.0
ipアドレスの表示
docker exec -it my-tomcat-none
ネットワークなしを確認する
docker network inspect none
"Containers": {
"c957b61dae93fbb9275acf73c370e5df1aaf44a986579ee43ab751f790220807": {
"Name": "my-tomcat-none",
"EndpointID": "16bf30fb7328ceb433b55574dc071bf346efa58e2eb92b6f40d7a902ddc94293",
"MacAddress": "",
"IPv4Address": "",
"IPv6Address": ""
}
}
6 ポートマッピング
tomcatコンテナをport-tomcatという名前で作成します。
docker run -d --name port-tomcat tomcat-ip:1.0
tomcatのサービスにアクセスする方法を考える
docker exec -it port-tomcat bash
curl localhost:8080
centos7でアクセスする場合はどうするか?
docker exec -it port-tomcat ip a
curl 172.17.0.4:8080
centosのlocalhost経由でアクセスする必要がある場合はどうすればよいでしょうか。この場合、tomcatのポート8080をcentosにマッピングする必要があります。
docker rm -f port-tomcat
docker run -d --name port-tomcat -p 8090:8080 tomcat-ip:1.0
curl localhost:8090
centos7はwin10上で動作する仮想マシンですが、win10上でip:portでアクセスしたい場合はどうすればいいのでしょうか?
#At this point it is required that the centos and win networks are on the same network segment, so in the Vagrantfile file
#This approach is equivalent to bridging the network. You can also specify which physical NIC to use for this network, for example
#config.vm.network"public_network",:bridge=>'en1: Wi-Fi (AirPort)'
config.vm.network"public_network"
centos7: ip a --->192.168.8.118
win10:browser access 192.168.8.118:9080
<イグ
7 複数マシン間の通信
これについては、Docker Swarmで詳しく説明しますので、このセクションでは簡単な紹介にとどめます。
同じcentos7マシンでは、どんなに投げても、2つのコンテナを通信させる方法が必要であることがわかりました。では、2台のcentos7マシンにある場合はどうでしょうか?図を描いてみましょう
VXLAN技術の導入。Virtual Extensible LAN (VELAN)の略。
ps:Dockerのネットワークをマスターすることは、実際に全体の技術の中核であり、記事はああコレクションの好きに注意を払うために歓迎されている有用である場合
次へ Dockerの実装
関連
-
[解決済み】apt-get でインストールしても docker コマンドが見つからない。
-
[解決済み】ドッカーコンテナがすぐに終了してしまう理由
-
[解決済み】docker: ドライバがエンドポイントウェブサーバの外部接続のプログラミングに失敗しました。
-
[解決済み] Docker: 親ディレクトリからファイルを追加する
-
[解決済み] アルパインイメージでdockerを使ってbashをユーザrootで実行するには? su: suidでないと正常に動作しません。
-
[解決済み] ドッカーイメージのアイコンを作成する
-
[解決済み] Dockerfileの "RUN chmod "が有効でない。
-
[解決済み] 作成前のチェックでエラーになる。「このコンピュータでは、VT-X/AMD-vが有効になっていません。有効になっているのに「BIOSで有効にすることが必須です。
-
Docker npm getaddrinfo EAI_AGAIN registry.npmjs.org registry.npmjs.org:443
-
ドッカーサーバーがHTTPSクライアントに対してHTTPレスポンスを返す問題処理
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Dockerのビルドコンテキスト外のファイルをインクルードする方法とは?
-
[解決済み] Dockerイメージを1つのコンテナにまとめる方法はありますか?
-
[解決済み] docker run --initに相当するdocker-composeは何ですか?
-
[解決済み] DockerでPillowを使用する
-
[解決済み] ドッカーコンテナの終了ステータス255は何を意味するのですか?
-
Http: サーバーが HTTPS クライアントに HTTP 応答を返した 解決策
-
docker 環境に opencv をインストールします ImportError: libGL.so.1: cannot open shared object file: そのようなファイルやディレクトリはありません
-
Docker Error : 無効または破損したジャーファイル .jar
-
docker encountered problem 4: yaml: line 1: mapping values are not allowed in this context.
-
httpコード中にdocker registry apiのインタラクションを呼び出す コード詳細