기본적으로 Docker 컨테이너는 완전히 격리돼 있으며 외부에서 포트에 접근할 수 있다고 명시하지 않으면 컨테이너 내의 포트에서 동작하는 서버를 시작해도 외부에서 접근할 수 없습니다.
이러한 포트 설정 방법과 Docker의 네트워킹 방식 중 Docker 컨테이너 간에 통신하거나 호스트 시스템 및 외부 네트워크와 통신할 수 있는 Docker의 브리지 네트워크에 대하여 기록하겠습니다.
목차
포트 연결
브리지 네트워크
관련 명령어
포트 연결
Docker 컨테이너 내부에서 웹 애플리케이션을 실행하는 경우 일부 포트를 외부로 노출하여야 합니다. 컨테이너에 포트를 설정하지 않은 경우와 설정한 경우, 두 가지의 예시를 통하여 비교해 보겠습니다.
서버 생성을 위한 테스트 코드는 Go로 작성하였으며 아래의 github에 올려두었습니다.
https://github.com/rainbow96bear/golang_practice/tree/master/docker/port_sample
포트 설정을 하지 않은 컨테이너
1. 아래의 명령어를 이용하여 컨테이너를 생성합니다.
docker run -it -v .\Desktop\port_test:/src --name post_test1 -w /src golang:alpine /bin/sh
이전 시간의 볼륨을 활용하여 컨테이너에서 편리하게 테스트 코드를 사용하기 위하여 볼륨도 추가하였습니다.
이미지는 'golang:alpine'을 사용하였습니다. alpine에 'golang'이 설치되어 있는 이미지로 서버를 열 때 go 언어를 사용하기 위하여 golang:alpine을 사용하였습니다.
2. 컨테이너가 실행되었다면 아래의 명령어를 입력하여 서버를 생성합니다.
go run main.go
볼륨에 미리 main.go를 받아두지 않았다면 실행하는 폴더에서 main.go를 생성하거나 혹은 다른 방법으로 서버를 생성해 주시면 됩니다.
위와 같이 서버를 열었지만 서버에 접근하려고 하면 연결에 실패하게 됩니다.
Docker는 이와 같이 포트를 설정하지 않는다면 외부에서 연결이 불가능합니다.
포트를 설정한 컨테이너
포트 설정은 -p 플래그를 사용하여 간단하게 설정할 수 있습니다. 포트 설정 이외에 위의 예시와 다른 점이 없습니다.
1. 아래의 명령어를 이용하여 컨테이너를 생성합니다.
docker run -it -v .\Desktop\port_test:/src -p 8080:8080 --name post_test2 golang:alpine /bin/sh
-p를 이용하여 포트를 설정할 때 [호스트 포트]:[컨테이너 포트]로 맵핑하게 됩니다.
2. 컨테이너가 실행되었다면 아래의 명령어를 입력하여 서버를 생성합니다.
go run main.go
이전과 다르게 포트 설정을 통하여 Docker의 서버를 호스트에서 접근할 수 있습니다.
브리지 네트워크
Docker에는 기본적으로 아래의 네트워크 모드를 지원한다고 합니다.
- 브리지 (bridge)
- 호스트 (host)
- 네트워크 단절 (none)
- 오버레이 (overlay)
이 중에서 브리지 네트워크에 대하여 알아보도록 하겠습니다.
브리지 네트워크란?
브리지 네트워크는 Docker 컨테이너 간에 통신하거나 호스트 시스템 및 외부 네트워크와 통신할 수 있는 네트워크 모델을 제공하는 기능입니다. 이 네트워크 모델은 Docker 데몬에 의해 자동으로 생성되는 가상 네트워크로, 기본적으로 모든 컨테이너가 동일한 브리지 네트워크에 속하게 됩니다.
현재 실행 중인 네트워크는 아리의 명령어를 실행하면 됩니다.
docker network ls
네트워크의 ID, 이름 Driver, Scope를 확인할 수 있습니다.
브리지 네트워크 생성
브리지 네트워크를 만들기 위하여 아래의 명령어를 사용합니다.
docker network create [네트워크 명]
명령어를 실행하면 긴 문자열이 나오는데 해쉬값으로 추측됩니다.
생성 후 'docker network ls'를 사용하여 확인하면 문자열의 앞부분이 ID로 나오는 것을 볼 수 있고 DRIVER가 bridge로 생성된 것을 알 수 있습니다.
사용자 정의 네트워크 연결
브리지 네트워크를 생성하게 되면 호스트를 제외한 해당 네트워크를 설정한 컨테이너 간에 통신이 이루어지고 그 외의 컨테이너는 통신이 되지 않습니다.
네트워크가 다른 경우 통신이 되는지 확인을 하기 위하여 아래의 명령어로 위에서 생성한 bridge 네트워크를 설정한 컨테이너를 생성하였습니다.
1. 아래의 명령어를 사용하여 네트워크를 설정하고 컨테이너를 생성합니다.
docker run -it --network=testNetwork -v .\Desktop\bridge_test:/src -p 8080:8080 -w /src --name bridge_test1 golang:alpine /bin/sh
'--network=[네트워크 명]'을 이용하여 컨테이너가 사용할 네트워크를 설정합니다.
웹 서버는 위의 예시들과 마찬가지로 main.go를 이용하여 서버를 열어줍니다.
2. 아래의 명령어를 이용하여 네트워크가 외부 컨테이너에서 접근합니다.
아래의 명령어는 'appropriate/curl'이미지를 사용하여 컨테이너에 curl을 이용하여 접근합니다.
-XPOST 뒤의 ip주소는 컨테이너의 이름을 입력합니다.
docker run --rm appropriate/curl:latest curl -i -XPOST bridge_test1:8080/rainbowbearWorld
실행 결과 네트워크가 다른 경우 응답이 '(6) Could not resolve host: bridge_test1'이라고 나온 것을 볼 수 있습니다.
3. 아래의 명령어를 이용하여 동일한 네트워크로 설정된 외부 컨테이너에서 접근합니다.
docker run --rm --network=testNetwork appropriate/curl:latest curl -i -XPOST bridge_test1:8080/rainbowbearWorld
실행 결과 네트워크가 같은 경우 응답이 성공적으로 확인되는 것을 알 수 있습니다.
네트워크 삭제
사용하지 않는 네트워크는 아래의 명령어로 삭제할 수 있습니다.
docker network rm [네트워크 명]
기본으로 제공되는 네트워크의 경우 삭제하면 문제가 발생할 수 있습니다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] 도커 컴포즈 활용하기 (YAML 작성) (0) | 2023.09.18 |
---|---|
[Docker] commit 명령어를 이용한 이미지 생성 (0) | 2023.09.16 |
[Docker] 도커파일과 이미지생성 (0) | 2023.09.16 |
[Docker] Docker 볼륨 이해하기 (데이터 공유, 관련 명령) (0) | 2023.09.08 |
[Docker] Docker(도커) 시작하기 (설치, 기본 명령어, Docker desktop) (0) | 2023.09.08 |