이야기박스
Network Containers 본문
Overview
Docker container에서 네트워크 구성을 어떻게 확인하는지? 그리고 새로운 네트워크 환경은 어떻게 만드는지?
도커를 업무 환경에서 본격적으로 사용하려면 필요한 지식들이죠. 오늘은 이 부분에 관련하여 포스팅을 작성하려고 합니다. 포스팅 내용은 아래 공식 도커 문서를 활용하여 작성하였습니다.
https://docs.docker.com/engine/tutorials/networkingcontainers/
Container Network
호스트 OS에서 도커 컨테이너를 생성하면 위와 같은 구조로 생성됩니다.
Network Driver
도커는 기본으로 `overlay`, `bridge` 라는 두 가지 네트워크 드라이버를 제공합니다. 물론 사용자가 원하는 커스텀 네트워크 환경을 구성할 수도 있습니다.
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
e5ba45239e25 bridge bridge local
a413aef518bf host host local
ece25f410169 none null local
컨테이너는 생성시 우리가 따로 어떤 선언을 해주지 않으면 `bridge` 네트워크로 들어가게 됩니다.
예시로 `ubuntu` 이미지를 생성해보도록 하겠습니다.
$ docker run -itd --name=networktest ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
d6cb415e2683: Pull complete
Digest: sha256:35fb073f9e56eb84041b0745cb714eff0f7b225ea9e024f703cab56aaa5c7720
Status: Downloaded newer image for ubuntu:latest
efd0fa0b727a6793ab0b8b227ba1c158299a1390c551529794ec04dc09059686
위에서 생성한 `ubuntu` 이미지가 `bridge` 네트워크에 포함된 모습은 아래 명령어로 확인할 수 있습니다.
$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "e5ba45239e2530ba8145fb2289dc9663f16729d4825344a06d66841b6e1f8468",
"Created": "2022-10-23T06:36:38.540405542Z",
"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": {
"efd0fa0b727a6793ab0b8b227ba1c158299a1390c551529794ec04dc09059686": {
"Name": "networktest",
"EndpointID": "b9cde99c2dab097237a7c5a2934f9ab852502b66bb0b1393264a22ab3fb03cdc",
"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": {}
}
]
생성하였던 `ubuntu` 이미지를 네트워크에서 제외시키려면 아래 명령어를 사용하면 됩니다.
$ docker network disconnect bridge networktest
Custom Network
저만의 고유한 네트워크를 만들어보도록 하겠습니다.
$ docker network create -d bridge storyparks
c5b9935a00780b25cc418adbecb17cbd27931c955ca0d47e3b65915258ea95e1
`-d` 옵션을 통하여 어떤 네트워크 드라이버에서 기반한 네트워크인지 선언을 해줄 수 있습니다.
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
e5ba45239e25 bridge bridge local
a413aef518bf host host local
ece25f410169 none null local
c5b9935a0078 storyparks bridge local
그리고 아래처럼 상세 정보를 확인해볼 수 있습니다.
$ docker network inspect storyparks
[
{
"Name": "storyparks",
"Id": "c5b9935a00780b25cc418adbecb17cbd27931c955ca0d47e3b65915258ea95e1",
"Created": "2022-10-23T08:11:13.292614673Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
Why divide the network?
IPAM을 확인해보면 왜 나누는지 알 수 있습니다. 특정 IP 대역을 할당해주고 싶은 경우, 네트워크 관리 용이성을 위해서 우리는 네트워크 레벨부터 나눌 수 있습니다.
- `bridge` 네트워크 Subnet: 172.17.0.0/16
- `storypakrs` 네트워크 Subnet: 172.18.0.0/16
Example
예시는 위에 참조로 걸어둔 공식 문서를 참조해보시면 좋을 것 같습니다. 저는 귀찮아서 따로 적지는 않았습니다.
요약하면 아래와 같습니다.
테스트 네트워크로 my_birdge, docker0 (default bridge) 두 가지를 사용합니다.
`docker0` 네트워크와 `my_bridge` 네트워크에 web 컨테이너를 하나씩 생성하고 `my_bridge` 네트워크에 또다시 db 컨테이너를 생성합니다.
결론은 아래와 같습니다.
- `docker0` web 컨테이너 --> `my_bridge` db 컨테이너: 연결 실패
- `my_bridge` web 컨테이너 --> `my_bridge` db 컨테이너: 연결 성공
테스트 로그는 아래에 첨부합니다.
# 연결 실패
$ docker container exec -it db bash
root@a205f0dd33b2:/# ping 172.17.0.2
ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
^C
--- 172.17.0.2 ping statistics ---
44 packets transmitted, 0 received, 100% packet loss, time 43185ms
# 연결 성공
$ docker container exec -it db bash
root@a205f0dd33b2:/# ping web
PING web (10.0.0.2) 56(84) bytes of data.
64 bytes from web (10.0.0.2): icmp_seq=1 ttl=64 time=0.095 ms
64 bytes from web (10.0.0.2): icmp_seq=2 ttl=64 time=0.060 ms
64 bytes from web (10.0.0.2): icmp_seq=3 ttl=64 time=0.066 ms
^C
--- web ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.060/0.073/0.095/0.018 ms
Review
많은 회사의 Prod 환경에선 도커만을 활용하기보다, 쿠버네티스와 함께 사용할 것이라 생각됩니다. 그럼에도 쿠버네티스의 네트워크 구성 기반에도 이러한 도커 네트워크 기술이 깔려있죠. 알아두어야 하는 지식이라 생각됩니다.
'Computer & Data > Orchestration' 카테고리의 다른 글
What is the difference between a process, a container, and a VM? (2) | 2022.10.10 |
---|---|
Kubernetes. Skaffold를 활용하여 개발환경을 꾸려보자 (0) | 2022.05.19 |
Kubernetes. 고급 스케줄링 (1) | 2022.01.12 |
Kubernetes. 소스 IP 주소 구하기 (0) | 2020.06.29 |
Kubernetes. Ingress and TLS Setting (0) | 2020.01.28 |