[개발 정리] Docker 튜토리얼 및 정리 3편
이번엔 도커 네트워크에 대해 정리해보려 한다. 도커 공식 docs와 블로그를 참고하였다.
도커 컨테이너는 서로 격리된 프로세스이기 때문에, 컨테이너 간 통신을 위해서는 docker network 옵션을 고려해야 한다. 도커 네트워크 드라이버는 아래와 같이 5가지가 존재한다.
- bridge : 하나의 호스트에서 여러 컨테이너가 통신
- host : 컨테이너가 호스트의 네트워크 내에서 실행 (격리 x)
- overlay : 여러 호스트에서 분산되어 돌아가는 컨테이너 간 통신
- macvlan : 컨테이너에 MAC 주소를 할당하여, 물리적 장치로 인식하게 함
- none : 네트워크 완전 격리
이 중에서 default값이자 가장 많이 사용된다는 bridge driver 만 다뤄보도록 하겠다.
제일 처음으로 docker 의 default network 리스트를 살펴보자
다음으로는 docker network create 커맨드를 사용해서 사용자 지정 네트워크를 하나 생성해준다. 디폴트 드라이버는 "bridge"이다.
inspect 커맨드로 새로 생성한 bridge-network 의 subnet을 보면, 아래와 같고, 아직 Container 를 붙히기 전이니 비어있는 것을 확인할 수 있다.
docker network inpect my-network
컨테이너를 생성할 때, --network 파라미터를 주고 위에서 생성한 bridge network 이름인 my-work 를 할당하여 두 개를 만들어준다.
다시 my-network 를 살펴보면, container 가 새롭게 할당된 것을 확인할 수 있다.
같은 bridge-network 를 할당받은 container 가 서로 통신이 가능한지는 docker exec 커맨드로 서로에게 ping 을 날려보면 된다. bridge network에서는 IP 뿐만 아니라 우리가 정한 각각의 컨테이너 이름 또는 별칭(alias)를 DNS 로 서로 통신할 수 있다.
docker exec test1 ping test2
docker exec test2 ping test1
마지막으로 어떠한 컨테이너와도 연결되어 있지 않은 network 는 prune 명령어로 삭제될 수 있다. 연결된 컨테이너 test1, test2 를 my-work 와 연결을 해제하고 prune 커맨드를 사용해보면, 사용되지 않는 네트워크이므로 삭제되는 것을 알 수 있다.
docker network disconnect my-network test1
docker network disconnect my-network test2
docker network prune
데이터 파이프라인을 짜게 되었다고 하자. 하나의 mysql container가 있고, 데이터를 읽고 처리하는 PySpark container 있다고 하면, 같은 bridge network 를 공유하게 하여, 서로 통신이 가능케해야 한다. 해당 예제를 보고, mysql container를 만들어보면, 아래와 같이 될 것이다.
참고로, default로 주어지는 bridge-network 를 공유하면 환경 변수 공유가 되지만, 사용자 정의 bridge-network 에서는 공유가 되지 않는다고 한다. 따라서, 아래의 예에서 pyspark 를 위한 container 를 생성할 때, mysql container 를 만들 때와 같은 환경 변수를 함께 인자로 넣어서 커맨드를 실행해야 한다.
docker network create data-pipeline
docker run -d \
--network data-pipeline --network-alias mysql \
--mount source=my-volume,target=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=pipeline-db \
mysql:5.7
네트워크 쪽으로 아는게 전무하여, 가장 고군분투하면서 정리를 해봤는데, 여러 개의 컨테이너를 같이 쓰고 연결하면서 체득이 중요할 것 같다. 추가적으로 알게된 내용이나 틀린 부분에 있어서 수정하도록 하겠다.