본문 바로가기

클라우드/Docker(도커)

[도커] 도커개념 & 도커 실행하기(이미지 생성 / 컨테이너 생성)

도커 개념

- 쓰는이유

복잡한 리눅스 애플리케이션을 컨테이너로 묶어서 실행할 수 있음

 

- 도커란 무엇인가

리눅스 커널에서 제공하는 컨테이너 기술을 이용

 

- 컨테이너 기술이란?

가상화보다 가벼운 기술

 

- 가상머신의 등장

컴퓨터 안에서 컴퓨터를 만들어내기 위한 시도(1960년대에 가상화 개념이 처음 등장)

서버 성능은 더욱 더 좋아졌음 -> 대부분의 시간을 서버가 놓고있음

 

- 클라우드 서비스란

가상화 기술을 이용하여 서버를임대해주는 서비스

 

- 가상머신의 문제

1. 컴퓨터를 통째로 만들다보니 각종 성능 손실이 발생

--> CPU안에 가상화 기능을 넣기 시작, 호스트와 커널을 공유하는 반가상화가 나오기 시작(?)

2. 항상 Guest OS를 설치해야함

이미지 안에 OS가 포함되기 떄문에 이미지 용량이 커짐 (꽤나 부담스러움)

3. 배포와 관리 기능이 부족 (OS가상화에만 주력)

==> 컨테이너 기술이 나오게됨

 

- 도커는 가상화가 아닌 격리

groups, namespace와 같은 

 

- 도커는 Guest OS를 설치하지 않음

  • 호스트와 OS자원(시스템 콜)을 공유
  • 이미지 용량이 크게 줄어듦
  • 이미지에 서버 운영을 위한 프로그램과 라이브러리만 격리해서 설치

 

- 도커는 하드웨어 가상화 계층이 없음

  • 필요한것은 다 호스트를 이용하기 때문에

 

- 도커는 이미지 생성과 배포에 특화

 

- 이미지와 컨테이너의 다른 점

  • 이미지는 서비스 운영에 필요한 소스, 프로그램, 컴파일된 실행파일등을 묶어논 파일(객체에 해당)
  • 저장소에 올리고 받는건 이미지(push/pull)
  • 컨테이너는 프로세스(인스턴스) / 이미지는 실행파일(객체)

- 도커의 이미지 처리방식

  • 베이스 이미지(애플리케이션 A - 우분투라고 가정) + 바뀐 부분
  • 도커는 베이스 이미지에서 바뀐부분만 이미지로 만들어짐
  • 컨테이너로 실행할 때는 베이스 이미지와 바뀐 부분을 합쳐서 실행
  • 각 이미지는 의존관계 형성

 

- 서비스 운영환경과 도커

  • 지금까지는 물리서버를 직접 운영했음
  • 호스팅 : 우리서버를 대신 관리해주는 것(관리의 위임)
  • 서버 구입과 설치에 돈이 많이 들고 시간이 오래 걸림
  • 클라우드 환경
  • 가상화가 발전하면서 클라우드 환경으로 변화
  • 클릭 몇 번 만으로 가상 서버를 생성

 

- 서버 대수가 많아지면서 사람이 일일이 세팅하기 힘들어짐 --> Immutable(불변) Infrastructure 패러다임 등장

 

- Immutable Infrastructure

  • 하드웨어를 소프트웨어 적으로 구현
  • 호스트 OS와 서비스 운영환경(서버 프로그램, 소스코드, 컴파일 된 바이너리) 분리
  • 한번 설정한 운영환경은 변경하지 않는다는 개념 (아예 지우고 다시 깔아라?)
  • 머신을 수정하는게 아닌 수정되있는 머신으로 바꿔치기 해라
  • 서비스가 업그레이드 되면 운영 환경 변경하지 않고 이미지를 새로 생성하여 배포
  • 장점 : 편리한 관리, 확장(이미지 하나로 서버를 계속 찍어낼 수 있음), 테스트 간편, 가볍다.
  • 도커는 Immutable Infrastructure를 구현한 프로젝트

 

- 도커요약

  • 컨테이너를 싣고 다니는 고래
  • 고래는 서버에서 여러 개의 컨테이너(이미지)를 실행하고 이미지 저장과 배포(운반)을 의미
  • 도커(Docker)는 부두 노동자를 뜻함. 컨테이너를 다루는 도커의 기능과 비슷함
  • 도커는 서비스 운영환경을 묶어서 손쉽게 배포함고 실행하는 경량 컨테이너 기술

 

 

- 동기/비동기

동기는 절차가 뚜렷 -> 근 순서대로 코딩하면 돼

비동기는 절차가 뚜렷하지 않아. -> 콜백함수(이거끝나고 나면 나를 다시 호출해줘)

 

- 포트지정해주지 않을 경우

무작위로 컨테이너를 올렸다 내렸다 할 경우 일일이 포트포워딩 해주는데 어려움있음 -> 도커한테 맡겨버림 (알아서 포트 지정해줌 32768 부터 ~)


도커 실습

 

교재: 도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문

참고: http://pyrasis.com/docker.html

      https://www.slideshare.net/pyrasis/docker-fordummies-44424016?from_action=save

 

DevOps 과정에서 사용한 가상머신은 중지해 두세요.

C:\HashiCorp\WorkDir>vagrant halt

  또는 

VirtualBox 관리자에서 중지 

 

우분투 가상머신 설치 및 도커 설치

#1 작업 디렉터리 생성 - C:\docker 디렉터리 생성

C:\> mkdir c:\docker

C:\> cd c:\docker

c:\docker>

#2 Vagrantfile 생성

c:\docker> vagrant init ⇒ Vagrantfile 템플릿을 생성

A `Vagrantfile` has been placed in this directory. You are now

ready to `vagrant up` your first virtual environment! Please read

the comments in the Vagrantfile as well as documentation on

`vagrantup.com` for more information on using Vagrant.

 

c:\docker\Vagrantfile

# -*- mode: ruby -*-

# vi: set ft=ruby :


Vagrant.configure("2") do |config|

  config.vm.box = "ubuntu/xenial64"

  config.vm.hostname = "xenial64"

  config.vm.synced_folder ".", "/vagrant_data", disabled: true

end



#3 가상머신 생성

c:\docker> vagrant up

Bringing machine 'default' up with 'virtualbox' provider...

==> default: Box 'ubuntu/xenial64' could not be found. Attempting to find and install...

    default: Box Provider: virtualbox

    default: Box Version: >= 0

==> default: Loading metadata for box 'ubuntu/xenial64'

    default: URL: https://vagrantcloud.com/ubuntu/xenial64

==> default: Adding box 'ubuntu/xenial64' (v20200904.0.0) for provider: virtualbox

    default: Downloading: https://vagrantcloud.com/ubuntu/boxes/xenial64/versions/20200904.0.0/providers/virtualbox.box

Download redirected to host: cloud-images.ubuntu.com

    default:

==> default: Successfully added box 'ubuntu/xenial64' (v20200904.0.0) for 'virtualbox'!

==> default: Importing base box 'ubuntu/xenial64'...

==> default: Matching MAC address for NAT networking...

==> default: Checking if box 'ubuntu/xenial64' version '20200904.0.0' is up to date...

==> default: Setting the name of the VM: docker_default_1600051023994_13889

==> default: Clearing any previously set network interfaces...

==> default: Preparing network interfaces based on configuration...

    default: Adapter 1: nat

==> default: Forwarding ports...

    default: 22 (guest) => 2222 (host) (adapter 1)

==> default: Running 'pre-boot' VM customizations...

==> default: Booting VM...

==> default: Waiting for machine to boot. This may take a few minutes...

    default: SSH address: 127.0.0.1:2222

    default: SSH username: vagrant

    default: SSH auth method: private key ⇒ vagrant ssh-config 명령어로 키 저장 경로를 확인할 수 있음

    default:

    default: Vagrant insecure key detected. Vagrant will automatically replace

    default: this with a newly generated keypair for better security.

    default:

    default: Inserting generated public key within guest...

    default: Removing insecure key from the guest if it's present...

    default: Key inserted! Disconnecting and reconnecting using new SSH key...

==> default: Machine booted and ready!

==> default: Checking for guest additions in VM...

    default: The guest additions on this VM do not match the installed version of

    default: VirtualBox! In most cases this is fine, but in rare cases it can

    default: prevent things such as shared folders from working properly. If you see

    default: shared folder errors, please make sure the guest additions within the

    default: virtual machine match the version of VirtualBox you have installed on

    default: your host and reload your VM.

    default:

    default: Guest Additions Version: 5.1.38

    default: VirtualBox Version: 6.1

==> default: Setting hostname...



#4 가상머신에 SSH로 접속

c:\docker> vagrant ssh

Welcome to Ubuntu 16.04.7 LTS (GNU/Linux 4.4.0-189-generic x86_64)

 

 * Documentation:  https://help.ubuntu.com

 * Management:     https://landscape.canonical.com

 * Support:        https://ubuntu.com/advantage

 

0 packages can be updated.

0 updates are security updates.

 

New release '18.04.5 LTS' available.

Run 'do-release-upgrade' to upgrade to it.



Welcome to Ubuntu 16.04.7 LTS (GNU/Linux 4.4.0-189-generic x86_64)

 

 * Documentation:  https://help.ubuntu.com

 * Management:     https://landscape.canonical.com

 * Support:        https://ubuntu.com/advantage

 

0 packages can be updated.

0 updates are security updates.

 

New release '18.04.5 LTS' available.

Run 'do-release-upgrade' to upgrade to it.



#5 패키지 업데이트 

vagrant@xenial64:~$ sudo apt update

vagrant@xenial64:~$ sudo apt upgrade



#6 도커 설치

vagrant@xenial64:~$ sudo apt install -y docker.io

vagrant@xenial64:~$ sudo usermod -a -G docker $USER

vagrant@xenial64:~$ sudo service docker restart

vagrant@xenial64:~$ sudo chmod 666 /var/run/docker.sock

vagrant@xenial64:~$ docker --version

Docker version 18.09.7, build 2d0083d

 

  

도커 이미지 생성

 

#1 작업 디렉터리 생성 및 이동

vagrant@xenial64:~$ mkdir chap01 && cd chap01

vagrant@xenial64:~/chap01$



#2 쉘 스크립트 파일 생성 및 실행 권한 부여

vagrant@xenial64:~/chap01$ vi helloworld

#!/bin/sh


echo "Hello, World!"

 

vagrant@xenial64:~/chap01$ chmod 755 helloworld

vagrant@xenial64:~/chap01$ ll ⇐ ls -l 과 동일

total 12

drwxrwxr-x 2 vagrant vagrant 4096 Sep 14 04:19 ./

drwxr-xr-x 5 vagrant vagrant 4096 Sep 14 04:18 ../

-rwxr-xr-x 1 vagrant vagrant   32 Sep 14 04:18 helloworld*



#3 Dockerfile 생성

vagrant@xenial64:~/chap01$ vi Dockerfile 

FROM  ubuntu:16.04                             # 베이스 이미지 정의

COPY  helloworld  /usr/local/bin               # 호스트 파일을 컨테이너 안으로 복사

RUN   chmod  +x  /usr/local/bin/helloworld     # 도커 빌드 과정에서 컨테이너 안에서 실행할 명령

CMD   [ "helloworld" ]                         # 도커 빌드를 통해 만들어진 이미지를 

                                               # 도커 컨테이너로 실행하기 전에 실행할 명령



#4 Dockerfile을 사용해서 이미지를 빌드

vagrant@xenial64:~/chap01$ docker image build -t helloworld:latest .

                           ~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ ~ 

                            |                  |                   +-- 도커 파일 위치 (현재 디렉터리)

                            |                  +-- 이미지 이름을 명시 (사용자명/이미지명:태그명)

                            +-- Dockerfile 명세에 맞춰 이미지를 생성

Sending build context to Docker daemon  3.072kB

Step 1/4 : FROM  ubuntu:16.04

16.04: Pulling from library/ubuntu ⇐ 이미지 이름에 사용자명이 기술되어 있지 않으면 공식 이미지를 의미 

8e097b52bfb8: Pull complete                  ⇐ --+ 이미지가 여러 개의 파일로 분리되어 있는 것을 확인                                                               

a613a9b4553c: Pull complete                       |                                                          

acc000f01536: Pull complete                       |                                                         

73eef93b7466: Pull complete                     --+                                                           

Digest: sha256:3dd44f7ca10f07f86add9d0dc611998a1641f501833692a2651c96defe8db940

Status: Downloaded newer image for ubuntu:16.04

 ---> 4b22027ede29

Step 2/4 : COPY  helloworld  /usr/local/bin

 ---> 23ab985036d9

Step 3/4 : RUN   chmod  +x  /usr/local/bin/helloworld

 ---> Running in 05d338a6c693

Removing intermediate container 05d338a6c693

 ---> 8b25279cefbf

Step 4/4 : CMD   [ "helloworld" ]

 ---> Running in 38242098834c

Removing intermediate container 38242098834c

 ---> 083947639383

Successfully built 083947639383

Successfully tagged helloworld:latest

 

#5 생성된 이미지를 조회

vagrant@xenial64:~/chap01$ docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

helloworld          latest              083947639383        7 minutes ago       127MB ⇐ 새롭게 생성한 이미지

ubuntu              16.04               4b22027ede29        3 weeks ago         127MB ⇐ 베이스 이미지

 

#6 컨테이너 실행 및 조회

vagrant@xenial64:~/chap01$ docker container run helloworld:latest

Hello, World!

 

vagrant@xenial64:~/chap01$ docker container ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

 

vagrant@xenial64:~/chap01$ docker container ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

b5dce3ec92bb        helloworld:latest   "helloworld"        29 seconds ago      Exited (0) 28 seconds ago                       silly_hermann

 

윈도우용 도커 설치

Hyper-V 가상화 기능 활성화 여부 체크

작업 관리자 > 성능 > CPU > 가상화 항목 확인

 

도커 설치 파일 다운로드

https://www.docker.com/get-started

 

도커 설치 파일 실행

다운로드 한 "Docker Desktop Installer.exe" 파일을 실행

도커 실행 확인 및 설정

 




도커 이미지로 도커 컨테이너 생성 (P36)

gihyodocker/echo:latest 이미지를 이용해서 컨테이너를 생성, 실행

#1 docker image pull 명령으로 도커 이미지를 로컬 레포지터리로 다운로드

vagrant@xenial64:~/chap01$ docker image pull gihyodocker/echo:latest

latest: Pulling from gihyodocker/echo

723254a2c089: Pull complete                                                                                

abe15a44e12f: Pull complete                                                                                

409a28e3cc3d: Pull complete                                                                                

503166935590: Pull complete                                                                                

abe52c89597f: Pull complete                                                                                

ce145c5cf4da: Pull complete                                                                                

96e333289084: Pull complete                                                                                

39cd5f38ffb8: Pull complete                                                                                

22860d04f4f1: Pull complete                                                                                

7528760e0a03: Pull complete                                                                                 

Digest: sha256:4520b6a66d2659dea2f8be5245eafd5434c954485c6c1ac882c56927fe4cec84

Status: Downloaded newer image for gihyodocker/echo:latest

 

vagrant@xenial64:~/chap01$ docker image ls ⇐ 로컬 레포지터리에 저장된 이미지를 조회

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

helloworld          latest              083947639383        About an hour ago   127MB

ubuntu              16.04               4b22027ede29        3 weeks ago         127MB

gihyodocker/echo    latest              3dbbae6eb30d        2 years ago         733MB

 

#2 docker container run 명령으로 컨테이너 실행

vagrant@xenial64:~/chap01$ docker container run -t -p 9000:8080 gihyodocker/echo:latest

2020/09/14 05:40:42 start server

(제어권을 반환하지 않고 멈춘 상태)

 

#3 명령 프롬프트를  하나 더 실행 후 SSH로 접속

c:\docker> vagrant ssh

:

vagrant@xenial64:~$



#4 두번째 터미널에서 컨테이너 실행을 확인

vagrant@xenial64:~$ docker container ls

CONTAINER ID      IMAGE                    COMMAND               CREATED             STATUS              PORTS                    NAMES

62c1b32acf92  gihyodocker/echo:latest   "go run /echo/main.go"   3 minutes ago   Up 3 minutes    0.0.0.0:9000->8080/tcp   cranky_stallman  ⇐ 컨테이너 이름을 명시하지 않았을 때 자동으로 만들어 주는 컨테이너 이름



#5 두번째 터미널에서 curl 명령으로 컨테이너로 요청을 전송

vagrant@xenial64:~$ curl http://localhost:9000

Hello Docker!!

 

vagrant@xenial64:~/chap01$ docker container run -t -p 9000:8080 gihyodocker/echo:latest

2020/09/14 05:40:42 start server

2020/09/14 05:48:29 received request ⇐ 첫번째 터미널에 요청에 대한 로그가 출력되는 것을 확인

 

#6 두번째 터미널에서 docker container stop 명령으로 컨테이너를 중지

vagrant@xenial64:~$ docker container stop 62

62                                                      ~~ 컨테이너 이름 또는 ID (ID는 식별 가능한 범위까지만 입력)



vagrant@xenial64:~$ docker container ls

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

 

vagrant@xenial64:~$ docker container ls -a

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                    PORTS               NAMES

62c1b32acf92    gihyodocker/echo:latest  "go run /echo/main.go" 11 minutes ago    Exited (2) About a minute ago                       cranky_stallman

b5dce3ec92bb        helloworld:latest         "helloworld"             About an hour ago   Exited (0) About an hour ago                        silly_hermann



간단한 애플리케이션과 도커 이미지 만들기 (P37~P48)

#1 main.go 작성 ⇒ 8080 포트로 요청을 대기하고, 요청이 들어 왔을 때 Hello, Docker!! 라는 메시지를 반환

vagrant@xenial64:~$ mkdir ~/chap02 && cd ~/chap02

vagrant@xenial64:~/chap02$ vi main.go

package main


import (

"fmt"

"log"

"net/http"

)


func main() {

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

log.Println("received request")

fmt.Fprintf(w, "Hello Docker!!")

})

log.Println("start server")

server := &http.Server{ Addr: ":8080" }

if err := server.ListenAndServe(); err != nill {

log.Println(err)

}

}

 

#2 Dockerfile 생성

vagrant@xenial64:~/chap02$ vi Dockerfile

FROM   golang:1.9


RUN    mkdir   /echo


COPY   main.go   /echo


CMD   [ "go", "run", "/echo/main.go" ]   

 

#3 이미지 생성

vagrant@xenial64:~/chap02$ docker image build -t example/echo:latest .

Sending build context to Docker daemon  3.072kB

Step 1/4 : FROM   golang:1.9

1.9: Pulling from library/golang

55cbf04beb70: Pull complete                                                                                

1607093a898c: Pull complete                                                                                

9a8ea045c926: Pull complete                                                                                

d4eee24d4dac: Pull complete                                                                                

9c35c9787a2f: Pull complete                                                                                

8b376bbb244f: Pull complete                                                                                

0d4eafcc732a: Pull complete                                                                                

186b06a99029: Pull complete                                                                                

Digest: sha256:8b5968585131604a92af02f5690713efadf029cc8dad53f79280b87a80eb1354

Status: Downloaded newer image for golang:1.9

 ---> ef89ef5c42a9

Step 2/4 : RUN    mkdir   /echo

 ---> Running in 449e92afa783

Removing intermediate container 449e92afa783

 ---> f0cfe58d9117

Step 3/4 : COPY   main.go   /echo

 ---> 2fd6aace590f

Step 4/4 : CMD   [ "go", "run", "/echo/main.go" ]

 ---> Running in f9deb6e31909

Removing intermediate container f9deb6e31909

 ---> 5fdc5627235d

Successfully built 5fdc5627235d

Successfully tagged example/echo:latest

 

#4 이미지 생성 확인 후 컨테이너 실행

vagrant@xenial64:~/chap02$ docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE

example/echo        latest              5fdc5627235d        About a minute ago   750MB

helloworld          latest              083947639383        2 hours ago          127MB

ubuntu              16.04               4b22027ede29        3 weeks ago          127MB

golang              1.9                 ef89ef5c42a9        2 years ago          750MB

gihyodocker/echo    latest              3dbbae6eb30d        2 years ago          733MB

 

vagrant@xenial64:~/chap02$ docker container run example/echo:latest

# command-line-arguments

/echo/main.go:16:44: undefined: nill

 

#5 main.go 수정 후 이미지 재생성

vagrant@xenial64:~/chap02$ vi main.go

                      :

if err := server.ListenAndServe(); err != nil {

log.Println(err)

}

}

 

vagrant@xenial64:~/chap02$ docker image build -t example/echo:latest .

Sending build context to Docker daemon  3.072kB

Step 1/4 : FROM   golang:1.9

 ---> ef89ef5c42a9

Step 2/4 : RUN    mkdir   /echo

 ---> Using cache

 ---> f0cfe58d9117

Step 3/4 : COPY   main.go   /echo

 ---> 301e84bb9f9c

Step 4/4 : CMD   [ "go", "run", "/echo/main.go" ]

 ---> Running in 966b923396b5

Removing intermediate container 966b923396b5

 ---> 2cfba54d6760

Successfully built 2cfba54d6760

Successfully tagged example/echo:latest

 

vagrant@xenial64:~/chap02$ docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

example/echo        latest              2cfba54d6760        12 seconds ago      750MB ⇐ 새로 만들어진 이미지

<none>              <none>              5fdc5627235d        4 minutes ago       750MB ⇐ 이전에 만들었던 이미지

helloworld          latest              083947639383        2 hours ago         127MB

ubuntu              16.04               4b22027ede29        3 weeks ago         127MB

golang              1.9                 ef89ef5c42a9        2 years ago         750MB

gihyodocker/echo    latest              3dbbae6eb30d        2 years ago         733MB

 

vagrant@xenial64:~/chap02$ docker container run example/echo:latest

2020/09/14 06:54:29 start server

(멈춘 상태) ⇐ 컨테이너에서 실행되는 main.go가 서비스 형태로 동작

 

#6 다른 터미널에서 컨테이너 종료

vagrant@xenial64:~$ docker container ls

CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES

5988d0269be5        example/echo:latest       "go run /echo/main.go"   4 minutes ago       Up 4 minutes                                 happy_kalam

a88c98fdb847        gihyodocker/echo:latest   "go run /echo/main.go"   About an hour ago   Up About an hour    0.0.0.0:9000->8080/tcp   cranky_minsky

 

vagrant@xenial64:~$ docker container stop 5988

5988

 

#7 첫번째 터미널에서 -d 옵션으로 컨테이너를 백그라운드에서 실행

vagrant@xenial64:~/chap02$ docker container run -d example/echo:latest

344300c239280f80e948309a638bb527bca0abf1b7add389763d0dc393b86006

(입력 가능한 상태)

 

vagrant@xenial64:~/chap02$ docker container ls

CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES

344300c23928        example/echo:latest       "go run /echo/main.go"   2 minutes ago       Up 2 minutes                                 optimistic_nash

a88c98fdb847        gihyodocker/echo:latest   "go run /echo/main.go"   About an hour ago   Up About an hour    0.0.0.0:9000->8080/tcp   cranky_minsky




#8 실행 중인 컨터이너를 중지 ⇒ docker container stop CONTAINER_ID

vagrant@xenial64:~/chap02$ docker container stop 3443

3443



#9 같은 이미지로 생성된 컨테이너를 일괄적으로 중지 ⇒ filter 옵션 이용

#9-1 같은 이미지로 2개의 컨테이너를 실행

vagrant@xenial64:~/chap02$ docker container run -d example/echo:latest 78f1c3fa2035ed232a3401569899409d1b4625ed88e83d8f1061b6fba66b98ad

 

vagrant@xenial64:~/chap02$ docker container run -d example/echo:latest

11a30978aba8490885cdffab6912a202b3be7473e817f69da486474533cc0c94

 

vagrant@xenial64:~/chap02$ docker container ls

CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES

11a30978aba8        example/echo:latest       "go run /echo/main.go"   2 seconds ago       Up 2 seconds                                 romantic_nobel

78f1c3fa2035        example/echo:latest       "go run /echo/main.go"   32 seconds ago      Up 31 seconds                                practical_robinson

a88c98fdb847        gihyodocker/echo:latest   "go run /echo/main.go"   About an hour ago   Up About an hour    0.0.0.0:9000->8080/tcp   cranky_minsky



#9-2 컨테이너 생성에 사용된 이미지로 조회

vagrant@xenial64:~/chap02$ docker container ls --filter "ancestor=example/echo"

CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS               NAMES

11a30978aba8        example/echo:latest   "go run /echo/main.go"   4 minutes ago       Up 4 minutes                       romantic_nobel

78f1c3fa2035        example/echo:latest   "go run /echo/main.go"   4 minutes ago       Up 4 minutes                     practical_robinson

 

#9-3 컨테이너 조회 결과에서 컨테이너 ID만 추출

vagrant@xenial64:~/chap02$ docker container ls --filter "ancestor=example/echo" -q

11a30978aba8

78f1c3fa2035

 

#9-4 동일한 이미지로 생성된 컨테이너를 일괄 중지

vagrant@xenial64:~/chap02$ docker container stop $(docker container ls --filter "ancestor=example/echo" -q)

11a30978aba8

78f1c3fa2035

 

vagrant@xenial64:~/chap02$ docker container ls -a

CONTAINER ID        IMAGE                    COMMAND                 CREATED            STATUS                         PORTS                    NAMES

11a30978aba8        example/echo:latest       "go run /echo/main.go"   8 minutes ago       Exited (2) 13 seconds ago                       romantic_nobel

78f1c3fa2035        example/echo:latest       "go run /echo/main.go"   8 minutes ago       Exited (2) 13 seconds ago                         practical_robinson

344300c23928        example/echo:latest       "go run /echo/main.go"   14 minutes ago      Exited (2) 9 minutes ago                        optimistic_nash

5988d0269be5        example/echo:latest       "go run /echo/main.go"   21 minutes ago      Exited (2) 15 minutes ago                       happy_kalam

f8f46d0c6d22        5fdc5627235d              "go run /echo/main.go"   About an hour ago   Exited (2) About an hour ago                  confident_heyrovsky

a88c98fdb847     gihyodocker/echo:latest   "go run /echo/main.go"   About an hour ago   Up About an hour   0.0.0.0:9000->8080/tcp cranky_minsky

62c1b32acf92        gihyodocker/echo:latest   "go run /echo/main.go"   2 hours ago         Exited (2) About an hour ago                    cranky_stallman

b5dce3ec92bb        helloworld:latest         "helloworld"             3 hours ago         Exited (0) 3 hours ago                                  silly_hermann



#10 -p 옵션을 이용해 포트 포워딩 

#10-1 -p 호스트포트:컨테이너포트

vagrant@xenial64:~/chap02$ docker container run -d -p 9090:8080 example/echo:latest

0f7e599e5f73d98618ba46cd26fc377abbfc5f7929eddc28d4f2f91a0631b4ef

 

vagrant@xenial64:~/chap02$ curl localhost:9090

Hello Docker!!

 

#10-2 호스트 포트를 생략하는 경우 ⇒ 자동으로 할당

vagrant@xenial64:~/chap02$ docker container run -d -p 8080 example/echo:latest

c9fc3ecad9f59975a49d2e8bcf713466c30565845c6a8503e79f87e50c0c4133

 

vagrant@xenial64:~/chap02$ docker container ls

CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                 NAMES

c9fc3ecad9f5        example/echo:latest       "go run /echo/main.go"   6 seconds ago       Up 5 seconds     0.0.0.0:32769->8080/tcp   nervous_williams

9a1659e58d40        example/echo:latest       "go run /echo/main.go"   2 minutes ago       Up 2 minutes    0.0.0.0:32768->80/tcp     sleepy_keldysh

0f7e599e5f73        example/echo:latest       "go run /echo/main.go"   4 minutes ago       Up 4 minutes      0.0.0.0:9090->8080/tcp    musing_visvesvaraya

a88c98fdb847        gihyodocker/echo:latest   "go run /echo/main.go"   About an hour ago   Up About an hour    0.0.0.0:9000->8080/tcp    cranky_minsky

 

vagrant@xenial64:~/chap02$ curl localhost:32769

Hello Docker!!



도커 이미지, 컨테이너 일괄 삭제

vagrant@xenial64:~/chap02$ docker container rm -f $(docker container ls -a -q)

                                             ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~

                                                                          |                      +-- 모든 컨테이너(실행, 중지 상태 모두)의 ID를 반환

                                                                          +-- 컨테이너를 강제로 삭제 (실행 중인 컨테이너는 중지하고 삭제)

 

vagrant@xenial64:~/chap02$ docker container ls -a

CONTAINER ID        IMAGE           COMMAND         CREATED          STATUS           PORTS               NAMES



vagrant@xenial64:~/chap02$ docker image rm -f $(docker image ls -q)

 

vagrant@xenial64:~/chap02$ docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE



 

docker image build --pull 옵션 

Always attempt to pull a newer version of the image

 

P51 --pull 옵션을 사용하면 매번 베이스 이미지를 강제로 새로 받아온다.

 

pull 옵션을 사용하지 않아도 베이스 이미지가 변경되면 로컬 캐쉬 이미지가 업데이트되며, 

pull 옵션을 사용하더라도 이미지가 변경되지 않으면 로컬 캐쉬 이미지를 사용




docker search 명령을 이용한 리포지토리 검색

vagrant@xenial64:~/chap02$ docker search mysql

NAME                              DESCRIPTION                                      STARS               OFFICIAL            AUTOMATED

mysql                             MySQL is a widely used, open-source relation…   9961                [OK] 

mariadb                           MariaDB is a community-developed fork of MyS…   3644                [OK] 

mysql/mysql-server                Optimized MySQL Server Docker images. Create…   725                                     [OK]

percona                           Percona Server is a fork of the MySQL relati…   509                 [OK] 

centos/mysql-57-centos7           MySQL 5.7 SQL database server                    83                        

mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   75                       

centurylink/mysql                 Image containing mysql. Optimized to be link…   61                                      [OK]

bitnami/mysql                     Bitnami MySQL Docker Image                       44                                      [OK]

 

이미지를 가져올 때 다음과 같은 순서에 해당하는 이미지를 사용할 것을 권장

  1. 공식 배포 이미지

  2. Dockerfile이 공개된 이미지

  3. STARS를 받은 이미지

 

vagrant@xenial64:~/chap02$ docker search --limit 5 mysql ⇐ STARS가 많은 상위 5개만 조회




리포지터리를 검색할 수 있도록 API를 제공

https://hub.docker.com/v2/repositories/library/mysql/tags

                                                 ~~~~~ ~~~~ ~~~ 태그 정보 조회

                                               사용자명  이미지이름

 

https://hub.docker.com/v2/repositories/myanjini/hello

https://hub.docker.com/v2/repositories/myanjini/hello/tags



터미널에서 제공되는 API를 이용해서 이미지 정보를 조회

vagrant@xenial64:~/chap02$ curl https://hub.docker.com/v2/repositories/library/mysql/tags

⇒ JSON 형식의 데이터가 단순 문자열 형태로 출력 

⇒ 가독성이 떨어져 데이터를 판독할 수 없음

 

jq 유틸리티를 설치

vagrant@xenial64:~/chap02$ sudo apt install -y jq

⇒ JSON 데이터를 읽기 좋게 표현 및 가공을 도와주는 프로그램

 

jq를 이용해서 출력 포맷을 변경

vagrant@xenial64:~/chap02$ curl https://hub.docker.com/v2/repositories/library/mysql/tags | jq

⇒ JSON 형식으로 포맷된 결과를 출력

⇒ 읽기 좋게 변경

 

jq를 이용해서 특정 데이터만 추출

vagrant@xenial64:~$ curl https://hub.docker.com/v2/repositories/library/mysql/tags | jq '.results[].name'

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100  4310    0  4310    0     0   3236      0 --:--:--  0:00:01 --:--:--  3238

"latest"

"8.0.21"

"8.0"

"8"

"5.7.31"

"5.7"

"5.6.49"

"5.6"

"5"

"8.0.20"




테스트용 베이스 이미지를 생성 

vagrant@xenial64:~/chap02$ mkdir ~/basetest && cd ~/basetest

vagrant@xenial64:~/basetest$ vi Dockerfile

FROM busybox

RUN  echo "version = 1" > /tmp/version

 

테스트용 이미지 생성

vagrant@xenial64:~/basetest$ docker image build -t myanjini/basetest:latest .

Sending build context to Docker daemon  2.048kB    ~~~~~ 도커 허브 계정명

Step 1/2 : FROM busybox

latest: Pulling from library/busybox

df8698476c65: Pull complete                                                                                 Digest: sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a

Status: Downloaded newer image for busybox:latest

 ---> 6858809bf669

Step 2/2 : RUN  echo "version = 1" > /tmp/version

 ---> Running in 2d6b0c83a7c5

Removing intermediate container 2d6b0c83a7c5

 ---> 4453428bfeee

Successfully built 4453428bfeee

Successfully tagged myanjini/basetest:latest

 

vagrant@xenial64:~/basetest$ docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

myanjini/basetest   latest              4453428bfeee        33 seconds ago      1.23MB

exam/echo           latest              bc76c708ba18        8 minutes ago       750MB

busybox             latest              6858809bf669        5 days ago          1.23MB

golang              1.9                 ef89ef5c42a9        2 years ago         750MB



생성한 이미지를 도커 허브에 등록

vagrant@xenial64:~/basetest$ docker image push myanjini/basetest:latest

The push refers to repository [docker.io/myanjini/basetest]

5cde1063fc95: Preparing                                                                                    

be8b8b42328a: Preparing                                                                                     

denied: requested access to the resource is denied ⇐ 인증 정보가 존재하지 않기 때문에 인증 오류가 발생

 

vagrant@xenial64:~/basetest$ docker login

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.

Username: myanjini

Password:

WARNING! Your password will be stored unencrypted in /home/vagrant/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

 

Login Succeeded

 

vagrant@xenial64:~/basetest$ docker image push myanjini/basetest:latest

The push refers to repository [docker.io/myanjini/basetest]

5cde1063fc95: Pushed                                                                                       

be8b8b42328a: Mounted from library/busybox                                                                  

latest: digest: sha256:8013bc6a598cdfc41c965ae6fc5ea4ee2678c5247a49e20e981b500fc2a4b74d size: 734



테스트용 이미지(basetest)를 이용해서 이미지를 생성

vagrant@xenial64:~/basetest$ mkdir ~/pulltest && cd ~/pulltest

 

vagrant@xenial64:~/pulltest$ vi Dockerfile

 

FROM  myanjini/basetest


RUN   cat /tmp/version

RUN   cat /tmp/version

 

vagrant@xenial64:~/pulltest$ docker image build -t myanjini/pulltest:latest .

Sending build context to Docker daemon  2.048kB

Step 1/3 : FROM  myanjini/basetest

 ---> 4453428bfeee

Step 2/3 : RUN   cat /tmp/version

 ---> Running in cc5dd4deb935

version = 1

Removing intermediate container cc5dd4deb935

 ---> 8edd72449867

Step 3/3 : RUN   cat /tmp/version

 ---> Running in 52396ba2f7da

version = 1

Removing intermediate container 52396ba2f7da

 ---> 24e041e03114

Successfully built 24e041e03114

Successfully tagged myanjini/pulltest:latest



vagrant@xenial64:~/pulltest$ docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

myanjini/pulltest   latest              24e041e03114        49 seconds ago      1.23MB

myanjini/basetest   latest              4453428bfeee        7 minutes ago       1.23MB

exam/echo           latest              bc76c708ba18        16 minutes ago      750MB

busybox             latest              6858809bf669        5 days ago          1.23MB

golang              1.9                 ef89ef5c42a9        2 years ago         750MB

 

vagrant@xenial64:~/pulltest$ docker image build -t myanjini/pulltest:latest . ⇐ 동일한 조건으로 이미지를 만들면 생성되지 않는 것을 확인

 

vagrant@xenial64:~/pulltest$ docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE

myanjini/pulltest   latest              24e041e03114        About a minute ago   1.23MB

myanjini/basetest   latest              4453428bfeee        8 minutes ago        1.23MB

exam/echo           latest              bc76c708ba18        16 minutes ago       750MB

busybox             latest              6858809bf669        5 days ago           1.23MB

golang              1.9                 ef89ef5c42a9        2 years ago          750MB

 

테스트용 베이스 이미지를 업그레이드 

vagrant@xenial64:~/pulltest$ cd ~/basetest

vagrant@xenial64:~/basetest$ vi Dockerfile

FROM busybox

RUN  echo "version = 2" > /tmp/version

 

vagrant@xenial64:~/basetest$ docker image build -t myanjini/basetest:latest .

Sending build context to Docker daemon  2.048kB

Step 1/2 : FROM busybox

 ---> 6858809bf669

Step 2/2 : RUN  echo "version = 2" > /tmp/version

 ---> Running in 5c65bf03c009

Removing intermediate container 5c65bf03c009

 ---> 1532baf215f4

Successfully built 1532baf215f4

Successfully tagged myanjini/basetest:latest

 

vagrant@xenial64:~/basetest$ docker image push myanjini/basetest:latest

The push refers to repository [docker.io/myanjini/basetest]

6b63e20acee8: Pushed                                                                                        be8b8b42328a: Layer already exists                                                                          latest: digest: sha256:bb12bdacd4de3a7246a7e0b74e3a08caf7f33aae1f3e158ea3b032660aa85c9c size: 734



테스트용 베이스 이미지를 이용한 이미지를 생성

vagrant@xenial64:~/pulltest$ docker image build -t myanjini/pulltest:latest .

Sending build context to Docker daemon  2.048kB

Step 1/3 : FROM  myanjini/basetest

 ---> 1532baf215f4

Step 2/3 : RUN   cat /tmp/version

 ---> Running in 72240485512b

version = 2

Removing intermediate container 72240485512b

 ---> b04bcb647a5c

Step 3/3 : RUN   cat /tmp/version

 ---> Running in e27ab6982343

version = 2

Removing intermediate container e27ab6982343

 ---> 8caa020e4267

Successfully built 8caa020e4267

Successfully tagged myanjini/pulltest:latest

 

vagrant@xenial64:~/pulltest$ docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

myanjini/pulltest   latest              8caa020e4267        28 seconds ago      1.23MB

myanjini/basetest   latest              1532baf215f4        2 minutes ago       1.23MB

<none>              <none>              24e041e03114        5 minutes ago       1.23MB

myanjini/basetest   <none>              4453428bfeee        13 minutes ago      1.23MB

exam/echo           latest              bc76c708ba18        21 minutes ago      750MB

busybox             latest              6858809bf669        5 days ago          1.23MB

golang              1.9                 ef89ef5c42a9        2 years ago         750MB