Docker 네트워킹의 기본 동작 6문제

별빛사막·2025년 2월 25일
0

docker

목록 보기
4/7

인프라를 잘 다루고 싶다면, nginx를 잘 다룰 줄 알아야한다.
nginx 웹서버는 포트를 구분자로 하여 여러 사이트를 운영할 수 있다.

Docker 네트워킹의 기본 동작 원리

  • 기본적으로 모든 도커 컨테이너는 동일한 브릿지 네트워크에 연결된다.
  • 같은 브릿지 네트워크에 속한 컨테이너들은 서로 자유롭게 통신할 수 있다.
  • 각 컨테이너는 고유한 IP 주소를 할당받는다.
172.17.0.1 → 게이트웨이 (Docker 호스트)
172.17.0.2 → 첫 번째 컨테이너 (예: nginx-1)
172.17.0.3 → 두 번째 컨테이너 (예: nginx-2)
172.17.0.4 → 세 번째 컨테이너 (예: nginx-3)
  • 컨테이너 간 통신은 IP 주소나 컨테이너 이름을 통해 가능하다.
  • 보안상 필요한 경우 사용자 정의 네트워크를 생성하여 컨테이너들을 격리할 수 있다.

문제1

  1. 도커 컨테이너 1 생성
  • docker run -d -p 8080:80 --name mynginx nginx
  • 해당 컨테이너의 IP 알아야함
  1. 도커 컨테이너 2 생성
  2. 도커 컨테이너 2에 bash 접속
  3. wget 을 설치
  4. wget 으로 도커 컨테이너 1 의 80 포트에 HTTP GET 요청하여 얻은 HTML결과를 화면에 출력

풀이과정

  1. 도커 컨테이너 1 생성
  • docker run -d --name mynginx nginx
  • 해당 컨테이너의 IP 알아냄 : docker inspect mynginx | grep '"IPAdress"'
  1. 도커 컨테이너 2 생성
    docker run -d --name mynginx2 nginx

  2. 도커 컨테이너 2에 bash 접속
    docker run -it --entrypoint bash my2 nginx

  3. wget 을 설치
    apt update
    apt install -y wget

  4. wget 으로 도커 컨테이너 1 의 80 포트에 HTTP GET 요청하여 얻은 HTML결과를 화면에 출력
    wget 172.17.0.2
    cat index.html

최종 결과


문제2

크롬에서 http://localhost:8085/sub.html 에 접속하면 `Hello Devs` 출력

풀이과정1

(핵심) http://localhost:8085/sub.html 에 접속할 때, 웹 서버는 Document Root 아래에서 해당 파일을 찾는데 그 기준이 index.html이니까 index.html의 위치를 찾고 거기에 sub.html을 추가해야한다.

  1. docker 생성
    docker run --rm -d -p 8085:80 --name my nginx

  2. 컨테이너에 bash 접속
    docker exec -it my bash

  3. index.html 파일 찾기

    ① find 명령어로 찾기
    find / -name index.html : 루트 디렉터리(/)부터 시작해 하위 모든 디렉터리에서 이름이 index.html인 파일 찾기

    ② locate 명령어로 찾기
    apt update
    apt install -y mlocate
    updatedb : updatedb안해주면 locate 명령어 사용이 안되니 주의!!
    locate index.html

  4. index.html의 경로로 이동해서 sub.html 작성
    cd /usr/share/nginx/html

    ① echo 명령어로 작성
    echo "<h1> Hello Devs </h1>" > sub.html

    ② vim 명령어로 작성
    apt update
    apt install -y vim
    vim sub.html

  5. http://localhost:8085/sub.html 접속

풀이과정2

  1. docker 생성
    docker run --rm -d -p 8080:80 --name my nginx

  2. sub.html 작성
    echo "<h1>Hello, Devs</h1>" > sub.html

  3. docker cp를 이용해 컨테이너 내부에 직접 접속하지 않고 파일을 전송
    docker cp sub.html my:/usr/share/nginx/html
    : 여기서 /usr/share/nginx/html 경로가 index.html의 경로임!

  4. http://localhost:8085/sub.html 접속

최종 결과


문제3

~/testDockerProjects/exam26/volumes/html/sub.html 파일의 내용이
http://localhost:8085/sub.html 으로 서비스 되게 해주세요.

풀이과정

(핵심) 볼륨은 폴더를 공유하는 것이다.
다만, 호스트(외부)와 공유됨으로써 컨테이너 내부(기존)의 index.html 등이 비어있을 수 있다.

  1. 볼륨 마운트를 사용한 docker 컨테이너 생성
    docker run \ --rm \ -d \ -p 8080:80 \ --name nginx-1 \ -v /${PWD}/testDockerProjects/exam27/nginx-1/volumes/usr/share/nginx/html:/usr/share/nginx/html \ nginx
  2. 외부에서 sub.html 생성
    echo "<h1>Hello, Devs</h1>" > ${PWD}/testDockerProjects/exam27/nginx-1/volumes/usr/share/nginx/html/sub.html
  • 외부에서 파일을 만들었지만 컨테이너 내부에서 만든것과 동일한 효과가 있다.
    docker exec -it my bash
    cd /usr/share/nginx/html/
    echo "<h1>Hello, Devs</h1>" > sub.html

    위 3가지 과정을 생략해도 된다!!!

최종결과


4. 문제

컨테이너 1 : nginx
컨테이너 2 : wget http://nginx-1/index.html 으로 컨테이너 1에 접근 할 수 있도록 해주세요.(컨테이너 이름으로 접근가능해야 합니다.)

풀이과정

(핵심) 브릿지 네트워크는 기본으로 docker run 하면 각 컨테이너가 브릿지안에 생성된다.
이때 사용자가 정의한 네트워크는 기본 네트워크와 달리 IP 주소 외에 컨테이너 이름으로도 통신이 가능하다.

참고로, 하나의 컨테이너가 2개 이상(기본 bridge, 사용자 정의 common )네트워크에 속해도 상관없다.
→ 네트워크별 네임스페이스(name)을 가지고 있고 독립적으로 인터페이스와 ip주소, 라우팅 테이블 등을 가지고 있기 때문에 동시에 연결되어 있더라도 충돌 없이 정상적으로 작동한다.

  1. 사용자 정의 네트워크
    docker network create common

  2. 컨테이너 2개 각각 생성
    docker run --rm -d --name nginx-1 --network common nginx
    docker run --rm -d --name nginx-2 --network common nginx

  3. 컨테이너 이름으로 접속
    docker exec -it nginx-2 bash
    apt update
    apt install -y wget
    wget http://nginx-1/index.html : 컨테이너 이름 nginx-1 으로 접근!


5. 문제

  • 도커 컨테이너 IP 사용금지
  • HOST 사용금지(http://nginx-1)
  • 172.17.0.1 사용가능(브릿지 네트워크에 속한 도커 컨테이너가 도커 HOST를 가리키는 IP)
  • nginx-2 에서 nginx-1의 80포트로 서비스 중인 웹서버에 GET /index.html

풀이과정

(핵심) 호스트 OS의 포트(외부)로 우회해서 컨테이너와 통신
즉, 호스트 OS의 포트와 컨테이너1이 연결되어있다는 점을 이용해서 컨테이너2는 호스트 OS포트를 이용해 컨테이너1과 통신한다.

  1. 컨테이너1 생성
    docker run --rm -d -p 8080:80 --name nginx-1 nginx

  2. 컨테이너2 생성 및 bash 셀 접속
    docker run --rm -it --name nginx-2 nginx bash

  3. wget, ping 명령어로 통신
    apt update
    apt install -y wget
    apt install -y iputils-ping

  4. 게이트웨이를 통해 도커 HOST에 접속가능한지 테스트
    ping 172.17.0.1
    (= ping host.docker.internal)

  5. 2번 컨테이너에서 1번 컨테이너 접속
    `wget http://172.17.0.1:8080/index.html

🔍 8080 vs 172.17.0.1

항목호스트 포트 사용게이트웨이 사용
명령어docker run -d -p 8080:80 nginx컨테이너 내부에서 실행: ping 172.17.0.1 또는 curl http://172.17.0.1
접속 방법브라우저에서 http://localhost:8080 접속컨테이너 내부에서 172.17.0.1로 직접 접근
트래픽 흐름외부 요청 → 호스트 OS의 8080 포트 → 컨테이너의 80 포트로 전달컨테이너 → Docker 브릿지 네트워크 게이트웨이(172.17.0.1) → 호스트 OS로 전달

🔍 호스트 OS vs 게이트 웨이 vs 호스트 포트

  • 호스트 OS: Docker 컨테이너가 실행되는 운영 체제 자체
  • 게이트웨이 (172.17.0.1): 컨테이너 내부에서 호스트로 접근하기 위한 IP 주소입니다.
    (주로 Linux 환경)
  • host.docker.internal: 컨테이너에서 호스트로 접근할 수 있는 DNS 이름(ex. google.com)
    (주로 Windows/macOS 환경)
  • 호스트 포트: 외부에서 컨테이너 애플리케이션에 접근하기 위한 네트워크 포트


6. 문제

힌트

  • nginx.conf 수정(버추얼 호스트 설정)을 해야 합니다

풀이과정

(핵심) 서버 하나에 site를 여러개 매핑할 수 있다.
즉, 폴더 하나가 site라고 생각하면 된다.
nginx에게 이를 학습시키기 위해서는 nginx.conf에 설정파일을 수정해야한다.
수정하고 나서는 nginx -s reload해야한다.

  1. 컨테이너 생성
    docker run --rm -d --name nginx-1 -p 8080:8080 -p 8081:8081 -p 8082:8082 nginx

  2. bash 셀 접속
    docker exec -it nginx-1 bash

  3. 폴더 생성 및 내용 채우기
    mkdir -p /web/site1 /web/site2 /web/site3

echo "<h1>Site 1</h1>" > /web/site1/index.html
echo "<h1>Site 2</h1>" > /web/site2/index.html
echo "<h1>Site 3</h1>" > /web/site3/index.html

  1. default.conf 위치 찾기 및 server 블록 추가
    find / -name nginx.conf
    cd /etc/nginx/conf.d/

apt update
apt install -y vim
vim site.conf

======= site.conf 파일에 추가할 내용 ======
server {
        listen 8080;
        root /web/site1;
}

server {
        listen 8081;
        root /web/site2;
}

server{
        listen 8082;
        root /web/site3;
}
  1. 설정파일 다시 로드
    nginx -s reload

최종 결과

profile
조금씩 매일 성장하자

0개의 댓글