Ubuntu 22.04에서 Docker 설치 및 사용하기

소개

Docker컨테이너에서 응용 프로그램 프로세스를 관리하는 과정을 간소화하는 응용 프로그램입니다. 컨테이너를 사용하면 응용 프로그램을 리소스 격리된 프로세스에서 실행할 수 있습니다. 이것은 가상 머신과 유사하지만, 컨테이너는 더 이동성이 있으며, 리소스를 더 효율적으로 사용하며, 호스트 운영 체제에 더 의존적입니다.

Docker 컨테이너의 다양한 구성 요소에 대한 자세한 소개는 Docker 생태계: 공통 구성 요소 소개를 참조하십시오.

이 튜토리얼에서는 Ubuntu 22.04에 Docker Community Edition (CE)를 설치하고 사용합니다. Docker 자체를 설치하고, 컨테이너 및 이미지를 사용하고, Docker Repository에 이미지를 푸시합니다.

DigitalOcean App Platform을 사용하여 응용 프로그램을 간단히 배포하세요. 몇 분 만에 GitHub에서 직접 배포하세요.

전제 조건

이 튜토리얼을 따르려면 다음이 필요합니다:

  • Ubuntu 22.04 초기 서버 설정 가이드에 따라 설정된 하나의 Ubuntu 22.04 서버, sudo루트 사용자 및 방화벽 포함.
  • 독자적인 이미지를 만들고 Docker Hub에 푸시하려면 Docker Hub에 계정이 필요합니다. 단계 7 및 8에 표시된 대로.

단계 1 — Docker 설치

공식 Ubuntu 저장소에서 사용 가능한 Docker 설치 패키지는 최신 버전이 아닐 수 있습니다. 최신 버전을 사용하려면 공식 Docker 저장소에서 Docker를 설치합니다. 이를 위해 새로운 패키지 소스를 추가하고, 다운로드가 유효한지 확인하기 위해 Docker의 GPG 키를 추가한 다음 패키지를 설치합니다.

먼저, 기존 패키지 목록을 업데이트합니다:

  1. sudo apt update

다음으로, apt가 HTTPS를 통해 패키지를 사용할 수 있도록 몇 가지 선행 패키지를 설치합니다:

  1. sudo apt install apt-transport-https ca-certificates curl software-properties-common

그런 다음, 공식 Docker 저장소의 GPG 키를 시스템에 추가합니다:

  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

APT 소스에 Docker 저장소를 추가합니다:

  1. 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

추가 사항이 인식되도록 기존 패키지 목록을 다시 업데이트합니다:

  1. sudo apt update

기본 Ubuntu 저장소 대신 Docker 저장소에서 설치할 것임을 확인합니다:

  1. apt-cache policy docker-ce

버전 번호가 다를 수 있지만 다음과 같은 출력이 표시됩니다:

Output of apt-cache policy docker-ce
docker-ce:
  Installed: (none)
  Candidate: 5:20.10.14~3-0~ubuntu-jammy
  Version table:
     5:20.10.14~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.13~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

알림: docker-ce가 설치되어 있지 않지만 설치 대상은 우분투 22.04 (jammy)용 Docker 저장소에서 가져온 것입니다.

마지막으로 Docker를 설치하세요:

  1. sudo apt install docker-ce

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

  1. sudo systemctl status docker

출력은 다음과 유사해야 합니다. 서비스가 활성화되어 실행 중임을 보여줍니다:

Output
● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-04-01 21:30:25 UTC; 22s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 7854 (dockerd) Tasks: 7 Memory: 38.3M CPU: 340ms CGroup: /system.slice/docker.service └─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Docker를 설치하면 Docker 서비스(데몬)뿐만 아니라 docker 명령줄 유틸리티 또는 Docker 클라이언트도 제공됩니다. 이 튜토리얼의 후반부에서 docker 명령을 사용하는 방법을 살펴보겠습니다.

단계 2 — Sudo 없이 Docker 명령 실행하기 (선택 사항)

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

Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'.

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

  1. sudo usermod -aG docker ${USER}

새로운 그룹 멤버십을 적용하려면 서버에서 로그아웃한 다음 다시 로그인하거나 다음을 입력하십시오:

  1. su - ${USER}

계속하려면 사용자 비밀번호를 입력하라는 메시지가 표시됩니다.

사용자가 도커 그룹에 추가되었는지 확인하려면 다음을 입력하십시오:

  1. groups
Output
sammy sudo docker

로그인되지 않은 도커 그룹의 사용자를 도커 그룹에 추가해야 하는 경우, 다음과 같이 명시적으로 해당 사용자를 선언하십시오:

  1. sudo usermod -aG docker username

이 문서의 나머지 부분은 도커 그룹의 사용자로 도커 명령을 실행하는 것으로 가정합니다. 그렇지 않은 경우 명령 앞에 sudo를 추가하십시오.

이제 도커 명령을 살펴보겠습니다.

단계 3 — 도커 명령 사용하기

도커를 사용하려면 옵션과 명령 그리고 인수를 따르는 형식으로 전달해야 합니다. 문법은 다음과 같습니다:

  1. docker [option] [command] [arguments]

모든 사용 가능한 하위 명령어를 보려면 다음을 입력하십시오:

  1. docker

도커 버전 20.10.14에서 사용 가능한 모든 하위 명령어의 완전한 목록은 다음과 같습니다:

Output
attach Attach local standard input, output, and error streams to a running container build Build an image from a Dockerfile 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 exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information 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 login Log in to a Docker registry logout Log out from a Docker registry 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 ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images 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 version Show the Docker version information wait Block until one or more containers stop, then print their exit codes

특정 명령에 사용 가능한 옵션을 보려면 다음을 입력하십시오:

  1. docker docker-subcommand --help

도커에 대한 시스템 전반적인 정보를 보려면 다음을 사용하십시오:

  1. docker info

이 명령들 중 일부를 살펴보겠습니다. 이미지 작업부터 시작하겠습니다.

단계 4 — Docker 이미지 작업

Docker 컨테이너는 Docker 이미지에서 생성됩니다. 기본적으로 Docker는 이러한 이미지를 Docker 프로젝트를 주도하는 회사인 Docker가 관리하는 Docker 레지스트리인 Docker Hub에서 가져옵니다. 누구나 Docker 이미지를 Docker Hub에 호스팅할 수 있으므로 필요한 대부분의 응용 프로그램 및 Linux 배포판은 그곳에 이미지가 호스팅되어 있습니다.

Docker Hub에서 이미지에 액세스하고 다운로드할 수 있는지 확인하려면 다음을 입력하십시오:

  1. docker run hello-world

결과는 Docker가 올바르게 작동 중임을 나타냅니다:

Output
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...

Docker는 처음에 로컬에서 hello-world 이미지를 찾을 수 없었으므로 Docker Hub에서 해당 이미지를 다운로드했습니다. 이미지가 다운로드되면 Docker는 이미지에서 컨테이너를 생성하고 컨테이너 내의 응용 프로그램을 실행하여 메시지를 표시했습니다.

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

  1. docker search ubuntu

이 스크립트는 Docker Hub를 크롤링하고 검색 문자열과 일치하는 모든 이미지 목록을 반환합니다. 이 경우 결과는 이와 유사할 것입니다:

Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating sys… 14048 [OK] websphere-liberty WebSphere Liberty multi-architecture images … 283 [OK] ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK] neurodebian NeuroDebian provides neuroscience research s… 88 [OK] open-liberty Open Liberty multi-architecture images based… 51 [OK] ...

공식 열에서, OK은 프로젝트를 주도하는 회사가 구축하고 지원하는 이미지를 나타냅니다. 사용할 이미지를 식별한 후에는 pull 하위 명령어를 사용하여 컴퓨터로 다운로드할 수 있습니다.

다음 명령어를 실행하여 공식 ubuntu 이미지를 컴퓨터로 다운로드할 수 있습니다:

  1. docker pull ubuntu

다음 출력이 표시됩니다:

Output
Using default tag: latest latest: Pulling from library/ubuntu e0b25ef51634: Pull complete Digest: sha256:9101220a875cee98b016668342c489ff0674f247f6ca20dfc91b91c0f28581ae Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest

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

컴퓨터로 다운로드된 이미지를 확인하려면 다음을 입력하십시오:

  1. docker images

출력은 다음과 유사할 것입니다:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB hello-world latest bf756fb1ae65 4 months ago 13.3kB

이 튜토리얼의 나중 단계에서 컨테이너를 실행하는 데 사용되는 이미지는 수정되어 새 이미지를 생성하고 이를 Docker Hub 또는 다른 Docker 레지스트리에 업로드할 수 있습니다(pushed가 기술 용어입니다).

더 자세한 내용은 컨테이너 실행 방법을 살펴보겠습니다.

단계 5 — Docker 컨테이너 실행

이전 단계에서 실행한 hello-world 컨테이너는 테스트 메시지를 내 뱉은 후에 종료되는 예제입니다. 컨테이너는 그보다 훨씬 유용할 수 있으며 대화형일 수도 있습니다. 결국, 그것들은 가상 머신과 유사하지만 자원을 더 효율적으로 사용합니다.

예를 들어, 최신 Ubuntu 이미지를 사용하여 컨테이너를 실행해 보겠습니다. -i-t 스위치의 조합은 컨테이너로 대화형 쉘 액세스를 제공합니다:

  1. docker run -it ubuntu

명령 프롬프트가 컨테이너 내에서 작업 중임을 나타내도록 변경되어야 합니다. 이 형식을 취해야 합니다:

Output
root@d9b100f2f636:/#

명령 프롬프트에서 컨테이너 ID를 주목하세요. 이 예에서는 d9b100f2f636입니다. 이후 컨테이너를 삭제할 때 이 컨테이너 ID가 필요합니다.

이제 컨테이너 내에서 어떤 명령이든 실행할 수 있습니다. 예를 들어, 컨테이너 내에서 패키지 데이터베이스를 업데이트해 봅시다. 컨테이너 내에서는 root 사용자로 작업하고 있기 때문에 어떤 명령에도 sudo 접두사를 붙일 필요가 없습니다:

  1. apt update

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

  1. apt install nodejs

이 명령은 공식 Ubuntu 저장소에서 Node.js를 컨테이너에 설치합니다. 설치가 완료되면 Node.js가 설치되었는지 확인하세요:

  1. node -v

터미널에 버전 번호가 표시됩니다:

Output
v12.22.9

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

컨테이너를 종료하려면 프롬프트에서 exit를 입력하세요.

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

단계 6 — Docker 컨테이너 관리

일정 기간 동안 Docker를 사용하면 컴퓨터에 많은 활성(실행 중) 및 비활성 컨테이너가 있게 됩니다. 활성 상태를 보려면 다음을 사용합니다:

  1. docker ps

다음과 유사한 출력이 표시됩니다:

Output
CONTAINER ID IMAGE COMMAND CREATED

이 튜토리얼에서는 hello-world 이미지에서 하나와 ubuntu 이미지에서 다른 하나의 컨테이너를 시작했습니다. 두 컨테이너 모두 더 이상 실행되지 않지만 시스템에는 여전히 존재합니다.

모든 컨테이너 — 활성 및 비활성을 모두 보려면 -a 스위치와 함께 docker ps를 실행합니다:

  1. docker ps -a

다음과 유사한 출력이 나타납니다:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" About a minute ago Exited (0) 7 seconds ago dazzling_taussig 587000e49d53 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago adoring_kowalevski

최신으로 생성한 컨테이너를 보려면 -l 스위치를 전달하세요:

  1. docker ps -l
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 3 minutes ago Exited (0) 2 minutes ago dazzling_taussig

중지된 컨테이너를 시작하려면 docker start를 사용한 다음 컨테이너 ID 또는 컨테이너의 이름을 입력합니다. Ubuntu 기반 컨테이너를 ID가 1c08a7a0d0e4인 것으로 시작해 보겠습니다:

  1. docker start 1c08a7a0d0e4

컨테이너가 시작되며 상태를 확인하려면 docker ps를 사용할 수 있습니다:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 6 minutes ago Up 8 seconds dazzling_taussig

실행 중인 컨테이너를 중지하려면 docker stop을 사용한 다음 컨테이너 ID 또는 이름을 입력합니다. 이번에는 Docker가 할당한 이름인 dazzling_taussig를 사용하겠습니다:

  1. docker stop dazzling_taussig

한 번 더는 컨테이너가 더 이상 필요하지 않다고 결정했다면 docker rm 명령을 사용하여 해당 컨테이너를 제거하세요. 컨테이너 ID 또는 이름을 사용하여 다시 제거합니다. docker ps -a 명령을 사용하여 hello-world 이미지와 관련된 컨테이너의 ID 또는 이름을 찾고 제거하세요.

  1. docker rm adoring_kowalevski

새로운 컨테이너를 시작하고 이름을 지정할 수 있도록 --name 스위치를 사용할 수 있습니다. 또한 --rm 스위치를 사용하여 중지될 때 자체적으로 제거되는 컨테이너를 생성할 수도 있습니다. 이러한 옵션 및 기타 정보에 대한 자세한 내용은 docker run help 명령을 참조하십시오.

컨테이너는 새로운 컨테이너를 빌드하는 데 사용할 수 있는 이미지로 변환할 수 있습니다. 이 작업 방법을 살펴보겠습니다.

단계 7 — 컨테이너에서 Docker 이미지로 변경 내용 커밋하기

Docker 이미지를 시작하면 가상 머신과 마찬가지로 파일을 생성, 수정 및 삭제할 수 있습니다. 수행한 변경 사항은 해당 컨테이너에만 적용됩니다. 시작하고 중지할 수 있지만 docker rm 명령으로 제거하면 변경 사항은 영구적으로 손실됩니다.

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

Node.js를 Ubuntu 컨테이너 내에 설치한 후, 이미지로부터 실행 중인 컨테이너를 가지고 있지만, 컨테이너는 생성에 사용한 이미지와 다릅니다. 그러나 이후에 새로운 이미지의 기초로서 이 Node.js 컨테이너를 재사용하고 싶을 수 있습니다.

그런 다음 다음 명령을 사용하여 변경 사항을 새 Docker 이미지 인스턴스로 커밋하십시오.

  1. docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

-m 스위치는 변경 내용을 알려주는 커밋 메시지를 위한 것이며, -a는 작성자를 지정하는 데 사용됩니다. container_id는 이전에 대화형 Docker 세션을 시작할 때 튜토리얼에서 노트한 것입니다. Docker 허브에서 추가 리포지토리를 만들지 않은 경우, repository는 일반적으로 Docker 허브 사용자 이름입니다.

예를 들어, 사용자 sammy의 경우, 컨테이너 ID가 d9b100f2f636인 경우 다음 명령이 될 것입니다:

  1. docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

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

다시 한번 Docker 이미지를 나열하면 새 이미지와 그것이 유래된 이전 이미지가 표시됩니다:

  1. docker images

다음과 같은 출력이 표시됩니다:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB ...

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

도커 파일(Dockerfile)에서 이미지를 빌드할 수도 있으며, 이를 통해 새 이미지에 소프트웨어 설치를 자동화할 수 있습니다. 그러나 이것은 이 튜토리얼의 범위를 벗어납니다.

이제 다른 사람들과 새 이미지를 공유하여 그들이 해당 이미지에서 컨테이너를 만들 수 있도록 합시다.

단계 8 — 도커 이미지를 도커 레포지토리에 푸시하기

기존 이미지로부터 새 이미지를 만든 다음에는 선택한 몇 명의 친구, 도커 허브(Docker Hub)에서 전 세계 또는 액세스 권한이 있는 다른 도커 레지스트리와 공유하는 것이 다음 논리적인 단계입니다. 도커 허브 또는 다른 도커 레지스트리에 이미지를 푸시하려면 해당 계정이 있어야 합니다.

이미지를 푸시하려면 먼저 도커 허브에 로그인합니다.

  1. docker login -u docker-registry-username

도커 허브 비밀번호를 사용하여 인증을 요청받습니다. 올바른 비밀번호를 지정했다면 인증이 성공해야 합니다.

참고: 도커 레지스트리 사용자 이름이 이미지를 만드는 데 사용한 로컬 사용자 이름과 다른 경우 이미지를 레지스트리 사용자 이름으로 태그해야 합니다. 마지막 단계에서 제공된 예를 들면 다음을 입력합니다:

  1. docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

그런 다음 다음을 사용하여 자체 이미지를 푸시할 수 있습니다:

  1. docker push docker-registry-username/docker-image-name

ubuntu-nodejs 이미지를 sammy 레포지토리로 푸시하려면 다음 명령을 사용합니다:

  1. docker push sammy/ubuntu-nodejs

이 프로세스는 이미지를 업로드하는 동안 시간이 소요될 수 있지만 완료되면 출력은 다음과 같이 보일 것입니다:

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Pushed 5f70bf18a086: Pushed a3b5c80a4eba: Pushed 7f18b442972b: Pushed 3ce512daaf78: Pushed 7aae4540b42d: Pushed ...

이미지를 레지스트리에 푸시한 후에는 계정 대시보드에 표시되어야 합니다. 아래 이미지에 표시된 것처럼.

이러한 종류의 오류가 발생하면 푸시 시도가 로그인되지 않았을 가능성이 있습니다:

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Preparing 5f70bf18a086: Preparing a3b5c80a4eba: Preparing 7f18b442972b: Preparing 3ce512daaf78: Preparing 7aae4540b42d: Waiting unauthorized: authentication required

docker login을 사용하여 로그인하고 푸시 시도를 다시 수행하세요. 그런 다음 Docker Hub 리포지토리 페이지에서 해당 이미지가 존재하는지 확인합니다.

이제 docker pull sammy/ubuntu-nodejs를 사용하여 이미지를 새로운 기기로 가져와 새 컨테이너를 실행할 수 있습니다.

결론

이 튜토리얼에서는 Docker를 설치하고 이미지 및 컨테이너를 사용하며 수정된 이미지를 Docker Hub에 푸시했습니다. 이제 기본 사항을 알았으므로 DigitalOcean 커뮤니티에서 다른 Docker 튜토리얼을 살펴보세요.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04