[Docker 3편] - 포트 매핑부터 컨테이너 관리까지

이상억·2025년 3월 18일

Docker

목록 보기
3/3

1. 포트 매핑과 옵션 차이 (-p vs -P)

  • Docker 컨테이너는 기본적으로 외부 네트워크와 격리되어 실행되지만, 포트 매핑을 통해 호스트와 통신할 수 있음.

  • 두 가지 옵션이 있는데, 그 차이는 다음과 같음.

-p 옵션

  • 형식: -p 호스트포트:컨테이너포트
  • 특징: 원하는 포트를 직접 지정해서 매핑할 수 있음
    예시:
# nginx 컨테이너의 기본 포트(80)를 호스트의 8080 포트에 매핑하여 실행
docker run --rm -d -p 8080:80 --name mynginx nginx

-P 옵션

  • 설명: 컨테이너 내에서 노출된 모든 포트를 Docker가 임의의 호스트 포트에 자동으로 매핑함
    예시:

# 모든 노출된 포트를 임의의 포트로 매핑하여 실행
docker run --rm -d -P --name auto_nginx nginx
  • 실행 후 docker ps 명령어로 실제 매핑된 호스트 포트를 확인할 수 있음.
  • 포인트: 외부에서 컨테이너 서비스(예: 웹서버)에 접근하려면 반드시 포트 매핑을 설정해야 함

2. 컨테이너 정보 확인 (docker inspect)

  • docker inspect 명령어를 사용하면 컨테이너의 상세 정보를 JSON 형식으로 확인할 수 있음.
  • 여기엔 컨테이너 ID, 이름, 네트워크 설정(예: IP 주소, 포트 매핑), 바인드 마운트 정보, 환경 변수 등 다양한 정보가 포함.

사용법

docker run --rm -d --name mynginx nginx
docker inspect mynginx  # 전체 정보 출력
  • 특정 정보(예: IP 주소)만 보고 싶을 땐 grep 또는 --format 옵션을 활용할 수 있음.
docker inspect mynginx | grep '"IPAddress"'

3. 컨테이너 간 통신

  • 기본적으로 Docker 컨테이너들은 같은 브릿지 네트워크에 연결되어 있어 서로 제약 없이 통신할 수 있음.

  • 각 컨테이너는 고유한 IP 주소를 할당받으며, 컨테이너 이름이나 IP 주소를 통해 통신할 수 있음.

  • 보안이 필요한 경우에는 사용자 정의 네트워크를 생성하여 컨테이너들을 격리할 수 있음.

실습 예시

1. my-nginx-1 컨테이너 띄우기

docker run --rm -d --name my-nginx-1 nginx
docker inspect my-nginx-1 | grep '"IPAddress"'
  • 보통 172.17.0.2 정도의 IP가 할당됨.

2. nginx-2 컨테이너에서 my-nginx-1에 접속하기

docker run --rm -it --name nginx-2 nginx bash
# 컨테이너 내부에서
apt update && apt install -y wget
wget http://172.17.0.2/index.html
cat index.html

4. docker exec로 컨테이너 내부 작업

  • 실행 중인 컨테이너에 추가 명령어를 실행하고 싶을 때 docker exec를 사용.
  • 예를 들어, nginx 컨테이너의 웹루트 디렉토리를 확인하거나 파일을 찾아볼 때 유용함.
bash
# my-nginx-1 컨테이너 띄우기
docker run --rm -d --name my-nginx-1 nginx

# 컨테이너 내부에 bash 접속
docker exec -it my-nginx-1 bash

# nginx 웹루트 디렉토리(일반적으로 /usr/share/nginx/html) 내 index.html 찾기
find / -name index.html 2>/dev/null
  • 또한, locate 명령어를 사용하려면 패키지 설치와 데이터베이스 업데이트가 필요.
apt update && apt install -y mlocate
updatedb
locate index.html

5. 웹루트 디렉토리에 파일 추가하기 (docker exec 활용)

  • nginx의 기본 웹루트 디렉토리는 /usr/share/nginx/html.
  • 여기에 파일을 추가하면 외부에서 바로 접근할 수 있음.

예시


# my-nginx-1 컨테이너 띄우기 (포트 매핑 포함)
docker run --rm -d -p 8080:80 --name my-nginx-1 nginx

# 컨테이너 내부로 들어가기
docker exec -it my-nginx-1 bash

# 웹루트 디렉토리 확인
locate index.html   # 보통 /usr/share/nginx/html 경로가 나옴

# sub.html 파일 추가
echo "<h1>Hello Devs</h1>" > /usr/share/nginx/html/sub.html

6. docker cp로 호스트와 컨테이너 간 파일 복사

  • docker cp 명령어를 사용하면 컨테이너 내부에 직접 접속하지 않고도 파일을 전송할 수 있음.

명령어 형식

  • 호스트 → 컨테이너
docker cp 호스트경로 컨테이너명:컨테이너경로
  • 컨테이너 → 호스트
docker cp 컨테이너명:컨테이너경로 호스트경로

실습 예시


# my-nginx-1 컨테이너 띄우기
docker run --rm -d -p 8080:80 --name my-nginx-1 nginx

# 호스트에서 파일 생성
echo "<h1>Hello from docker cp</h1>" > sub.html

# 호스트에서 컨테이너로 파일 복사
docker cp sub.html my-nginx-1:/usr/share/nginx/html/

# 파일 복사가 완료되면 호스트에서 파일 삭제 (원본 정리)
rm sub.html

# 컨테이너 내부에서 파일 존재 확인
docker exec -it my-nginx-1 bash -c "ls /usr/share/nginx/html"

7. 바인드 마운트를 이용한 HTML 파일 관리

  • 개발 시 호스트의 파일을 컨테이너에 바로 반영하고 싶다면, 바인드 마운트가 아주 유용함.
  • 컨테이너를 삭제해도 호스트의 파일은 유지되며, 실시간으로 변경 사항이 반영 됨.

예시

cd ~  # 홈 디렉토리로 이동

# 바인드 마운트를 이용해 컨테이너 실행
docker run \
  --rm \
  -d \
  -p 8080:80 \
  --name my-nginx-1 \
  -v /${PWD}/testDockerProjects/exam27/my-nginx-1/volumes/usr/share/nginx/html:/usr/share/nginx/html \
  nginx
  • 호스트의 /testDockerProjects/exam27/my-nginx-1/volumes/usr/share/nginx/html 경로에 HTML 파일을 생성하거나 수정하면, 컨테이너의 /usr/share/nginx/html에 바로 반영 됨.

예를 들어,


echo "<h1>Hello Devs</h1>" > ${PWD}/testDockerProjects/exam27/my-nginx-1/volumes/usr/share/nginx/html/sub.html
profile
이상억

0개의 댓글