docker network
는 커널의 네트워크 스택의 하위로, 상위에는 네트워크 드라이브를 생성한다. 즉, docker network = Linux network
와 같다.1. Endpoint: 컨테이너 내부의 네트워크 인터페이스를 나타냅니다. 각 컨테이너는 하나 이상의 엔드포인트를 가질 수 있습니다.
2. Sandbox: 컨테이너의 네트워크 스택을 나타냅니다. 샌드박스 안에는 여러 엔드포인트가 존재할 수 있습니다.
3. Network: 동일한 네트워크 설정(예: IP 주소 범위, 라우팅 규칙 등)을 공유하는 일련의 엔드포인트들을 그룹화합니다.
4. Driver/Plugin: CNM의 정의된 API를 구현하여 특정 네트워크 솔루션과 Docker를 통합합니다. 예를 들어, Overlay, Bridge, Host 등의 내장 드라이버가 있으며, 외부 네트워크 솔루션을 통합하기 위해 써드파티 플러그인도 사용할 수 있습니다.
[ec2-user@ip-172-31-39-154 ~]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
1b1f9cb59d91 bridge bridge local
a6d2dc487604 host host local
5964bb59b326 none null local
bridge network 사용할 수 있는 부분 확인
- bridge로 연결된 container 들은 local에서만 연결 가능하다.
- bridge to bridge 간에 통신은 orverlay driver를 통해서 가능하다.
veth는 OSI 2계층 서비스로 컨테이너 내부에 제공되는 네트워크 인터페이스 eth0와 한 쌍(pair)으로 제공되어 docker0와 가상의 "터널링 네트워크"를 제공한다.
[ec2-user@ip-172-31-39-154 ~]$ ip link show type bridge
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:d0:20:24:d4 brd ff:ff:ff:ff:ff:ff
# Container의 네트워크(eth0)는 vethxxxxxxx의 숫자보다 하나 작은 값을 가진다.
[ec2-user@ip-172-31-39-154 ~]$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "1b1f9cb59d91a453d9410b3411633ab5619c50de10518fc981141f39acd08716",
"Created": "2023-10-04T12:06:13.538637267Z",
"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": {
"2fc3fd2105463433d10d0943ee821073747009eceab9323d792ac2805fdc9bf2": {
"Name": "sjin-ubuntu",
"EndpointID": "dd072efc037c5fdc13ab5dd5a24e2cab7d64c1ba78213656e5b7ac95008113d3",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"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": {}
}
]
옵션 | 설명 |
---|---|
--add-host=[Host명:IP Address] | Container의 /etc/hosts에 Host명과 IP Address를 설정 |
--dns=[IP Address] | DNS 서버의 IP Address를 설정 (/etc/resolv.conf)(168.126.63.1~3/8.8.8.8) |
--mac-address=[MAC Address] | Container의 MAC Address 설정 |
--expose=[포트 번호] | Container 내부에서 Host로 노출할 포트 번호 지정 |
-net=[bridge , none , host] | Container의 네트워크 설정(birdge = docker0) |
-h, --hostname="Host명" | Container의 Host명 설정(default, container ID가 호스트명) |
-P, --publish-all=[true , false] | Container 내부의 노출된 포트를 호스트 임의의(32768~) 포트를 호스트와 연결(명시적) |
-p [Host 포트 번호]:[Container 포트 번호] --publish published=5000, target=80 | Host와 Container의 포트를 매핑(암시적) |
--link=[container:container_id] | 동일 Host의 다른 Container에서 엑세스 시 이름 설정 IP가 아닌 container의 이름을 이용해 통신 가능 |
# container DNS 서버 설정
[ec2-user@ip-172-31-39-154 ~]$ docker run -it --dns=8.8.8.8 centos bash
[root@bd746dbb906b /]# cat /etc/resolv.conf
search ap-northeast-2.compute.internal
nameserver 8.8.8.8
# container MAC Address 설정
[ec2-user@ip-172-31-39-154 ~]$ docker run -d --mac-address="92:d0:c6:0a:29:33" centos:7
[ec2-user@ip-172-31-39-154 ~]$ docker inspect --format="{{ .Config.MacAddress }}" sad_mcclintock
92:d0:c6:0a:29:33
# Host 명과 IpAddress 설정
[ec2-user@ip-172-31-39-154 ~]$ docker container run -it --add-host=fastcampus.co.kr:192.168.0.100 centos:7 bash
[root@b74c2c3639eb /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.0.100 fastcampus.co.kr
172.17.0.3 b74c2c3639eb
# docker-proxy? kernel이 아닌 사용자 환경에서 수행되기 때문에 kernel과 상관없이 host 가 받은 패킷을 그대로 container의 port로 전달.
# port를 외부로 노출하도록 설정하게 되면, docker host에는 docker-proxy라는 프로세스가 자동으로 생성
[ec2-user@ip-172-31-39-154 ~]$ docker run -d -P --name=myweb --expose=40001 nginx:1.25.0
[ec2-user@ip-172-31-39-154 ~]$ docker port myweb
80/tcp -> 0.0.0.0:32769
80/tcp -> [::]:32769
40001/tcp -> 0.0.0.0:32768
40001/tcp -> [::]:32768
[ec2-user@ip-172-31-39-154 ~]$ docker ps | grep myweb
31d158ad65d5 nginx:1.25.0 "/docker-entrypoint.…" 39 seconds ago Up 39 seconds 0.0.0.0:32769->80/tcp, :::32769->80/tcp, 0.0.0.0:32768->40001/tcp, :::32768->40001/tcp myweb
[ec2-user@ip-172-31-39-154 ~]$ sudo netstat -nlp | grep 32769
tcp 0 0 0.0.0.0:32769 0.0.0.0:* LISTEN 30563/docker-proxy
tcp6 0 0 :::32769 :::* LISTEN 30568/docker-proxy
[ec2-user@ip-172-31-39-154 ~]$ ps -ef | grep 30563
root 30563 10836 0 12:58 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 32769 -container-ip 172.17.0.3 -container-port 80
ec2-user 30759 28167 0 13:01 pts/0 00:00:00 grep --color=auto 30563
~$ docker network inspect {network-ID}를 통해 조회가능