[Docker] 도커 네트워크 만들기

Posted by 김성철

Docker - 도커 네트워크 만들기

https://www.daleseo.com/docker-networks/  
  
도커에서 생성한 컨테이너는 개별적인 환경에서 돌아가기 때문에 기본적으로 다른 컨테이너와의 통신이 불가능함  
여러개의 컨테이너를 도커 네트워크에 연결하면 서로 통신이 가능함  

도커 네트워크 종류

- bridge : 네트워크는 하나의 호스트 컴퓨터 내에서 여러 컨테이너들이 서로 소통할 수 있도록 해줌  
  
- host : 네트워크는 컨터이너를 호스트 컴퓨터와 동일한 네트워크에서 컨테이너를 돌리기 위해서 사용됨  
  
- overlay : 네트워크는 여러 호스트에 분산되어 돌아가는 컨테이너들 간에 네트워킹을 위해서 사용됨  

도커 네트워크 확인

======================================================================================================  
docker network ls  
======================================================================================================  
  
- 실행 후 화면  
======================================================================================================  
NETWORK ID     NAME                   DRIVER    SCOPE  
2bf61c1472b4   bridge                 bridge    local  
d457701c6583   host                   host      local  
1ba007a7f649   none                   null      local  
5b01e3506555   springboot-mysql-net   bridge    local  
======================================================================================================  

도커 네트워크 생성

test11 이라는 네트워크를 생성  
======================================================================================================  
docker network create test11  
======================================================================================================  

도커 네트워크 상세 정보

위에서 생성한 test11 네트워크의 상세 정보를 확인  
======================================================================================================  
docker network inspect test11  
======================================================================================================  
  
- 실행 후 화면  
======================================================================================================  
[  
	{  
		"Name": "test11",  
		"Id": "91b898c22303cadcc7338e30c629a05516812180cb855b02f8b25eb41ce8e0d4",  
		"Created": "2022-08-09T12:47:30.9683971Z",  
		"Scope": "local",  
		"Driver": "bridge",  
		"EnableIPv6": false,  
		"IPAM": {  
			"Driver": "default",  
			"Options": {},  
			"Config": [  
				{  
					"Subnet": "172.20.0.0/16",  
					"Gateway": "172.20.0.1"  
				}  
			]  
		},  
		"Internal": false,  
		"Attachable": false,  
		"Ingress": false,  
		"ConfigFrom": {  
			"Network": ""  
		},  
		"ConfigOnly": false,  
		"Containers": {},  
		"Options": {},  
		"Labels": {}  
	}  
]  
======================================================================================================  

컨테이너 실행

======================================================================================================  
docker run -itd --name one busybox  
======================================================================================================  
  
--network 옵션을 주지 않으면 기본적으로 bride 라는 디폴트 네트워크테 붙게됨  

bridge 네트워크 확인

======================================================================================================  
docker network inspect bridge  
======================================================================================================  
  
- 아래를 확인해보면 Containers 부분에 one 가 들어있음  
======================================================================================================  
[  
	{  
		"Name": "bridge",  
		"Id": "2bf61c1472b453ea2f74acaaaa17ed0b1f2e5c02d3a573bb2e5c8eda028a9bf1",  
		"Created": "2022-08-09T10:30:43.686715Z",  
		"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": {  
			"33480a6661bc192f85775385c5d69841599a4290a4657db253c640e3f9058db7": {  
				"Name": "one",  
				"EndpointID": "9628ee038ac0261b977a99a6c1c21f558766cf6eb7321c4f91d5ac359c086f21",  
				"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": {}  
	}  
]  
======================================================================================================  

실행중인 컨테이너를 네트워크에 연결

docker network connect [네트워크명] [컨테이너명]  
  
======================================================================================================  
docker network connect test11 one  
======================================================================================================  
  
- 연결한 네트워크를 확인  
======================================================================================================  
docker network inspect test11  
======================================================================================================  
  
- 아래와 같이 one 가 test11 네트워크에 추가되어있음  
======================================================================================================  
[  
	{  
		"Name": "test11",  
		"Id": "91b898c22303cadcc7338e30c629a05516812180cb855b02f8b25eb41ce8e0d4",  
		"Created": "2022-08-09T12:47:30.9683971Z",  
		"Scope": "local",  
		"Driver": "bridge",  
		"EnableIPv6": false,  
		"IPAM": {  
			"Driver": "default",  
			"Options": {},  
			"Config": [  
				{  
					"Subnet": "172.20.0.0/16",  
					"Gateway": "172.20.0.1"  
				}  
			]  
		},  
		"Internal": false,  
		"Attachable": false,  
		"Ingress": false,  
		"ConfigFrom": {  
			"Network": ""  
		},  
		"ConfigOnly": false,  
		"Containers": {  
			"33480a6661bc192f85775385c5d69841599a4290a4657db253c640e3f9058db7": {  
				"Name": "one",  
				"EndpointID": "5264799d5e5f5942170dc606884c0dabae39c160d4e121c160250720e13ecc00",  
				"MacAddress": "02:42:ac:14:00:02",  
				"IPv4Address": "172.20.0.2/16",  
				"IPv6Address": ""  
			}  
		},  
		"Options": {},  
		"Labels": {}  
	}  
]  
  
======================================================================================================  

네트워크에서 컨테이너 제거

처음생성할때 --network 옵션을 주지 않고 생성하면 bridge 에 연결됨  
connect 명령어로 다른 네트워크에 붙이게 될 경우 bridge 와 추가로 연결한 네트워크에 둘다 연결되어 있게됨  
	ex) one 컨테이너는 bridge 와 test11 네트워크에 둘다 연결되어있음  
  
docker network disconnect [네트워크명] [컨테이너명]  
======================================================================================================  
docker network disconnect bridge one  
======================================================================================================  
  
위의 명령어를 실행 후 bridge 네트워크를 확인해보면 one 컨테이너가 삭제된 것을 확인할수있음  
======================================================================================================  
docker network inspect bridge  
======================================================================================================  

컨테이너 실행시 네트워크에 추가

컨테이너 실행시 --network [네트워크명] 옵션을 추가하여서 컨테이너를 실행하면  
바로 해당 네트워크에 연결된 상태로 실행됨  
======================================================================================================  
docker run -itd --name two --network test11 busybox  
======================================================================================================  
  
- 아래의 명령어로 네트워크에 추가된 컨테이너들 확인  
======================================================================================================  
docker network inspect test11  
======================================================================================================  
  
- 추가된 컨테이너는 Containers 에서 확인가능함  
======================================================================================================  
[  
	{  
		"Name": "test11",  
		"Id": "91b898c22303cadcc7338e30c629a05516812180cb855b02f8b25eb41ce8e0d4",  
		"Created": "2022-08-09T12:47:30.9683971Z",  
		"Scope": "local",  
		"Driver": "bridge",  
		"EnableIPv6": false,  
		"IPAM": {  
			"Driver": "default",  
			"Options": {},  
			"Config": [  
				{  
					"Subnet": "172.20.0.0/16",  
					"Gateway": "172.20.0.1"  
				}  
			]  
		},  
		"Internal": false,  
		"Attachable": false,  
		"Ingress": false,  
		"ConfigFrom": {  
			"Network": ""  
		},  
		"ConfigOnly": false,  
		"Containers": {  
			"0f293ac16aa8fe8a2d05961ab3f2b0e4f14ea9e3246a53d898e93841c1443a53": {  
				"Name": "two",  
				"EndpointID": "b9ab2009d18e8651c59b9ff85fa18fde0b9a111786cbdb0bb0c56f345b20d449",  
				"MacAddress": "02:42:ac:14:00:03",  
				"IPv4Address": "172.20.0.3/16",  
				"IPv6Address": ""  
			},  
			"33480a6661bc192f85775385c5d69841599a4290a4657db253c640e3f9058db7": {  
				"Name": "one",  
				"EndpointID": "5264799d5e5f5942170dc606884c0dabae39c160d4e121c160250720e13ecc00",  
				"MacAddress": "02:42:ac:14:00:02",  
				"IPv4Address": "172.20.0.2/16",  
				"IPv6Address": ""  
			}  
		},  
		"Options": {},  
		"Labels": {}  
	}  
]  
======================================================================================================  

컨테이너간 통신 확인

컨테이너의 이름을 hostname 처럼 사용할 수 잇음  
- 아래의 명령어 실행  
======================================================================================================  
docker exec one ping two  
======================================================================================================  
  
- 결과  
======================================================================================================  
PS C:\Users\sung> docker exec one ping two  
PING two (172.20.0.3): 56 data bytes  
64 bytes from 172.20.0.3: seq=0 ttl=64 time=0.069 ms  
64 bytes from 172.20.0.3: seq=1 ttl=64 time=0.063 ms  
64 bytes from 172.20.0.3: seq=2 ttl=64 time=0.088 ms  
64 bytes from 172.20.0.3: seq=3 ttl=64 time=0.070 ms  
64 bytes from 172.20.0.3: seq=4 ttl=64 time=0.060 ms  
======================================================================================================  
  
또는 docker network inspect test11 명령어로 컨테이너들의 IP를 확인하여 ping 실행  
172.20.0.2 -> one  
172.20.0.3 -> two  
	- 아래의 명령어 실행  
======================================================================================================  
docker exec two ping 172.20.0.2  
======================================================================================================  
  
- 결과  
======================================================================================================  
PS C:\Users\sung> docker exec two ping 172.20.0.2  
PING 172.20.0.2 (172.20.0.2): 56 data bytes  
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.081 ms  
64 bytes from 172.20.0.2: seq=1 ttl=64 time=0.089 ms  
64 bytes from 172.20.0.2: seq=2 ttl=64 time=0.099 ms  
64 bytes from 172.20.0.2: seq=3 ttl=64 time=0.082 ms  
64 bytes from 172.20.0.2: seq=4 ttl=64 time=0.085 ms  
64 bytes from 172.20.0.2: seq=5 ttl=64 time=0.084 ms  
======================================================================================================  
  
※ ip ping ip 는 안됌  
	ex)  
		docker exec 172.20.0.3 ping 172.20.0.2  
======================================================================================================  
PS C:\Users\sung> docker exec 172.20.0.3 ping 172.20.0.2  
Error: No such container: 172.20.0.3  
======================================================================================================  

도커 네트워크 삭제

도커 네트워크를 삭제하기전에는 실행중인 컨테이너들을 전부 제거해야 함  
  
======================================================================================================  
docker network rm test11  
======================================================================================================  
  
- 실행중인 컨테이너 있을 시 아래와 같이 표시됨  
======================================================================================================  
PS C:\Users\sung> docker network rm test11  
Error response from daemon: error while removing network: network test11 id 91b898c22303cadcc7338e30c629a05516812180cb855b02f8b25eb41ce8e0d4 has active endpoints  
======================================================================================================  
  
- 컨테이너 중지  
	컨테이너 중지시에는 컨테이너의 ID 나 name 을 사용하여 중지 할수 있음, 또한 한번에 여러개의 컨테이너를 중지할수 있음  
  
	1. 실행중엔 컨테이너확인  
	======================================================================================================  
	PS C:\Users\sung> docker ps  
	CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                               NAMES  
	0f293ac16aa8   busybox     "sh"                     7 minutes ago    Up 7 minutes                                        two  
	33480a6661bc   busybox     "sh"                     15 minutes ago   Up 15 minutes                                       one  
	02b1ae25a18b   stock       "java -jar /myboot.j…"   25 minutes ago   Up 25 minutes   0.0.0.0:9090->80/tcp                test  
	144ebf25dd0a   mysql:5.7   "docker-entrypoint.s…"   7 days ago       Up 3 hours      0.0.0.0:3306->3306/tcp, 33060/tcp   mysql  
	======================================================================================================  
  
	2. 컨테이너 중지, 중지시 두개를 동시에 중지할수 있으며 하나는 컨테이너명으로 중지하고 하나는 컨테이너 ID 로 중지함  
	======================================================================================================  
	PS C:\Users\sung> docker stop one 0f293ac16aa8  
	one  
	0f293ac16aa8  
	======================================================================================================  
  
컨테이너 중지가 끝나면 도커 네트워크 삭제  
======================================================================================================  
docker network rm test11  
======================================================================================================  

도커 네트워크 청소

여러개의 컨테이너와 네트워크를 사용하다보면 사용하지 않는 도커 네트워크가 있을수 있음  
사용하지 않는 네트워크를 청소해주는 명령어는 prune 임  
  
======================================================================================================  
docker network prune  
======================================================================================================  
  
테스트 - 도커 네트워크 생성  
	======================================================================================================  
	docker network create abc123  
	docker network create test123  
	======================================================================================================  
  
테스트 - 도커 네트워크 확인  
	======================================================================================================  
	docker network ls  
	======================================================================================================  
  
	- 실제 명령어 실행  
	======================================================================================================  
	PS C:\Users\sung> docker network ls  
	NETWORK ID     NAME                   DRIVER    SCOPE  
	ab49ab76e77b   abc123                 bridge    local  
	2bf61c1472b4   bridge                 bridge    local  
	d457701c6583   host                   host      local  
	1ba007a7f649   none                   null      local  
	5b01e3506555   springboot-mysql-net   bridge    local  
	d59addc2c710   test123                bridge    local  
	======================================================================================================  
  
테스트 - 사용하지 않는 네트워크 삭제  
  
	======================================================================================================  
	docker network prune  
	======================================================================================================  
  
	- 실제 명령어 실행  
	======================================================================================================  
	PS C:\Users\sung> docker network prune  
	WARNING! This will remove all custom networks not used by at least one container.  
	Are you sure you want to continue? [y/N] y  
	Deleted Networks:  
	abc123  
	test123  
	======================================================================================================  
  
	- 삭제 후 확인해보면 abc123 , test123 두개의 네트워크가 지워진 것이 확인됨  
	======================================================================================================  
	PS C:\Users\sung> docker network ls  
	NETWORK ID     NAME                   DRIVER    SCOPE  
	2bf61c1472b4   bridge                 bridge    local  
	d457701c6583   host                   host      local  
	1ba007a7f649   none                   null      local  
	5b01e3506555   springboot-mysql-net   bridge    local  
	======================================================================================================