TechY

[개발 정리] Docker 튜토리얼 및 정리 3편 본문

[개발 정리]/[Docker]

[개발 정리] Docker 튜토리얼 및 정리 3편

hskimim 2021. 9. 12. 02:10

이번엔 도커 네트워크에 대해 정리해보려 한다. 도커 공식 docs블로그를 참고하였다. 

 

도커 컨테이너는 서로 격리된 프로세스이기 때문에, 컨테이너 간 통신을 위해서는 docker network 옵션을 고려해야 한다. 도커 네트워크 드라이버는 아래와 같이 5가지가 존재한다.

 

  1. bridge : 하나의 호스트에서 여러 컨테이너가 통신
  2. host : 컨테이너가 호스트의 네트워크 내에서 실행 (격리 x)
  3. overlay : 여러 호스트에서 분산되어 돌아가는 컨테이너 간 통신
  4. macvlan : 컨테이너에 MAC 주소를 할당하여, 물리적 장치로 인식하게 함
  5. none : 네트워크 완전 격리

이 중에서 default값이자 가장 많이 사용된다는 bridge driver 만 다뤄보도록 하겠다.

 

제일 처음으로 docker 의 default network 리스트를 살펴보자

bridge, host, none 이 세팅되어 있다...

 

다음으로는 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

네트워크 쪽으로 아는게 전무하여, 가장 고군분투하면서 정리를 해봤는데, 여러 개의 컨테이너를 같이 쓰고 연결하면서 체득이 중요할 것 같다. 추가적으로 알게된 내용이나 틀린 부분에 있어서 수정하도록 하겠다.