😎다룰 내용
도커 파일로 NGINX의 설정파일을 수정함에 있어, 직접 컨테이너에 접근하여 경로를 확인하고 수정하는 방법을 알아보자.
Nginx 이미지 파악하기
먼저, 도커 허브에 들어가서 공식 내용을 찾아 다음과 같은 file을 작성하였다.
FROM nginx
# COPY webapp /usr/share/nginx/html
# COPY conf/nginx.conf /etc/nginx/nginx.conf
ENTRYPOINT ["nginx", "-g", "daemon off;"]
각 로컬에서 폴더 아래 작성된 내용을 NGINX 컨테이너의 해당 디렉토리에 COPY하는 내용이다.
정말, 로컬에서 전달하는 폴더의 내용이 NGINX 이미지의 해당 디렉토리에 복사하면 되는지 직접 컨테이너 내부를 살펴보자.
이를 확인하기 위해서 먼저 COPY 문구는 주석처리하고 해당 file을 빌드하고 진행해보겠다.
만들어진 image를 실행한다.
여기서, file에서 엔트리 포인트로 다음과 같은 옵션을 설정하였다.
ENTRYPOINT ["nginx", "-g", "daemon off;"]
daemon off; 옵션 값으로 포그라운드로 실행하면서 -d 옵션을 넣어 컨테이너를 실행하고 있다.
어떤 과정과 상태를 가지는 걸까?
위의 docker file은 nginx에 대한 것으로 nginx가 포그라운드로 실행되도록 지정한다.
daemon off;는 nginx가 백그라운드로 가지 않고, 컨테이너가 계속 실행될 수 있도록 하는 설정이다.
따라서 -d 옵션을 사용하면, nginx가 포그라운드에서 실행되면서도 컨테이너가 백그라운드에서 실행된다.
즉, 컨테이너 내부에 nginx는 포그라운드로 실행되는데 컨테이너 자체는 백그라운드로 실행되는 것이다.
Find 명령어 사용
이어서, COPY 경로에 있는 html 파일 경로가 제대로 작성된 것인지
컨테이너에 접근하여 cd /usr/share/nginx/html 로 이동하여
파일 목록을 살펴보니 index.html 파일이 있다.
그런데, 정말 해당 폴더가 유일하게 하나인지 궁금하다.
혹시 다른 폴더 구조에 있고 해당 경로의 파일 경로로 지정하는 경우도 있기 때문이다.
이를 위해 find / -name index.html 명령어를 실행하였다.
의미는 /( 루트 경로 ) 아래 이름이 index.html인 모든 파일을 찾아보는 것이다.
유일하게 COPY에 적은 경로만이 있다. 그러면 이제 유일한 파일로 해당 경로가 맞다는 확신이 생겼다.
그리고 conf 파일 경로가 맞는지 알아보기 위해서 해당 경로로 이동하고 목록을 찾아보니, nginx.conf 파일이 있다.
cat 명령어를 통해서 해당 파일 내용을 살펴보니 설정과 관련한 내용들이 나온다.
그런데 설정 파일 내용들 중에서 < include 경로 > 가 적힌 내용이 있는데,
자세한 설정과 관련한 내용을 다루고 있는 듯하다.
따라서 해당 경로의 폴더를 확인하고 이동하여 목록을 살펴보니
default.conf가 존재한다.
해당 파일의 내용을 살펴보니, 본격적으로 설정과 관련한 다양한 옵션 및 설정들을 가지고 있다.
그럼 우리가 COPY할 경로는 현재 이 파일의 경로로 사용하는 것이 맞다.
NGINX 설정 파일 경로 변경과 설정 파일 변경
FROM nginx
# COPY webapp /usr/share/nginx/html
# COPY conf/nginx.conf /etc/nginx/conf.d/default.conf
ENTRYPOINT ["nginx", "-g", "daemon off;"]
따라서 설정과 관련하여 COPY 경로를 위처럼 변경한다.
그리고 default.conf에 있는 스크립트를 복사하여 로컬의 conf/nginx.conf로 만들어준다.
이제 해당 로컬 폴더에서 만든 nginx 설정에 따라 dockerfile을 build하면
컨테이너의 nginx 설정에 그대로 반영되는 것이다.
이를 위해서, 기존 설정을 변경하여 컨테이너를 실행하여 확인해보겠다.
먼저 기존에 아무런 변경이 없는 nginx 설정이다.
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;
#}
}
그리고 현재 실습에 있어 필요한 설정과 관련한 내용만 남긴 스크립트이다.
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
#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;
}
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
}
에러페이지 설정과 관련하여
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
해당 코드는 500번대 에러에 대해 /50x.html 페이지로 이동하는 설정이기에
도커 파일에서 html COPY의 로컬 경로인 webapp에 50x.html 파일을 만들고 아래와 같이 html 코드를 작성하였다.
마찬가지로 root 경로에 보일 index.html 파일을 만들고 아래와 같이 코드를 작성하였다.
이제 docker file의 COPY 주석을 풀어주고
build하여 이미지를 컨테이너로 실행한 뒤, 해당 루트 경로에 접근하면, 로컬에서 작성한 index.html의 내용이 브라우저에 출력되면 잘 구성된 것이다.
이제, localhost:8080에 접근하면 로컬에서 만든 html에 따라 브라우저에서 잘 출력된다.
설정 파일과 dockerfile의 구성이 COPY 되어 제대로 작동하는 것이다.
'Docker > Docker 입문' 카테고리의 다른 글
도커 입문 17 - 도커file ( mysql 환경 변수와 데이터 저장 ) (0) | 2024.12.27 |
---|---|
도커 입문 16 - 도커file ( nginx를 로비 서버로 활용 ) (0) | 2024.12.26 |
도커 입문 14 - 도커file (Nginx 분석, inspect 명령어) (0) | 2024.12.25 |
도커 입문 13 - 도커file (RUN, COPY) (0) | 2024.12.22 |
도커 입문 12 - Dockerfile(EntryPoint와 Workdir) (0) | 2024.12.13 |
댓글