ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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. 종료하려는 컨테이너 내부에서 종료
    2. 터미널에서 종료 명령

    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 ~ %

     

    목록 조회시 우분투 컨테이너가 없어진것을 확인할 수 있습니다

     

    마치며

    이번글에서는 도커 이미지와 컨테이너의 간단한 생성, 실행, 종료, 삭제에 대해 간단하게 알아보고 실습하였구요 

    다음글에서는 도커에 다양한 명령어와 네크워크 설정에 대해서 작성해보도록 하겠습니다~

     

    감-사 :)

Designed by Tistory.