Docker NGINX 이미지를 사용하여 나만의 이미지 만들기
이 포스트는 Docker NGINX 이미지를 사용하여 나만의 이미지로 만들어 구동해볼겁니다.
Docker 이미지를 만드는 이유는 기존에 있던 도커의 이미지들의 부족한 부분을 채워서 커스터 마이징이 가능하고 신규 서버를 구축하게 되었을 때 만들어 놓은 이미지를 사용해 시간 단축이 가능합니다
목차
1. Docker 이미지를 이용하여 NGINX OSS를 나만의 이미지로 만들어서 구동해보기
2. DockerFile를 이용하여 NGINX Plus를 나만의 이미지로 만들어서 구동해보기
1. Docker 이미지 를 이용하여 NGINX OSS를 나만의 이미지로 만들어서 구동해보기
Docker 를 이용하여 나만의 이미지로 만들기는 2가지 방법이 있습니다.
1번째 방법을 사용하여 NGINX OSS를 이미지로 만들어 주겠습니다.
일단 나만의 이미지를 만들기전에 1번째 방법에서는 Docker가 설치되어 있어야합니다. 그리고 NGINX
이미지가 설치 및 컨테이너가 구동되어있어야 합니다.

Docker 명령어를 이용하여 현재 실행되어있는 NGINX OSS에 접속하여 줍니다.
docker exec -it [컨테이너명] /bin/bash


root@[컨테이너 Id]로 접속하게 됩니다.
Docker hub에 있는 NGINX와 차별점을 두기 위해 NGINX index.html를 수정할 겁니다.
일단 Docker bash에는 vim이나 nano가 설치되어 있지 않기 때문에 따로 설치를 하거나 호스트로 빼서 수정을 해주어야 합니다. (이 포스트에서는 호스트로 파일을 복사해 수정하고 덮어쓰기를 하였습니다.)
명령어를 이용해 localhost:8080으로 접속 시 보이는 NGINX의 index.html을 찾아주었습니다.

exit 명령어를 통해 컨테이너 NGINX bash에서 나와주었습니다.
exit
이제 index.html의 위치를 찾았으니 현재 호스트 파일에 복사를 하여 수정해줍니다.
아까 find 명령어를 사용해 찾은 NGINX index 위치를 docker cp 명령어를 통해 복사하여줍니다.
docker cp [컨테이너명]:/usr/share/nginx/html/index.html index.html

vi index.html
vim을 통하여 수정을 하였습니다.

기본 NGINX index.html과 다르게 작성하여주었습니다.
수정한후 docker cp 명령어를 통해 다시 docker nginx bash로 옮겨주었습니다.
docker cp index.html [컨테이너 명]:/usr/share/nginx/html/index.html

이제 나만의 이미지를 만들어 볼겁니다.
1번 째 방법은 docker commit 명령어를 사용하여 이미지를 만들어 줍니다.
docker commit [수정했던 컨테이너명] [만들 이미지]

정한 이름으로 이미지가 만들어져 있는 것을 볼 수 있습니다.

이제 만든 이미지를 구동시켜 수정한 index.html가 적용이 되었는지 확인해 보겠습니다.
docker run -d --name [컨테이너명 지정] -p [접속할 때 사용할 포트]:[nginx 사용포트] [이미지명]

docker ps 명령어를 통해 컨테이너가 생성 및 실행이 잘 되었는지 확인해 주고 직접 접속하여 index.html이 수정이 잘 되었는지 확인하여줍니다.


원래 NGINX 기본 페이지와 다르게 index.html로 바꾼 이미지로 설치 되었는지 확인하여줍니다.
2. Dockerfile를 이용하여 NGINX Plus를 나만의 이미지로 만들어서 구동해보기
이미지 만들기 2번째 방법을 사용하여 NGINX Plus를 나만의 이미지로 구동해볼겁니다.
2번째 방법은 dockerfile을 생성하여 수정해주는 것입니다.
일단 NGINX Plus는 라이센스 정책 때문에 docker hub와 같은 공개 저장소에 업로드가 불가능하기 때문에
docker pull같은 명령어로 nginx plus를 설치하는 것이 불가능합니다.
이로 인해 NGINX Plus는 dockerfile을 만들어서 빌드를 해주게 되는데요. 저희는 여기서 dockerfile을 공식에서 가져와 수정하여 나만의 이미지로 만들겁니다. (NGINX Plus를 설치하기 위해서는 키파일이 필요합니다.)
NGINX Plus 공식 홈페이지에서 dockerfile을 가져왔습니다.
우분투를 사용하였기 때문에 dockerfile중 첫번째꺼 debian으로 지정된 파일을 가져왔습니다.
vi 명령어를 통해 dockerfile을 생성해준후 vim에 들어가줍니다.
vi Dockerfile
아래 dockerfile을 추가해 줍니다
ARG RELEASE=bookworm
FROM debian:${RELEASE}-slim
LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"
RUN --mount=type=secret,id=nginx-crt,dst=nginx-repo.crt \
--mount=type=secret,id=nginx-key,dst=nginx-repo.key \
set -x \
&& groupadd --system --gid 101 nginx \
&& useradd --system --gid nginx --no-create-home --home /nonexistent --comment "nginx user" --shell /bin/false --uid 101 nginx \
&& apt-get update \
&& apt-get install --no-install-recommends --no-install-suggests -y ca-certificates gnupg2 lsb-release \
&& \
NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62; \
NGINX_GPGKEY_PATH=/usr/share/keyrings/nginx-archive-keyring.gpg; \
export GNUPGHOME="$(mktemp -d)"; \
found=''; \
for server in \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu \
; do \
echo "Fetching GPG key $NGINX_GPGKEY from $server"; \
gpg --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$NGINX_GPGKEY" && found=yes && break; \
done; \
test -z "$found" && echo >&2 "error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1; \
gpg --export "$NGINX_GPGKEY" > "$NGINX_GPGKEY_PATH" ; \
rm -rf "$GNUPGHOME"; \
apt-get remove --purge --auto-remove -y gnupg2 && rm -rf /var/lib/apt/lists/* \
&& nginxPackages=" \
nginx-plus \
" \
&& echo "Acquire::https::pkgs.nginx.com::Verify-Peer \"true\";" > /etc/apt/apt.conf.d/90nginx \
&& echo "Acquire::https::pkgs.nginx.com::Verify-Host \"true\";" >> /etc/apt/apt.conf.d/90nginx \
&& echo "Acquire::https::pkgs.nginx.com::SslCert \"/etc/ssl/nginx/nginx-repo.crt\";" >> /etc/apt/apt.conf.d/90nginx \
&& echo "Acquire::https::pkgs.nginx.com::SslKey \"/etc/ssl/nginx/nginx-repo.key\";" >> /etc/apt/apt.conf.d/90nginx \
&& echo "deb [signed-by=$NGINX_GPGKEY_PATH] https://pkgs.nginx.com/plus/debian `lsb_release -cs` nginx-plus\n" > /etc/apt/sources.list.d/nginx-plus.list \
&& mkdir -p /etc/ssl/nginx \
&& cat nginx-repo.crt > /etc/ssl/nginx/nginx-repo.crt \
&& cat nginx-repo.key > /etc/ssl/nginx/nginx-repo.key \
&& apt-get update \
&& apt-get install --no-install-recommends --no-install-suggests -y $nginxPackages curl gettext-base \
&& apt-get remove --purge -y lsb-release \
&& apt-get remove --purge --auto-remove -y && rm -rf /var/lib/apt/lists/* /etc/apt/sources.list.d/nginx-plus.list \
&& rm -rf /etc/apt/apt.conf.d/90nginx /etc/ssl/nginx \
&& ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]
주석을 제거하여 사용해 주었습니다.
여기서 저희는 바뀐점을 확인하기 위해서 index.html을 바꾸어 줄건데요.
vim을 통해 index.html을 생성하고 간단한 html을 추가하여주었습니다.
vi index.html

dockerfile을 수정해 줍니다.
포트 위에 부분에 저희가 수정하여 바뀐점을 확인하기 위한 index.html을 복사하여줍니다.

dockerfile을 수정한 후 이미지를 dockerfile 대로 다운로드 해줍니다.
이포스트에서는 인증키를 /etc/ssl/nginx/ 안에 넣어주었습니다.
DOCKER_BUILDKIT=1 docker build --no-cache -t [만들 이미지명] --secret id=nginx-crt,src=[nginx plus 인증키 위치] --secret id=nginx-key,src=[nginx plus 인증키 위치] .


끝났다면 잘 설치 되었는지 docker images 명령어를 통해 확인해줍니다.
docker images

제가 만든 이미지 testnginxplus가 잘 설치 되었습니다.
아까 변경한 index.html을 확인하기 위해 컨테이너를 생성 및 실행해줍니다.
docker run -d --name [컨테이너명 지정] -p [접속할 때 사용할 포트]:[nginx 사용포트] [이미지명]

이제 Dockerfile 마지막 줄에 복사한 index.html이 잘 적용 되었는지 확인해보겠습니다.

잘 적용된 것을 볼 수 있습니다.
아래 뉴스레터를 구독하고 NGINX의 최신 정보들을 빠르게 전달받아보세요.
댓글을 달려면 로그인해야 합니다.