Docker 정리 노트 (2)

10752 단어 필기
Docker정리노트(二)Networking:docker는 로컬에서 네트워크 카드 장치인docker0을 만들었습니다. 기본 주소는 172.17.0.1이고 네트워크 카드이며 소프트 교환기로도 이해할 수 있습니다.
[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는 가상 기회를 시작하여 로컬에서 네트워크 장치를 비우고, 절반은 가상 장치에, 절반은 docker0에 꽂아서 통신을 완성합니다.ifconfig는 가상 카드를 볼 수 있고 iplink show는 다른 절반의 카드를 볼 수 있다(즉 가상 기기에서 보는eth0).
[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 진짜 기기는 네트워크 UTS ipc를 공유한다.(즉 연맹식 네트워크, 개방식 네트워크(open container)) 그래서 docker는 이런 몇 가지 네트워크를 가질 수 있다. 1.none: 통신이 필요 없는 외딴섬 네트워크2.bridge: 브리지 네트워크 (docker 기본 네트워크 방식) 3.joinded: 연맹 네트워크 A기 B기 4.open container: 호스트 공유 네트워크 A, B 팩시밀리, (컨소시엄 네트워크의 확장)
docker 네트워크 설정: 런 용기에서 네트워크 방식을 지정할 수 있습니다.
[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


또한 생성된 이름 공간에서 명령을 실행할 수 있습니다. 기본적으로 Lo 로컬 NIC는 하나만 표시됩니다.
[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


iplink 명령은 이름 공간에 네트워크 카드 쌍을 만들 수 있습니다.
[root@localhost ~]# ip link   help  
Usage: ip link add [link DEV] [ name ] NAME
...

수동으로 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 수동으로 할 수 있습니다
[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 링크 명령으로 이름을 변경할 수도 있습니다.
[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


현재 양쪽에 모두 네트워크 카드가 있으니 주소로 활성화할 수 있습니다.
[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


마찬가지로 숙성 호스트의 네트워크 카드를 r2에 옮겨 r1r2로 통신하게 하고 네트워크 명칭 공간, 네트워크 카드의 조합을 통해 네트워크 환경을 모의할 수 있다.
네 가지 네트워크:none:lo만 있고 외부와 통신하지 않는다bridged:반은 용기에 있고 반은docker0교에 있고 다리에 있다.(기본값)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 포트에 비추는 것을 볼 수 있습니다.
- 실제 컴퓨터에 비치는 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 컨테이너두 컨테이너는 독립된 PID, USER.MOUNT 공유 NETWORK, IPC, UTS
시작할 때 - 네트워크 유형 지정: A 컨테이너 중:
docker run  --name b1 -it   --rm busybox:latest  


B 용기 중;
docker run  --name  b2  --network container:b1   -it --rm busybox:latest

용기에ifconfig를 제거하면 두 용기가 공용 네트워크 공간을 사용할 수 있습니다.
공유 호스트(직접 노출 포트),
 docker run  --name  b2  --network  host   -it --rm busybox:latest


docker0 수정하기;docker0 다리의 네트워크 속성 정보를 사용자 정의합니다:/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

좋은 웹페이지 즐겨찾기