안녕하세요 펭귄교수입니다.
도커는 애플리케이션을 격리된 환경에서 실행할 수 있는 컨테이너 기술입니다.
하지만 도커 컨테이너는 기본적으로 외부 네트워크와 격리되어 있기 때문에 외부에서 컨테이너 내부로 접근하기 위해서는 포트 포워딩(Port Forwarding)을 설정해야 합니다.
포트 포워딩을 통해 도커 컨테이너 내부에서 실행 중인 서비스에 외부에서 접근할 수 있으며, 이를 통해 웹 애플리케이션, 데이터베이스, API 서버 등 다양한 서비스를 외부로 노출할 수 있습니다.
이번 포스팅에서는 도커 컨테이너와 포트 포워딩의 개념과 사용법, 그리고 이를 실제 애플리케이션에서 어떻게 설정할 수 있는지에 대해 다뤄보겠습니다.
1. 도커 컨테이너와 네트워크 개요
도커는 각 컨테이너를 고립된 네트워크 환경에서 실행합니다. 컨테이너 내부에서 실행 중인 애플리케이션은 기본적으로 외부에서 접근할 수 없으나, 포트 포워딩을 통해 외부와의 연결을 설정할 수 있습니다.
도커 컨테이너에서 네트워크와 관련된 주요 개념은 다음과 같습니다:
- Bridge Network: 기본적으로 도커는 각 컨테이너를 브릿지 네트워크로 격리합니다.
- Host Network: 호스트와 동일한 네트워크에서 실행되며, 호스트와 동일한 IP를 공유합니다.
- Port Forwarding: 호스트의 특정 포트와 컨테이너 내부의 포트를 연결하여 외부에서 접근할 수 있게 만듭니다.
네트워크 상태 확인
현재 실행 중인 도커 컨테이너의 네트워크 상태를 확인하려면 다음 명령어를 사용합니다:
docker network ls
이 명령어를 사용하면 도커가 관리하는 네트워크 목록을 확인할 수 있습니다.
2. 포트 포워딩(Port Forwarding) 설정 방법
도커 컨테이너에서 외부로 애플리케이션을 노출하려면 포트 포워딩을 설정해야 합니다. 포트 포워딩은 도커 컨테이너 실행 시 명령어에 -p 옵션을 추가해 간단하게 설정할 수 있습니다.
2-1. 기본적인 포트 포워딩 명령어
포트 포워딩을 설정하려면 docker run 명령어에 -p 옵션을 사용하여 호스트와 컨테이너의 포트를 연결할 수 있습니다.
docker run -d -p <호스트포트>:<컨테이너포트> <이미지명>
예를 들어, 웹 서버 애플리케이션을 도커 컨테이너에서 실행하고 이를 외부에서 접근하려면, 다음과 같이 80번 포트를 호스트와 컨테이너 간에 연결할 수 있습니다.
docker run -d -p 8080:80 nginx
이 경우, 호스트의 8080 포트로 접근하면, 컨테이너 내부의 80 포트로 요청이 전달되며, 컨테이너 내부에서 실행 중인 Nginx 웹 서버가 해당 요청을 처리하게 됩니다.
2-2. 여러 포트 포워딩
하나의 컨테이너에서 여러 개의 포트를 외부에 노출해야 할 경우도 있습니다. 이런 경우에는 포트 포워딩 설정을 여러 개 추가하면 됩니다.
docker run -d -p 8080:80 -p 8443:443 mywebapp
이 명령어는 호스트의 8080 포트를 컨테이너의 80 포트로, 호스트의 8443 포트를 컨테이너의 443 포트로 매핑하여, HTTP와 HTTPS 요청을 모두 처리할 수 있게 만듭니다.
2-3. 임의의 포트에 매핑
도커에서 포트를 매핑할 때, 호스트 포트를 생략하면 도커가 임의의 포트를 자동으로 할당해줍니다.
docker run -d -p 80 nginx
이 경우, 호스트의 임의의 포트가 자동으로 컨테이너의 80번 포트와 연결됩니다. 어떤 포트가 매핑되었는지 확인하려면, 다음 명령어로 컨테이너의 포트 상태를 확인할 수 있습니다.
docker port <컨테이너ID>
3. 도커 컴포즈(Docker Compose)와 포트 포워딩
- Docker Compose를 사용하면 여러 컨테이너를 한꺼번에 관리하고, YAML 파일을 통해 포트 포워딩 설정을 할 수 있습니다.
3-1. Docker Compose 설정 예시
아래는 docker-compose.yml 파일에서 포트 포워딩을 설정하는 예시입니다.
version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
- "8443:443"
위 설정은 Nginx 웹 서버를 사용하며, 호스트의 8080 포트와 8443 포트를 각각 HTTP(80)와 HTTPS(443)로 매핑합니다.
docker-compose up -d
위 명령어로 도커 컴포즈를 실행하면 포트 포워딩이 설정된 컨테이너가 생성됩니다.
4. 포트 충돌 및 해결 방법
도커에서 포트 포워딩을 설정할 때, 호스트에서 이미 사용 중인 포트와 충돌이 발생할 수 있습니다. 만약 같은 포트에 두 개 이상의 컨테이너를 할당하려고 하면 오류가 발생합니다.
4-1. 포트 충돌 방지
포트 충돌을 방지하기 위해서는 각 컨테이너에 다른 호스트 포트를 할당해야 합니다. 예를 들어, 첫 번째 컨테이너는 8080 포트에, 두 번째 컨테이너는 8081 포트에 연결하는 방식으로 해결할 수 있습니다.
docker run -d -p 8080:80 nginx
docker run -d -p 8081:80 nginx
이 방식으로 각 컨테이너를 서로 다른 포트에 매핑해, 호스트에서의 포트 충돌을 방지할 수 있습니다.
4-2. 사용 중인 포트 확인
현재 호스트에서 사용 중인 포트를 확인하려면 리눅스에서는 netstat이나 ss 명령어를 사용할 수 있습니다.
sudo netstat -tuln | grep LISTEN
이 명령어는 호스트에서 현재 사용 중인 포트를 출력합니다. 이를 통해 충돌을 방지할 수 있습니다.
5. 포트 포워딩과 방화벽 설정
호스트 시스템의 방화벽이 설정되어 있으면, 포트 포워딩이 제대로 동작하지 않을 수 있습니다. 방화벽에서 해당 포트를 허용해야 외부에서 컨테이너로의 접근이 가능합니다.
5-1. UFW 방화벽 설정 예시
우분투(Ubuntu)에서는 UFW 방화벽을 많이 사용합니다. 특정 포트를 허용하려면 다음 명령어를 사용합니다.
$ sudo ufw allow 8080/tcp
CentOS 는 firewalld 으로 방화벽을 설정합니다.
$ sudo firewall-cmd --permanent --zone=public --add-port=8080/tcp
success
$ sudo firewall-cmd --reload # reload를 해줘야 적용됩니다.
$ sudo firewall-cmd --list-ports
3389/tcp 8080/tcp
이 명령어는 TCP 8080 포트를 허용하는 설정입니다. 방화벽에서 포트 허용이 완료되면, 외부에서 도커 컨테이너로 접근할 수 있습니다.
6. 리눅스 명령어와 도커 포트 포워딩의 조합
리눅스 명령어와 도커 포트 포워딩을 함께 활용하면 보다 효율적으로 네트워크를 관리할 수 있습니다. 예를 들어, 리눅스 스크립트를 사용하여 여러 개의 컨테이너를 자동으로 실행하고, 각각의 포트를 지정해주는 방식으로 작업을 자동화할 수 있습니다.
for i in {1..5}; do
docker run -d -p 800$i:80 nginx
done
위 스크립트는 5개의 Nginx 컨테이너를 실행하고, 각각의 컨테이너를 8001에서 8005까지의 호스트 포트에 매핑합니다. 이를 통해 빠르게 여러 개의 컨테이너를 실행하고, 각기 다른 포트로 접근할 수 있습니다.
7. 가상환경 (Virtual Box)에서 포트포워딩
만약 저처럼 가상환경 (Virtual Box 등) 에서 리눅스 환경을 구축하고 그 안에서 Docker를 실행할 경우 가상환경에서 실제 PC와도 포트포워딩이 되어 있어야 합니다.
그 부분도 설명드리겠습니다.
7-1. Local Host PC IP/PORT 확인
윈도우의 경우 CMD 창을 열고 ipconfig/all 명령어를 사용하면 해당 PC의 모든 IP 리스트를 볼 수 있습니다.
여기서 볼 것은 설명에 VirtualBox Host-Only Ethernat Adapter 인가,
그리고 IPv4 주소입니다. 이 주소를 복사해놓습니다.
그리고 해당 주소를 Virtual Box 가상환경 설정 > 네트워크 > 고급 > 포트포워딩 설정으로 들어갑니다.
들어가면 호스트 IP/PORT, 게스트 IP/PORT 를 적는 부분이 있습니다. 복사했던 IP 주소를 HOST IP에 등록시켜줍니다.
게스트 IP는 가상환경 서버에서 IP를 확인한 후 넣어주면 됩니다.
net-tools가 Install 된 상황에서 ifconfig 명령어를 사용하면 됩니다.
# Ubuntu
sudo apt-get update
sudo apt-get install net-tools
ifconfig
# CentOS
sudo yum install net-tools
ifconfig
그렇게 나오는 IP 중 10.0 으로 시작해주는 IP를 게스트 IP로 작성해주면 됩니다.
PORT는 사용을 워하는 PORT로 작성해주면 됩니다.
8. 마무리
도커 컨테이너와 포트 포워딩은 컨테이너 기반 애플리케이션을 외부에 노출하기 위해 필수적인 기술입니다. 포트 포워딩을 사용하면 컨테이너 내부에서 실행 중인 서비스를 외부 네트워크와 연결할 수 있으며, 이를 통해 웹 서버나 데이터베이스 등 다양한 애플리케이션을 배포하고 관리할 수 있습니다.
이번 포스팅에서는 도커의 기본적인 포트 포워딩 명령어 사용법부터, 도커 컴포즈를 통한 설정, 포트 충돌 문제 해결 방법, 방화벽 설정까지 다양한 주제를 다루었습니다. 이를 통해 도커를 보다 효율적으로 사용하고, 네트워크 설정을 잘 관리할 수 있게 되기를 바랍니다.
'Docker > Docker 강의' 카테고리의 다른 글
[Docker 강의 14편] 도커 컨테이너 자동화 (0) | 2024.09.30 |
---|---|
[Docker 강의 13편] 도커로 개발 환경 설정하기 (0) | 2024.09.29 |
[Docker 강의 11편] 도커 이미지 푸시(Push) 및 풀(Pull) (0) | 2024.09.29 |
[Docker 강의 10편] Docker Registry (0) | 2024.09.29 |
[Docker 강의 9편] 다중 컨테이너 환경 구축 (1) | 2024.09.25 |