해당 강의는 ex04 디렉토리에서 진행하였음.

 

1. 디렉토리 및 필요한 파일 생성

  • server1
    • webapp
      • index.html
    • Dockerfile
  • server2
    • webapp
      • index.html
    • Dockerfile
  • lb
    • Dockerfile 
    • conf
      • nginx.conf

Dockerfile (server1, server2 동일)

FROM nginx

COPY ./webapp /usr/share/nginx/html

ENTRYPOINT ["nginx", "-g", "daemon off;"]

 

index.html (server1)

<h1>Welcome nginx Server1</h1>

 

index.html (server2)

<h1>Welcome nginx Server2</h1>

 

 

2. Dockerfile 빌드

ex04 디렉토리에서 진행.

docker build -t server1:1.0 ./server1
docker build -t server2:1.0 ./server2

 

3. Docker 이미지 확인 및 실행

docker images

빌드한 이미지가 제대로 생성되었는지 확인 한다.

 

이미지가 제대로 생성되었으면 아래의 명령어로 실행

docker run -d -p 8081:80 --name nginx-server1 server1:1.0
docker run -d -p 8082:80 --name nginx-server2 server2:1.0

docker ps 및 제대로 실행되었는지 확인하는 부분은 생략!

 

4. 구성하려는 서버 구성도

 

5. 설정파일 생성

lb/conf/nginx.conf 파일을 생성한다.

upstream server1{
                server 172.17.0.3:80;
}

upstream server2{
                server 172.17.0.4:80;
}

server{
        listen 80;
        server_name localhost;

        #여기서 server1은 위의 upstream server1을 의미한다.
        location /server1{
                proxy_pass http://server1/;
        }

        #여기서 server2는 위의 upstream server2를 의미한다.
        location /server2{
                proxy_pass http://server2/;
        }

}

여기서 upstream server1, upstream server2 IP는 docker inspect [CONTAINER ID] 로 확인하여 넣어주어야한다.!!

 

lb용 Dockerfile을 작성한다.

FROM nginx
COPY conf/nginx.conf /etc/nginx/conf.d/default.conf
ENTRYPOINT ["nginx", "-g", "daemon off;"]

 

6. lb 빌드하기

docker build -t lb:1.0 ./lb

 

7. lb 실행하기

docker run -d -p 8080:80 --name nginx-lb lb:1.0

 

8. 로드밸런스 확인하기

192.168.0.3:8080/server1

192.168.0.3:8080/server2 

각각 접속해보고 server1, server2의 index.html 이 뜨면 성공!

 

 

16강에서부터 이어진 내용이므로 ex03/webapp, ex03/conf 디렉토리 생성되어있는 것을 가정한다.

1. Dockerfile 작성

 1 FROM nginx
 2
 3 #COPY webapp /usr/share/nginx/html
 4 #COPY conf/nginx.conf /etc/nginx/conf.d/default.conf
 5
 6 ENTRYPOINT ["nginx", "-g", "daemon off;"]

아직 webapp과 conf에 들어갈 내용이 없으니까 일단 주석 처리 해주자.

 

2. Dockerfile build 및 컨테이너 실행

docker build -t nginx-server ./
docker run -d -p 8080:80 --name some-nginx nginx-server

 

3. default.conf 내용 가져오기

우리가 건드려야할 conf파일을 확인 후 base될 내용을 가져오자.

docker exec -it [CONTAINER ID] bash

실행한 컨테이너의 터미널에 접속한다.

cd /etc/nginx/conf.d

컨테이너의 터미널에 접속했으면 nginx의 default config파일이 있는 곳으로 이동한다.

cat default.conf

 

우리는 default.conf를 base로 하여 설정을 건드려야하므로 해당 내용을 복사해서 만들어둔 호스트의 conf 폴더로 가져오자.

server {
    listen       80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

해당 내용을 복사 → 컨테이너 터미널 종료 → HOST의 conf디렉토리에 nginx.conf 파일을 생성한 후 복사한 내용을 붙여넣기한다.

 

이전 15 RUN명령어 강의에서 기본으로 제공되는 html을 바꾸기 위해서 ./index.nginx-debian.html 이렇게 변경하였는데 그때는 config 파일에 다르게 설정되어있어있어서 그렇다고 하심.

 

4. 기본페이지, 에러페이지 변경하기

우리가 참고할 설정들은 기본 location과 error가 발생했을 때 보여줄 location 이다.

해당 설정을 위해서는 설정파일의 7,17 번째 줄을 변경하면 된다.

에러페이지용 index는 17번째 줄을 보면 50x.html 이름으로 설정되어있고, 기본 location은 index.html로 설정되어있으므로 webapp에 index.html과 50x.html을 생성해준다. (둘다 경로는 /usr/share/nginx/html 로 동일한 것을 볼 수 있다.)

<h1>Error Page!!</h1>

50x.html

<h1>Welcome Nginx!!</h1>

index.html

 

5. Dockerfile 수정 및 재빌드

주석 처리해둔 COPY 명령어 부분을 주석해제 한 후 빌드를 다시 해주자.

  1 FROM nginx
  2
  3 COPY webapp /usr/share/nginx/html
  4 COPY conf/nginx.conf /etc/nginx/conf.d/default.conf
  5
  6 ENTRYPOINT ["nginx", "-g", "daemon off;"]

Dockerfile

 

docker build -t nginx-server:2.0 ./

빌드

 

docker run -d -p 8080:80 --name some-nginx nginx-server:2.0

실행

 

버그발생

docker ps -a  확인 결과 컨테이너가 강제 종료되는 현상

docker logs [CONTAINER ID] : 명령어로 로그를 보니 아래와 같은 로그가 출력되어있었다.

conf에 있는 nginx.conf 에 오타가 나와있어서 수정함!

 

다시 빌드해서 다시 실행시켜 보면 설정한 대로 동작하는 것을 볼 수 있다.

아직 50x 에러를 발생시킬 수 없어서 보여줄 수가 없다.

기본 페이지는 설정한 대로 제대로 뜬다.

 

컨테이너에 터미널로 접속해서 확인해봐도 설정한대로 잘 복사되었다.

설정파일도 제대로 복사된것을 알 수 있다.(/etc/nginx/conf.d/default.conf)

1. 실습준비

그동안의 실습 내용들 모두 정리

nginx, httpd 컨테이너, 이미지 모두 지운 다음 lecture/ex03디렉토리를 생성한다.

 

2. 파일 생성

ex03 디렉토리 안에서 아래와 같이 디렉토리와 Dockerfile을 생성해준다.

mkdir conf
mkdir webapp
touch Dockerfile

 

3. nginx컨테이너 실행

docker run --name some-nginx -d -p 8000:80 nginx

 

4. docker inspect

docker inspect [CONTINAER ID]

nginx의 컨테이너 ID를 입력해서 nginx 컨테이너를 분석해보자.

일단 docker ps로 방금 전에 실행시킨 nginx를 보면 COMMAND가 /docker-entroypoint... 인걸 볼 수 있다.

 

좀 더 자세히 보기 위해서 docker inspect를 사용해서 봐보자. 컨테이너 내부에서 해당 shell 파일을 실행시켜 주는 것 같다.

 

어떤 스크립트인지 컨테이너 내부에서 해당 파일을 찾아보자.

docker-entorypoint.sh는 / 에서 바로 찾아볼 수 있었다.

docker exec -it 32b bash

 

네트워크 정보

컨테이너의 네트워크 정보

여기서 볼건 IPAddress와 Gateway인데 IPAddress는 나중에 다른 컨테이너와 통신이 필요할 때 컨테이너 끼리 내부적으로 데이터를 주고받을 때 필요함. (Spring ↔ MySQL 등등) 근데 아이피 보다는 --name으로 다른 컨테이너를 식별하는게 더 편하다고 하심.

Gateway는 HOST와 연결된 통로라고 생각하면된다.

 

주의 

Dockerfile에 쓰는 EXPOSE 80 같은 명령어는

80포트를 여는 명령어가 아니라 80포트가 열려있음! 이라고 알려주는 표시일 뿐이다.

+ Recent posts