Docker整理ノート(二)
10581 ワード
Docker整理ノート(2)Networking:docker作成ローカルにNICデバイスdocker 0が作成されました.デフォルトアドレスは172.17.0.1です.NICでもソフトスイッチと理解できます.
dockerネットワークメカニズム:
dockerは、仮想マシンに半分、docker 0に半分を挿入して通信を完了する仮想機会を起動します.ifconfigは仮想ネットワークカードを見ることができ、ip link showは他の半分のネットワークカード(つまり仮想マシンで見たeth 0)を見ることができます.
kvm外部から仮想マシンにアクセスする方法はnat転送またはブリッジしかできないが、dockerはホストまたは他の仮想マシンとネットワーク空間を共有することによって行うことができる.すなわち、A仮想マシンにはmount user pidがあり、Bには独立したmount user pidがあり、ABまたはABホストはnetwork UTS ipcを共有することができる.(つまり、アライアンスネットワーク、オープンネットワーク)だからdockerはこのいくつかのネットワークを持つことができます:1.none:通信不要のアイランドネットワーク2.bridge:ブリッジ型netネットワーク(dockerデフォルトネットワーク方式)3.joinded:アライアンスネットワークA機B機4.Open container:ホスト共有ネットワークA,Bホスト、(アライアンスネットワークの延長)
dockerネットワークの設定:runコンテナの場合、ネットワーク方式を指定できます.
ネットワークbridge,host,noneのネットワーク情報を表示できます
拡張IPコマンド:centosでネットワーク名空間「ip」コマンドを手動で操作できます.
ネットワーク名空間を手動で追加できます.
また、作成したネームスペースでコマンドを実行することもできます.デフォルトではローカルNICが1つしかありません.
ip linkコマンドは、NICペアを作成し、名前空間に配置できます.
手動で1対のNICを作成するには:
ip set手動バーの半分のNICを名前空間に入れることができます:
IP linkコマンドで名前を変更することもできます.
両方にNICがあるので、アドレスをアクティブにすることができます.
同様に,ホストホストのネットワークカードをr 2に移動してr 1 r 2を通信させ,ネットワーク名空間,ネットワークカードの組合せによりネットワーク環境をシミュレートすることも可能である.
4種類のネットワーク:none:loだけで、外部と通信しないbridged:半分は容器で、半分はdocker 0ブリッジで、ブリッジ.(デフォルト)joined:AコンテナとBコンテナのアライアンス式、open container:ホストネットワーク空間を直接共有
hostsファイルに注入できます–add-host
コンテナ内のアドレスはイントラネットで、ネットワークは達成できません.私たちはそれを暴露する必要があります.-P:dnat変換をしたのは
コンテナアドレスをホストの32768ポートにマッピングすることがわかる.
-pは、ホストにマッピングされるipのどのポートを直接指定することもできます.
Joined container連盟容器;2つの容器には独立したPID、USERがあります.MOUNT共有NETWORK,IPC,UTS
起動時–networkネットワークタイプを指定:Aコンテナ:
B容器中;
容器のifconfigを除去すると、2つの容器が共通のネットワーク空間を持つことがわかります.
共有ホスト(ポートを直接露出);
docker 0を変更します.カスタムdocker 0ブリッジのネットワークプロパティ情報:/etc/docker/daemon.jsonファイル
dockerdデーモンのC/Sは、デフォルトでUnix SOcket形式のアドレスのみをリスニング、/var/run/docker.sock;TCPソケットを使用する場合、vim/etc/docker/daemon.json:
ネットワークブリッジを手動で作成します.
[ZW@docker ~]# ifconfig | grep -C5 docker0
docker0: flags=4099 mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:53ff:fef6:4154 prefixlen 64 scopeid 0x20
ether 02:42:53:f6:41:54 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
dockerネットワークメカニズム:
[ZW@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
84b330d92923 bridge bridge local
f70243acdd4c host host local
ed7f69c4a866 none null local
dockerは、仮想マシンに半分、docker 0に半分を挿入して通信を完了する仮想機会を起動します.ifconfigは仮想ネットワークカードを見ることができ、ip link showは他の半分のネットワークカード(つまり仮想マシンで見たeth 0)を見ることができます.
[ZW@docker ~]# docker container start web && ifconfig | grep veth
web
vethfa4b6f6: flags=4163 mtu 1500
kvm外部から仮想マシンにアクセスする方法はnat転送またはブリッジしかできないが、dockerはホストまたは他の仮想マシンとネットワーク空間を共有することによって行うことができる.すなわち、A仮想マシンにはmount user pidがあり、Bには独立したmount user pidがあり、ABまたはABホストはnetwork UTS ipcを共有することができる.(つまり、アライアンスネットワーク、オープンネットワーク)だからdockerはこのいくつかのネットワークを持つことができます:1.none:通信不要のアイランドネットワーク2.bridge:ブリッジ型netネットワーク(dockerデフォルトネットワーク方式)3.joinded:アライアンスネットワークA機B機4.Open container:ホスト共有ネットワークA,Bホスト、(アライアンスネットワークの延長)
dockerネットワークの設定:runコンテナの場合、ネットワーク方式を指定できます.
[ZW@docker ~]# docker container run --help | grep network
--network string Connect a container to a
network (default "default")
ネットワークbridge,host,noneのネットワーク情報を表示できます
[ZW@docker ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "dacbc276f6b07d734709317892d66abb045f88f0ff38fbbb5f8c78773ce36549",
"Created": "2018-10-28T11:05:07.769121664+08:00",
"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": {},
"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": {}
}
]
拡張IPコマンド:centosでネットワーク名空間「ip」コマンドを手動で操作できます.
[root@localhost ~]# rpm -qf /sbin/ip
iproute-3.10.0-74.el7.x86_64
[root@localhost ~]# ip netns help
Usage: ip netns list
ip netns add NAME #
ip netns set NAME NETNSID
ip [-all] netns delete [NAME]
ip netns identify [PID]
ip netns pids NAME
ip [-all] netns exec [NAME] cmd ... #
ip netns monitor
ip netns list-id
ネットワーク名空間を手動で追加できます.
[root@localhost ~]# ip netns add r1
[root@localhost ~]# ip netns add r2
[root@localhost ~]# ip netns list
r2
r1
また、作成したネームスペースでコマンドを実行することもできます.デフォルトではローカルNICが1つしかありません.
[root@localhost ~]# ip netns exec r1 ifconfig -a
lo: flags=8 mtu 65536
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ip linkコマンドは、NICペアを作成し、名前空間に配置できます.
[root@localhost ~]# ip link help
Usage: ip link add [link DEV] [ name ] NAME
...
手動で1対のNICを作成するには:
[root@localhost ~]# ip link add name eth1.1 type veth peer name veth1.2
#name type peer
[root@localhost ~]# ip link
5: [email protected]: mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether ce:ac:2e:6d:73:43 brd ff:ff:ff:ff:ff:ff
6: [email protected]: mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether ee:47:86:a6:b9:1b brd ff:ff:ff:ff:ff:ff
ip set手動バーの半分のNICを名前空間に入れることができます:
[root@localhost ~]# ip link set dev veth1.2 netns r1
[root@localhost ~]# ip link
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 00:0c:29:02:de:1c brd ff:ff:ff:ff:ff:ff
3: virbr0: mtu 1500 qdisc noqueue state DOWN mode DEFAULT qlen 1000
link/ether 52:54:00:0b:9b:e5 brd ff:ff:ff:ff:ff:ff
4: virbr0-nic: mtu 1500 qdisc pfifo_fast master virbr0 state DOWN mode DEFAULT qlen 1000
link/ether 52:54:00:0b:9b:e5 brd ff:ff:ff:ff:ff:ff
6: eth1.1@if5: mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether ee:47:86:a6:b9:1b brd ff:ff:ff:ff:ff:ff link-netnsid 0
[root@localhost ~]# ip netns exec r1 ifconfig -a
lo: flags=8 mtu 65536
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth1.2: flags=4098 mtu 1500
ether ce:ac:2e:6d:73:43 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
IP linkコマンドで名前を変更することもできます.
[root@localhost ~]# ip netns exec r1 ip link set dev veth1.2 name eth0
[root@localhost ~]# ip netns exec r1 ifconfig -a
eth0: flags=4098 mtu 1500
ether ce:ac:2e:6d:73:43 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=8 mtu 65536
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
両方にNICがあるので、アドレスをアクティブにすることができます.
[root@localhost ~]# ifconfig eth1.1 192.168.0.1/24 up
[root@localhost ~]# ip netns exec r1 ifconfig eth0 192.168.0.3/24
[root@localhost ~]# ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.089 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.076 ms
同様に,ホストホストのネットワークカードをr 2に移動してr 1 r 2を通信させ,ネットワーク名空間,ネットワークカードの組合せによりネットワーク環境をシミュレートすることも可能である.
4種類のネットワーク:none:loだけで、外部と通信しないbridged:半分は容器で、半分はdocker 0ブリッジで、ブリッジ.(デフォルト)joined:AコンテナとBコンテナのアライアンス式、open container:ホストネットワーク空間を直接共有
--network -h --dns dns:
[root@docker ~]# docker run --name t1 -it --network bridged - -dns 8.8.8.8 --rm busybox:latest
hostsファイルに注入できます–add-host
[root@docker ~]# docker run --name t1 -it -h t1 --add-host www.baidu.com:1.1.1.1 busybox:latest
コンテナ内のアドレスはイントラネットで、ネットワークは達成できません.私たちはそれを暴露する必要があります.-P:dnat変換をしたのは
[root@docker ~]# docker run --name t1 -it -p 80 --rm nginx:1.14-alpine
[root@docker ~]# docker port t1
80/tcp -> 0.0.0.0:32769
[root@docker ~]# iptables -t nat -vnL | grep dpt
0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:80
1 60 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:32768 to:172.17.0.2:80
コンテナアドレスをホストの32768ポートにマッピングすることがわかる.
-pは、ホストにマッピングされるipのどのポートを直接指定することもできます.
docker run --name t1 -it -p 192.168.64.100:5555:80 --rm nginx:1.14-alpine
[root@docker ~]# docker port t1
80/tcp -> 192.168.64.100:5555
Joined container連盟容器;2つの容器には独立したPID、USERがあります.MOUNT共有NETWORK,IPC,UTS
起動時–networkネットワークタイプを指定:Aコンテナ:
docker run --name b1 -it --rm busybox:latest
B容器中;
docker run --name b2 --network container:b1 -it --rm busybox:latest
容器のifconfigを除去すると、2つの容器が共通のネットワーク空間を持つことがわかります.
共有ホスト(ポートを直接露出);
docker run --name b2 --network host -it --rm busybox:latest
docker 0を変更します.カスタムdocker 0ブリッジのネットワークプロパティ情報:/etc/docker/daemon.jsonファイル
{
"bip": "192.168.1.5/24",
"fixed-cidr": "10.20.0.0/16",
"fixed-cidr-v6": "2001:db8::/64",
"mtu": 1500,
"default-gateway": "10.20.1.1",
"default-gateway-v6": "2001:db8:abcd::89",
"dns": ["10.20.1.2","10.20.1.3"]
}
dockerdデーモンのC/Sは、デフォルトでUnix SOcket形式のアドレスのみをリスニング、/var/run/docker.sock;TCPソケットを使用する場合、vim/etc/docker/daemon.json:
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
ネットワークブリッジを手動で作成します.
ip link set dev docker network create -d bridge --subnet 172.26.0.0/16 --gateway 172.26.0.1 mybr0