Docker 컨테이너는 기본적으로 외부 네트워크와 격리되어 실행되지만, 포트 매핑을 통해 호스트와 통신할 수 있음.
두 가지 옵션이 있는데, 그 차이는 다음과 같음.
# nginx 컨테이너의 기본 포트(80)를 호스트의 8080 포트에 매핑하여 실행
docker run --rm -d -p 8080:80 --name mynginx nginx
# 모든 노출된 포트를 임의의 포트로 매핑하여 실행
docker run --rm -d -P --name auto_nginx nginx
사용법
docker run --rm -d --name mynginx nginx
docker inspect mynginx # 전체 정보 출력
docker inspect mynginx | grep '"IPAddress"'
기본적으로 Docker 컨테이너들은 같은 브릿지 네트워크에 연결되어 있어 서로 제약 없이 통신할 수 있음.
각 컨테이너는 고유한 IP 주소를 할당받으며, 컨테이너 이름이나 IP 주소를 통해 통신할 수 있음.
보안이 필요한 경우에는 사용자 정의 네트워크를 생성하여 컨테이너들을 격리할 수 있음.
실습 예시
docker run --rm -d --name my-nginx-1 nginx
docker inspect my-nginx-1 | grep '"IPAddress"'
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
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
apt update && apt install -y mlocate
updatedb
locate index.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
명령어 형식
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"
예시
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
예를 들어,
echo "<h1>Hello Devs</h1>" > ${PWD}/testDockerProjects/exam27/my-nginx-1/volumes/usr/share/nginx/html/sub.html