일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- docker
- C++
- 플러터
- 포인터
- github
- Data Structure
- vim
- dart 언어
- jupyter
- Unity
- jupyter lab
- HTML
- Python
- Algorithm
- c언어
- 다트 언어
- c#
- gitlab
- 유니티
- 깃
- c# 윈폼
- 도커
- Houdini
- 구조체
- c# 추상 클래스
- git
- C# delegate
- Flutter
- c# winform
- C언어 포인터
- Today
- Total
nomad-programmer
[DevOps/Docker] 컨테이너 네트워크 본문
Docker 컨테이너끼리 통신을 할 때는 Docker 네트워크를 통해 수행한다.
네트워크 목록 표시 (docker network ls)
Docker 네트워크의 목록을 확인하려면 docker network ls 명령을 사용한다.
docker network ls [옵션]
지정할 수 있는 주요 옵션
옵션 | 설명 |
-f, --filter=[] | 출력을 필터링한다. |
--no-trunc | 상세 정보를 출력한다. |
-q, --quiet | 네트워크 ID만 표시한다. |
Docker를 설치한 상태에서 다음의 명령을 실행하면 네트워크의 구성 정보를 목록으로 확인할 수 있다. Docker는 기본값으로 bridge, host, none 이 세개의 네트워크를 만든다.
// 네트워크 목록 표시
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
aaaaaaaaaaaa bridge bridge local
bbbbbbbbbbbb host host local
cccccccccccc none null local
표시할 네트워크의 상세 정보를 확인할 때는 --no-trunc 옵션, 네트워크 ID만 확인할 때는 -q, --quiet 옵션을 지정한다. 또한 필터링하고 싶을 때는 -f, --filter 옵션을 지정한다. 필터링할 때는 값을 key=value 형식으로 지정한다.
필터링에서 이용할 수 있는 키
키 값 | 설명 |
driver | 드라이버 지정 |
id | 네트워크 ID |
label | 네트워크에 설정된 라벨(label=<key> 또는 label=<key>=<value> 로 지정한다) |
name | 네트워크명 |
scope | 네트워크의 스코프(swarm/global/local) |
type | 네트워크의 타입 (사용자 정의 네트워크 custom/정의 완료 네트워크 builtin) |
예를 들어 브릿지 네트워크의 네트워크 ID만을 목록으로 표시하고 싶을 때는 다음과 같은 명령을 실행한다.
$ docker network ls -q --filter driver=bridge
네트워크를 명시적으로 지정하지 않고 Docker 컨테이너를 시작하면 기본값인 'bridge' 네트워크로 Docker 컨테이너를 시작한다.
오버레이 네트워크란?
오버레이 네트워크 (overlay network) 는 물리 네트워크 상에서 소프트웨어적으로 에뮬레이트한 네트워크를 말한다. 물리 네트워크를 덮듯이 가상 네트워크가 구성된다는 점에서 가상 네트워크라고도 부른다. 물리 네트워크의 구조가 은폐되어 그 아래에 있는 물리 계층의 형태나 제어 방식 등을 의식하지 않고 이용할 수 있다는 것이 특징이다. 예를 들어 여러 개의 호스트에 걸친 네트워크를 구성할 때 사용한다. 소프트웨어로 구성된 네트워크이므로 물리 작업을 수반하지 않고 자유롭게 구성을 변경할 수 있다는 장점이 있다.
네트워크 작성 (docker network create)
새로운 네트워크를 작성할 때는 docker network create 명령을 사용한다.
docker network create [옵션] 네트워크
지정할 수 있는 주요 옵션
옵션 | 설명 |
--driver, -d | 네트워크 브릿지 또는 오버레이 (기본 값은 bridge) |
--ip-range | 컨테이너를 할당하는 IP 주소의 범위를 지정 |
--subnet | 서브넷을 CIDR 형식으로 지정 |
--ipv6 | IPv6 네트워크 유효화 유무 (true/false) |
--label | 네트워크에 설정하는 라벨 |
다음의 명령을 실행하면 'web-network' 라는 이름의 네트워크가 만들어진다. --driver 옵션으로 'bridge'를 지정하고 있기 때문에 브릿지 네트워크를 작성한다.
// 브릿지 네트워크 작성
$ docker network create --driver=bridge web-network
--driver 옵션에서 지정할 수 있는 네트워크 드라이버는 'bridge' 또는 'overlay' 이다. 또한 커스텀 네트워크 드라이버도 사용할 수 있다. 오버레이 네트워크는 여러 개의 호스트에 걸쳐 있는 네트워크를 말한다.
NOTE : Docker 컨테이너의 이름 해결 |
Docker의 기본 브릿지 네트워크와 docker network create 명령으로 사용자가 임의로 만든 네트워크 (사용자 정의 네트워크) 에서는 이름 해결 구조가 다르다. 먼저 Docker의 기본 브릿지 네트워크는 Docker 설치 시에 자동으로 만들어지는 것으로, 컨테이너 생성시에 명시적으로 지정하지 않는 경우 이 네트워크로 컨테이너가 시작된다. 예를 들어 webap/log 라는 이름의 컨테이너를 기본 브릿지 네트워크에서 시작한 경우, 시작된 컨테이너는 이름 해결을 할 수 없으므로 컨테이너 생성 시에 미리 docker container run 명령으로 --link 옵션을 붙여 둘 필요가 있다. --link 옵션을 지정하면 컨테이너 안의 /etc/hosts 파일에 컨테이너명과 컨테이너에 할당된 IP 주소가 등록된다. 한편 사용자 정의 네트워크는 docker 데몬에 내장된 내부 DNS 서버에 의해 이름 해결이 이루어진다. 내부 DNS 서버를 사용하면 link 기능과 같이 /etc/hosts 파일에 의존하지 않고 이름 해결을 할 수 있으므로 컨테이너명뿐만 아니라 컨테이너 시작 시에 지정한 --net-alias 옵션을 사용한 alias 명으로도 통신을 할 수 있다. 사용자 정의 네트워크를 사용하는 편이 보다 유연하고 쉽게 네트워크 구성 관리를 할 수 있기 때문에 특별한 이유가 없는 한 이쪽을 사용하는 것이 좋다. |
네트워크 연결 (docker network connect / docker network disconnect)
Docker 컨테이너를 Docker 네트워크에 연결할 때는 docker network connect 명령을, 네트워크에서 연결을 해제할 때는 docker network disconnect 명령을 사용한다.
docker network connect [옵션] 네트워크 컨테이너
지정할 수 있는 주요 옵션
옵션 | 설명 |
--ip | IPv4 주소 |
--ip6 | IPv6 주소 |
--alias | 별명 |
--link | 다른 컨테이너에 대한 링크 |
다음의 명령을 실행하면 'webfront' 라는 이름의 Docker 컨테이너를 'web-network' 라는 이름의 Docker 네트워크에 연결시킨다. 연결 후에는 동일한 네트워크상에 있는 다른 컨테이너와 통신을 할 수 있다. 컨테이너의 연결은 IP 주소뿐만 아니라 컨테이너명 또는 컨테이너 ID도 그대로 사용할 수 있다.
// 네트워크에 대한 연결
$ docker network connect web-network webfront
네트워크에 대한 연결은 컨테이너 시작 시에 할 수도 있다. docker container run 명령을 실행하면 베이스 이미지가 'nginx' 이고 'webap' 라는 이름의 Docker 컨테이너를 좀 전에 작성한 'web-network' 네트워크에 만든다.
// 네트워크를 지정한 컨테이너 시작
$ docker container run -itd --name=webap --net=web-network nginx
그리고 네트워크에서 연결을 해제할 때는 docker network disconnect 명령을 사용한다.
다음의 명령을 실행하면 'webfront' 라는 이름의 Docker 컨테이너를 'web-network' 라는 이름의 Docker 네트워크에서 연결을 해제한다.
// 네트워크에 대한 연결 해제
$ docker network disconnect web-network webfront
네트워크 상세 정보 확인 (docker network inspect)
네트워크 상세 정보를 확인할 때는 docker network inspect 명령을 사용한다.
docker network inspect [옵션] 네크워크
네트워크 삭제 (docker network rm)
Docker 네트워크를 삭제할 때는 docker network rm 명령을 사용한다.
docker network rm [옵션] 네트워크
다음의 명령을 실행하면 'web-network' 라는 이름의 네트워크를 삭제한다. 단, 네트워크를 삭제하려면 docker network disconnect 명령을 사용하여 연결 중인 모든 컨테이너와의 연결을 해제해야 한다.
// 네트워크 삭제
$ docker network rm web-network