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 옵션을 사용하면 사용 가능한 포트를 자동으로 할당해 유연하게 사용할 수 있음
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 }}' mynginx | IP 주소만 출력 (추천) |
docker inspect 를 활용하면 컨테이너의 네트워크, 볼륨, 환경 변수 등의
다양한 정보를 확인할 수 있음
grep 보다는 --format 옵션을 사용하는 것이 더 깔끔하고 정확한 결과를 얻는 방법
Docker에서 컨테이너들은 기본적으로 브릿지 네트워크(bridge network)에 연결됨
이를 통해 같은 네트워크에 속한 컨테이너들끼리 자유롭게 통신할 수 있음
1. 기본 개념
브릿지 네트워크(bridge network)
Docker의 기본 네트워크 모드로, 컨테이너들이 서로 통신할 수 있도록 해줌
컨테이너들은 고유한 IP 주소를 할당 받음
기본 네트워크를 그대로 사용하면 IP 주소 기반으로 컨테이너 간 통신이 가능
컨테이너 간 통신 방법
IP 주소 사용: 각 컨테이너는 브릿지 네트워크에서 개별적인 IP를 받기 때문에
해당 IP를 통해 접근할 수 있음
컨테이너 이름 사용: 같은 네트워크에 있는 경우 컨테이너 이름을 도메인처럼
사용할 수도 있음
보안 및 네트워크 분리
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.2 는 nginx-1 컨테이너의 IP 주소이므로 해당 컨테이너의 웹 서버에 직접 접근하는 것과 같음
⑧ index.html 파일 확인
cat index.html
nginx-1 컨테이너에서 제공하는 index.html 파일의 내용을 출력
정상적으로 통신이 이루어졌다면, Nginx의 기본 HTML 페이지가 표시됨
3. 정리
| 명령어 | 설명 |
|---|---|
docker run --rm -d --name nginx-1 nginx | nginx-1 컨테이너 실행 |
docker inspect nginx-1 \| grep '"IPAddress"' | nginx-1의 IP 주소 확인 |
docker run --rm -it --name nginx-2 nginx bash | nginx-2 컨테이너 실행 및 내부 접속 |
apt update && apt install -y wget | nginx-2에서 wget 설치 |
wget http://172.17.0.2/index.html | nginx-2에서 nginx-1의 웹 페이지 요청 |
cat index.html | index.html 파일의 내용을 확인 |
✅ Docker 컨테이너들은 기본적으로 같은 브릿지 네트워크에서 서로 통신할 수 있음
✅ 컨테이너는 각각 고유한 IP 주소를 가지며, 이를 통해 직접 접근 가능
✅ 같은 네트워크 내에서는 컨테이너 이름을 통해서도 접근 가능
✅ 사용자 정의 네트워크를 활용하면 더 안전한 네트워크 환경을 구성할 수 있음
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 nginx | my-nginx-1 컨테이너 실행 |
docker exec -it my-nginx-1 bash | 컨테이너 내부에 bash 셸로 접속 |
find / -name index.html 2>/dev/null | index.html 파일 검색 (find 사용) |
find / -name index.html 2>&1 \| grep -v "Permission denied" | 접근 불가 디렉토리 제외 후 index.html 검색 |
cat /etc/issue | 컨테이너 배포판 정보 확인 |
apt update && apt install -y mlocate | locate 명령어 설치 |
updatedb | locate 명령어를 위한 데이터베이스 업데이트 |
locate index.html | index.html 파일 빠르게 검색 |
✅
docker exec을 사용하면 실행 중인 컨테이너 내부에서 명령어 실행 가능✅
-it옵션을 사용하면 대화형 터미널로 컨테이너 내부에 접속 가능✅
find는 파일을 직접 검색하는 반면,locate는 데이터베이스를 사용하여 빠르게 검색✅
updatedb실행 후locate사용 가능
📌 웹서버란?
웹 서버는 웹 클라이언트(브라우저)로부터 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 컨테이너 내부에서 웹 페이지를 직접 수정하고 확인이 가능해짐