도커 개념
- 쓰는이유
복잡한 리눅스 애플리케이션을 컨테이너로 묶어서 실행할 수 있음
- 도커란 무엇인가
리눅스 커널에서 제공하는 컨테이너 기술을 이용
- 컨테이너 기술이란?
가상화보다 가벼운 기술
- 가상머신의 등장
컴퓨터 안에서 컴퓨터를 만들어내기 위한 시도(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]
이미지를 가져올 때 다음과 같은 순서에 해당하는 이미지를 사용할 것을 권장
-
공식 배포 이미지
-
Dockerfile이 공개된 이미지
-
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
'리눅스(Linux) > 컨테이너(Container)' 카테고리의 다른 글
리눅스의 컨테이너 격리 (cgroups, namespace) (1) | 2023.07.28 |
---|---|
[Docker] docker inspect (0) | 2021.09.11 |
[도커] 스웜모드 & 스웜모드의서비스 장애 복구 & 서비스 컨테이너에 설정 정보 전달(secret,config) & 도커 스웜 네트워크 & 서비스 디스커버리 (0) | 2020.09.19 |
[도커] 쉘스크립트에 도커 명령어 작성 & Docker compose & swarm (0) | 2020.09.16 |
[도커] 도커이미지(태깅/CMD명령 오버라이딩/필터링/출력형식) & 도커 컨테이너(정지, 재시작, 삭제/wordpress/볼륨) (0) | 2020.09.15 |