본문 바로가기
리눅스&OS

Ubuntu(우분투 20.04)에서 Docker를 사용하기 (from Docker hub)

by developer's warehouse 2023. 12. 5.

이 글에서는 Ubuntu(우분투) 20.04에서 Docker를 사용하는 방법에 대해서 설명합니다.

Ubuntu(우분투 20.04)에서 Docker를 사용하기 썸네일

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 쉘에 접속하는 방법은 다음과 같습니다

테스트 용으로 제가 올려놓은 이미지는 아래와 같습니다.

내 계정의 docker hub 이미지 확인하기

 

이 이미지를 이용해서 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
2. Docker 이미지를 가져오기: Docker Hub에서 원하는 이미지를 찾아 docker pull 명령을 사용하여 이미지를 가져옵니다. 예를 들어, Ubuntu 이미지를 가져오려면 다음 명령을 사용합니다
sudo docker pull 이미지이름:태그
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
sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lswhh/myflask v1.0 5311f75c2c6c 47 hours ago 16GB
 
3. Docker 이미지를 실행하고, 호스트의 8000, 5000, 443, 80 포트를 컨테이너의 동일한 포트에 바인딩합니다. 그리고 /bin/bash를 실행하여 bash 셸에 진입합니다. <이미지 이름> 부분은 실행하려는 Docker 이미지의 이름으로 대체해야 합니다.
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#
해당 docker 이미지는 필요한 패키지를 설치하지 못했습니다. 그러므로, 필요한 패키지를 다음과 같이 설치해야 합니다.
 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
위에서 가장 마지막에 실행된 컨테이너 ID를 이용해서 생성합니다.

해당 내용은 필요한 것들을 모두 정리하고 패키지를 설치한 이미지 상태입니다.

 

마지막으로 다음과 같이 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에서 확인해 보면 다음과 같습니다.

docker hub에 push 된 이미지

 

 

이제 정상적인 이미지를 다시 실행시키면 다음과 같습니다.

이미지를 실행시킬 때 다음과 같이 -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

 
ubuntu@instance-20230810-1409:~/Container$ sudo docker exec -it 48842b25d1e0 bash
 

이렇게 하면 bash 쉘에서 필요한 명령을 수행할 수 있습니다. 저의 경우 nginx를 띄우고 exit하였습니다.

물론 nginx용 docker이미지는 docker 이미지를 실행할 때 nginx까지 자동으로 띄우도록 entrypoint를 설정 해야 하는데 저는 일단 위와 같이 진행해 보았습니다.

다음번에 좀 더 수정해서 자동화 해보도록 하겠습니다.

facebook twitter kakaoTalk kakaostory naver band shareLink