이 글에서는 nginx용 docker 이미지를 만드는데 가장 단순하게 만드는 법에 대해서 설명합니다.
Table Of Contents
docker entry point 쉘 만들기
docker 이미지 실행시 무한 루프를 돌려줄 shell을 먼저 만듭니다.
(venv) (base) eddy_lee@instance-1:~$ cat start.sh
#!/bin/bash
INTERVAL=10
while true;
do
ps x;
sleep $INTERVAL;
done
무한루프를 만들지 않으면 해당 shell이 끝나버리면 docker run이 끝나버리므로 무한루프를 돌립니다.
사실 nginx를 자동으로 띄우는 작업 등도 해야하는데 저는 그냥 무한루프 돌려놓고 들어가서 수행하려고 일단 이렇게 만들고 있습니다.
Dockerfile
docker 이미지를 만들려면 dockerfile을 만들어야 하는데, 이 dockerfile을 만들 때, 그냥 내 디렉토리를 통째로 복사하도록 아래와 같이 만들어 줍니다.
# Ubuntu 20.04를 기반으로 하는 Docker 이미지를 사용합니다.
FROM ubuntu:20.04
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
python3 \
python3-pip \
python3-venv \
python3-certbot-nginx \
nginx \
ca-certificates \
curl \
unzip \
apt-transport-https \
libgl1-mesa-glx \
&& rm -rf /var/lib/apt/lists/*
COPY flask/nginx.conf /etc/nginx/sites-available/default
EXPOSE 80 8000 8090 5000
RUN mkdir -p /home/eddy_lee
# 실행 스크립트 추가
COPY start.sh /usr/local/bin/
# 권한 설정
RUN chmod +x /usr/local/bin/start.sh
# 작업 디렉토리를 설정합니다.
WORKDIR /home/eddy_lee
# /home/eddy_lee 디렉토리의 모든 파일과 디렉토리를 /app에 복사합니다.
COPY /home/eddy_lee/* /home/eddy_lee
CMD ["start.sh"]
위의 Dockerfile이 있는 home 디렉토리에서 다음의 명령을 수행하여 v1.0 버전의 도커 이미지를 만듭니다.
sudo docker build -t myflask:v1.0 ./
이 명령은 수행 중에 파일을 찾을 수 없다는 에러가 나기도 하는데, 복사하다가 에러가 나는 경우가 몇 번 있었습니다.
이 때에는 심볼릭 링크가 깨진경우가 많으므로 해당 파일의 심볼릭 링크를 찾아서 연결하거나 어차피 깨진 심볼릭 링크는 정상적으로 쓰이지 않고 있던 것이므로 제거하거나 합니다.
그리고, 만약 처음부터 다시 시작하려면 다음의 명령어로 docker 캐시 이미지를 날려줍니다.
아래 명령은 docker의 모든 중지되거나 실행 안 하는 이미지를 제거하는 명령입니다.
sudo docker system prune -a --volumes
디스크 공간 부족으로 인해 파일 분리
도커 파일 이미지를 만들다 알게 된 것인데, 디스크 공간을 두 배를 사용합니다.
일단 조금씩 만들어야 할 것 같아서 분리하였습니다.
(venv) (base) eddy_lee@instance-1:~$ cat Dockerfile
# Ubuntu 20.04를 기반으로 하는 Docker 이미지를 사용합니다.
FROM ubuntu:20.04
RUN useradd -m -d /home/eddy_lee -s /bin/bash eddy_lee
COPY flask/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80 8000 8090 5000
# 작업 디렉토리를 설정합니다.
WORKDIR /home/eddy_lee
COPY flask /home/eddy_lee/flask
COPY imgFilterApp /home/eddy_lee/imgFilterApp
COPY venv /home/eddy_lee/venv
COPY start.sh /home/eddy_lee/start.sh
# 권한 설정
RUN chmod +x start.sh
CMD ["start.sh"]
(venv) (base) eddy_lee@instance-1:~$ sudo docker build -t myflask:v1.0 .
[+] Building 450.3s (14/14) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 533B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:20.04 2.3s
=> [1/9] FROM docker.io/library/ubuntu:20.04@sha256:33a5cc25d22c45900796a1aca487ad7a7cb09f09ea00b779e3b2026b4fc2faba 3.0s
=> => resolve docker.io/library/ubuntu:20.04@sha256:33a5cc25d22c45900796a1aca487ad7a7cb09f09ea00b779e3b2026b4fc2faba 0.0s
=> => sha256:33a5cc25d22c45900796a1aca487ad7a7cb09f09ea00b779e3b2026b4fc2faba 1.13kB / 1.13kB 0.0s
=> => sha256:3246518d9735254519e1b2ff35f95686e4a5011c90c85344c1f38df7bae9dd37 424B / 424B 0.0s
=> => sha256:6df89402372646d400cf092016c28066391a26f5d46c00b1153e75003465484d 2.30kB / 2.30kB 0.0s
=> => sha256:edaedc954fb53f42a7754a6e2d1b57f091bc9b11063bc445c2e325ea448f8f68 27.51MB / 27.51MB 0.6s
=> => extracting sha256:edaedc954fb53f42a7754a6e2d1b57f091bc9b11063bc445c2e325ea448f8f68 2.2s
=> [internal] load build context 183.3s
=> => transferring context: 15.98GB 182.6s
=> [2/9] RUN useradd -m -d /home/eddy_lee -s /bin/bash eddy_lee 3.2s
=> [3/9] COPY flask/nginx.conf /etc/nginx/nginx.conf 4.9s
=> [4/9] WORKDIR /home/eddy_lee 0.1s
=> [5/9] COPY flask /home/eddy_lee/flask 0.9s
=> [6/9] COPY imgFilterApp /home/eddy_lee/imgFilterApp 86.0s
=> [7/9] COPY venv /home/eddy_lee/venv 57.5s
=> [8/9] COPY start.sh /home/eddy_lee/start.sh 0.1s
=> [9/9] RUN chmod +x start.sh 0.4s
=> exporting to image 114.7s
=> => exporting layers 114.6s
=> => writing image sha256:5311f75c2c6c2cea8752b95d439d1c85d23420600cea9cb76b74462b0802333d 0.0s
=> => naming to docker.io/library/myflask:v1.0 0.0s
이제 docker login 후 push를 해야 합니다.
(venv) (base) eddy_lee@instance-1:~$ sudo docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: lswhh
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
(venv) (base) eddy_lee@instance-1:~$
이 docker 이미지를 docker hub에 올리려면 docker hub에 repository를 만든 다음에 해당 이름으로 push를 해야합니다.
다음과 같이 만들고 tag를 달아서 push 했습니다.
(venv) (base) eddy_lee@instance-1:~$ sudo docker tag myflask:v1.0 lswhh/myflask:v1.0
(venv) (base) eddy_lee@instance-1:~$ sudo docker push lswhh/myflask:v1.0
The push refers to repository [docker.io/lswhh/myflask]
66d193c7ba96: Pushed
741bda5014e9: Pushed
d482fa8590cf: Pushing [==========> ] 1.347GB/6.451GB
745d802031cf: Pushing [=========> ] 1.719GB/9.417GB
e87389ffc423: Pushed
5f70bf18a086: Pushed
6293702ef56e: Pushed
b8c29c872d04: Pushed
아래와 같이 docker hub에 올라갔습니다.
'리눅스&OS' 카테고리의 다른 글
리눅스의 man의 Section 설명 및 섹션별 검색 명령어 (0) | 2024.01.05 |
---|---|
tcp 네트워크 timer를 통해 리눅스 커널에서 소켓 끊는 현상 확인하기 (0) | 2024.01.05 |
Ubuntu(우분투 20.04)에서 Docker를 사용하기 (from Docker hub) (0) | 2023.12.05 |
리눅스 커널(linux kernel) 버전 정보 확인 uname | version | hostnamectl (0) | 2023.11.23 |
https 보안 인증서 let's encrypt에서 certbot으로 재발급 받기 (0) | 2023.11.22 |