Docker整理ノート(二)

10581 ワード

Docker整理ノート(2)Networking:docker作成ローカルにNICデバイスdocker 0が作成されました.デフォルトアドレスは172.17.0.1です.NICでもソフトスイッチと理解できます.
[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