
사전준비:
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계정의 대시보드에 이미지가 보여지게 됩니다. 이상으로 도커를 설치하고, 이미지와 컨테이너로 작업하고, 수정된 이미지를 도커 허브에 푸시 하는것 까지 알아보았습니다.