-
[Docker] 도커 기초 개념 - 도커의 작동방식과 도커이미지, 컨테이너 실행 실습Study/Docker&Kubernetes 2025. 1. 26. 14:48
지난 글에서 도커를 설치하고 도커이미지 실행까지 해보았습니다!
본격적으로 도커와 컨테이너에 대해 알아보겠습니다!
1. 도커의 작동 방식
도커 구조 도커의 전체구조는 도커클라이언트, 도커 호스트, 도커 레지스트리로 구성되어있습니다.
- 도커 클라이언트 : 도커에 명령을 내린다
- 도커 호스트 : 도커를 설치한 서버
- 도커 레지스트리 : 도커이미지를 저장하거나 배포하는 시스템
- 공개(public) 레지스트리 : docker hub가 대표적
- 개인(private) 레지스트리
도커 상세 구조 도커 클라이언트에서 명령을 입력하면 도커호스트 내의 도커 데몬이 명령을 처리합니다
만약 이미지를 다운받으라는 명령을 받았을 경우 도커 데몬이 도커 호스트에 이미지가 있는지 확인한 후에 없으면 레지스트리에서 다운을 받습니다.
2. 도커 이미지
컨테이너를 생성하는 데 필요한 모든 파일, 라이브러리, 종속성 및 설정을 포함한 읽기 전용 템플릿입니다.
도커이미지를 통해 동일한 환경을 가진 여러개의 컨테이너를 생성할 수 있습니다
* 도커 허브(https://hub.docker.com/)에서 도커 이미지를 다운로드 및 업로드 할 수 있습니다
3. 도커 컨테이너
도커 이미지를 실행 할 수 있는 인스턴스를 의미하며 도커 엔진과 호스트 운영 체제를 공유합니다.
각 컨테이너는 독립적인 파일시스템을 가지고있으며 격리된 환경에서 실행이 되며 도커엔진 하위에서 독립적으로 실행됩니다.
도커 엔진은 도커 컨테이너의 생성, 실행, 관리 등을 담당합니다.
다음은 실제로 도커 명령어를 실행해보겠습니다.
4. 도커 이미지 다운로드
docker image pull {이미지이름:태그이름}
해당 이미지가 로컬에 있는지 확인하고 이미지가 없다면 도커 레지스트리에서 이미지를 다운로드 합니다
태그이름을 지정하지않은 경우엔 디폴트로 "latest" 태그가 적용됩니다
실습을 위해 우분투 이미지를 다운로드 해보겠습니다
우분투 이미지 다운로드
해당 이미지는 레이어가 1개인 경우입니다
kimsokuri@gimsokuliui-MacBookAir DockerProject % docker image pull ubuntu Using default tag: latest latest: Pulling from library/ubuntu 8bb55f067777: Download complete Digest: sha256:80dd3c3b9c6cecb9f1667e9290b3bc61b78c2678c02cbdae5f0fea92cc6734ab Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest
- 8bb55f067777: Download complete : 이미지 레이어 다운로드가 완료 되었다는 메세지입니다. 이 메시지는 이미지 레이어 개수만큼 나타나는데, ubuntu 이미지의 레이어는 1개로 구성되어있음을 알 수 있습니다.
- Digest: sha256:80dd3c3b9c6cecb9f1667e9290b3bc61b78c2678c02cbdae5f0fea92cc6734ab다운로드한 모든 레이어와 메타정보를 포함하는 이미지의 해시값을 의미합니다
Digest 값을 이용해서 이미지를 다운로드 할수있습니다.
docker image pull [이미지 이름@Digest]
이미지 명 : ubuntu
Digest 값 : sha256:80dd3c3b9c6cecb9f1667e9290b3bc61b78c2678c02cbdae5f0fea92cc6734ab
위 두개의 값을 이용해 이미지를 다운받아보겠습니다.
kimsokuri@gimsokuliui-MacBookAir DockerProject % docker image pull ubuntu@sha256:80dd3c3b9c6cecb9f1667e9290b3bc61b78c2678c02cbdae5f0fea92cc6734ab docker.io/library/ubuntu@sha256:80dd3c3b9c6cecb9f1667e9290b3bc61b78c2678c02cbdae5f0fea92cc6734ab: Pulling from library/ubuntu Digest: sha256:80dd3c3b9c6cecb9f1667e9290b3bc61b78c2678c02cbdae5f0fea92cc6734ab Status: Image is up to date for ubuntu@sha256:80dd3c3b9c6cecb9f1667e9290b3bc61b78c2678c02cbdae5f0fea92cc6734ab docker.io/library/ubuntu@sha256:80dd3c3b9c6cecb9f1667e9290b3bc61b78c2678c02cbdae5f0fea92cc6734ab
두번째로 레이어가 여러개인 이미지를 다운받아보겠습니다
파이썬 이미지 다운로드
kimsokuri@gimsokuliui-MacBookAir DockerProject % docker image pull python:3.11.6 3.11.6: Pulling from library/python 3bf98da35d8a: Download complete 031bfcddba4a: Download complete 95089c600b36: Download complete 7a2f0d5b0b05: Download complete df2021ddb7d6: Download complete b0f1034fa6a0: Download complete 8d647f1dd7e7: Download complete 5cdd9a70365f: Download complete Digest: sha256:2a725c9721f737a2944244c98c714d24f8bcfaddd9f5c15083cbaa024f7fce54 Status: Downloaded newer image for python:3.11.6 docker.io/library/python:3.11.6
- 3bf98da35d8a: Download complete .... : 우분투 이미지와는 다르게 다운로드가 여러개 된것을 볼 수 있습니다. 파이썬 이미지는 레이어가 여러개임을 알 수있습니다. 3bf98da35d8a 값은 레이어의 해시값입니다.
- Digest: sha256:2a725c9721f737a2944244c98c714d24f8bcfaddd9f5c15083cbaa024f7fce54 : 위 레이어를 모두 포함하는 이미지 Digest 입니다.
파이썬의 이미지는 하나의 이미지(2a725c9)안에 여러개의 레이어(3bf98da35d8a, 031bfcddba4a....)이 구성되어있는 형태입니다
5. 도커 이미지 목록 확인
docker image ls
도커 호스트에 다운로드한 도커 이미지 목록을 확인해보겠습니다
kimsokuri@gimsokuliui-MacBookAir DockerProject % docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d715f14f9eca 38 hours ago 17kB ubuntu latest 80dd3c3b9c6c 2 months ago 139MB python 3.11.6 2a725c9721f7 15 months ago 1.46GB
그동안 설치한 이미지 목록을 확인할 수 있습니다.
여기서 보이는 IMAGE ID는 로컬에서 할당받은 값이고 도커레지스트리에 존재하는 값이랑 다릅니다. 다운로드할때 새로 할당받습니다
6. 도커 컨테이너 생성 및 실행
- 생성 및 실행 : run
docker container run [이미지 이름]
run 으로 명령을 실행하게 되면 컨테이너 생성과 실행을 동시에 진행합니다.
kimsokuri@gimsokuliui-MacBookAir DockerProject % docker container run python:3.11.6 kimsokuri@gimsokuliui-MacBookAir DockerProject %
컨테이너의 생성과 실행을 한번에 할 수도 있지만, 따로따로 할수있는데요. 다음 명령어를 통해 실행이 가능합니다.
- 생성 : create
docker container create [이미지 이름]
kimsokuri@gimsokuliui-MacBookAir ~ % docker container create ubuntu 1665e276c10537076df925d3486296b1f677101719ed48877340c2d2f078a4f1
컨테이너를 생성만 하고 컨테이너 목록을 다시 확인하면 아래와 같이 STATUS가 Created 인 것을 확인할 수 있습니다!
kimsokuri@gimsokuliui-MacBookAir ~ % docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1665e276c105 ubuntu "/bin/bash" 8 seconds ago Created gallant_murdock kimsokuri@gimsokuliui-MacBookAir ~ %
- 실행 : start
생성한 컨테이너를 실행해보도록 하겠습니다
여기서 주의할 점은 이미지명이 아닌 컨테이너 ID라는것입니다.
docker container start [컨테이너 ID]
목록 조회를 통해 생성한 컨테이너의 ID를 확인 후 실행하겠습니다.
kimsokuri@gimsokuliui-MacBookAir ~ % docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1665e276c105 ubuntu "/bin/bash" 4 minutes ago Created gallant_murdock kimsokuri@gimsokuliui-MacBookAir ~ % docker container start 1665e276c105 1665e276c105
run, create, start 등 원하는 방식으로 컨테이너를 실행하면 됩니다.
7. 도커 컨테이너 목록 확인
docker container ls
현재 컨테이너 목록을 확인할 수 있습니다.
kimsokuri@gimsokuliui-MacBookAir DockerProject % docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
위에서 파이썬 컨테이너를 실행했는데 뜨지 않습니다.
뜨지않은 이유는 컨테이너가 실행된 후 실행할 명령어가 없어 즉시 종료 되었기 때문입니다.
이 문제를 해결하려면, 상호작용(interactive) 모드로 컨테이너를 실행시키거나 특정 명령어를 주어야합니다.
실행 여부와 상관없이 모든 상태의 컨테이너 목록을 보고싶다면 -a만 추가 시켜주면 됩니다.
docker container ls -a
kimsokuri@gimsokuliui-MacBookAir DockerProject % docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca9e96b1ced9 python:3.11.6 "python3" 4 minutes ago Exited (0) 4 minutes ago loving_jepsen 8a8107841b5a hello-world "/hello" 3 hours ago Exited (0) 3 hours ago cranky_haibt
- STATUS : Exited 는 컨테이너가 종료되었다는 뜻이고 숫자 0은 정상적으로 종료되었다는것을 의미합니다.
8. 컨테이너 내부 접속 (상호작용 모드로 실행)
docker container run -it ubuntu
상호 작용 모드로 실행하기 위해서는 -it 옵션을 추가합니다.
해당 옵션을 통해 컨테이너 내부에 들어갈수있습니다.
우분투 컨테이너를 상호작용모드로 실행해보겠습니다.
kimsokuri@gimsokuliui-MacBookAir ~ % docker container run -it ubuntu root@fff48ec44aeb:/# ls bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
컨테이너를 실행한 후 사용자명이 root로 변경되었습니다.
우분투 컨테이너를 계속 실행하면서
터미널을 하나 더 실행해서 우분투 컨테이너가 실행되고있는지 확인해보겠습니다.
kimsokuri@gimsokuliui-MacBookAir ~ % docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fff48ec44aeb ubuntu "/bin/bash" 6 minutes ago Up 6 minutes sharp_noyce
여기서 STATUS 영역을 보면 우분투 컨테이너의 상태가 UP인것을 확인할 수 있습니다. UP은 실행중이라는것을 의미합니다.
9. 컨테이너 종료
컨테이너 종료 방법은 크게 두가지 방법이 있습니다.
- 종료하려는 컨테이너 내부에서 종료
- 터미널에서 종료 명령
1) 종료하려는 컨테이너 내부에서 종료
컨테이너 쉘에서 아래 명령어를 입력하면 종료됩니다
exit
실행하게 되면 다시 컨테이너가 종료되면서 원래 사용자로 돌아오게됩니다.
root@fff48ec44aeb:/# exit exit kimsokuri@gimsokuliui-MacBookAir ~ %
2) 터미널에서 종료 명령
다른 터미널을 실행해서 아래 명령어를 입력합니다.
docker container stop [컨테이너 ID]
목록 조회를 통해 확인한 컨테이너 ID를 이용해 컨테이너를 종료합니다.
kimsokuri@gimsokuliui-MacBookAir ~ % docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ade42e01f74a ubuntu "/bin/bash" 4 seconds ago Up 4 seconds wizardly_sinoussi b824fe7c6eca python:3.11.6 "python3" 18 minutes ago Up 18 minutes dreamy_kare kimsokuri@gimsokuliui-MacBookAir ~ % docker container stop ade42e01f74a ade42e01f74a
해당 명령어를 호출하고 종료까지의 약간의 시간(약 10초)이 소요됩니다.
종료가 되면 컨테이너 ID가 출력됩니다.
추가적으로 종료하는 비슷한 명령어가 있습니다.
docker container kill [컨테이너 ID]
해당 명령어는 컨테이너를 즉시 종료하는 명령어이지만, 종료할때는 stop을 쓰는것이 권장됩니다.
10. 컨테이너 삭제
docker container rm [컨테이너 ID]
컨테이너 목록을 확인 한 뒤에 컨테이너 ID를 가져와 컨테이너를 삭제합니다.
우분투 컨테이너를 삭제해보겠습니다
kimsokuri@gimsokuliui-MacBookAir ~ % docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 731464bbe70c ubuntu "/bin/bash" 2 seconds ago Exited (0) 2 seconds ago charming_joliot kimsokuri@gimsokuliui-MacBookAir ~ % docker container rm 731464bbe70c 731464bbe70c kimsokuri@gimsokuliui-MacBookAir ~ % docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES kimsokuri@gimsokuliui-MacBookAir ~ %
목록 조회시 우분투 컨테이너가 없어진것을 확인할 수 있습니다
마치며
이번글에서는 도커 이미지와 컨테이너의 간단한 생성, 실행, 종료, 삭제에 대해 간단하게 알아보고 실습하였구요
다음글에서는 도커에 다양한 명령어와 네크워크 설정에 대해서 작성해보도록 하겠습니다~
감-사 :)
'Study > Docker&Kubernetes' 카테고리의 다른 글
[Docker] 맥 OS에 Docker Desktop 설치하기 (1) 2025.01.23 한 권으로 배우는 도커 & 쿠버네티스 - [PART 1] 2장 도커의 개념 (0) 2025.01.09 한 권으로 배우는 도커 & 쿠버네티스 - 1장 실습 환경 구축 하기 (0) 2025.01.06