Docker 알아보기 - 3

현곤·2025년 2월 27일

Docker 컨테이너의 포트 매핑 개념 정리

Docker 컨테이너는 기본적으로 외부 네트워크와 격리된 환경에서 실행됨

따라서, 컨테이너 내부에서 실행중인 서비스(ex: 웹 서버)를 외부에서 접근하려면
포트 매핑(port mapping) 설정이 필요함

이걸 위해 -p , -P 옵션을 사용할 수 있다


1. -p 옵션: 특정 포트 매핑

-p <호스트 포트>:<컨테이너 포트>
  • 사용자가 직접 지정한 포트로 고정된 매핑을 설정할 수 있음

  • 예시) Nginx 컨테이너의 기본 포트(80)를 호스트의 8080 포트에 매핑하려면?

dokcer run --rm -d -p 8080:80 --name mynginx nginx

실행을 하게 되면

  • 이제 호스트의 8080 포트로 접속하면 컨테이너의 80번 포트에 연결

  • 브라우저 hhtp://localhost:8080 으로 접속하면 Nginx 페이지가 보임


2. -P 옵션: 자동 포트 매핑

-P
  • 컨테이너에서 노출된 모든 포트를 호스트의 임의의 사용 가능한 포트로 자동 매핑함

  • 예시)

docker run --rm -d -P --name auto_nginx nginx
  • 실행 후 docker ps 명령어로 호스트에서 매핑된 포트를 확인할 수 있음
docker ps

출력 예시

CONTAINER ID   IMAGE    COMMAND                  PORTS                   NAMES
a1b2c3d4e5f6   nginx    "nginx -g 'daemon of…"   0.0.0.0:32768->80/tcp    auto_nginx

여기서 32768->80/tcp컨테이너의 80번 포트가 호스트의 32768번 포트에
자동 매핑된 것
을 의미


3. 정리

옵션설명
-p <호스트 포트>:<컨테이너 포트>원하는 포트를 직접 지정하여 매핑
-P컨테이너에서 노출된 모든 포트를 자동으로 임의의 호스트 포트에 매핑
  • 외부에서 컨테이너 내부 서비스에 접근하려면 반드시 포트 매핑을 설정해야 함

  • -p 옵션을 사용하면 특정 포트에 연결할 수 있어 예측 가능

  • -P 옵션을 사용하면 사용 가능한 포트를 자동으로 할당해 유연하게 사용할 수 있음


dokcer inspect

1. docker inspect 로 확인할 수 있는 정보

  • 컨테이너 ID, 이름

  • 네트워크 설정 (IP 주소, 포트 매핑 등)

  • 볼륨 및 바인드 마운트 정보

  • 환경 변수

  • 실행 명령어

  • 컨테이너 상태 정보 (실행 중인지, 중지되었는지 등)

  • 그 외 여러 설정값


2. 실습 예제

① 컨테이너 실행

먼저 Nginx 컨테이너를 실행

docker run --rm -d --name mynginx nginx
  • --rm : 컨테이너가 종료되면 자동으로 삭제

  • -d : 백그라운등서 실행

  • --name mynginx : 컨테이너 이름을 mynginx 로 설정

② 컨테이너의 모든 정보 확인

docker inspect mynginx
  • mynginx 컨테이너의 전체 정보를 JSON 형식으로 출력

  • 출력되는 정보가 많기 때문에 필요한 정보만 필터링하는 것이 좋음

③ 특정 정보만 필터링하기

IP 주소 확인

docker inspect mynginx | grep '"IPAddress"'
  • grep 을 사용하면 "IPAddress" 항목만 출력할 수 있음

  • 하지만 grep 은 JSON 구조에서 정확한 값을 추출하기 어렵기 때문에,
    더 좋은 방법은 --format 옵션을 사용하는 것

--format 옵션을 활용한 IP 주소 추출

docker inspect --format '{{ .NetworkSettings.IPAddress }}' mynginx
  • --format 옵션을 사용하면 필요한 정보만 깔끔하게 출력할 수 있음

  • 위 명령어는 mynginx 컨테이너의 IP 주소만 출력


3. 정리

명령어설명
docker inspect mynginx컨테이너의 전체 정보를 JSON 형식으로 출력
docker inspect mynginx \| grep '"IPAddress"'IP 주소 관련 정보만 필터링 (비효율적)
docker inspect --format '{{ .NetworkSettings.IPAddress }}' mynginxIP 주소만 출력 (추천)
  • docker inspect 를 활용하면 컨테이너의 네트워크, 볼륨, 환경 변수 등의
    다양한 정보를 확인할 수 있음

  • grep 보다는 --format 옵션을 사용하는 것이 더 깔끔하고 정확한 결과를 얻는 방법


Docker 컨테이너 간 네트워크 통신 개념

Docker에서 컨테이너들은 기본적으로 브릿지 네트워크(bridge network)에 연결됨

이를 통해 같은 네트워크에 속한 컨테이너들끼리 자유롭게 통신할 수 있음


1. 기본 개념

  • 브릿지 네트워크(bridge network)

    • Docker의 기본 네트워크 모드로, 컨테이너들이 서로 통신할 수 있도록 해줌

    • 컨테이너들은 고유한 IP 주소를 할당 받음

    • 기본 네트워크를 그대로 사용하면 IP 주소 기반으로 컨테이너 간 통신이 가능

  • 컨테이너 간 통신 방법

    • IP 주소 사용: 각 컨테이너는 브릿지 네트워크에서 개별적인 IP를 받기 때문에
      해당 IP를 통해 접근할 수 있음

    • 컨테이너 이름 사용: 같은 네트워크에 있는 경우 컨테이너 이름을 도메인처럼
      사용할 수도 있음

  • 보안 및 네트워크 분리

    • 네트워크를 격리해야 할 경우, 사용자 정의 네트워크(custom network)를 생성하여 특정 컨테이너들끼리만 통신할 수 있도록 설정할 수 있음

2. 실습 예제

① 기존 컨테이너 삭제 (선택 사항)

Docker에서는 기본적으로 컨테이너가 순차적으로 IP 주소를 할당받음

  • 첫 번째 컨테이너는 172.17.0.2 가 될 가능성이 높음

  • 정확한 IP를 보장하려면 기존 컨테이너를 삭제하는 것이 좋음

docker container prune -f  # 모든 정지된 컨테이너 삭제

② 첫 번째 컨테이너(Nginx-1) 실행

docker run --rm -d --name nginx-1 nginx
  • --rm : 컨테이너 종료 시 자동 삭제

  • -d : 백그라운드에서 실행

  • --name nginx-1 : 컨테이너 이름을 nginx-1 로 설정


③ 첫 번째 컨테이너(Nginx-1)의 IP 주소 확인

docker inspect nginx-1 | grep "'IPAdderss'"
  • docker inspect 명령어로 컨테이너의 상세 정보를 확인할 수 있음

  • grep '"IPAddress"' 를 사용하면 IP 주소 정보만 필터링할 수 있음

  • 일반적으로 첫 번째 컨테이너의 IP는 172.17.0.2 가 됨


④ 두 번째 컨테이너(Nginx-2) 실행 및 내부 접속

docker run --rm -it --name nginx-2 nginx bash
  • --rm : 컨테이너 종료 시 자동 삭제

  • -it : 터미널 상호작용 모드 (bash 를 실행하여 내부에서 명령어 입력 가능)

  • --name nginx-2 : 컨테이너 이름을 nginx-2 로 설정

이제 nginx-2 컨테이너 내부에서 명령어를 실행할 수 있음


⑤ 두 번째 컨테이너(Nginx-2)에서 배포판 확인

cat /etc/issue
  • 현재 컨테이너의 운영체제 정보를 확인하는 명령어

  • 보통 Ubuntu 기반이면 Debian GNU/Linux 등의 결과가 나옴


⑥ 두 번째 컨테이너(Nginx-2)에서 wget 설치

apt update
apt install -y wget
  • apt update : 패키지 리스트 업데이트

  • apt install -y wget : wget 을 설치 (자동으로 yes 선택)

  • wget웹 서버에서 파일을 다운로드하는 유틸리티


⑦ nginx-2 컨테이너에서 nginx-1의 웹 페이지 다운로드

wget http://172.17.0.2/index.html
  • wget 을 사용하여 nginx-1 컨테이너의 웹 페이지(index.html)를 가져옴

  • 여기서 172.17.0.2nginx-1 컨테이너의 IP 주소이므로 해당 컨테이너의 웹 서버에 직접 접근하는 것과 같음


⑧ index.html 파일 확인

cat index.html
  • nginx-1 컨테이너에서 제공하는 index.html 파일의 내용을 출력

  • 정상적으로 통신이 이루어졌다면, Nginx의 기본 HTML 페이지가 표시됨


3. 정리

명령어설명
docker run --rm -d --name nginx-1 nginxnginx-1 컨테이너 실행
docker inspect nginx-1 \| grep '"IPAddress"'nginx-1의 IP 주소 확인
docker run --rm -it --name nginx-2 nginx bashnginx-2 컨테이너 실행 및 내부 접속
apt update && apt install -y wgetnginx-2에서 wget 설치
wget http://172.17.0.2/index.htmlnginx-2에서 nginx-1의 웹 페이지 요청
cat index.htmlindex.html 파일의 내용을 확인

✅ Docker 컨테이너들은 기본적으로 같은 브릿지 네트워크에서 서로 통신할 수 있음
✅ 컨테이너는 각각 고유한 IP 주소를 가지며, 이를 통해 직접 접근 가능
✅ 같은 네트워크 내에서는 컨테이너 이름을 통해서도 접근 가능
✅ 사용자 정의 네트워크를 활용하면 더 안전한 네트워크 환경을 구성할 수 있음


Docker 컨테이너 내부에서 명령어 실행

1. docker exec 명령어

이 명령어는 실행 중인 컨테이너 내부에서 추가 명령어를 실행할 때 사용됨

  • 컨테이너가 실행 중인 상태에서 내부에 접근하여 작업할 때 유용

  • -it 옵션을 사용하면 대화형(Interactive) 모드로 접속하여 직접 명령어 입력이 가능

  • 컨테이너 내부에서 파일 탐색, 애플리케이션 디버깅, 설정 변경 등을 수행할 수 있음

📌 기본 문법

docker exec [옵션] <컨테이너 이름> <실행할 명령어>

📌 예시

docker exec -it mynginx bash
  • myngnix 컨테이너 내부에 bash 셸로 접속

2. 실습 예제

① Nginx 컨테이너 실행 (my-nginx-1)

docker run --rm -d --name my-nginx-1 nginx
  • --rm : 종료 시 자동 삭제

  • -d : 백그라운드 실행

  • --name my-nginx-1 : 컨테이너 이름을 my-nginx-1 로 설정


② 실행 중인 컨테이너 내부에 접속

docker exec -it my-nginx-1 bash
  • -it : 대화형 터미널로 접속

  • bash : 컨테이너 내부에서 bash 셸 실행


find 명령어로 index.html 파일 찾기

find / -name index.html 2>/dev/null
  • find / -name index.html : 루트(/) 디렉토리부터 index.html 파일을 검색

  • 2>dev/null : "Permission denied" 오류를 숨김

대체 방법 (오류 메시지 제거)

find / -name index.html 2>&1 | grep -v "Permission denied"
  • 2>&1 : 표준 오류(stderr)를 표준 출력(stdout)으로 변경

  • grep -v "Permission denied" : 접근 불가능한 디렉토리를 필터링


locate 명령어로 index.html 파일 찾기

  • find전체 파일 시스템을 검색하는 반면,
    locate 는 미리 생성된 인덱스를 사용하여 더 빠르게 파일을 찾음

  • 하지만 locate 를 사용하려면 먼저 데이터베이스를 업데이트해야 함


⑤ 컨테이너의 배포판 확인

cat /etc/issue
  • 현재 컨테이너의 운영체제 정보를 확인

  • 보통 Debian GNU/Linux 또는 Ubuntu 가 표시됨


mlocate 패키지 설치 (locate 명령어 사용 가능하게 하기)

apt update
apt install -y mlocate
  • apt update : 패키지 목록 업데이트

  • apt install -y mlocate : mlocate 패키지 설치 (자동으로 yes)


updatedb 실행 (파일 데이터베이스 업데이트)

updatedb
  • locate파일 데이터베이스를 기반으로 검색하기 때문에 updatedb 명령어를 먼저 실행해야 함

  • 실행 후 새로 생성된 파일들도 검색할 수 있음


locate 명령어로 index.html 파일 찾기

locate index.html
  • index.html 파일의 위치를 빠르게 검색

3. 정리

명령어설명
docker run --rm -d --name my-nginx-1 nginxmy-nginx-1 컨테이너 실행
docker exec -it my-nginx-1 bash컨테이너 내부에 bash 셸로 접속
find / -name index.html 2>/dev/nullindex.html 파일 검색 (find 사용)
find / -name index.html 2>&1 \| grep -v "Permission denied"접근 불가 디렉토리 제외 후 index.html 검색
cat /etc/issue컨테이너 배포판 정보 확인
apt update && apt install -y mlocatelocate 명령어 설치
updatedblocate 명령어를 위한 데이터베이스 업데이트
locate index.htmlindex.html 파일 빠르게 검색

docker exec을 사용하면 실행 중인 컨테이너 내부에서 명령어 실행 가능

-it 옵션을 사용하면 대화형 터미널로 컨테이너 내부에 접속 가능

find파일을 직접 검색하는 반면, locate데이터베이스를 사용하여 빠르게 검색

updatedb 실행 후 locate 사용 가능


웹서버, 웹루트 디렉토리, Nginx 설정

📌 웹서버란?

  • 웹 서버는 웹 클라이언트(브라우저)로부터 HTTP 요청을 받아 웹 페이지를 제공하는 서버

  • 대표적인 웹 서버로는 Nginx, Apache 등이 있음

📌 웹루트 디렉토리란?

  • 웹 서버가 웹 페이지 파일들을 찾는 기본 디렉토리

  • Nginx의 기본 웹루트 디렉토리는 /usr/share/nginx/html

  • 이 디렉토리에 HTML 파일을 추가하면 웹에서 접근할 수 있음

  • 예를 들어 /user/share/nginx/html/sub.html 파일을 추가하면
    http://서버주소/sub.html 로 접근할 수 있음


① Nginx 컨테이너 실행 및 포트 매핑

docker run --rm -d -p 8080:80 --name my-nginx-1 nginx
  • -d : 백그라운드 실행

  • -p 8080:80 : 호스트의 8080번 포트를 컨테이너의 80번 포트와

  • --name my-nginx-1 : 컨테이너 이름 my-nginx-1 지정

  • nginx : Nginx 컨테이너 실행

이렇게 하면 브라우저에서 http://localhost:8080 으로 접근 가능


② Nginx 컨테이너 내부에 접속

docker exec -it my-nginx-1 bash
  • 실행 중인 my-nginx-1 컨테이너 내부에 bash 쉘로 접속

③ Nginx의 웹루트 디렉토리 찾기

(1) find 명령어 사용

find / -name index.html 2>/dev/null
  • index.html : 파일이 저장된 위치 찾기

  • 2>/dev/null : 권한 오류 메세지 숨기기

find / -name index.html 2>&1 | grep -v "Permission denied"
  • 접근 권한이 없는 디렉토리를 제외, index.html 파일 위치 검색

(2) locate 명령어 사용 (더 빠름)

cat /etc/issue  # 배포판 확인
apt update
apt install -y mlocate  # locate 명령어 설치
updatedb  # locate 명령어 데이터베이스 업데이트
locate index.html  # 웹루트 디렉토리 찾기 (출력: /usr/share/nginx/html)
  • locate 명령어는 빠르게 파일을 검색할 수 있음 (updatedb 먼저 실행해야 가능)

  • 출력 결과 : /usr/share/nginx/html/index.html (Nginx의 기본 웹루트 디렉토리)

④ 새로운 HTML 파일 추가

echo "<h1>Hello Devs</h1>" > /usr/share/nginx/html/sub.html
  • sub.html 파일을 생성하고, "Hello Devs" 라는 내용을 추가

  • 이제 웹에서 http://localhost:8080/sub.html 로 접속하면 Hello Devs 출력

그래서 http://localhost:8080/sub.html 에 들어가면 <h1>Hello Devs</h1> 가 출력됨

Nginx 컨테이너 내부에서 웹 페이지를 직접 수정하고 확인이 가능해짐

profile
코딩하는 곤쪽이

0개의 댓글