우분투(ubuntu)에 도커(Docker) 설치 하고 사용하기

Table of Contents

    사전준비:

    Ubuntu 22.04 서버

    Docker Hub의 계정

    Step1 – 도커 설치

    공식 Ubuntu 리포지토리에서 제공되는 Docker 설치 패키지는 최신 버전이 아닐 수 있습니다. 최신 버전을 확보하기 위해 공식 Docker 리포지토리에서 Docker를 설치하겠습니다. 이를 위해 새 패키지 소스를 추가하고, 다운로드가 유효한지 확인하기 위해 Docker에서 GPG 키를 추가한 다음 패키지를 설치합니다.

    1.먼저 기존 패키지 목록을 업데이트

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo apt update

    2. apt가 HTTPS를 통해 패키지를 사용할 수 있도록 하는 몇 가지 필수 패키지를 설치:

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo apt install apt-transport-https ca-certificates curl software-properties-common

    3. 공식 Docker 리포지토리에 대한 GPG 키를 시스템에 추가:

    (base) kevin_kidong_lim@streamlit-mpi:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    (base) kevin_kidong_lim@streamlit-mpi:~$

    4. APT 소스에 Docker 리포지토리를 추가:

    (base) kevin_kidong_lim@streamlit-mpi:~$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

    5. 추가 패키지가 인식되도록 기존 패키지 목록을 다시 업데이트:

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo apt update

    6. 기본 Ubuntu 리포지토리가 아닌 Docker 리포지토리에서 설치하려고 하는지 확인:

    (base) kevin_kidong_lim@streamlit-mpi:~$ apt-cache policy docker-ce
    docker-ce:
    Installed: 5:26.1.3-1~ubuntu.20.04~focal
    Candidate: 5:26.1.4-1~ubuntu.20.04~focal
    Version table:
    5:26.1.4-1~ubuntu.20.04~focal 500
    500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
    *** 5:26.1.3-1~ubuntu.20.04~focal 500
    500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
    100 /var/lib/dpkg/status
    5:26.1.2-1~ubuntu.20.04~focal 500

    7. 도커 설치

    (base) kevin_kidong_lim@streamlit-mpi:~$ pt install docker-ce

    8. 도커 설치 확인

    Docker가 설치되고, 데몬이 시작되었으며, 부팅 시 프로세스가 시작되도록 설정되어 있어야 합니다. 실행 중인지 확인합니다:

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo systemctl status docker
    ● docker.service - Docker Application Container Engine
    Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
    Active: active (running) since Thu 2024-05-23 16:05:39 UTC; 2 weeks 6 days ago
    TriggeredBy: ● docker.socket
    Docs: https://docs.docker.com
    Main PID: 6530 (dockerd)
    Tasks: 73
    Memory: 114.9M
    CGroup: /system.slice/docker.service
    ├─ 6530 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    ├─39190 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 443 -container-ip 192.168.0.2 -container-port>


    Step2 – Sudo 없이 Docker 명령 실행하기(선택 사항)

    기본적으로 docker 명령은 루트 사용자 또는 Docker 설치 과정에서 자동으로 생성되는 docker 그룹에 속한 사용자만 실행할 수 있습니다. sudo를 접두사로 붙이지 않거나 docker 그룹에 속하지 않은 상태에서 docker 명령을 실행하려고 하면 다음과 같은 출력이 표시됩니다:

    (base) kevin_kidong_lim@streamlit-mpi:~$ docker ps -a
    permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.45/containers/json?all=1": dial unix /var/run/docker.sock: connect: permission denied

    docker 명령을 실행할 때마다 sudo를 입력하지 않으려면 사용자 아이디를 docker 그룹에 추가하세요:

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo groupadd docker
    groupadd: group 'docker' already exists
    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo usermod -aG docker ${USER}
    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo service docker restart

    현재 사용자는 로그아웃 및 재로그인을 하면 적용됩니다.

    Step3 – 도커 명령어 사용하기

    도커를 사용하는 방법은 옵션과 명령어 체인을 전달한 다음 인수를 전달하는 방식으로 이루어집니다. 구문은 다음과 같은 형식을 취합니다:

    base) kevin_kidong_lim@streamlit-mpi:~$ docker [option] [command] [arguments]

    사용 가능한 모든 하위 명령을 보려면 다음과 같이 입력합니다:

    (base) kevin_kidong_lim@streamlit-mpi:~$ docker

    Usage: docker [OPTIONS] COMMAND

    A self-sufficient runtime for containers

    (base) kevin_kidong_lim@streamlit-mpi:~$ docker
    
    Usage:  docker [OPTIONS] COMMAND
    
    A self-sufficient runtime for containers
    
    Common Commands:
      run         Create and run a new container from an image
      exec        Execute a command in a running container
      ps          List containers
      build       Build an image from a Dockerfile
      pull        Download an image from a registry
      push        Upload an image to a registry
      images      List images
      login       Log in to a registry
      logout      Log out from a registry
      search      Search Docker Hub for images
      version     Show the Docker version information
      info        Display system-wide information
    
    Management Commands:
      builder     Manage builds
      buildx*     Docker Buildx
      checkpoint  Manage checkpoints
      compose*    Docker Compose
      container   Manage containers
      context     Manage contexts
      image       Manage images
      manifest    Manage Docker image manifests and manifest lists
      network     Manage networks
      plugin      Manage plugins
      system      Manage Docker
      trust       Manage trust on Docker images
      volume      Manage volumes
    Swarm Commands:
      config      Manage Swarm configs
      node        Manage Swarm nodes
      secret      Manage Swarm secrets
      service     Manage Swarm services
      stack       Manage Swarm stacks
      swarm       Manage Swarm
    Commands:
      attach      Attach local standard input, output, and error streams to a running container
      commit      Create a new image from a container's changes
      cp          Copy files/folders between a container and the local filesystem
      create      Create a new container
      diff        Inspect changes to files or directories on a container's filesystem
      events      Get real time events from the server
      export      Export a container's filesystem as a tar archive
      history     Show the history of an image
      import      Import the contents from a tarball to create a filesystem image
      inspect     Return low-level information on Docker objects
      kill        Kill one or more running containers
      load        Load an image from a tar archive or STDIN
      logs        Fetch the logs of a container
      pause       Pause all processes within one or more containers
      port        List port mappings or a specific mapping for the container
      rename      Rename a container
      restart     Restart one or more containers
      rm          Remove one or more containers
      rmi         Remove one or more images
      save        Save one or more images to a tar archive (streamed to STDOUT by default)
      start       Start one or more stopped containers
      stats       Display a live stream of container(s) resource usage statistics
      stop        Stop one or more running containers
      tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
      top         Display the running processes of a container
      unpause     Unpause all processes within one or more containers
      update      Update configuration of one or more containers
      wait        Block until one or more containers stop, then print their exit codes
    

    특정 명령에 사용할 수 있는 옵션을 보려면 다음과 같이 입력합니다:

    (base) kevin_kidong_lim@streamlit-mpi:~$ docker rm --help
    
    Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]
    
    Remove one or more containers
    
    Aliases:
      docker container rm, docker container remove, docker rm
    
    Options:
      -f, --force     Force the removal of a running container (uses SIGKILL)
      -l, --link      Remove the specified link
      -v, --volumes   Remove anonymous volumes associated with the container

    Docker에 대한 시스템 전체 정보를 보려면 다음을 사용하세요:

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker info
    Client: Docker Engine - Community
    Version: 26.1.3
    Context: default
    Debug Mode: false
    Plugins:
    buildx: Docker Buildx (Docker Inc.)
    Version: v0.14.0
    Path: /usr/libexec/docker/cli-plugins/docker-buildx
    compose: Docker Compose (Docker Inc.)
    Version: v2.27.0
    Path: /usr/libexec/docker/cli-plugins/docker-compose

    Step4 – Docker 이미지로 작업하기

    Docker 컨테이너는 Docker 이미지로 빌드됩니다. 기본적으로 Docker는 Docker Hub에서 이러한 이미지를 가져옵니다. 누구나 Docker Hub에서 Docker 이미지를 호스팅할 수 있으므로 필요한 대부분의 애플리케이션 및 Linux 배포판은 이곳에서 이미지를 호스팅합니다.
    Docker Hub에서 이미지에 액세스하고 다운로드할 수 있는지 확인하려면 다음과 같이 입력하세요:

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    c1ec31eb5944: Pull complete
    Digest: sha256:d1b0b5888fbb59111dbf2b3ed698489c41046cb9d6d61743e37ef8d9f3dda06f
    Status: Downloaded newer image for hello-world:latest

    Docker는 처음에 로컬에서 hello-world 이미지를 찾을 수 없었기 때문에 기본 리포지토리인 Docker Hub에서 이미지를 다운로드했습니다. 이미지가 다운로드되면 Docker는 이미지에서 컨테이너를 생성하고 컨테이너 내의 애플리케이션이 실행되어 메시지를 표시했습니다.

    검색 하위 명령어와 함께 docker 명령을 사용하여 Docker Hub에서 사용 가능한 이미지를 검색할 수 있습니다. 예를 들어 Ubuntu 이미지를 검색하려면 다음과 같이 입력합니다:

    base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker search ubuntu
    NAME DESCRIPTION STARS OFFICIAL
    ubuntu Ubuntu is a Debian-based Linux operating sys… 17105 [OK]
    ubuntu-debootstrap DEPRECATED; use "ubuntu" instead 52 [OK]
    ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 115 [OK]
    websphere-liberty WebSphere Liberty multi-architecture images … 299 [OK]
    open-liberty Open Liberty multi-architecture images based… 65 [OK]
    neurodebian NeuroDebian provides neuroscience research s… 109 [OK]
    ubuntu/nginx Nginx, a high-performance reverse proxy & we… 113
    ubuntu/squid Squid is a caching proxy for the Web. Long-t… 91
    ubuntu/cortex Cortex provides storage for Prometheus. Long… 4
    ubuntu/prometheus Prometheus is a systems and service monitori… 61
    ubuntu/kafka Apache Kafka, a distributed event streaming … 49
    ubuntu/apache2 Apache, a secure & extensible open-source HT… 73
    ubuntu/bind9 BIND 9 is a very flexible, full-featured DNS… 89

    위 리스트는 docker에서 지원하는 이미지를 나타냅니다. 사용하려는 이미지를 확인했으면 pull 하위 명령을 사용하여 컴퓨터에 다운로드할 수 있습니다.

    다음 명령을 실행하여 공식 우분투 이미지를 컴퓨터에 다운로드합니다:

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker pull ubuntu
    Using default tag: latest
    latest: Pulling from library/ubuntu
    00d679a470c4: Already exists
    Digest: sha256:e3f92abc0967a6c19d0dfa2d55838833e947b9d74edbcb0113e48535ad4be12a
    Status: Downloaded newer image for ubuntu:latest
    docker.io/library/ubuntu:latest
    (base) kevin_kidong_lim@streamlit-mpi:~$

    이미지가 다운로드된 후에는 run 명령어로 다운로드한 이미지를 사용하여 컨테이너를 실행할 수 있습니다. hello-world 예제(docker run hello-world) 에서 보았듯이, run 명령어로 docker를 실행할 때 이미지가 다운로드되지 않은 경우, Docker 클라이언트는 먼저 이미지를 다운로드한 다음 이를 사용하여 컨테이너를 실행합니다.

    컴퓨터에 다운로드된 이미지를 확인하려면 다음과 같이 입력합니다:

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    mariadb latest d08fd2bbace4 43 hours ago 406MB
    wordpress php8.1-apache fe65cf6f4fd1 6 days ago 684MB
    certbot/certbot latest 5cb06f020f4e 7 days ago 117MB
    ubuntu latest 17c0145030df 13 days ago 76.2MB
    wordpress latest c4d738408447 5 weeks ago 685MB
    nginx latest e784f4560448 5 weeks ago 188MB
    hello-world latest d2c94e258dcb 13 months ago 13.3kB
    mysql 8.0.27 3218b38490ce 2 years ago 516MB
    (base) kevin_kidong_lim@streamlit-mpi:~$

    Step5 – Docker 컨테이너 실행하기

    이전 단계에서 실행한 헬로월드 컨테이너는(docker run hello-world) 테스트 메시지를 전송한 후 실행되고 종료되는 컨테이너의 예시입니다. 컨테이너는 이보다 훨씬 더 유용할 수 있으며 대화형일 수도 있습니다. 결국 컨테이너는 가상 머신과 비슷하지만 리소스 친화적이라는 점만 다릅니다.

    예를 들어 최신 우분투 이미지를 사용하여 컨테이너를 실행해 보겠습니다. i와 -t 스위치를 조합하면 컨테이너에 대한 대화형 셸 액세스가 가능합니다:

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker run -it ubuntu
    root@e42efae14e98:/#

    명령 프롬프트에서 컨테이너 ID를 확인합니다. 이 예에서는 e42efae14e98입니다. 나중에 컨테이너를 제거할 때 컨테이너를 식별하려면 이 컨테이너 ID가 필요합니다.

    이제 컨테이너 내에서 모든 명령을 실행할 수 있습니다. 예를 들어 컨테이너 내부의 패키지 데이터베이스를 업데이트해 보겠습니다. 컨테이너 내부에서 루트 사용자로 작업하기 때문에 명령 앞에 sudo를 붙일 필요가 없습니다:

    root@e42efae14e98:/# apt update
    Get:1 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
    Get:2 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
    Get:3 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
    Get:4 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]
    Get:5 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [174 kB]
    Get:6 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [76.5 kB]
    Get:7 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [49.6 kB]
    Get:8 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]
    Get:9 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]
    Get:10 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1808 kB]
    Get:11 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]
    Get:12 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [75.0 kB]
    Get:13 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Packages [3124 B]
    Get:14 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [197 kB]
    Get:15 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [76.5 kB]
    Get:16 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [7519 B]
    Fetched 22.9 MB in 2s (12.3 MB/s)
    Reading package lists… Done
    Building dependency tree… Done
    Reading state information… Done
    6 packages can be upgraded. Run 'apt list --upgradable' to see them.

    그런 다음 그 안에 애플리케이션을 설치합니다. Node.js를 설치해 보겠습니다:

    root@e42efae14e98:/# apt install nodejs
    Reading package lists… Done
    Building dependency tree… Done
    Reading state information… Done
    The following additional packages will be installed:
    ca-certificates libbrotli1 libcares2 libicu74 libnghttp2-14 libnode109 libuv1t64 node-acorn node-busboy
    node-cjs-module-lexer node-undici node-xtend nodejs-doc openssl
    Suggested packages:
    npm
    The following NEW packages will be installed:
    ca-certificates libbrotli1 libcares2 libicu74 libnghttp2-14 libnode109 libuv1t64 node-acorn node-busboy
    node-cjs-module-lexer node-undici node-xtend nodejs nodejs-doc openssl
    0 upgraded, 15 newly installed, 0 to remove and 6 not upgraded.
    Need to get 28.6 MB of archives.
    After this operation, 111 MB of additional disk space will be used.
    Do you want to continue? [Y/n]

    이렇게 하면 공식 Ubuntu 리포지토리에서 컨테이너에 Node.js가 설치됩니다. 설치가 완료되면 Node.js가 설치되었는지 확인합니다:

    root@e42efae14e98:/# node -v
    v18.19.1
    root@e42efae14e98:/#

    컨테이너 내에서 변경한 내용은 해당 컨테이너에만 적용됩니다.

    컨테이너를 종료하려면 프롬프트에 exit를 입력합니다.

    다음으로 시스템에서 컨테이너를 관리하는 방법을 살펴보겠습니다.

    root@e42efae14e98:/# exit
    exit
    (base) kevin_kidong_lim@streamlit-mpi:~$

    Step6 – Docker 컨테이너 관리하기

    Docker를 사용하다 보면 컴퓨터에 활성(실행 중) 및 비활성 컨테이너가 많이 있을 것입니다. 활성 컨테이너를 보려면

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    aeffe81bceb0 mariadb "docker-entrypoint.s…" 4 hours ago Up 4 hours 3306/tcp mariadb_2
    bcd2fed4f6d1 wordpress:php8.1-apache "docker-entrypoint.s…" 4 hours ago Up 4 hours 80/tcp wordpress_2
    a7e7cf595d35 nginx:latest "/docker-entrypoint.…" 4 hours ago Restarting (1) 20 seconds ago nginx_2
    377127a93dde wordpress:latest "docker-entrypoint.s…" 8 days ago Up 8 days 0.0.0.0:8080->80/tcp, :::8080->80/tcp wordpress-wordpress-1
    ced0e9cec88d mysql:8.0.27 "docker-entrypoint.s…" 8 days ago Up 8 days 3306/tcp, 33060/tcp wordpress-db-1
    b501f3d4f415 nginx:latest "/docker-entrypoint.…" 2 weeks ago Up 2 weeks 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp nginx

    활성 및 비활성 컨테이너를 모두 보려면 -a 옵션을 사용하여 docker ps를 실행하세요:

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker ps -a

    생성한 최신 컨테이너를 보려면 -l 옵션을 사용하세요:

    base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker ps -l
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    e42efae14e98 ubuntu "/bin/bash" 9 minutes ago Exited (0) 3 minutes ago quizzical_mayer

    중지된 컨테이너를 시작하려면 컨테이너 ID 또는 컨테이너 이름 뒤에 docker 시작을 사용합니다. ID가 e42efae14e98 인 Ubuntu 기반 컨테이너를 시작 하고 프로세스를 확인해보겠습니다: (상태표시가 Up 으로 바뀜.)

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker start e42efae14e98
    e42efae14e98
    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker ps -l
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    e42efae14e98 ubuntu "/bin/bash" 12 minutes ago Up 8 seconds quizzical_mayer

    실행 중인 컨테이너를 중지하려면 docker stop을 사용하고 그 뒤에 컨테이너 ID 또는 이름을 입력합니다. 이번에는 Docker에서 컨테이너에 할당된 이름인 quizzical_mayer를 사용하겠습니다: ( 상태표시가 Exited 로 바뀜)

    base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker stop quizzical_mayer
    quizzical_mayer
    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker ps -l
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    e42efae14e98 ubuntu "/bin/bash" 14 minutes ago Exited (137) 3 seconds ago quizzical_may

    컨테이너가 더 이상 필요하지 않다고 판단되면 컨테이너 ID 또는 이름을 사용하여 docker rm 명령으로 컨테이너를 제거합니다. docker ps -a 명령을 사용하여 헬로월드 이미지와 연결된 컨테이너의 컨테이너 ID 또는 이름을 찾아서 제거합니다.

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker rm magical_kowalevski
    magical_kowalevski

    name 명령어를 사용하여 새 컨테이너를 시작하고 이름을 지정할 수 있습니다. 또한 –rm 명령어를 사용하여 컨테이너가 중지되면 스스로 제거되는 컨테이너를 만들 수도 있습니다. 이러한 옵션 및 기타 옵션에 대한 자세한 내용은 docker command 도움말 명령을 참조하세요.

    컨테이너를 이미지로 전환하여 새 컨테이너를 빌드하는 데 사용할 수 있습니다. 어떻게 작동하는지 살펴보겠습니다.

    Step7 – 컨테이너의 변경 사항을 Docker 이미지에 커밋하기

    Docker 이미지를 시작하면 가상 머신에서와 마찬가지로 파일을 만들고, 수정하고, 삭제할 수 있습니다. 변경한 내용은 해당 컨테이너에만 적용됩니다. 시작하고 중지할 수 있지만, docker rm 명령으로 컨테이너를 삭제하면 변경 사항이 영원히 사라집니다.

    이 섹션에서는 컨테이너의 상태를 새 Docker 이미지로 저장하는 방법을 설명합니다.

    위의 예제에서 Ubuntu 컨테이너 안에 Node.js를 설치한 후 이미지에서 실행되는 컨테이너를 만들었고 이 것은 Node.js를 추가하는데 사용한 이미지와 다릅니다. 하지만 나중에 새 이미지의 기초로 이 Node.js 컨테이너를 재사용하고 싶을 수도 있습니다.

    그런 다음 다음 명령을 사용하여 변경 사항을 새 Docker 이미지 인스턴스에 커밋합니다.

    m 명령어는 사용자와 다른 사람들이 어떤 변경 사항을 알 수 있도록 도와주는 커밋 메시지를 위한 것이고, -a는 작성자를 지정하는 데 사용됩니다. container_id는 앞서 튜토리얼의 앞부분에서 대화형 Docker 세션을 시작할 때 언급했던 것입니다. Docker Hub에서 추가 리포지토리를 만들지 않는 한, 리포지토리는 일반적으로 Docker Hub 사용자 이름입니다.

    예를 들어 컨테이너 ID가 e42efae14e98 인 사용자 kevin00의 경우 명령은 다음과 같습니다:

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker commit -m "added kevin Node.js" -a "kevin00" e42efae14e98 kevin00/ubuntu-nodejs
    sha256:46520c9002b2a52e1cd634dddc73989cfd1626ddcf485084b482aa2c6fdbf322

    이미지를 커밋하면 새 이미지가 컴퓨터에 로컬로 저장됩니다. 이 튜토리얼의 뒷부분에서는 다른 사람들이 액세스할 수 있도록 이미지를 Docker Hub와 같은 Docker 레지스트리에 푸시하는 방법을 배우게 됩니다.

    Docker 이미지를 다시 나열하면 새 이미지와 그 이미지가 파생된 이전 이미지가 표시됩니다:

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    kevin00/ubuntu-nodejs latest 46520c9002b2 38 seconds ago 208MB

    이 예제에서 ubuntu-nodejs는 Docker Hub의 기존 ubuntu 이미지에서 파생된 새 이미지입니다. 크기 차이는 변경 사항을 반영합니다. 이 예제에서는 NodeJS가 설치되었다는 점이 변경되었습니다. 따라서 다음에 NodeJS가 사전 설치된 우분투를 사용하여 컨테이너를 실행해야 할 때는 새 이미지를 사용하면 됩니다.

    이제 다른 사람들이 컨테이너를 만들 수 있도록 새 이미지를 다른 사람들과 공유해 보겠습니다.

    Step8 – 도커 이미지를 도커 리포지토리로 푸시하기

    기존 이미지에서 새 이미지를 만든 다음에는 Docker Hub의 전 세계 또는 액세스 권한이 있는 다른 Docker 레지스트리와 공유하는 것입니다. 이미지를 Docker Hub 또는 다른 Docker 레지스트리에 푸시하려면 해당 레지스트리에 계정이 있어야 합니다.

    이미지를 푸시하려면 먼저 Docker Hub에 로그인합니다. 만약 없으면 https://hub.docker.com/ 에서 계정을 만들어주세요.

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker login -u kevin00
    Password:

    참고: Docker 레지스트리 사용자 아이디가 이미지를 만들 때 사용한 로컬 사용자 아이디와 다른 경우 레지스트리 사용자 아이디로 이미지에 태그를 지정해야 합니다. 마지막 단계의 예제에서는 다음과 같이 입력합니다:

    docker tag another00/ubuntu-nodejs kevin00/ubuntu-nodejs

    (base) kevin_kidong_lim@streamlit-mpi:~$ sudo docker push kevin00/ubuntu-nodejs
    Using default tag: latest
    The push refers to repository [docker.io/kevin00/ubuntu-nodejs]
    27537a89f335: Pushed
    42d3f8788282: Mounted from library/ubuntu
    latest: digest: sha256:7d7af7093f042b868224e73cef14fabda9346f4b0918c722dcf0d6bc6b215255 size: 741

    이미지를 레지스트리에 푸시하면 docker hub계정의 대시보드에 이미지가 보여지게 됩니다. 이상으로 도커를 설치하고, 이미지와 컨테이너로 작업하고, 수정된 이미지를 도커 허브에 푸시 하는것 까지 알아보았습니다.