Docker 컨테이너(container)는 격리된 환경에서 돌아가기 때문에 기본적으로 다른 컨테이너와의 통신이 불가능합니다.
하지만 여러 개의 컨테이너를 하나의 Docker 네트워크(network)에 연결시키면 서로 통신이 가능해집니다.
동일한 도커 네트워크에 위치하면 localhost의 port없이 컨테이너끼리 서로 통신이 가능해집니다.
네트워크 조회
docker network ls
docker network ls : 커맨드를 사용하면 현재 생성되어 있는 Docker 네트워크 목록을 조회할 수 있습니다.
- docker network ls 명령을 사용하면 bridge, host, none 세 종류 네트워크를 볼 수 있습니다.시작하자마자 나오는 네트워크는 Docker 데몬(daemon)이 실행되면서 디폴트로 생성되는 네트워크입니다.
- docker network inspect 네트워크 이름 명령을 사용하면 네트워크의 상세 정보를 볼 수가 있습니다. 이 명령에서 Containers 항목에 네트워크에 연결된 컨테이너들이 나오게 됩니다.
네트워크 종류
Docker 네트워크는 bridge, host, overlay 등 다양한 종류가 있습니다. 그 중 기본 값이자 가장 많이 사용하는 것은 bridge 입니다.
- bridge 네트워크는 하나의 호스트 컴퓨터 내에서 여러 컨테이너들이 서로 소통할 수 있도록 해줍니다.
- host 네트워크는 컨터이너를 호스트 컴퓨터와 동일한 네트워크에서 컨테이너를 돌리기 위해서 사용됩니다.
- overlay 네트워크는 여러 호스트에 분산되어 돌아가는 컨테이너들 간에 네트워킹을 위해서 사용됩니다.
네트워크 생성
docker network create 원하는 네트워크 이름 명령을 사용하면 도커 네트워크를 만들 수 있습니다.
만들어진 네트워크는 위에서 본 docker network ls 를 이용해 확인 할 수 있습니다.
컨테이너를 실행할 때 --network 옵션을 명시해주지 않으면, 기본적으로 bride라는 이름의 디폴트 네트워크에 붙게 됩니다.
네트워크 생성 실습
이제 저희는 mongo 와 mongo-express 라는 두개의 컨테이너 간에 통신이 필요해 mongo-network 를 만들어야 하는 상황이라고 가정해보겠습니다.
- docker network create mongo-network 이렇게 작성해주면 이름이 mongo-network인 도커 네트워크가 생성이 됩니다. 이제 mongo를 mongo-express에서 실행하려면, 네트워크에 컨테이너를 설정을 해줘야합니다.
- 이제 run할 때 mongo이미지 네트워크 설정 을 진행합니다.
docker run -d \ -p 27017:27017 \ -e MONGO_INITDB_ROOT_USERNAME=admin \ -e MONGO_INITDB_ROOT_PASSWORD=password \ --name mongodb \ --net mongo-network \ mongo
- -e를 사용해 실행 시 필요한 환경 변수를 세팅했습니다.
- --net mongo-network 를 하면, 이제 몽고 네트워크 내부에서 mongo가 실행됩니다.
- 만약 올바르게 실행됐는지 확인하고 싶으면 docker logs 생성된_컨테이너_id 확인합니다.
다음으로 mongo-express도 비슷한 방식으로 실행해줍니다.역시 실행할 때 설정해줘야 하는 환경변수가 있어서 그것을 설정해주고 실행합니다.
docker run -d \ -p 8081:8081 \ -e ME_CONFIG_MONGODB_ADMINUSERNAME=admin \ -e ME_CONFIG_MONGODB_ADMINPASSWORD=passwiord \ --net mongo-network \ --name mongo-express \ -e ME_CONFIG_MONGODB_SERVER=mongodb \ mongo-express
이렇게 하면 도커 네트워크를 직접 설정해서 두 컨테이너간의 통신을 할 수 있게 되었습니다.
네트워크에 컨테이너 연결/해제
- 연결 : docker network connect 네트워크_이름 컨테이너_이름
- Docker 네트워크에 컨테이너를 연결할 때는 docker network connect 커맨드를 사용합니다.
하나의 컨테이너는 여러 개의 네트워크에 동시에 연결할 수 있습니다. 만약 컨테이너를 생성할 때 아무런 네트워크 옵션을 주지 않았다면 bridge 네트워크에 있기 때문에 이를 해제해주는 실습을 할 수 있습니다.
- 해제 : docker network disconnect 네트워크_이름 컨테이너_이름
네트워크 제거
docker network rm 네트워크_이름 명령을 사용하면 네트워크를 지울 수 있습니다. 만약 제거하려는 네트워크 상에서 실행 중인 컨테이너가 있을 때는 제거가 되지 않습니다.
그럴 때는 해당 네트워크에 연결되어 실행 중인 모든 컨테이너를 먼저 stop 명령으로 중지 시키고, 네트워크를 삭제해야 합니다.
docker network prune : 아무런 연결이 없는 네트워크를 한번에 제거하는 명령입니다.
참고
'42Seoul > Inception' 카테고리의 다른 글
docker compose 명령어 [42 inception 과제 개념 7] (0) | 2023.06.24 |
---|---|
docker-compose 란 무엇인가? [42 inception 과제 개념 6] (0) | 2023.06.24 |
Docker 명령어, 포트번호, 컨테이너 디버깅 [42 inception 과제 개념 4] (0) | 2023.06.24 |
Docker, Docker Engine ( Client, Daemon) [42 inception 과제 개념 3] (0) | 2023.06.24 |
도커 이미지와 컨테이너 레포지토리 [42 inception 과제 개념 2] (0) | 2023.06.24 |