이 글에서는 Ubuntu(우분투) 20.04에서 Docker를 사용하는 방법에 대해서 설명합니다.
Table Of Contents
Docker 설치하기
Ubuntu 20.04에는 기본적으로 Docker가 설치되어있지 않습니다.
그러므로 다음의 명령을 수행하여 docker를 설치합니다.
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
Docker를 사용할 때는 두 가지 방법이 있습니다. Docker 이미지를 만들거나 Docker이미지를 실행하는 것입니다.
Docker 이미지를 만드는 법은 다음 링크를 참고하세요.
https://2story.org/entry/nginx용-docker-이미지-무식하게-만들기
이 글에서는 Docker hub에 있는 이미지로부터 가져와서 실행하는 것을 목표로 하겠습니다.
Docker 이미지 Pull 및 Run
Docker를 사용하여 Ubuntu에서 컨테이너를 실행하고 bash 쉘에 접속하는 방법은 다음과 같습니다
테스트 용으로 제가 올려놓은 이미지는 아래와 같습니다.
이 이미지를 이용해서 pull 하고 실행(run) 해보겠습니다.
1. Docker에 로그인 하기
sudo docker login을 통해 로그인을 합니다. sudo를 하지 않으면 /var/run/docker.sock 파일에 대한 권한 문제로 로그인이 되지 않습니다.
sudo docker login
Log in with your Docker ID or email address 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.
You can log in with your password or a Personal Access Token (PAT). Using a limited-scope PAT grants better security and is required for organizations using SSO. Learn more at https://docs.docker.com/go/access-tokens/
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
ubuntu@instance-20230810-1409:~/Container$ sudo docker pull lswhh/myflask:v1.0
v1.0: Pulling from lswhh/myflask
7007490126ef: Extracting [=================================================> ] 28.31MB/28.58MB
1d60bfe7d569: Download complete
89b66eb40820: Download complete
4f4fb700ef54: Download complete
f5403cdde9e1: Download complete
4678f683a89b: Downloading [=> ] 292.6MB/8.734GB
7b5d670363e1: Downloading [====> ] 288.1MB/2.964GB
b2a839aaa970: Download complete
b01fda8b2cf3: Download complete
docker run -it -p 8000:8000 -p 5000:5000 -p 443:443 -p 80:80 <이미지 이름> /bin/bash
ubuntu@instance-20230810-1409:~/Container$ sudo docker run -it -p 8000:8000 -p 5000:5000 -p 443:443 -p 80:80 lswhh/myflask:v1.0 /bin/bash
root@dad83603003b:/home/eddy_lee#
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/*
4. 여기서 이제 기존 docker에서 부족한 내용들이 설치가 된 docker 이미지를 신규 docker 이미지 tag로 만들어 보도록 하겠습니다.
Docker에서 변경 사항을 적용한 후에 새로운 이미지를 생성하려면, 먼저 변경 사항을 적용한 컨테이너를 종료해야 합니다. 그런 다음 docker commit 명령을 사용하여 컨테이너의 현재 상태를 새로운 이미지로 저장할 수 있습니다.
다음은 이 과정을 수행하는 방법입니다:
먼저, bash 세션을 종료하거나 exit 명령을 사용하여 Docker 컨테이너를 종료합니다.
그런 다음, docker ps -a 명령을 사용하여 종료된 컨테이너의 ID를 찾습니다.
마지막으로, docker commit 명령을 사용하여 종료된 컨테이너의 상태를 새로운 이미지로 저장합니다. 이때 <컨테이너ID>는 종료된 컨테이너의 ID이고, <새이미지명>은 생성할 새 이미지의 이름입니다.
docker commit <컨테이너ID> <새이미지명>
ubuntu@instance-20230810-1409:~/Container$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
054fc4edea55 lswhh/myflask:v1.0 "/bin/bash" 52 seconds ago Exited (0) 6 seconds ago musing_kowalevski
98e5d2e64180 lswhh/myflask:v1.0 "start.sh" 6 minutes ago Created 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp, 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 8090/tcp gracious_banzai
dad83603003b lswhh/myflask:v1.0 "/bin/bash" 38 minutes ago Exited (0) 10 minutes ago nice_austin
sudo docker commit 054fc4edea55 lswhh/myflask:v2.0
sha256:1d15a48572313e47e2d0e1160f8f7592a7b1a97d0b30da2798f0f277e0b21898
해당 내용은 필요한 것들을 모두 정리하고 패키지를 설치한 이미지 상태입니다.
마지막으로 다음과 같이 push 하면 정상적인 docker 이미지가 신규로 push 되었습니다.
ubuntu@instance-20230810-1409:~/Container$ sudo docker push lswhh/myflask:v2.0
The push refers to repository [docker.io/lswhh/myflask]
6f255d3380d8: Pushed
66d193c7ba96: Layer already exists
741bda5014e9: Layer already exists
d482fa8590cf: Layer already exists
745d802031cf: Layer already exists
e87389ffc423: Layer already exists
5f70bf18a086: Layer already exists
6293702ef56e: Layer already exists
b8c29c872d04: Layer already exists
954c82bdeb5f: Layer already exists
v2.0: digest: sha256:cbb7973d1c1a9ce3ed999635306a26707d202f71bdcb5f99a04fab58052f2f5e size: 2411
ubuntu@instance-20230810-1409:~/Container$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lswhh/myflask v2.0 1d15a4857231 2 minutes ago 16GB
lswhh/myflask v1.0 5311f75c2c6c 47 hours ago 16GB
docker hub에서 확인해 보면 다음과 같습니다.
이제 정상적인 이미지를 다시 실행시키면 다음과 같습니다.
이미지를 실행시킬 때 다음과 같이 -d 옵션으로 detach 모드에서 실행합니다. 마지막에 start.sh은 무한루프 도는 쉘 명령으로 서비스를 계속 유지해야하므로 추가하였습니다.
sudo docker run -d -p 8000:8000 -p 5000:5000 -p 443:443 -p 80:80 lswhh/myflask:v3.0 start.sh
이전에 Dockerfile에 이미지 만들때, CMD로 start.sh을 수행하도록 만들었는데 이 부분이 잘 안 되는데 원인은 아직 못 찾았습니다.
여튼 위와 같이 수행하면 백그라운드로 동작합니다.
그 후에 해당 컨테이너에 bash로 접속하려면 다음을 수행합니다.
먼저 docker ps로 컨테이너 ID를 알아오고 그 다음에 exec -it 명령으로 bash를 실행합니다.
ubuntu@instance-20230810-1409:~/Container$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48842b25d1e0 lswhh/myflask:v3.0 "start.sh" 4 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp, 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 8090/tcp exciting_kare
이렇게 하면 bash 쉘에서 필요한 명령을 수행할 수 있습니다. 저의 경우 nginx를 띄우고 exit하였습니다.
물론 nginx용 docker이미지는 docker 이미지를 실행할 때 nginx까지 자동으로 띄우도록 entrypoint를 설정 해야 하는데 저는 일단 위와 같이 진행해 보았습니다.
다음번에 좀 더 수정해서 자동화 해보도록 하겠습니다.
'리눅스&OS' 카테고리의 다른 글
tcp 네트워크 timer를 통해 리눅스 커널에서 소켓 끊는 현상 확인하기 (0) | 2024.01.05 |
---|---|
nginx용 docker 이미지 무식하게 만들기 (0) | 2023.12.05 |
리눅스 커널(linux kernel) 버전 정보 확인 uname | version | hostnamectl (0) | 2023.11.23 |
https 보안 인증서 let's encrypt에서 certbot으로 재발급 받기 (0) | 2023.11.22 |
구글 클라우드 서버(GCP)에 Docker 설치하고 web 서버 이미지 실행하기 (0) | 2023.11.22 |