01 Docker란 무엇이며, 왜 필요한가?
02 Docker의 핵심 개념과 용어
03 Do(ckerize) it yourself
Docker란?
애플리케이션을 개발(developing)하고, 배포(shipping)하고, 실행(running)하기 위한 Open Platform
OS-level Virtualization(Linux Container)를 제공하기 위한 구현 제품.
애플리케이션과 인프라스트럭처의 의존관계를 분리할 수 있는 방법
가상머신(Virtual Machine)의 단점을 극복할 수 있는 리눅스 컨테이너 기술의 구현
Docker Client : 명령어를 통해 Docker Daemon에 API를 호출하여 Docker Image와 Container를 관리할 수 있는 프로그램
Docker Daemon : Docker API 요청을 수신하여 Docker Object(Image, Container, Network, Volue 등)를 관리할 수 있는 프로세스
Docker Registry : Docker Image를 저장하고 관리하는 공간. Public Registry(ex. Docker Hub)와 Private Registry가 있음.
Dockerfile : Docker Image를 빌드하기 위한 정보 및 명령어가 작성된 파일 (Docker Image를 생성하는 방법 중 하나)
Docker Image : Dockerfile, Docker Registry, 또는 다른 Docker Image로부터 생성된 컨테이너 생성을 위한 Read-only Template
Docker Container : Docker Image 위에서 실행된 특수한 형태의 격리된 프로세스
3. Docker란?
• 애플리케이션을 개발(developing)하고, 배포(shipping)하고, 실행(running)하기 위한 Open Platform
• OS-level Virtualization(Linux Container)를 제공하기 위한 구현 제품.
• 애플리케이션과 인프라스트럭처의 의존관계를 분리할 수 있는 방법
• 가상머신(Virtual Machine)의 단점을 극복할 수 있는 리눅스 컨테이너 기술의 구현
4. Docker는 왜 필요한가? (애플리케이션을구동하기위한동일한서버환경이필요한경우어떻게하는가?)
OPTION 1. Document 이용
그때는 맞고 지금은 틀리다
5. Docker는 왜 필요한가? (애플리케이션을구동하기위한동일한서버환경이필요한경우어떻게하는가?)
OPTION 2. Virtual Machine 이용
Virtual Machine Docker Container
VS
Host O/S 위에서 하드웨어를 에뮬레이션(Hypervisor, a.k.a.
VMM) 한 뒤, 그 위에 다시 Guest O/S를 구동하는 방식
단점 : Heavyweight, Limited performance, Memory
allocation etc.
Host O/S의 커널을 공유하면서 특수한 형태의 격리된
프로세스가 구동되는 방식
6. Docker는 왜 필요한가? (애플리케이션을구동하기위한동일한서버환경이필요한경우어떻게하는가?)
OPTION 2. Virtual Machine 이용
Host O/S 위에서 하드웨어를 에뮬레이션(Hypervisor, a.k.a.
VMM) 한 뒤, 그 위에 다시 Guest O/S를 구동하는 방식
단점 : Heavyweight, Limited performance, Memory
allocation etc.
Host O/S의 커널을 공유하면서 특수한 형태의 격리된
프로세스가 구동되는 방식
7. Docker는 왜 필요한가? (애플리케이션을구동하기위한동일한서버환경이필요한경우어떻게하는가?)
OPTION 3. AWS AMI(Amazon Machine Image) 이용
Amazon Machine Image Docker Container
VS
Root Volume을 포함한 Amazon EC2 instance의 이미지
단점 : Cloud 제공자 dependency, 로컬 개발 환경 적용
어려움. Host O/S 자체가 결정되어 있음. 하나의 Host
O/S에서 여러 개의 이미지를 동시에 사용 불가
Host O/S의 커널을 공유하면서 특수한 형태의 격리된
프로세스가 구동되는 방식
9. Docker Architecture
• Docker Client : 명령어를 통해 Docker Daemon에 API를 호출하여 Docker Image와 Container를 관리할 수 있는 프로그램
• Docker Daemon : Docker API 요청을 수신하여 Docker Object(Image, Container, Network, Volue 등)를 관리할 수 있는 프로세스
• Docker Registry : Docker Image를 저장하고 관리하는 공간. Public Registry(ex. Docker Hub)와 Private Registry가 있음.
• Dockerfile : Docker Image를 빌드하기 위한 정보 및 명령어가 작성된 파일 (Docker Image를 생성하는 방법 중 하나)
• Docker Image : Dockerfile, Docker Registry, 또는 다른 Docker Image로부터 생성된 컨테이너 생성을 위한 Read-only Template
• Docker Container : Docker Image 위에서 실행된 특수한 형태의 격리된 프로세스
https://docs.docker.com/get-
started/overview/
10. Docker Client Commands
Docker Daemon에 API를 호출하는 다양한 명령어들
변경 작업
Docker Container
ubuntu:latest
Docker Image
run
build
commit
pull
push
Docker Registry (Remote, Public)
ubuntu:custom
Docker Image
Docker File
FROM ubuntu:latest
RUN apt-get …
WORKDIR /xxx …
ubuntu:myimg
Docker Image docker images
Docker Registry (Local, Private)
start / restart / stop
ps / ps -a
rm
rmi
13. 2. Shared Image를 이용한 Container 실행 (1/3)
변경 작업
Docker Container
ubuntu:latest
Docker Image
run
build
commit
pull
push
Docker Registry (Remote, Public)
ubuntu:custom
Docker Image
Docker File
FROM ubuntu:latest
RUN apt-get …
WORKDIR /xxx …
ubuntu:myimg
Docker Image docker images
Docker Registry (Local, Private)
start / restart / stop
ps / ps -a
rm
rmi
14. 2. Shared Image를 이용한 Container 실행 (1/3)
$> docker pull ubuntu:latest
latest: Pulling from library/ubuntu
345e3491a907: Pull complete
57671312ef6f: Pull complete
5e9250ddb7d0: Pull complete
Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
$> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 7e0aa2d69a15 12 days ago 72.7MB
$> docker run -it ubuntu:latest bash
root@20319b78ee46:/# exit
Exit
• -i(--interactive) : Keep STDIN open even if not attached
• -t(--tty) : Allocate a pseudo-tty
15. 2. Shared Image를 이용한 Container 실행 (2/3)
변경 작업
Docker Container
ubuntu:latest
Docker Image
run
build
commit
pull
push
Docker Registry (Remote, Public)
ubuntu:custom
Docker Image
Docker File
FROM ubuntu:latest
RUN apt-get …
WORKDIR /xxx …
ubuntu:myimg
Docker Image docker images
Docker Registry (Local, Private)
start / restart / stop
ps / ps -a
rm
rmi
16. 2. Shared Image를 이용한 Container 실행 (2/3)
$> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8c6c5bba0428 ubuntu:latest "bash" 44 seconds ago Exited (0) 39 seconds ago sweet_pasteur
$> docker start -i 8c6c5bba0428
root@8c6c5bba0428:/# git --version
bash: git: command not found
root@8c6c5bba0428:/# apt-get update
...
root@8c6c5bba0428:/# apt-get install git
...
root@8c6c5bba0428:/# git --version
git version 2.25.1
root@8c6c5bba0428:/# exit
exit
17. 2. Shared Image를 이용한 Container 실행 (3/3)
변경 작업
Docker Container
ubuntu:latest
Docker Image
run
build
commit
pull
push
Docker Registry (Remote, Public)
ubuntu:custom
Docker Image
Docker File
FROM ubuntu:latest
RUN apt-get …
WORKDIR /xxx …
ubuntu:myimg
Docker Image docker images
Docker Registry (Local, Private)
start / restart / stop
ps / ps -a
rm
rmi
18. 2. Shared Image를 이용한 Container 실행 (3/3)
$> docker diff 8c6c5bba0428
C /usr
C /usr/share
A /usr/share/gitweb
A /usr/share/gitweb/gitweb.cgi
A /usr/share/gitweb/index.cgi
A /usr/share/gitweb/static
...
$> docker commit 8c6c5bba0428 ubuntu:git
sha256:0b5f76111343b32caa95823e7635e50c0fb2ca65aae5333c2986e5f975091cc2
$> docker images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu git 0b5f76111343 13 minutes ago 202MB
ubuntu latest 7e0aa2d69a15 2 weeks ago 72.7MB
• sha256:0b5f76111343b32ca... : 일종의 commit hash
19. 2. Shared Image를 이용한 Container 실행 (3/3)
$> docker run -it ubuntu:git
root@1bf72ef870c8:/# git --version
git version 2.25.1
exit
$> docker push ubuntu:git
The push refers to repository [docker.io/library/ubuntu]
17b604a4a937: Preparing
2f140462f3bc: Preparing
63c99163f472: Preparing
ccdbb80308cc: Preparing
denied: requested access to the resource is denied
$> docker login
Login with your Docker ID to ...
Username: xxxxxxxx
Password: xxxxxxxx
Login Succeeded
• Docker image를 로그인 한 계정의 private repository로 push 해야 함.
20. 2. Shared Image를 이용한 Container 실행 (3/3)
$> docker tag ubuntu:git logispot/ubuntu:git
$> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu git 0b5f76111343 52 minutes ago 202MB
logispot/ubuntu git 0b5f76111343 52 minutes ago 202MB
ubuntu latest 7e0aa2d69a15 2 weeks ago 72.7MB
$> docker push logispot/ubuntu:git
The push refers to repository [docker.io/logispot/ubuntu]
17b604a4a937: Pushed
2f140462f3bc: Mounted from library/ubuntu
63c99163f472: Mounted from library/ubuntu
ccdbb80308cc: Mounted from library/ubuntu
git: digest: sha256:1fcf3a274a16215b92c4bd86c95e11fbc86bd3b0e69ccda21c017fe68b8bd04b size: 1155
$> docker rmi ubuntu:latest
Error response from daemon: conflict: ...
$> docker rm 8c6c5bba0428
8c6c5bba0428
$> docker rmi ubuntu:latest
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93