인프라를 잘 다루고 싶다면, nginx를 잘 다룰 줄 알아야한다.
nginx 웹서버는 포트를 구분자로 하여 여러 사이트를 운영할 수 있다.
172.17.0.1 → 게이트웨이 (Docker 호스트)
172.17.0.2 → 첫 번째 컨테이너 (예: nginx-1)
172.17.0.3 → 두 번째 컨테이너 (예: nginx-2)
172.17.0.4 → 세 번째 컨테이너 (예: nginx-3)
docker run -d --name mynginx nginx
docker inspect mynginx | grep '"IPAdress"'
도커 컨테이너 2 생성
docker run -d --name mynginx2 nginx
도커 컨테이너 2에 bash 접속
docker run -it --entrypoint bash my2 nginx
wget 을 설치
apt update
apt install -y wget
wget 으로 도커 컨테이너 1 의 80 포트에 HTTP GET 요청하여 얻은 HTML결과를 화면에 출력
wget 172.17.0.2
cat index.html
(핵심) http://localhost:8085/sub.html 에 접속할 때, 웹 서버는 Document Root 아래에서 해당 파일을 찾는데 그 기준이 index.html이니까 index.html의 위치를 찾고 거기에 sub.html을 추가해야한다.
docker 생성
docker run --rm -d -p 8085:80 --name my nginx
컨테이너에 bash 접속
docker exec -it my bash
index.html 파일 찾기
① find 명령어로 찾기
find / -name index.html
: 루트 디렉터리(/)부터 시작해 하위 모든 디렉터리에서 이름이 index.html인 파일 찾기
② locate 명령어로 찾기
apt update
apt install -y mlocate
updatedb
: updatedb안해주면 locate 명령어 사용이 안되니 주의!!
locate index.html
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
docker 생성
docker run --rm -d -p 8080:80 --name my nginx
sub.html 작성
echo "<h1>Hello, Devs</h1>" > sub.html
docker cp를 이용해 컨테이너 내부에 직접 접속하지 않고 파일을 전송
docker cp sub.html my:/usr/share/nginx/html
: 여기서 /usr/share/nginx/html 경로가 index.html의 경로임!
~/testDockerProjects/exam26/volumes/html/sub.html 파일의 내용이
http://localhost:8085/sub.html 으로 서비스 되게 해주세요.
(핵심) 볼륨은 폴더를 공유하는 것이다.
다만, 호스트(외부)와 공유됨으로써 컨테이너 내부(기존)의 index.html 등이 비어있을 수 있다.
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
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가지 과정을 생략해도 된다!!!
컨테이너 1 : nginx
컨테이너 2 : wget http://nginx-1/index.html 으로 컨테이너 1에 접근 할 수 있도록 해주세요.(컨테이너 이름으로 접근가능해야 합니다.)
(핵심) 브릿지 네트워크는 기본으로 docker run 하면 각 컨테이너가 브릿지안에 생성된다.
이때 사용자가 정의한 네트워크는 기본 네트워크와 달리 IP 주소 외에 컨테이너 이름으로도 통신이 가능하다.
참고로, 하나의 컨테이너가 2개 이상(기본 bridge, 사용자 정의 common )네트워크에 속해도 상관없다.
→ 네트워크별 네임스페이스(name)을 가지고 있고 독립적으로 인터페이스와 ip주소, 라우팅 테이블 등을 가지고 있기 때문에 동시에 연결되어 있더라도 충돌 없이 정상적으로 작동한다.
사용자 정의 네트워크
docker network create common
컨테이너 2개 각각 생성
docker run --rm -d --name nginx-1 --network common nginx
docker run --rm -d --name nginx-2 --network common nginx
컨테이너 이름으로 접속
docker exec -it nginx-2 bash
apt update
apt install -y wget
wget http://nginx-1/index.html
: 컨테이너 이름 nginx-1 으로 접근!
(핵심) 호스트 OS의 포트(외부)로 우회해서 컨테이너와 통신
즉, 호스트 OS의 포트와 컨테이너1이 연결되어있다는 점을 이용해서 컨테이너2는 호스트 OS포트를 이용해 컨테이너1과 통신한다.
컨테이너1 생성
docker run --rm -d -p 8080:80 --name nginx-1 nginx
컨테이너2 생성 및 bash 셀 접속
docker run --rm -it --name nginx-2 nginx bash
wget, ping 명령어로 통신
apt update
apt install -y wget
apt install -y iputils-ping
게이트웨이를 통해 도커 HOST에 접속가능한지 테스트
ping 172.17.0.1
(= ping host.docker.internal)
2번 컨테이너에서 1번 컨테이너 접속
`wget http://172.17.0.1:8080/index.html
항목 | 호스트 포트 사용 | 게이트웨이 사용 |
---|---|---|
명령어 | 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로 전달 |
- <h1>Site 1</h1>
- <h1>Site 2</h1>
- <h1>Site 3</h1>
(핵심) 서버 하나에 site를 여러개 매핑할 수 있다.
즉, 폴더 하나가 site라고 생각하면 된다.
nginx에게 이를 학습시키기 위해서는 nginx.conf에 설정파일을 수정해야한다.
수정하고 나서는 nginx -s reload해야한다.
컨테이너 생성
docker run --rm -d --name nginx-1 -p 8080:8080 -p 8081:8081 -p 8082:8082 nginx
bash 셀 접속
docker exec -it nginx-1 bash
폴더 생성 및 내용 채우기
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
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;
}
nginx -s reload