Docker 네트워크

설치하는 동안 Docker는 세 가지 다른 네트워크 옵션을 만듭니다.
docker network ls를 사용하여 다음과 같이 나열할 수 있습니다.
bojana@linux:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
0c872e6d6453 bridge bridge local
10826dd62a8b host host local
cab99af2344e none null local
기본적으로 호스트 내의 전용 네임스페이스 네트워크에 있는 브리지 모드가 선택됩니다.
이전 글에서, 우리는 기본적인 docker 명령을 연구했고, 호스트에서 docker run-p를 사용하여 포트를 비추었다.이렇게 하면 Docker가 iptables 규칙을 만들어 호스트에서 컨테이너로 트래픽을 라우팅합니다.
위 목록의 없음 항목은 Docker가 어떠한 구성도 수행하지 않아야 함을 나타냅니다.그것은 네트워크 수요를 맞춤형으로 설정하는 데 쓰인다.
용기의 네트워크를 현저하게 선택하려면, 넷을 docker run에 전달합니다.
브리지는 두 세그먼트를 연결하는 Linux 커널 특성입니다.
Docker를 설치하면 호스트에 docker0이라는 브리지를 몰래 만듭니다.
이 점을 검증하기 위해 ip addr show 명령을 내릴 수 있습니다.다음은 내 기계의 출력이다.
bojana@linux:~$ ip addr show
1: lo: 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: mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 96:00:00:b1:5e:b3 brd ff:ff:ff:ff:ff:ff
inet 188.34.194.63/32 scope global dynamic eth0
valid_lft 74220sec preferred_lft 74220sec
inet6 2a01:4f8:1c1c:a675::1/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::9400:ff:feb1:5eb3/64 scope link
valid_lft forever preferred_lft forever
3: docker0: mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:b6:9c:25:22 brd 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:b6ff:fe9c:2522/64 scope link
valid_lft forever preferred_lft forever
5: veth51c3665@if4: mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 96:4d:57:fa:c0:99 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::944d:57ff:fefa:c099/64 scope link
valid_lft forever preferred_lft forever
docker0은 172.17.0.1/16 범위의 가상 이더넷 브리지를 사용합니다.
veth51c3665는 용기를 브리지 네트워크에 연결하는 가상 인터페이스 쌍의 호스트 단말기입니다.
앞에서 말한 바와 같이, 기본적으로 용기를 시작할 때 발표된 포트가 없기 때문에, 도커 호스트 외부에서는 용기를 볼 수 없지만, 도커 호스트 자체에서 접근할 수 있습니다.
이 예에서, 우리는nginxdemo/hello 이미지를 사용할 것이다. 이것은 간단한 웹 서버를 포함하고 용기의 IP 주소를 출력할 수 있기 때문에 내부에서 다른 내용을 볼 수 있다.bojana@linux:~$ docker run -d nginxdemos/hello실행 중인 이 용기에 연결해서 IP 주소가 분배되었는지 봅시다.
실행 중인 컨테이너의 셸에 액세스하려면 다음을 사용합니다.bojana@linux:~$ docker exec -it jovial_wu /bin/ash주의: jovial wu는 만들 때 지정한 무작위 용기 이름입니다. 이름이 지정되지 않았기 때문에 docker ps 명령을 사용하여 이름을 확인하십시오.
컨테이너 명령줄의 IP 주소 표시:
/ # ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
우리는 상술한 docker 0 범위에서 주소가 오는 것을 보았다.
브라우저에 이 주소를 붙여 넣으면 nginx 데모 페이지가 나타납니다.

이것은 우리에게 용기 내부에서 본 내용을 보여 준다. 예를 들어 다리의 IP에 서버name을 더하면, 후자는 용기의 linux 호스트 이름 (용기 id) 이다.
컨테이너는 어떻게 다리 위에서 서로 통신합니까?
컨테이너의 두 번째 인스턴스를 작성합니다.docker run -d nginxdemos/hello연결:docker exec -it inspiring_mcnulty2 /bin/ashIP를 확인하면 브리지 범위에서 다시 확인할 수 있습니다.
/ # ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.4/16 brd 172.17.255.255 scope glo
이전에 생성한 컨테이너에 대해 Ping을 수행할 수도 있습니다.
/ # ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.204 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.189 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.181 ms
64 bytes from 172.17.0.3: seq=3 ttl=64 time=0.192 ms
^C
--- 172.17.0.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.181/0.191/0.204 ms
이것은 우리가 같은 브리지에 있는 두 용기 사이에 IP가 연결되어 있다는 것을 의미한다.
만약 우리가 IP 루트 명령을 내린다면, Docker 호스트의 IP를 통해 기본 루트가 있는 것을 볼 수 있습니다
다리 위에서 입구로 삼다.
컨테이너에서 인터넷에 액세스할 수도 있고 이름 확인도 가능합니다.
/ # ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=111 time=18.209 ms
64 bytes from 8.8.8.8: seq=1 ttl=111 time=18.524 ms
64 bytes from 8.8.8.8: seq=2 ttl=111 time=18.116 ms
64 bytes from 8.8.8.8: seq=3 ttl=111 time=18.414 ms
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 18.116/18.315/18.524 ms
/ # ping google.com
PING google.com (142.250.185.110): 56 data bytes
64 bytes from 142.250.185.110: seq=0 ttl=112 time=28.885 ms
64 bytes from 142.250.185.110: seq=1 ttl=112 time=28.785 ms
64 bytes from 142.250.185.110: seq=2 ttl=112 time=29.383 ms
64 bytes from 142.250.185.110: seq=3 ttl=112 time=28.670 ms
^C
-------- google.com ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 28.670/28.930/29.383 ms
기본 브리지 설정에서 모든 용기는 같은 가상 네트워크에 있기 때문에 서로 통신할 수 있습니다.그러나 컨테이너를 분리하기 위해 다른 네트워크 이름 공간을 만들 수 있습니다.
우리가 말했듯이, 도커 용기를 외부에서 볼 수 있는 가장 흔한 방법은 포트가 비치는 것이다.
이번에는 포트 매핑을 지정하는 다른 컨테이너를 만듭니다.bojana@linux:~$ docker run -d nginxdemo/hello -p 81:80그러나 우리가 지적해야 할 점은 도커 용기 간의 명칭 해석이 작동하지 않는다는 것이다.
위에서 만든 컨테이너에 연결하고 호스트 이름으로 만든 첫 번째 또는 두 번째 컨테이너에 대해 ping을 시도할 경우 다음을 수행할 수 없습니다.
/ # hostname
0888f0c68423
/ # ping 167bcc074170
ping: bad address '167bcc074170'

사용자 정의 브리지


원칙적으로 용기 사이에서 호스트 이름을 해석할 수 있지만 기본 브리지에서 호스트 이름을 해석할 수 없다.
이것은 우리가 반드시 자신을 창조해야 한다는 것을 의미한다.
docker network create 명령을 사용하여 사용자정의 브리지 네트워크를 만들려면 다음과 같이 하십시오.
bojana@linux:~$ docker network create --driver=bridge --subnet=172.172.0.0/24 --ip-range=172.172.0.128/25 --gateway=172.172.0.1 my-br0
지금까지 만든 모든 용기를 계속 정지하거나 제거할 수 있습니다. 그러면 깨끗한 기록이 있습니다.
이제 새로 만든 다리를 사용하는 새 컨테이너를 만듭니다.
bojana@linux:~$ docker run -d --name my-nginx --network my-br0 --hostname my-nginx nginxdemos/hello
다른 이름과 호스트 이름이 있는 인스턴스도 있습니다.
bojana@linux:~$ docker run -d --name my-nginx2 --network my-br0 --hostname my-nginx2 nginxdemos/hello
현재 docker inspect를 사용하여 새로 만든 컨테이너의 네트워크 설정을 확인하는 경우
bojana@linux:~$ docker inspect -f '{{ json .NetworkSettings.Networks }}' my-nginx
{"my-br0":{"IPAMConfig":null,"Links":null,"Aliases":["b91bde6aa527","my-nginx"],"NetworkID":"f9e797b2ab8826342ea8343b8bebe8e1459eea114aa0b015f56b01f90fe39ff8","EndpointID":"a1af70992c90967ebca917eeebaa67b4e7bc23bdfb2f352f283faaee223d4fc0","Gateway":"172.172.0.1","IPAddress":"172.172.0.128","IPPrefixLen":24,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:ac:00:80","DriverOpts":null}}
Google 네트워크 설정이 적용되었거나, 용기가 분배되었거나, 원하신다면, Google이 정의한 네트워크에 가입하셨습니다.이제 호스트 이름을 통해 한 컨테이너와 다른 컨테이너를 Ping 하려고 하면 다음과 같이 작동합니다.
/ # ping my-nginx2
PING my-nginx2 (172.172.0.129): 56 data bytes
64 bytes from 172.172.0.129: seq=0 ttl=64 time=0.166 ms
64 bytes from 172.172.0.129: seq=1 ttl=64 time=0.149 ms
64 bytes from 172.172.0.129: seq=2 ttl=64 time=0.211 ms
64 bytes from 172.172.0.129: seq=3 ttl=64 time=0.134 ms
^C
-------- my-nginx2 ping statistics ---
And also if we ping by hostname another container:
/ # ping my-nginx
PING my-nginx (172.172.0.128): 56 data bytes
64 bytes from 172.172.0.128: seq=0 ttl=64 time=0.342 ms
64 bytes from 172.172.0.128: seq=1 ttl=64 time=0.134 ms
64 bytes from 172.172.0.128: seq=2 ttl=64 time=0.191 ms
64 bytes from 172.172.0.128: seq=3 ttl=64 time=0.128 ms
^C
-------- my-nginx ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.128/0.198/0.342 ms
결론은 Docker가 사용자 정의 다리를 통해 용기 간의 명칭 해석을 제공했다는 것이다.
신용: 유튜브의 많은 내용은 이 사이트에서 빌려온 것이다.이 채널을 보세요. 아주 재미있고 깔끔한 내용들이 있습니다.이 글에서, 나는 도커 명령만 사용하고,portainer를 사용하지 않고, 추가 주석을 추가할 필요가 없다고 시도했다.
게시물 최초 발표: bojana.dev

좋은 웹페이지 즐겨찾기