소개
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 키를 추가한 다음 패키지를 설치합니다.
먼저, 기존 패키지 목록을 업데이트합니다:
다음으로, apt
가 HTTPS를 통해 패키지를 사용할 수 있도록 몇 가지 선행 패키지를 설치합니다:
그런 다음, 공식 Docker 저장소의 GPG 키를 시스템에 추가합니다:
APT 소스에 Docker 저장소를 추가합니다:
추가 사항이 인식되도록 기존 패키지 목록을 다시 업데이트합니다:
기본 Ubuntu 저장소 대신 Docker 저장소에서 설치할 것임을 확인합니다:
버전 번호가 다를 수 있지만 다음과 같은 출력이 표시됩니다:
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를 설치하세요:
이제 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
명령을 실행하려고 하면 다음과 같은 출력이 표시됩니다:
Outputdocker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
docker
명령을 실행할 때마다 sudo
를 입력하지 않으려면 사용자 이름을 docker
그룹에 추가하세요:
새로운 그룹 멤버십을 적용하려면 서버에서 로그아웃한 다음 다시 로그인하거나 다음을 입력하십시오:
계속하려면 사용자 비밀번호를 입력하라는 메시지가 표시됩니다.
사용자가 도커 그룹에 추가되었는지 확인하려면 다음을 입력하십시오:
Outputsammy sudo docker
로그인되지 않은 도커
그룹의 사용자를 도커
그룹에 추가해야 하는 경우, 다음과 같이 명시적으로 해당 사용자를 선언하십시오:
이 문서의 나머지 부분은 도커 그룹의 사용자로 도커
명령을 실행하는 것으로 가정합니다. 그렇지 않은 경우 명령 앞에 sudo
를 추가하십시오.
이제 도커
명령을 살펴보겠습니다.
단계 3 — 도커 명령 사용하기
도커
를 사용하려면 옵션과 명령 그리고 인수를 따르는 형식으로 전달해야 합니다. 문법은 다음과 같습니다:
모든 사용 가능한 하위 명령어를 보려면 다음을 입력하십시오:
도커 버전 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
특정 명령에 사용 가능한 옵션을 보려면 다음을 입력하십시오:
도커에 대한 시스템 전반적인 정보를 보려면 다음을 사용하십시오:
이 명령들 중 일부를 살펴보겠습니다. 이미지 작업부터 시작하겠습니다.
단계 4 — Docker 이미지 작업
Docker 컨테이너는 Docker 이미지에서 생성됩니다. 기본적으로 Docker는 이러한 이미지를 Docker 프로젝트를 주도하는 회사인 Docker가 관리하는 Docker 레지스트리인 Docker Hub에서 가져옵니다. 누구나 Docker 이미지를 Docker Hub에 호스팅할 수 있으므로 필요한 대부분의 응용 프로그램 및 Linux 배포판은 그곳에 이미지가 호스팅되어 있습니다.
Docker Hub에서 이미지에 액세스하고 다운로드할 수 있는지 확인하려면 다음을 입력하십시오:
결과는 Docker가 올바르게 작동 중임을 나타냅니다:
OutputUnable 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 이미지를 검색하려면 다음을 입력하십시오:
이 스크립트는 Docker Hub를 크롤링하고 검색 문자열과 일치하는 모든 이미지 목록을 반환합니다. 이 경우 결과는 이와 유사할 것입니다:
OutputNAME 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
이미지를 컴퓨터로 다운로드할 수 있습니다:
다음 출력이 표시됩니다:
OutputUsing 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
예제에서 보았듯이, docker
가 run
하위 명령어와 함께 실행될 때 이미지가 다운로드되지 않은 경우 Docker 클라이언트가 먼저 이미지를 다운로드한 다음에 컨테이너를 실행합니다.
컴퓨터로 다운로드된 이미지를 확인하려면 다음을 입력하십시오:
출력은 다음과 유사할 것입니다:
OutputREPOSITORY 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 스위치의 조합은 컨테이너로 대화형 쉘 액세스를 제공합니다:
명령 프롬프트가 컨테이너 내에서 작업 중임을 나타내도록 변경되어야 합니다. 이 형식을 취해야 합니다:
Outputroot@d9b100f2f636:/#
명령 프롬프트에서 컨테이너 ID를 주목하세요. 이 예에서는 d9b100f2f636
입니다. 이후 컨테이너를 삭제할 때 이 컨테이너 ID가 필요합니다.
이제 컨테이너 내에서 어떤 명령이든 실행할 수 있습니다. 예를 들어, 컨테이너 내에서 패키지 데이터베이스를 업데이트해 봅시다. 컨테이너 내에서는 root 사용자로 작업하고 있기 때문에 어떤 명령에도 sudo
접두사를 붙일 필요가 없습니다:
그런 다음 그 안에 어떤 애플리케이션을 설치할 수 있습니다. Node.js를 설치해 보겠습니다:
이 명령은 공식 Ubuntu 저장소에서 Node.js를 컨테이너에 설치합니다. 설치가 완료되면 Node.js가 설치되었는지 확인하세요:
터미널에 버전 번호가 표시됩니다:
Outputv12.22.9
컨테이너 내에서 만든 변경 사항은 해당 컨테이너에만 적용됩니다.
컨테이너를 종료하려면 프롬프트에서 exit
를 입력하세요.
이제 시스템에서 컨테이너를 관리하는 방법을 살펴보겠습니다.
단계 6 — Docker 컨테이너 관리
일정 기간 동안 Docker를 사용하면 컴퓨터에 많은 활성(실행 중) 및 비활성 컨테이너가 있게 됩니다. 활성 상태를 보려면 다음을 사용합니다:
다음과 유사한 출력이 표시됩니다:
OutputCONTAINER ID IMAGE COMMAND CREATED
이 튜토리얼에서는 hello-world
이미지에서 하나와 ubuntu
이미지에서 다른 하나의 컨테이너를 시작했습니다. 두 컨테이너 모두 더 이상 실행되지 않지만 시스템에는 여전히 존재합니다.
모든 컨테이너 — 활성 및 비활성을 모두 보려면 -a
스위치와 함께 docker ps
를 실행합니다:
다음과 유사한 출력이 나타납니다:
OutputCONTAINER 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
스위치를 전달하세요:
OutputCONTAINER 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
인 것으로 시작해 보겠습니다:
컨테이너가 시작되며 상태를 확인하려면 docker ps
를 사용할 수 있습니다:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" 6 minutes ago Up 8 seconds dazzling_taussig
실행 중인 컨테이너를 중지하려면 docker stop
을 사용한 다음 컨테이너 ID 또는 이름을 입력합니다. 이번에는 Docker가 할당한 이름인 dazzling_taussig
를 사용하겠습니다:
한 번 더는 컨테이너가 더 이상 필요하지 않다고 결정했다면 docker rm
명령을 사용하여 해당 컨테이너를 제거하세요. 컨테이너 ID 또는 이름을 사용하여 다시 제거합니다. docker ps -a
명령을 사용하여 hello-world
이미지와 관련된 컨테이너의 ID 또는 이름을 찾고 제거하세요.
새로운 컨테이너를 시작하고 이름을 지정할 수 있도록 --name
스위치를 사용할 수 있습니다. 또한 --rm
스위치를 사용하여 중지될 때 자체적으로 제거되는 컨테이너를 생성할 수도 있습니다. 이러한 옵션 및 기타 정보에 대한 자세한 내용은 docker run help
명령을 참조하십시오.
컨테이너는 새로운 컨테이너를 빌드하는 데 사용할 수 있는 이미지로 변환할 수 있습니다. 이 작업 방법을 살펴보겠습니다.
단계 7 — 컨테이너에서 Docker 이미지로 변경 내용 커밋하기
Docker 이미지를 시작하면 가상 머신과 마찬가지로 파일을 생성, 수정 및 삭제할 수 있습니다. 수행한 변경 사항은 해당 컨테이너에만 적용됩니다. 시작하고 중지할 수 있지만 docker rm
명령으로 제거하면 변경 사항은 영구적으로 손실됩니다.
이 섹션에서는 컨테이너의 상태를 새로운 Docker 이미지로 저장하는 방법을 안내합니다.
Node.js를 Ubuntu 컨테이너 내에 설치한 후, 이미지로부터 실행 중인 컨테이너를 가지고 있지만, 컨테이너는 생성에 사용한 이미지와 다릅니다. 그러나 이후에 새로운 이미지의 기초로서 이 Node.js 컨테이너를 재사용하고 싶을 수 있습니다.
그런 다음 다음 명령을 사용하여 변경 사항을 새 Docker 이미지 인스턴스로 커밋하십시오.
-m 스위치는 변경 내용을 알려주는 커밋 메시지를 위한 것이며, -a는 작성자를 지정하는 데 사용됩니다. container_id
는 이전에 대화형 Docker 세션을 시작할 때 튜토리얼에서 노트한 것입니다. Docker 허브에서 추가 리포지토리를 만들지 않은 경우, repository
는 일반적으로 Docker 허브 사용자 이름입니다.
예를 들어, 사용자 sammy의 경우, 컨테이너 ID가 d9b100f2f636
인 경우 다음 명령이 될 것입니다:
이미지를 커밋하면 새 이미지가 로컬로 컴퓨터에 저장됩니다. 이 튜토리얼의 나중 단계에서는 다른 사람이 액세스할 수 있도록 Docker Hub와 같은 Docker 레지스트리에 이미지를 푸시하는 방법을 배우게 됩니다.
다시 한번 Docker 이미지를 나열하면 새 이미지와 그것이 유래된 이전 이미지가 표시됩니다:
다음과 같은 출력이 표시됩니다:
OutputREPOSITORY 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)에서 전 세계 또는 액세스 권한이 있는 다른 도커 레지스트리와 공유하는 것이 다음 논리적인 단계입니다. 도커 허브 또는 다른 도커 레지스트리에 이미지를 푸시하려면 해당 계정이 있어야 합니다.
이미지를 푸시하려면 먼저 도커 허브에 로그인합니다.
도커 허브 비밀번호를 사용하여 인증을 요청받습니다. 올바른 비밀번호를 지정했다면 인증이 성공해야 합니다.
참고: 도커 레지스트리 사용자 이름이 이미지를 만드는 데 사용한 로컬 사용자 이름과 다른 경우 이미지를 레지스트리 사용자 이름으로 태그해야 합니다. 마지막 단계에서 제공된 예를 들면 다음을 입력합니다:
그런 다음 다음을 사용하여 자체 이미지를 푸시할 수 있습니다:
ubuntu-nodejs
이미지를 sammy 레포지토리로 푸시하려면 다음 명령을 사용합니다:
이 프로세스는 이미지를 업로드하는 동안 시간이 소요될 수 있지만 완료되면 출력은 다음과 같이 보일 것입니다:
OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...
이미지를 레지스트리에 푸시한 후에는 계정 대시보드에 표시되어야 합니다. 아래 이미지에 표시된 것처럼.
이러한 종류의 오류가 발생하면 푸시 시도가 로그인되지 않았을 가능성이 있습니다:
OutputThe 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