1 of 103

Docker Admin (기본)

강사 : 김정석

2 of 103

목차

1장 도커란 ?

2장 도커엔진

3 of 103

1장 도커란 ?

  • 가상머신 과 도커 컨테이너
  • 도커엔진 설치
  • 도커 데몬

4 of 103

도커(Docker)

1장 도커란 ?

  • 도커
    • 리눅스 컨테이너에 여러기능을 추가
    • 애플리케이션을 컨테이너로 좀더 쉽게 사용할 수 있게 만든 오픈소스 프로젝트
    • 2013년 3월 dotCloud 창업자 Solomon Hykes 가 Pycon Conference 에서 발표
    • Go 언어로 작성 된 “The future of linux Containers”
    • 가상 머신과 달리 성능손실이 거의 없는 차세대 클라우드 솔루션으로 주목
  • 도커 프로젝트
    • 도커 컴포즈, 도커머신, 레지스트리, Kitematic 등 다양한 프로젝트 존재
    • 일반적 도커 : 도커엔진을 의미
    • 도커 프로젝트는 도커 엔진을 효율적으로 사용하기 위한 도구들

4

5 of 103

가상머신 과 도커 컨테이너

1장 도커란 ?

  • 가상머신
    • 하이퍼바이저를 통한 가상화로 성능 손실이 발생
    • 완벽한 독립적 공간을 생성 하나, 이미지 용량이 크고 가상머신 배포에 부담

  • 도커 컨테이너
    • 리눅스 Chroot, 네임스페이스, Cgroup 를 사용한 프로세스 단위 격리 환경 구성
    • 애플리케이션 구동을 위한 라이브러리만 포함한 이미지생성, 용량이 작음

5

6 of 103

윈도우 도커엔진 설치

1장 도커란 ?

  • 도커 툴박스(Docker Toolbox)

  • Docker for Windows

  • 설치 환경 : 윈도우 7 64비트 이상
  • 오라클 버추얼박스(VirtualBox) 의 가상화 기술을 이용해 리눅스 가상환경에

도커 엔진을 구성

  • https://www.docker.com/products/docker-toolbox

  • 설치 환경 : 윈도우 10 64비트 이상
  • Windows Hyper-V 를 이용해 가상화 환경 제공
  • https://docs.docker.com/docker-for-windows/install/

6

7 of 103

리눅스 도커엔진 설치

1장 도커란 ?

  • 도커 설치 지원 플랫폼 참조

https://docs.docker.com/engine/installation/#time-based-release-schedule

  • 실습 환경
    • Centos7 최신버전 설치

  • 리눅스 커널 버전 확인
    • 리눅스 커널 버전 3.10 이상 확인

  • Old 도커엔진 버전 삭제

7

# uname -r�3.10.0-514.el7.x86_64

# yum remove docker docker-common docker-selinux docker-engine

8 of 103

리눅스 도커엔진 설치

1장 도커란 ?

  • Yum Util 도구 Device-Mapper 드라이버 설치

  • 최신 도커엔진 설치용 리포지터리 추가

  • 최신 도커엔진 설치

  • 도커엔진 시작

  • 도커엔진 테스트

8

# yum install docker-ce

# systemctl start docker

yum install -y device-mapper-persistent-data lvm2

# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# docker run hello-world

9 of 103

도커데몬

1장 도커란 ?

  • 도커구조

  • 도커 명령어
  • 도커 프로세스
  • dockerd : 도커 엔진의 프로세스는 dockerd 파일로 실행
  • docker 클라이언트는 /var/run/docker.sock 유닉스 소켓을 통해 API 명령 호출
  • docker : 클라이언트 CLI 명령어

9

# which docker�/usr/bin/docker

# ps aux | grep docker�avahi 706 0.0 0.0 30204 1816 ? Ss 05:45 0:00 avahi-daemon: running [docker1.local]�root 923 0.3 2.2 675780 41280 ? Ssl 05:45 0:21 /usr/bin/dockerd --insecure-registry 192.168.35.51:5000

# ls /var/run/docker.sock �/var/run/docker.sock

도커 클라이언트

도커 데몬

docker version

/var/run/docker.sock

개발자

10 of 103

도커데몬

1장 도커란 ?

  • 도커 데몬 실행

  • 데커 데몬 서비스 실행
  • 도커 데몬 서비스 자동 실행 설정
  • 도커 데몬 직접 실행

  • 데커 데몬 실행
  • docker 서비스는 dockerd 명령을 참조해 서비스를 시작

10

# service docker start

�# service docker stop

systemctl enable docker

# dockerd --help��Usage: dockerd COMMAND��A self-sufficient runtime for containers.��Options:� --add-runtime runtime Register an additional OCI compatible runtime (default [])�..

11 of 103

도커데몬

1장 도커란 ?

  • 도커 데몬 실행 옵션 설정

  • dockerd 명령에 옵션 설정
  • 도커 데몬 서비스에서 옵션 변경
  • systemd 서비스의 실행 옵션을 변경 후 적용
  • systemd 버전 업그레이스시 덮어씌워져 변경 될 수 있음
  • docker 서비스용 옵션 설정 파일 생성 후 변경
  • systemd 버전 업그레이드와 관계없이 영구 적용
  • docker 서비스 재시작 후 적용확인

11

# dockerd -D -H tcp://0.0.0.0:2375 --insecure-registry=192.168.100.99:5000 --tls=false

# vi /etc/systemd/system/multi-user.target.wants/docker.service

[Service]�..�ExecStart=/usr/bin/dockerd --insecure-registry 192.168.35.51:5000

..

# mkdir -p /etc/systemd/system/docker.service.d

# vi /etc/systemd/system/docker.service.d/docker.conf�[Service]�..�ExecStart=/usr/bin/dockerd --insecure-registry 192.168.35.51:5000

12 of 103

도커데몬

1장 도커란 ?

  • 도커 데몬 실행 옵션 설정

  • 도커데몬 원격 API 사용가능 옵션
  • -H : 도커 데몬 API 접근 통신 포트 설정
  • 기본 API 값 : -H unix:///var/run/docker.sock (로컬 유닉스 소켓 사용)
  • -H tcp://192.168.99.100:2375 (URL 로 http 요청을 보내 데몬 API 접근)
  • docker 클라이언트의 docker 데몬 주소 설정

12

# dockerd -D -H tcp://192.168.99.100:2375

[client] # export DOCKER_HOST=”tcp://192.168.199.100:2375”

[client] # docker version

[client] # docker -H tcp://192.168.100.2375 version

도커 클라이언트

도커 데몬

docker version

/var/run/docker.sock

개발자

원격호스트

curl 192.168.99.100:2375/version

13 of 103

2장 도커 엔진

  • 도커이미지와 컨테이너
  • 도커 컨테이너 다루기
  • 도커 볼륨
  • 도커 네트워크
  • 도커 이미지
  • 도커 파일(Dockerfile)

14 of 103

도커 이미지와 컨테이너

2장 도커엔진

  • 도커이미지
    • 가상머신 생성시 사용하는 ISO 와 비슷한 개념의 이미지
    • 여러 개의 층으로 된 바이너리 파일로 존재
    • 컨테이너 생성시 읽기 전용으로 사용됨
    • 도커 명령어로 레지스트리로 부터 다운로드 가능

alicek106/ubuntu:14.04

    • 저장소 이름 : 이미지가 저장된 장소, 이름이 없으면 도커 허브(Docker Hub)로 인식
    • 이미지 이름 : 이미지의 역활을 나타낼 이름, 생략 불가능
    • 이미지 버전 : 이미지 버전정보, 생략하면 latest 로 인식

14

저장소 이름

이미지 버전

이미지 이름

15 of 103

도커 이미지와 컨테이너

2장 도커엔진

  • 도커컨테이너
    • 도커 이미지로 부터 생성됨
    • 격리된 파일시스템, 시스템 자원, 네트워크를 사용할 수 있는 독립공간 생성
    • 도커 이미지 목적에 맞게 컨테이너를 생성하는 것이 일반적

예) 웹 서버 도커 이미지로 부터 여러개의 컨테이너 생성 = 개수만큼의 웹서버

    • 이미지를 읽기 전용으로 사용, 이미지 변경 데이터는 컨테이너 계층에 저장
    • 컨테이너의 애플리케이션 설치/삭제는 다른 컨테이너에 영향이 없음

예) 우분투 이미지로 별도의 컨테이너 생성 후 Apache, Mysql 설치/삭제 가능

15

16 of 103

도커 컨테이너 다루기

2장 도커엔진

  • 도커 엔진 버전 확인

  • 컨테이너 생성

  • run : 컨테이너 실행
  • -i : 테이너와 상호 입출력 가능 옵션
  • -t : 셀을 사용할 수 있는 tty 활성화
  • de98b3c4d0e8 : 컨테이너 고유 ID

16

# docker -v�Docker version 17.09.0-ce, build afdb6d4

# docker run -i -t ubuntu:14.04�Unable to find image 'ubuntu:14.04' locally�14.04: Pulling from library/ubuntu�bae382666908: Pull complete �...�b0de1abb17d6: Pull complete �Digest: sha256:6e3e3f3c5c36a91ba17ea002f63e5607ed6a8c8e5fbbddb31ad3e15638b51ebc�Status: Downloaded newer image for ubuntu:14.04

root@de98b3c4d0e8:/#

17 of 103

도커 컨테이너 다루기

2장 도커엔진

  • 컨테이너 파일 시스템 확인

  • 컨테이너 내부에서 빠져나오기

  • exit 또는 Ctrl+D : 컨테이너 빠져나오면서, 컨테이너 정지
  • Ctrl+P,Q : 컨테이너 정지 하지 않고 빠져 나오기

17

root@de98b3c4d0e8:/# ls�bin boot dev etc home lib lib64 media mnt opt proc root run

sbin srv sys tmp usr var�

root@de98b3c4d0e8:/# exit�exit�

18 of 103

도커 컨테이너 다루기

2장 도커엔진

  • Centos7 이미지 내려받기

  • 이미지 목록 확인

  • create : 컨테이너 생성 (생성만 되고 실행은 되지 않음)
  • --name : 컨테이너 이름 지정 옵션

  • 컨테이너 생성 하기

18

# docker pull centos:7�7: Pulling from library/centos�d9aaf4d82f24: Pull complete �Digest: sha256:4565fe2dd7f4770e825d4bd9c761a81b26e49cc9e3c9631c58cfc3188be9505a�Status: Downloaded newer image for centos:7

# docker images�REPOSITORY TAG IMAGE ID CREATED SIZE�centos 7 d123f4e55e12 6 hours ago 197MB�ubuntu 14.04 dea1945146b9 7 weeks ago 188MB

# docker create -i -t --name mycentos centos:7�250c54187b22d9f177435099cd8613581f24429b07809c71fc4f96e16a982d7d

19 of 103

도커 컨테이너 다루기

2장 도커엔진

  • 컨테이너 시작 및 들어가기

  • 고유 ID 이름을 사용하여 컨테이너 관리 가능
  • ID 값중 구분이 가능한 길이만 입력 후 컨테이너 명령 실행

  • 컨테이너 ID 사용

  • start : 컨테이너 시작
  • attach : 컨테이너 들어가기

19

# docker start mycentos�mycentos��[root@docker1 ~]# docker attach mycentos�[root@250c54187b22 /]#

# docker start 250c54�250c54

�# docker attach 250c54�[root@250c54187b22 /]#

20 of 103

도커 컨테이너 다루기

2장 도커엔진

  • 컨테이너 목록 확인

  • IMAGE : 컨테이너 생성시 사용된 이미지 이름
  • COMMAND : 컨테이너 시작시 실행될 명령어 (기본 내장된 명령어 /bin/bash)
  • CREATED : 컨테이너가 생성된 이후 시간
  • STATUS : 컨테이너 상태 (UP : 실행중, Exited : 중지됨, Pause : 일시중지)
  • PORTS : 컨테이너가 오픈한 포트와 호스트에 연결 상태
  • NAMES : 컨테이너 고유 이름, 중복 불가능, 변경가능
  • ps : 현재 실행중인 목록 출력
  • ps -a : 모든 컨테이너 목록 출력

  • 컨테이너 이름변경

20

# docker ps�CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES�250c54187b22 centos:7 "/bin/bash" 25 minutes ago Up 3 minutes mycentos

# docker ps -a�CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES�250c54187b22 centos:7 "/bin/bash" 28 minutes ago Up 6 minutes mycentos�de98b3c4d0e8 ubuntu:14.04 "/bin/bash" 41 minutes ago Exited (0) 36 minutes ago festive_kare

# docker rename mycentos yourcentos

21 of 103

도커 컨테이너 다루기

2장 도커엔진

  • 컨테이너 삭제

  • rm : 컨테이너 삭제 (중지된 컨테이너만 삭제됨)
  • rm -f : 실행중인 컨테이너 삭제
  • stop : 컨테이너 중지

21

# docker ps -a�CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES�250c54187b22 centos:7 "/bin/bash" 28 minutes ago Up 6 minutes mycentos�de98b3c4d0e8 ubuntu:14.04 "/bin/bash" 41 minutes ago Exited (0) 36 minutes ago festive_kare

# docker rm festive_kare�festive_kare

�# docker ps -a�CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES�250c54187b22 centos:7 "/bin/bash" 41 minutes ago Up 19 minutes yourcentos�

# docker rm yourcentos�Error response from daemon: You cannot remove a running container 250c54187b22d9f177435099cd8613581f24429b07809c71fc4f96e16a982d7d. Stop the container before attempting removal or force remove

# docker stop yourcentos�yourcentos���# docker rm yourcentos

22 of 103

도커 컨테이너 다루기

2장 도커엔진

  • 중지된 모든 컨테이너 삭제

  • ps -a : 상태 관계없이 모든 컨테이너 출력
  • ps -q : 컨테이너 ID만 출력

  • 모든 컨테이너 정지 및 삭제

  • $(docker ps -a -q) : 컨테이너 ID값을 실행 명령의 입력값으로 전달

22

# docker container prune�WARNING! This will remove all stopped containers.�Are you sure you want to continue? [y/N] y�Deleted Containers:�250c54187b22d9f177435099cd8613581f24429b07809c71fc4f96e16a982d7d��Total reclaimed space: 0B

# docker ps -a -q�56e89dd10229�5d0ef0ce7510�dc973f626abd

# docker stop $(docker ps -a -q)��# docker rm $(docker ps -a -q)

23 of 103

도커 컨테이너 다루기

2장 도커엔진

  • 컨테이너 네트워크 상태 확인

  • -p : 호스트 포트 와 컨테이너 포트 연결 옵션

특정 호스트 IP:포트 와 컨테이터 포트 연결 가능

  • 컨테이너 생성시 외부 포트 연결

23

#docker run -i -t --name network_test ubuntu:14.04

�root@f0db180e6ca4:/# ifconfig�eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02 � inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0� UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1� RX packets:6 errors:0 dropped:0 overruns:0 frame:0� TX packets:0 errors:0 dropped:0 overruns:0 carrier:0� collisions:0 txqueuelen:0 � RX bytes:508 (508.0 B) TX bytes:0 (0.0 B)��lo Link encap:Local Loopback � inet addr:127.0.0.1 Mask:255.0.0.0� UP LOOPBACK RUNNING MTU:65536 Metric:1� RX packets:0 errors:0 dropped:0 overruns:0 frame:0� TX packets:0 errors:0 dropped:0 overruns:0 carrier:0� collisions:0 txqueuelen:1 � RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

# docker run -i -t --name myserver -p 80:80 ubuntu:14.04

# docker run -i -t --name webserver -p 3306:3306 -p 192.168.35.51:8888:8080 ubuntu:14.04

24 of 103

컨테이너 애플리케이션 구축

2장 도커엔진

  • 서비스 컨테이너 화
  • 컨테이너에 하나의 애플리케이션만 실행
  • 컨테이너간 독립성 보장으로 버전관리 및 소스모듈화 등이 쉬움
  • 한 컨테이너에 프로세스 하나만 실행 = 도커 철학

  • 워드프레스 블로그 서비스 구축

  • 데이타베이스 와 워드프레스 웹서버 컨테이너 생성 및 연동
  • Mysql 컨테이너 생성 및 실행

  • -d : Detached 모드, 백그라운드 에서 동작하는 애플리케이션으로 실행
  • -e : 내부 환경 변수 설정

24

# docker run -d \�> --name wordpressdb \�> -e MYSQL_ROOT_PASSWORD=password \�> -e MYSQL_DATABASE=wordpress \�> mysql:5.7

25 of 103

컨테이너 애플리케이션 구축

2장 도커엔진

  • 워드프레스 블로그 서비스 구축
  • Wordpress 웹 컨테이너 생성

  • --link : 컨테이너간 접근시 별명으로 접근 가능하도록 설정

wordpressdb 컨테이너를 mysql 별명으로 접근가능

주의사항 : --link 에 입력된 컨테이너가 중지 또는 존재하지 않으면 실행 불가능

  • -p 80 : 호스트의 특정포트와 컨테이너의 80포트를 연결
  • exec : 컨테이너 내부에서 명령어를 실행한 뒤 그 결과값을 반환

25

# docker run -d \�> -e WORDPRESS_DB_PASSWORD=password \�> --name wordpress \�> --link wordpressdb:mysql \�> -p 80 \�> wordpress

# docker exec wordpress /usr/bin/apt-get update

# docker exec wordpress /usr/bin/apt-get install iputils-ping -y

# docker exec wordpress ping -c 2 mysql�PING mysql (172.17.0.2): 56 data bytes�64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.076 ms�64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.062 ms�--- mysql ping statistics ---�2 packets transmitted, 2 packets received, 0% packet lo

26 of 103

컨테이너 애플리케이션 구축

2장 도커엔진

  • 워드프레스 블로그 서비스 구축
  • 컨테이너 확인

  • wordpress 웹서버 80포트는 호스트의 32770 포트로 연결됨

26

# docker ps�CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES�8ba76563b8e1 wordpress "docker-entrypoint..." 4 minutes ago Up 4 minutes 0.0.0.0:32770->80/tcp wordpress�5cfe97da35cb mysql:5.7 "docker-entrypoint..." 6 minutes ago Up 6 minutes 3306/tcp wordpressdb

27 of 103

도커 볼륨

2장 도커엔진

  • 컨테이너 레이어
  • 이미지로 컨테이너를 생성하면 이미지는 읽기전용
  • 컨테이너 변경정보는 변경사항만 별도로 저장, 컨테이너 정보 보존

예) mysql 의 DB 저장 데이터는 컨테이너 레이어 공간에 저장됨

  • 컨테이너 레이어의 데이터는 컨테이너 삭제와 함께 삭제되어 복구 불가능

  • 볼륨
  • 컨테이너 데이터를 영구적으로 보관 가능
  • 호스트볼륨을 공유 또는 볼륨 컨테이너 이용가능

27

28 of 103

도커 볼륨

2장 도커엔진

  • 호스트 공유 볼륨 공유
  • -v : 호스트의 디렉토리 및 파일을 컨테이너의 디렉토리 및 파일과 공유

리눅스 시스템 관점 : 파일 및 디렉토리를 마운트하는 구조

호스트 /home/wordpress_db =공유= 컨테이너 /var/lib/mysql

  • 호스트 공유 볼륨을 사용한 Mysql 컨테이너 생성

  • 호스트 /home/wordpress_db 폴더확인

  • wordpressdb_hostvolume 컨테이너의 mysql 마운트 정보

28

# docker run -d \�> --name wordpressdb_hostvolume \�> -e MYSQL_ROOT_PASSWORD=password \�> -e MYSQL_DATABASE=wordpress \�> -v /home/wordpress_db:/var/lib/mysql \�> mysql:5.7

# ls /home/wordpress_db�auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys�ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem wordpress

# docker exec wordpressdb_hostvolume mount | grep mysql�/dev/mapper/centos-root on /var/lib/mysql type xfs (rw,relatime,attr2,inode64,noquota)

29 of 103

도커 볼륨

2장 도커엔진

  • 볼륨 컨테이너 공유
  • --volumes-from : 다른 컨테이너의 볼륨을 공유
  • 호스트 공유 볼륨을 사용한 Mysql 컨테이너 생성

  • 새로 성성된 컨테이너의 공유된 폴더 확인

  • -v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유

29

# docker run -i -t \�> --name volumes_from_container \�> --volumes-from wordpressdb_hostvolume \�> ubuntu:14.04

# ls /var/lib/mysql/ �auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 mysql private_key.pem server-cert.pem sys�ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 performance_schema public_key.pem server-key.pem wordpress

# mount | grep mysql�/dev/mapper/centos-root on /var/lib/mysql type xfs (rw,relatime,attr2,inode64,noquota)�

30 of 103

도커 볼륨

2장 도커엔진

  • 도커 자체 제공 볼륨 기능
  • 도커 볼륨 생성

  • 새로 생성된 볼륨 확인

  • myvolume_1 볼륨 컨테이너 생성 후 파일 생성

  • Myvolume_2 볼륨 컨테이너 생성 후 볼륨 파일 확인

30

# docker volume create --name myvolume�myvolume

# docker volume ls�DRIVER VOLUME NAME�local myvolume

# docker run -i -t --name myvolume_1 \�> -v myvolume:/root/ \�> ubuntu:14.04

root@0259f65f9603:/# echo hello, volume! >> /root/volume

# docker run -i -t --name myvolume_2 \�> -v myvolume:/root/ \�> ubuntu:14.04�root@493dae2bc70b:/# cat /root/volume �hello, volume!

31 of 103

도커 볼륨

2장 도커엔진

  • 볼륨 정보
  • 볼륨 정보 확인

  • 도커 엔진에서 볼륨은 디렉토리에 상응하는 단위
  • 볼륨은 다양한 스토리지 백엔드 플러그인 드라이버 사용가능
  • 기본적으로 제공되는 드라이버는 local
  • inspect : 컨테이너, 이미지, 볼륨 등 도커 구성 단위의 정보 확인 가능
  • -- type : 정보를 확인할 종류를 명시 (image 또는 volume)

31

# docker inspect --type volume myvolume�[� {� "CreatedAt": "2017-11-04T20:00:59+09:00",� "Driver": "local",� "Labels": {},� "Mountpoint": "/var/lib/docker/volumes/myvolume/_data",� "Name": "myvolume",� "Options": {},� "Scope": "local"� }�]

32 of 103

도커 볼륨

2장 도커엔진

  • 컨테이너 생성시 볼륨 생성
  • volume_auto 볼륨 컨테이너 생성

  • 볼륨 정보 확인

  • -v /root : 컨테이너 생성시 /root 폴더용 볼륨이 자동 생성됨
  • c2fd49 로 시작하는 ID 의 볼륨이 생성됨
  • 컨테이너 정보 확인

32

# docker run -i -t --name volume_auto \�> -v /root \�> ubuntu:14.04

# docker volume ls�DRIVER VOLUME NAME�local c3fd49eb43304d610d2cc4528b2fef1594f9dcb52b5f04772932294f2948465a�local myvolume

# docker container inspect volume_auto | grep c3fd49� "Name": "c3fd49eb43304d610d2cc4528b2fef1594f9dcb52b5f04772932294f2948465a",� "Source": "/var/lib/docker/volumes/c3fd49eb43304d610d2cc4528b2fef1594f9dcb52b5f04772932294f2948465a/_data",

33 of 103

도커 볼륨

2장 도커엔진

  • 볼륨 디렉토리 쓰기권한 설정
  • 쓰기 제한 볼륨 컨테이너 생성

  • -v [볼륨명]:Z : 다른 컨테이너가 볼륨을 쓰지 못하도록 쓰기권한 제어
  • datavol2 컨테이너는 /root/data1 는 쓰기 가능, /root/data2 쓰기 불가능

33

# docker run -i -t --name datavol1 \�> -v /root/data1:z \

> -v /root/data2:Z \�> ubuntu:14.04 \

> bash

# docker run --name datavol2 \

> --volumes-from=datavol1 \�> -d ubuntu:14.04 \

> touch /root/data2 \

touch: cannot touch ‘/data2/mydata’: Permission denied

! 에러발생

34 of 103

도커 볼륨

2장 도커엔진

  • 볼륨 디렉토리 쓰기권한 설정
  • RO/RW 권한 볼륨 컨테이너 생성
  • -v [호스트볼륨]:[볼륨명]:rw : 볼륨 읽기 쓰기 권한 제공
  • datavol2 컨테이너는 /root/data1 는 쓰기 가능, /root/data2 쓰기 불가능
  • -v [호스트볼륨]:[볼륨명]:ro : 볼륨 읽기 권한만 제공

34

# docker run -i -t --name datavol1 \�> -v /home/data1:/root/data1:rw \

> -v /home/data2:/root/data2:ro \�> ubuntu:14.04 \

> bash

# docker run -i -t --name datavol2 \

> --volumes-from=datavol1 \�> ubuntu:14.04 \

> touch /root/data2/mydata \

touch: cannot touch ‘/root/data2/mydata’: Read-only file system

35 of 103

도커 볼륨

2장 도커엔진

  • 볼륨 삭제
  • 사용하지 않은 볼륨 한번에 삭제

  • 스테이트리스(stateless) 컨테이너 : 데이터를 외부 볼륨에 저장하는 방식
  • 스테이트 풀(stateful) 컨테이너 : 데이터를 컨테이너 내부에 저장 하는 방식
  • 볼륨은 컨테이너를 삭제 해도 자동으로 삭제 되지 않는다.

35

# docker volume prune�WARNING! This will remove all volumes not used by at least one container.�Are you sure you want to continue? [y/N] y�Deleted Volumes:�myvolume�c3fd49eb43304d610d2cc4528b2fef1594f9dcb52b5f04772932294f2948465a��Total reclaimed space: 245.1MB

36 of 103

도커 네트워크

2장 도커엔진

  • 네트워크 구조
  • 컨테이너 네트워크 정보

  • 컨테이너 내부 IP는 순차적으로 할당
  • 컨테이너 생성, 재시작시 변경될 수 있음
  • 호스트에 veth 디바이스가 생성됨
  • 컨테이너 마다 외부 통신을 위해 호스트에 가상 네트워크 인터페이스(veth) 생성
  • 호스트 네트워크 정보

36

root@d286b8157298:/#

eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02 � inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0� ..

# ifconfig�docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500� inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0�..�veth95fa667: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500� inet6 fe80::dc85:72ff:fe5e:6285 prefixlen 64 scopeid 0x20<link>�..

37 of 103

도커 네트워크

2장 도커엔진

  • 네트워크 구조
  • 호스트 docker0 브리지 정보

  • 호스트 veth 디바이스는 docker0 브리지에 바인딩됨

37

# brctl show�bridge name bridge id STP enabled interfaces�docker0 8000.024252d9f225 no veth95fa667

38 of 103

도커 네트워크

2장 도커엔진

  • 네트워크 기능
  • 호스트 도커 네트워크 리스트

  • dockr0 는 기본제공 브리지
  • 다양한 네트워크 드라이버 제공 (bridge, host, none, container, overlay)
  • 플러그인 및 솔루션 (weave, flannel, openvswitch)
  • 호스트 도커 브리지 설정 정보

38

# docker network ls�NETWORK ID NAME DRIVER SCOPE�c5a1645cca4e bridge bridge local�1fcd84e8dc17 docker_gwbridge bridge local�6ed0fb9a6fff host host local�61c80b79c426 none null local

# docker inspect bridge�[� {� "Name": "bridge",�� "Subnet": "172.17.0.0/16",� "Gateway": "172.17.0.1"� }�..

39 of 103

도커 네트워크

2장 도커엔진

  • 브리지 생성하기
  • 호스트에 mybridge 네트워크 생성

  • mybridge 네트워크 사용 컨테이너 생성

  • ip 할당을 임의로 설정한 네트워크 생성

  • 컨테이너에 새로운 ip 가 할당됨 확인

39

# docker network create --driver bridge mybridge�23daa7904394dfccd836c56f1ccdc6ab0919e87d5e5fb84f4574148f384d4cae

# docker run -i -t --name mynetwork_container \�> --net mybridge \�> ubuntu:14.04

root@57dd1662ce3d:/#

root@57dd1662ce3d:/# ifconfig�eth0 Link encap:Ethernet HWaddr 02:42:ac:13:00:02 � inet addr:172.19.0.2 Bcast:0.0.0.0 Mask:255.255.0.0

# docker network create --driver bridge \�> --subnet=172.72.0.0/16 \�> --ip-range=172.72.0.0/24 \�> --gateway=172.72.0.1 \�> my_custom_network�a4709da563a5b2808d598b0adae5941ced4eadbb791502276ce59329f50212be

40 of 103

도커 네트워크

2장 도커엔진

  • 호스트(host) 네트워크
  • 호스트 네트워크를 사용한 network_host 컨테이너 생성

  • 컨테이너 이름이 호스트 도메인명 과 동일함
  • 별도의 포트 연결 없이 컨테이너 애플리케이션 서비스 가능
  • 컨테이너에 호스트 네트워크를 그대로 사용가능
  • 네트워크를 별도로 만들 필요 없음
  • 논(none) 네트워크
  • 호스트 네트워크를 사용한 network_host 컨테이너 생성

  • 네트워크를 사용하지 않는 구조

40

# docker run -i -t --name network_host \�> --net host \�> ubuntu:14.04�root@docker1:/#

# docker run -i -t --name network_none \�> --net none \�> ubuntu:14.04

41 of 103

도커 네트워크

2장 도커엔진

  • 컨테이너(Container) 네트워크
  • 호스트 네트워크를 사용한 network_host 컨테이너 생성

  • --net container:[다른 컨테이너 이름/ID] : 컨테이너 네트워크로 연결
  • 다른 컨테이너 네트워크를 공유
  • IP, MAC, NIC 의 속성을 공유함
  • container_1 과 container2 네트워크 확인

41

# docker run -i -t -d --name network_container_1 ubuntu:14.04�6a175d467e5a37e504c9a6b994efa89c451317bd917744488a3ce0f45a7613e8

# docker run -i -t -d --name network_container_2 \�> --net container:network_container_1 \�> ubuntu:14.04�bb0574edfb6c99c970caed8d0c78545b1863956254c55b830decb7111a8c77ef

# docker exec network_container_1 ifconfig�eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:03 � inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0��# docker exec network_container_2 ifconfig�eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:03 � inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0

42 of 103

도커 네트워크

2장 도커엔진

  • 브리지 네트워크와 --net-alias
  • service 호스트 이름으로 연결가능한 3개 컨테이너 생성

  • --net-alias [호스트 이름] : 컨테이너에 접근 가능한 호스트이름 설정
  • 동일한 호스트 이름으로 여러 개의 컨테이너에 접근 가능
  • network_alias_container1 컨테이너의 IP 확인

42

# docker run -i -t -d --name network_alias_container1 \�> --net mybridge \�> --net-alias service ubuntu:14.04�8b1b201bc29d93c1a35f541647c87d2379749c0b1d3e3240a5f71129862e24f1

�# docker run -i -t -d --name network_alias_container2 \�> --net mybridge \�> --net-alias service ubuntu:14.04�eb5596c7a23596280debfb5c32afb2871c3644914516458707ab862584fd4730�

# docker run -i -t -d --name network_alias_container3 \�> --net mybridge \�> --net-alias service ubuntu:14.04�2832a48f2e3531d28cd5e37c3ee1dc3df870d760896c2a632c0ab7a080431d08

# docker inspect network_alias_container1 | grep IPAddress� "SecondaryIPAddresses": null,� "IPAddress": "",� "IPAddress": "172.19.0.3"

43 of 103

도커 네트워크

2장 도커엔진

  • 브리지 네트워크와 --net-alias
  • alias_ping 컨테이너 생성 후 service 호스트 ping 테스트

  • 도커 엔진 내장 DNS 가 --net-alias 옵션으로 service 이름에 대해 IP를 전달

43

# docker run -i -t --name network_alias_ping \�> --net mybridge \�> ubuntu:14.04

�root@0c42c30fa6bb:/# ping -c 1 service�PING service (172.19.0.4) 56(84) bytes of data.�64 bytes from network_alias_container2.mybridge (172.19.0.4): icmp_seq=1 ttl=64 time=0.056 ms��root@0c42c30fa6bb:/# ping -c 1 service�PING service (172.19.0.5) 56(84) bytes of data.�64 bytes from network_alias_container3.mybridge (172.19.0.5): icmp_seq=1 ttl=64 time=0.059 ms��root@0c42c30fa6bb:/# ping -c 1 service�PING service (172.19.0.3) 56(84) bytes of data.�64 bytes from network_alias_container1.mybridge (172.19.0.3): icmp_seq=1 ttl=64 time=0.059 ms

44 of 103

컨테이너 로깅

2장 도커엔진

  • json-file 로그 사용
  • 로그 확인

  • logs : 컨테이너 로그확인
  • 표준출력(StdOut) 과 에러(StdErr) 로그를 별도의 메타데이터 파일로 저장
  • 로그파일 : /var/lib/docker/containers/컨테이너ID/컨테이너ID-json.log
  • 특정 시간 이후 로그 확인 (Unix 타임스템프 사용)

  • 로그 스트림 출력

44

# docker logs mysql�Initializing database�2017-11-05T10:20:38.822037Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).�..

# docker logs --since 1509877247 mysql�2017-11-05T10:20:47.502681Z 0 [Note] InnoDB: Shutdown completed; log sequence number 12169513�2017-11-05T10:20:47.503756Z 0 [Note] InnoDB: Removed temporary tablespace data file: "ibtmp1"�..

# docker logs -f -t mysql�..

45 of 103

컨테이너 로깅

2장 도커엔진

  • syslog 로그 사용
  • syslogtest 컨테이너 생성

  • 컨테이너 로그를 syslog로 보내 저장
  • 호스트의 message 로그에 기록된 로그 확인

  • 로그 드라이버
  • 컨테이너 로그를 저장하는 다양한 로그 드라이버 제공
  • 대표적인 로그 드라이버 : syslog, journald, fluentd, awslogs

45

# docker run -d --name syslog_container \�> --log-driver=syslog \�> ubuntu:14.04 \�> echo syslogtest

# cat /var/log/messages | grep syslogtest�Nov 5 19:39:54 docker1 314d3db5ee77[946]: syslogtest

46 of 103

컨테이너 로깅

2장 도커엔진

  • rsyslog 서버 컨테이너 생성 및 설정

  • Rsyslog 서비스 재시작

  • 원격 syslog 서버 저장방법
  • syslog 원격 서버 설치, 로그 정보를 원격서버로 전달
  • 원격 로그 저장방법 rsyslog 사용,
  • -h : 컨테이너 호스트 이름 지정

46

# docker run -i -t \�> -h rsyslog \�> --name rsyslog_server \�> -p 514:514 -p 514:514/udp \�> ubuntu:14.04

root@rsyslog:/# vi /etc/rsyslog.conf�..

# provides UDP syslog reception�$ModLoad imudp�$UDPServerRun 514�..�# provides TCP syslog reception�$ModLoad imtcp�$InputTCPServerRun 514�..

root@rsyslog:/# service rsyslog restart

47 of 103

컨테이너 로깅

2장 도커엔진

  • 클라이언트 컨테이너 생성 및 로그생성

  • Rsyslog 서버 syslog 확인

  • 원격 syslog 서버 저장방법
  • --log-opt : 로그 드라이버에 추가할 옵션

syslog-address = 로그 서버 주소

tag = 로그 저장시 사용될 태그 정보, 로그 분류 용도

47

# docker run -i -t \�> --log-driver=syslog \�> --log-opt syslog-address=tcp://192.168.35.51:514 \�> --log-opt tag="mylog" \�> ubuntu:14.04

root@599eebe7568c:/# echo test�test

root@rsyslog:/# cat -f /var/log/syslog �Nov 5 20:01:09 192.168.35.51 mylog[946]: #033]0;root@599eebe7568c: /#007root@599eebe7568c:/# echo est#010 #010#010 #010#010 #010test#015�Nov 5 20:01:09 192.168.35.51 mylog[946]: test#015

48 of 103

컨테이너 자원

2장 도커엔진

  • 컨테이너 자원 할당 제한
  • 컨테이너 자원 제한 사용량 확인 방법

  • Update 옵션을 이용 컨테이너 자원제한 변경 방법

# docker update (변경할 자원 제한) (컨테이너 이름)

ex) # docker update --cpuset-cpus=1 centos ubuntu

  • 컨테이너 생성시 자원제한 값을 할당 하지 않으면 모든 자원을 제한 없이 사용
  • 자원 할당 제한으로 호스트의 자원을 관리해야 함

48

# docker inspect rsyslog_server�“HostConfig” : {

..

"DiskQuota": 0,� "KernelMemory": 0,� "MemoryReservation": 0,� "MemorySwap": 0,� "MemorySwappiness": null,� "OomKillDisable": false,� "PidsLimit": 0,� "Ulimits": null,� "CpuCount": 0,� "CpuPercent": 0,� "IOMaximumIOps": 0,� "IOMaximumBandwidth": 0�..

49 of 103

컨테이너 자원

2장 도커엔진

  • 컨테이너 메모리 제한
  • 메모리 제한 컨테이너 생성

  • 메모리 설정 값 확인

  • --memory : 컨테이너 메모리 용량 제한 설정
  • 스왑 메모리값 제한 컨테이너 생성

49

# docker run -d \�> --memory="1g" \�> --name memeory_1g \�> nginx

# docker inspect memory_1g | grep \"Memory\"� "Memory": 1073741824,

# docker run -it --name swap_500m \�> --memory=200m \�> --memory-swap=500m \�> ubuntu:14.04

50 of 103

컨테이너 자원

2장 도커엔진

  • 컨테이너 CPU 제한
  • CPU 제한 컨테이너 생성
  • stress 패키지 설치 및 cpu 부하 발생

  • --cpu-shares : 상태적인 값을 지정 (1024=cpu 할당비율 1)

2048 값은 일반 컨테이너 보다 CPU 할당 시간이 2배

  • 호스트의 cpu 사용량 확인

50

# docker run -i -t --name cpu_share \�> --cpu-shares 2048 \�> ubuntu:14.04

# apt-get update

# apt-get install stress

# stress --cpu 1

# ps aux | grep stress�..�root 3624 99.6 0.0 7316 96 pts/0 R+ 21:03 3:12 stress --cpu 1�..�root 3753 44.4 0.0 7316 100 pts/0 R+ 21:04 2:08 stress --cpu 1

51 of 103

컨테이너 자원

2장 도커엔진

  • 컨테이너 CPU 제한
  • 특정 CPU 코어 사용 제한
  • htop 패키지 설치 (CPU 코어 사용 확인)
  • --cpuset-cpu : 컨테이너가 특정 CPU만 사용하도록 설정
  • htop 명령어 실행, 3번째 코어 CPU 사용량 확인

51

# docker run -i -t --name cpuset_2 \�> --cpuset-cpus=2 \�> ubuntu:14.04

root@46667cb2da51:/# stress --cpu 1

# yum -y install epel-release

# yum -y install htop

52 of 103

컨테이너 자원

2장 도커엔진

  • 컨테이너 CPU 제한
  • 특정 CPU 스케줄 시간 조절 (--cpu-period , --cpu-quota)
  • 직관적 CPU 사용량 설정 (--cpus)

  • CFS(Completely Fair Scheduler) 주기는 기본값 100ms =100000
  • 기본값 100000 중 25000 (¼) 를 할당
  • CPU 할당 스케쥴 시간이 ¼ 로 줄었기 때문에 성능도 ¼ 로 줄어듬
  • --cpu-share=512 또는 --cpu-period=100000 --cpu-quota=50000 과 동일
  • 호스트 CPU 중 50% 사용

52

# docker run -i -t --name quota_1_4 \�> --cpu-period=100000 \�> --cpu-quota=25000 \�> ubuntu:14.04

# docker run -i -t --name cpus_container \�> --cpus=0.5 \�> ubuntu:14.04

53 of 103

컨테이너 자원

2장 도커엔진

  • Block I/O 제한
  • 초당 쓰기 1mb 제한 컨테이너 생성

  • --device-write-bps, --device-read-bps : 쓰고 읽는 작업의 초당 제한 설정
  • --device-write-iops, --device-read-iops : 상대값을 이용한 쓰고 읽는 작업 속도 제한
  • kb, mb, gb 단위로 제한 가능
  • 컨테이너가 파일을 읽고 쓰는 대역폭을 제한
  • Direct I/O 의 경우만 블록 입출력이 제한 됨, Buffered I/O 는 제한되지 않음
  • 블록 쓰기 테스트

53

# docker run -i -t \�> --device-write-bps /dev/mapper/centos-root:1mb \�> ubuntu:14.04

root@4f1f9af26e72:/#

root@4f1f9af26e72:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct�10+0 records in�10+0 records out�10485760 bytes (10 MB) copied, 10.009 s, 1.0 MB/s

54 of 103

컨테이너 자원

2장 도커엔진

  • Block I/O 제한
  • 5mb 제한 컨테이너 에서 블록 쓰기 테스트

  • iops 옵션을 통한 블록 쓰기 제한 컨테이너 생성

54

docker run -i -t --device-write-bps /dev/mapper/centos-root:5mb ubuntu:14.04�root@ba1391a7498c:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct�10+0 records in�10+0 records out�10485760 bytes (10 MB) copied, 2.00846 s, 5.2 MB/s

# docker run -i -t --device-write-iops /dev/mapper/centos-root:5 ubuntu:14.04

root@80ad9f23ba27:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct

10+0 records in

10+0 records out

10485760 bytes (10 MB) copied, 4.00267 s, 2.6 MB/s

# docker run -i -t --device-write-iops /dev/mapper/centos-root:10 ubuntu:14.04

root@4d1eb087a06b:/# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct

10+0 records in

10+0 records out

10485760 bytes (10 MB) copied, 2.00278 s, 5.2 MB/s

55 of 103

도커 이미지

2장 도커엔진

  • 도커 이미지
  • 도커 허브 이미지 검색

  • STARS : 도커 사용자로 부터 즐기찾기 수
  • 도커 이미지는 도커 허브(Docker Hub)라는 중앙 이미지 저장소에서 다운로드함
  • docker create, docker run, docker pull 명령어로 이미지 다운로드 가능
  • 도커 계정 생성후 이미지를 업로드/다운로드 가능
  • 도커 허브 비공개 저장소는 요금을 지불 해야 사용 가능
  • 이미지 저장소를 직접 구축해 사용 가능 = 도커 사설 레지스트리

55

# docker search ubuntu�NAME DESCRIPTION STARS OFFICIAL AUTOMATED�ubuntu Ubuntu is a Debian-based Linux operating s... 6770 [OK] �dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC 141 [OK]�rastasheep/ubuntu-sshd Dockerized SSH service, built on top of of... 115 [OK]�ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 88 [OK]�ubuntu-upstart Upstart is an event-based replacement for ... 80 [OK]

56 of 103

도커 이미지

2장 도커엔진

  • 이미지 구조 이해

56

(1) ubuntu:15.04 (2) commit_test:first (3) commit_test:second

(1)

(2)

(3)

57 of 103

도커 이미지

2장 도커엔진

  • 도커 이미지 생성
  • 이미지 생성을 위한 컨테이너 생성

  • docker commit 명령을 사용, first commit 이미지 생성

  • Docker commit [option] CONTAINER [REPOSITORY[:TAG]]
  • -a : author (이미지 작성자 ) 메타데이터를 이미지에 저장
  • -m : 커밋 메세지를 뜻, 이미지 설명 입력
  • 이미지 생성 확인

57

# docker run -i -t --name commit_test ubuntu:14.04�root@423213a9e410:/# echo test_first! >> first

# docker commit \�> -a "user1" -m "my first commit" \�> commit_test \�> commit_test:first�sha256:175f54ed8eb03cbd3eb52dcf0fd9af84b099abfe00f85007c65424b7bbf513d4

[root@docker1 ~]# docker images�REPOSITORY TAG IMAGE ID CREATED SIZE�commit_test first 175f54ed8eb0 3 minutes ago 188MB�ubuntu 14.04 dea1945146b9 7 weeks ago 188MB

58 of 103

도커 이미지

2장 도커엔진

  • 도커 이미지 생성
  • second 이미지 생성을 위한 컨테이너 생성

  • docker commit 명령을 사용, second commit 이미지 생성

  • 이미지 생성 확인

58

# docker run -i -t --name commit_test2 commit_test:first�root@77edfe2e5e69:/# echo test_second! >> second

# docker commit \�> -a "user1" -m "my second commit" \�> commit_test2 \�> commit_test:second�sha256:c87fc1137ca81f04246608adc68efb47cfd0c5c37ca5989335eea6a93ad14c50

# docker images�REPOSITORY TAG IMAGE ID CREATED SIZE�commit_test second c87fc1137ca8 54 seconds ago 188MB�commit_test first 175f54ed8eb0 29 minutes ago 188MB�ubuntu 14.04 dea1945146b9 7 weeks ago 188MB

59 of 103

도커 이미지

2장 도커엔진

  • 도커 이미지 생성
  • 이미지 정보 확인

  • docker inspect : 이미지 레이어의 아이디 값 확인
  • commit 실행으로 새로운 이미지 생성시 마다 레이어 값이 추가됨

59

# docker inspect ubuntu:14.04

"Layers": [�..� "sha256:7fb9ba64f896b3a7001af9604a44243cfa663c84e414cd298ee8bc754feb5aa1",�..�

# docker inspect commit_test:first� "Layers": [�..� "sha256:7fb9ba64f896b3a7001af9604a44243cfa663c84e414cd298ee8bc754feb5aa1",� "sha256:3d40b70326a382e5d8664d65bf92d2e1fd97192a2038db41dfdc40336d6945ad"�..�

# docker inspect commit_test:second� "Layers": [�..� "sha256:7fb9ba64f896b3a7001af9604a44243cfa663c84e414cd298ee8bc754feb5aa1",� "sha256:3d40b70326a382e5d8664d65bf92d2e1fd97192a2038db41dfdc40336d6945ad",� "sha256:11c4899c1d01be18ecb766770e927d3edc2bbfafc9366e2af6ad5d5d08ad2f9e"�..

60 of 103

도커 이미지

2장 도커엔진

  • 도커 이미지 생성
  • 이미지 히스토리 확인

  • docker history [이미지명] : 이미지 생성 히스토리 출력

60

# docker history commit_test:second�IMAGE CREATED CREATED BY SIZE COMMENT�c87fc1137ca8 9 minutes ago /bin/bash 13B my second commit�175f54ed8eb0 37 minutes ago /bin/bash 12B my first commit�dea1945146b9 7 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B �<missing> 7 weeks ago /bin/sh -c mkdir -p /run/systemd && echo '... 7B �<missing> 7 weeks ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\... 2.75kB �<missing> 7 weeks ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B �<missing> 7 weeks ago /bin/sh -c set -xe && echo '#!/bin/sh' >... 195kB �<missing> 7 weeks ago /bin/sh -c #(nop) ADD file:8f997234193c2f5... 188MB

61 of 103

도커 이미지

2장 도커엔진

  • 도커 이미지 삭제
  • commit_test:first 이미지 삭제

  • 이미지를 사용 중인 컨테이너 존재, 이미지 레이어 삭제 할 수 없음
  • docker rm -r 로 삭제 가능, 이미지 레이어는 삭제되지 않고 이름만 삭제됨
  • 컨테이너 삭제 후 이미지 삭제

  • Untagged : 이미지 레이어에 부여된 이름만 삭제, 실제 레이어 삭제 안됨

commit_test:second 레이어가 참조하고 있기 때문

61

# docker rmi commit_test:first�Error response from daemon: conflict: unable to remove repository reference "commit_test:first" (must force) - container 77edfe2e5e69 is using its referenced image 175f54ed8eb0

# docker stop commit_test2 && docker rm commit_test2�commit_test2

�# docker rmi commit_test:first�Untagged: commit_test:first

62 of 103

도커 이미지

2장 도커엔진

  • 도커 이미지 삭제
  • commit_test:second이미지 삭제

  • Untagged : 이름이 삭제 되었고,
  • Deleted : 실제 이미지 레이어 삭제되었음을 의미함

이미지 삭제는 부모 레이어가 존재 하지 않을때 삭제됨

  • Ubuntu:14.04 이미지는 삭제 되지 않음
  • 이름만 지워진 댕글링(Dangling) 이미지 확인

  • 댕글링(Dangling) 이미지 한꺼번에 삭제

62

# docker rmi commit_test:second�Untagged: commit_test:second�Deleted: sha256:c87fc1137ca81f04246608adc68efb47cfd0c5c37ca5989335eea6a93ad14c50�Deleted: sha256:8f201d21712daecc4b9357cfa191e072f400e8c6c446fb99a52613277c9ebab7�Deleted: sha256:175f54ed8eb03cbd3eb52dcf0fd9af84b099abfe00f85007c65424b7bbf513d4�Deleted: sha256:1081a3cb494cf37f1821d0f410582e5939cdbeaa90244b2e569690686adde3f0

# docker images -f dangling=true

# docker image prune

63 of 103

도커 이미지

2장 도커엔진

  • 도커 이미지 추출
  • Ubuntu14.04 이미지 추출

  • docker save : 컨테이너 커맨드, 이미지 이름과 태그, 메타데이터 포함 이미지 추출
  • - o : 추출될 파일명 지정
  • 이미지 로드

  • docker load : save 명령어로 추출된 이미지 로드

기존 이미지 정보를 모두 포함하므로 동일하게 이미지가 생성됨

63

# docker save -o ubuntu_14_04.tar ubuntu:14.04

# ls ubuntu_14_04.tar �ubuntu_14_04.tar

# docker rmi ubuntu:14.04�Untagged: ubuntu:14.04�Untagged: ubuntu@sha256:6e3e3f3c5c36a91ba17ea002f63e5607ed6a8c8e5fbbddb31ad3e15638b51ebc�Deleted: sha256:dea1945146b96542e6e20642830c78df702d524a113605a906397db1db022703

..

# docker load -i ubuntu_14_04.tar �c47d9b229ca4: Loading layer [==================================================>] 196.9MB/196.9MB�..�Loaded image: ubuntu:14.04

64 of 103

도커 이미지

2장 도커엔진

  • 도커 이미지 추출
  • 컨테이너 정보 없이 파일시스템만 추출

  • docker export : 컨테이너 이미지를 파일로 추출
  • docker import : export 명령어로 추출된 이미지 파일을 새로운 이미지로 저장
  • docker save 명령어로 이미지를 만들면 컨테이너 설정 정보도 함께 저장됨

ex) 컨테이너 변경사항, detached 모드, 컨테이너 커맨드 등

  • 이미지를 파일로 추출하면 개수 만큼 디스크 공간을 차지함

64

# docker export -o rootFS.tar mycontainer

# docker import rootFS.tar myimage:0:0

65 of 103

도커 이미지

2장 도커엔진

  • 도커 이미지 배포
  • 파일배포

추출한 이미지 파일을 복사 후 저장

파일용량이 크고 도커엔진이 많을때 배포가 어려움

  • 도커허브

이미지 클라우드 저장소

회원 가입을 통한 Public 무료저장소 와 Private 유료 저장소 사용가능

  • 사설 레지스트리

사용자가 직접 도커 이미지 저장소(Docker Private Registry)를 직접 구성

저장소 서버, 저장공간을 사용자가 직접 관리 해야함

회사 사내망 환경에서 이미지 배포시 좋은방법

65

66 of 103

도커 이미지

2장 도커엔진

  • 도커 허브 (https://hub.docker.com/)
  • ubuntu 이미지 검색결과
  • Sign up 클릭 후 계정생성

66

67 of 103

도커 이미지

2장 도커엔진

  • 이미지 저장소 생성
  • Create Repository 클릭

67

68 of 103

도커 이미지

2장 도커엔진

  • 이미지 저장소 생성
  • 이미지 저장소 정보 입력
  • Visibiliy : Public(공개) , Private(비공개) 선택
  • Private 저장소는 1개만 무료

68

69 of 103

도커 이미지

2장 도커엔진

  • 이미지 저장소 생성
  • 저장소 이름 확인
  • 저장소 이름 : mplugs/ktdsimage (계정이름 : mplugs , 저장될 이미지 이름 : ktdsimage)

69

70 of 103

도커 이미지

2장 도커엔진

  • 저장소에 이미지 올리기
  • 컨테이너 생성 후 이미지 만들기

  • docker tag [기존 이미지 이름] [새롭게 생성될 이름]
  • ktdsimag:0.0 이미지에 mplugs/ktdsimage:0.0 이름을 추가
  • tag : 기존 이미지에 이름만 추가하는 명령, 기존 이미지는 삭제 되지 않음
  • ktdsimage:0.0 이미지(레이어) 생성됨
  • 이미지에 이름 추가 하기

70

# docker run -i -t --name commit_container1 ubuntu:14.04�root@18d4a15f3473:/# echo my first push >> test��# docker commit commit_container1 ktdsimage:0.0�sha256:cc9784b889dde92473229a1d4dff0b64584a3004640b61783d2b77ab047e055c

# docker tag ktdsimage:0.0 mplugs/ktdsimage:0.0

# docker images�REPOSITORY TAG IMAGE ID CREATED SIZE�mplugs/ktdsimage 0.0 cc9784b889dd 8 minutes ago 188MB�ktdsimage 0.0 cc9784b889dd 8 minutes ago 188MB�

71 of 103

도커 이미지

2장 도커엔진

  • 저장소에 이미지 올리기
  • 도커 허브 로그인

  • docker push : 이미지 저장소에 이미지 업로드
  • 이미지는 하나만 업로드됨, ubuntu14.04 이미지는 도커허브에 이미 존재하기 때문
  • 인터넷과 연결이 되어 있어야 함
  • 접속 계정 과 패스워드 입력
  • 이미지에 이름 추가 하기

71

# 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: mplugs�Password: �Login Succeeded

# docker push mplugs/ktdsimage:0.0�The push refers to a repository [docker.io/mplugs/ktdsimage]�e9efe767c47f: Pushed �7fb9ba64f896: Mounted from library/ubuntu �..�0.0: digest: sha256:5e2c9c48869c62f05d5d0af48334f0ca286fefbab98e6d7689115aa50f18681f size: 1566

72 of 103

도커 이미지

2장 도커엔진

  • 저장소에 이미지 올리기
  • 도커 허브 저장소 이미지 업로드 확인
  • Tag 버튼을 클릭하면 이미지 업로드 이미지를 확인할 수 있음

72

73 of 103

도커 이미지

2장 도커엔진

  • 저장소에서 이미지 내려받기
  • 컨테이너 중지, 삭제 후 이미지 삭제

  • 현재 도커엔진에는 mplugs/ktimage:0.0 이미지는 삭제되어 보이지 않음
  • 이미지 리스트 확인

73

# docker stop commit_container1�commit_container1��# docker rmi mplugs/ktdsimage:0.0�Untagged: mplugs/ktdsimage:0.0�Untagged: mplugs/ktdsimage@sha256:5e2c9c48869c62f05d5d0af48334f0ca286fefbab98e6d7689115aa50f18681f

# docker images�REPOSITORY TAG IMAGE ID CREATED SIZE�ktdsimage 0.0 cc9784b889dd 18 minutes ago 188MB�nginx latest 40960efd7b8f 6 days ago 108MB�centos 7 d123f4e55e12 7 days ago 197MB�..

74 of 103

도커 이미지

2장 도커엔진

  • 저장소에서 이미지 내려받기
  • 도커허브로 부터 이미지 다운로드

  • 이미지 리스트 확인

  • docker pull [이미지주소] : 도커허브로 부터 이미지 다운로드

74

# docker pull mplugs/ktdsimage:0.0�0.0: Pulling from mplugs/ktdsimage�Digest: sha256:5e2c9c48869c62f05d5d0af48334f0ca286fefbab98e6d7689115aa50f18681f�Status: Downloaded newer image for mplugs/ktdsimage:0.0

# docker images�REPOSITORY TAG IMAGE ID CREATED SIZE�ktdsimage 0.0 cc9784b889dd 18 minutes ago 188MB�mplugs/ktdsimage 0.0 cc9784b889dd 18 minutes ago 188MB�nginx latest 40960efd7b8f 6 days ago 108MB�centos 7 d123f4e55e12 7 days ago 197MB�..

75 of 103

도커 이미지

2장 도커엔진

  • 사설 레지스트리 저장소 생성
  • 사설 레지스트리 컨테이너 생성

  • --restart=always : 컨테이너가 정지되면 다시 시작

도커 엔진을 재시작하면 컨테이너도 재시작 됨

  • --restart=on-failure : 컨테이너 종료코드가 0이 아닐때 5번까지 재시작 시도
  • --restart=unless-stopped : 컨테이너를 stop 정지했다면, 도커 엔진을 재시작 해도

컨테이너가 재시작 되지 않도록 설정

75

# docker run -d --name myregistry \�> -p 5000:5000 \�> --restart=always \�> registry:2.6�Unable to find image 'registry:2.6' locally�2.6: Pulling from library/registry�49388a8c9c86: Pull complete �..�Digest: sha256:d837de65fd9bdb81d74055f1dc9cc9154ad5d8d5328f42f57f273000c402c76d�Status: Downloaded newer image for registry:2.6�eee2cb731c384e4102a20f0d69722a222134c3c31c80470fc67a2c023252f115

76 of 103

도커 이미지

2장 도커엔진

  • 사설 레지스트리 저장소 생성
  • Centos7 docker-distribution 설치

  • tcp6 사용중지 커널 부팅 옵션 변경

  • 레지스트리 포트 5000번이 TCP6만 열리는 증상발생
  • ipv6 사용중지를 커널 부팅옵션으로 변경 후 재부팅

  • tcp 5000번 포트 확인

76

# yum install docker-distribution

# systemctl enable docker-distribution�# systemctl start docker-distribution

# vi /etc/default/grub�add ipv6.disable=1 at line 6,like:�GRUB_CMDLINE_LINUX="ipv6.disable=1 ..."�

#grub2-mkconfig -o /boot/grub2/grub.cfg�#reboot

# netstat -lntp�Active Internet connections (only servers)�Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name �.. �tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 2202/docker-proxy

77 of 103

도커 이미지

2장 도커엔진

  • 사설 레지스트리 이미지 생성
  • 사설 레지스트리 접속 테스트

  • 레지스트리 컨테이너는 기본적으로 5000번 포트를 사용

  • 사설 레지스트리 업로드 이미지 Tag 생성

  • 이미지 리스트 확인

77

# curl localhost:5000/v2/�{}

# docker tag ktdsimage:0.0 192.168.35.51:5000/ktdsimage:0.0

# docker images�REPOSITORY TAG IMAGE ID CREATED SIZE�192.168.35.51:5000/ktdsimage 0.0 cc9784b889dd About an hour ago 188MB�ktdsimage 0.0 cc9784b889dd About an hour ago 188MB

78 of 103

도커 이미지

2장 도커엔진

  • 사설 레지스트리 이미지 업로드
  • 사설 레지스트리에 이미지 Push 하기

  • 도커 데몬은 기본적으로 https를 통한 레지스트리 접근만 허용

  • 도커 엔진 옵션 변경

  • 이미지 업로드 명령 실행

78

# docker push 192.168.35.51:5000/ktdsimage:0.0�The push refers to a repository [192.168.35.51:5000/ktdsimage]�Get https://192.168.35.51:5000/v2/: http: server gave HTTP response to HTTPS client

# vi /usr/lib/systemd/system/docker.service �..

ExecStart=/usr/bin/dockerd $DOCKER_OPTS

..

# DOCKER_OPTS="--insecure-registry=192.168.35.51:5000"

# docker push 192.168.35.51:5000/ktdsimage:0.0�The push refers to a repository [192.168.35.51:5000/ktdsimage]�e9efe767c47f: Pushed �..�0.0: digest: sha256:5e2c9c48869c62f05d5d0af48334f0ca286fefbab98e6d7689115aa50f18681f size: 1566 0.0 cc9784b889dd About an hour ago 188MB

79 of 103

Dockerfile

2장 도커엔진

  • 컨테이너로 이미지 생성 방법
  1. 기본 OS 이미지로 컨테이너 생성
  2. 애플리케이션 설치 및 환경설정, 소스코드 복제
  3. 컨테이너 이미지 커밋(commit)
  • 애플리케이션 설치 환경구성을 위한 매뉴얼작업이 필요
  • 애플리케이션 구동 이미지로 커밋하기 때문에 이미지 동작을 보장

79

Ubuntu:14.04

or

Centos:7

myapp:0.0

1. 컨테이너 생성

2. 애플리케이션 설치

3. 컨테이너 커밋

새로운 컨테이너

애플리케이션 설치�컨테이너

80 of 103

Dockerfile

2장 도커엔진

  • Dockerfile로 이미지 생성 방법
  • 매뉴얼 작업을 기록한 Dockerfile 생성
  • 빌드 명령어가 Dockerfile 을 읽어 이미지를 생성
  • 이미지를 직접 생성 또는 커밋 해야 하는 수고스러움을 줄여줌
  • 애플리케이션 빌드를 자동화
  • 도커 허브의 신뢰할 수 있는 이미지를 바탕으로 쉽게 이미지 배포 가능

80

myapp:0.0

2. Dockerfile 빌드

FROM ubuntu 14.04

RUN apt-get update

RUN apt-get install..

81 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 작성
  • 컨테이너 빌드에 필요한 작업 명령이 저장된 특수 파일
  • 도커 엔진은 현재 디렉토리의 “Dockerfile” 이라는 이름의 파일을 참조

시나리오 : 웹서버를 설치하고, 로컬에 있는 test.html -> 컨테이너 /var/www/html 복사

  • 로컬 test.html 파일 생성

  • 아파치 웹서버가 설치된 이미지를 빌드하는 Dockerfile 생성

81

# echo test >> test.html

# echo test >> test.html

# vi Dockerfile

FROM ubuntu:14.04�MAINTAINER teacher�LABEL "purpose"="practice"�RUN apt-get update�RUN apt-get install apache2 -y�ADD test.html /var/www/html �WORKDIR /var/www/html�RUN ["/bin/bash", "-c", "echo hello >> test2.html"]�EXPOSE 80�CMD apachectl -DFOREGROUND

82 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 작성
  • 한줄이 하나의 명령어
  • 명령어는 대소문자 상관 없으나, 일반적으로 대문자를 사용
  • FROM : 베이스가 될 이미지 정의
  • MAINTAINER : 이미지를 생성한 개발자 정보, 도커 1.13.0 버전 이후 사용하지 않음
  • LABEL : 이미지에 메타데이터 추가, “키:값” 형태로 정의

docker inspect 명령어로 이미지 메타데이터 정보 확인가능

  • RUN : 이미지를 만들기 위해 컨테이너 내부에서 명령어 실행

명령어의 옵션/인자 값은 배열형태로 전달

Dockerfile 명령어는 쉘을 사용하지 않기 때문에 쉘을 정의해야한다

예) RUN [“sh”, “-c”, “echo $MY_ENV”]

  • ADD : Dockerfile 이 위치한 디렉토리의 파일 -> 이미지에 추가
  • WORKDIR : 명령어를 실행할 디렉토리 정의, cd 명령과 같은기능
  • EXPOSE : 생성한 이미지에서 노출할 포트 정의
  • CMD : 컨테이너가 시작될때 실행되는 명령설정, 한번만 사용가능

82

83 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 빌드
  • 이미지 생성

  • 생성된 이미지 확인

  • docker build : Dockerfile 을 이용한 이미지 생성 명령

-t : 생성할 이미지 이름 정의 옵션

이름을 정의 하지 않으면 16진수 형태로 이름이 저장됨

83

# docker build -t mybuild:0.0 ./

Sending build context to Docker daemon 3.072kB�Step 1/10 : FROM ubuntu:16.04� ---> dd6f76d9cc90�Step 2/10 : MAINTAINER teacher� ---> Running in 72ed646689bf� ---> bdcec47ac282�..

# docker images�REPOSITORY TAG IMAGE ID CREATED SIZE�mybuild 0.0 8df4c18a7a0c 25 seconds ago 260MB�192.168.35.51:5000/ktdsimage 0.0 cc9784b889dd 13 hours ago 188MB�..

84 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 빌드
  • 생성된 이미지로 컨테이너 실행

  • 컨테이너와 연결된 호스트 포트 확인

  • -P : EXPOSE 로 노출된 포트를 호스트에서 사용가능한 포트에 차례로 연결
  • docker port [컨테이너] : 컨테이너 포트와 호스트 포트 연결정보 출력

84

# docker run -d -P --name myserver mybuild:0.0�2e33d49d5935be9b91653f926b9842238363302b6a4f419ad1576e9a2451c0c1

# docker port myserver�80/tcp -> 0.0.0.0:32768

myapp:0.0

도커이미지

FROM ubuntu 14.04

RUN apt-get update

RUN apt-get install..

test.html

docker build -t mybuild:0.0 ./

새로운이미지

빌드 컨텍스트(Dockerfile이 위치한 경우의 파일들)

디렉토리 : ./

85 of 103

Dockerfile

2장 도커엔진

  • 빌드 컨텍스트(Context)
  • docker build 실행 첫번째 로그

  • 이미지 생성시 ./ 디렉토리의 컨텍스트 파일이 전송됨
  • 컨텍스트 파일은 명령어 마지막에 지정하는 위치의 파일 및 디렉토리 전부 포함
  • 불필요한 파일은 .dockerignore 파일에 정의필요
  • ! : 컨텍스트 제외 하지 않을 파일 지정

85

# docker build -t mybuild:0.0 ./�Sending build context to Docker daemon 3.072kB

# vi .dockerignore

test2.html

*.html

*/*.html

!test.htm?

86 of 103

Dockerfile

2장 도커엔진

  • Dockerfile을 이용한 컨테이너 생성과 커밋
  • 이미지가 만들어지는 과정

  • ADD, RUN 등의 명령어가 실행될 때마다 새로운 컨테이너 레이어 생성
  • 최종 이미지 생성까지 임시 컨테이너 레이어 생성 후 삭제

86

Sending build context to Docker daemon 3.072kB�Step 1/10 : FROM ubuntu:16.04� ---> dd6f76d9cc90�Step 2/10 : MAINTAINER teacher� ---> Running in 72ed646689bf� ---> bdcec47ac282�Removing intermediate container 72ed646689bf�Step 3/10 : LABEL "purpose" "practice"� ---> Running in 06db3b26f9fb� ---> 71723b26562b�...

FROM ubuntu:14.04

RUN apt-get update

RUN apt-get install

새 이미지 레이어

새 이미지 레이어

새 이미지 레이어

87 of 103

Dockerfile

2장 도커엔진

  • 캐시를 이용한 이미지 빌드
  • Dockerfile2 파일 생성

  • -f : docker build 에 사용할 Dockerfile 지정
  • 이전에 빌드했던 Dockerfile 과 같은 내용이 있다면 이전 이미지를 활용
  • Dockerfile2 파일을 이용한 이미지 빌드

87

# vi Dockerfile2

FROM ubuntu:14.04�MAINTAINER teacher�LABEL "purpose"="practice"�RUN apt-get update

# docker build -f Dockerfile2 -t mycache:0.0 ./�Sending build context to Docker daemon 4.096kB�Step 1/10 : FROM ubuntu:16.04� ---> dd6f76d9cc90�Step 2/10 : MAINTAINER teacher� ---> Using cache� ---> bdcec47ac282�..�Successfully built 8df4c18a7a0c

88 of 103

Dockerfile

2장 도커엔진

  • 캐시를 이용한 이미지 빌드
  • 캐시로 사용할 이미지를 직접 지정하여 빌드

  • --no-cache : 기존 빌드에 사용된 캐시를 사용하지 않고 Dockerfile을 첨부터 다시

이미지 레이어를 생성함

  • 이미 존재하는 캐시를 사용하지 않을 경우

  • --cache-from : 특정 이미지의 Dockerfile 캐시 이용
  • nginx:latest 이미지를 빌드하는 Dockerfile 에 일부 내용을 추가해 활용

88

# docker build --cache-from nginx my_extend_nginx:0.0 .

# docker build --no-cache -t mycache:0.0 .

89 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어
  • ENV : 도커에서 사용할 환경 변수 설정

  • test 변수에 /home 값을 설정
  • myenv 이미지 빌드

  • 컨테이너 생성 후 변수 확인

89

# vi Dockerfile

FROM ubuntu:14.04�ENV test /home�WORKDIR $test�RUN touch $test/mytouchfile

# docker build -t myenv:0.0 ./�Sending build context to Docker daemon 4.096kB�Step 1/4 : FROM ubuntu:14.04� ---> dea1945146b9�..�Successfully built 9a64ed22c0fa�Successfully tagged myenv:0.0

# docker run -i -t --name env_test myenv:0.0 /bin/bash�root@1dd86a895239:/home# echo $test�/home

90 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어
  • -e 옵션으로 ENV 설정값 덮어쓰기

  • test 변수값이 /home -> myvalue 로 변경됨
  • 환경변수 설정된 경우, 설정되지 않은 경우 확인

90

# docker run -i -t --name env_test_override \�> -e test=myvalue \�> myenv:0.0 /bin/bash�root@5bdbdd8f3dd2:/home# echo $test�myvalue

# vi Dockerfile

FROM ubuntu:14.04�ENV my_env my_value�RUN echo ${my_env:-value} / ${my_env:+value} / ${my_env2:-value} / ${my_env2:+value}

# docker build ./�Sending build context to Docker daemon 4.096kB�..�Step 3/3 : RUN echo ${my_env:-value} / ${my_env:+value} / ${my_env2:-value} / ${my_env2:+value}� ---> Running in a1153a71fa0c�my_value / value / value /�..

91 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어
  • VOLUME : 호스트와 공유할 컨테이너 내부의 디렉토리 설정

  • /home/volume 디렉토리를 호스트와 공유
  • volume_test 이미지 빌드 후 컨테이너 생성

  • 볼륨 리스트 확인

91

# vi Dockerfile�FROM ubuntu:14.04�ENV my_env my_value�RUN mkdir /home/volume�RUN echo test >> /home/volume/testfile�VOLUME /home/volume

# docker build -t myvolume:0.0 ./�..

# docker run -i -t -d --name volume_test myvolume:0.0�6cfadd4c0b4bd0baefc4fa13821ea70ce5e9a19b0b363e70a07ea85ef7ecdc61

# docker volume ls�DRIVER VOLUME NAME�local 01c9539670ad5991eff1bcc7ca4200bfd7ff0167c1d79f6bc18b847eba852b17

92 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어
  • ARG : build 명령어를 실행할 때 추가로 입력 받아 Dockerfile 내 사용된 변수값 설정

  • my_arg 는 build 명령 실행시 입력, my_arg_2 는 Dockerfile 에서 설정
  • myarg 이미지 빌드 실행

  • 볼륨 리스트 확인

92

# vi Dockerfile�FROM ubuntu:14.04�ARG my_arg�ARG my_arg_2=value2�RUN touch ${my_arg}/mytouch

# docker build --build-arg my_arg=/home -t myarg:0.0 ./�..

# docker run -i -t --name arg_test myarg:0.0�root@ca4abb4ef31e:/# ls /home/mytouch �/home/mytouch

93 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어
  • USER : USER로 사용자 계정을 설정하면, 그 아래 명령은 해당 사용자 권한으로 실행

  • user1 사용자 계정으로 하위 명령어 실행 됨
  • ONBUILD : 빌드된 이미지를 기반으로 하는 다른 이미지가 Dockerfile 로 실행될때

실행할 명령어를 추가

  • onbuild_test 이미지 생성 후 컨테이너 실행
  • /onbuild_file 파일이 확인되지 않음

93

..

RUN groupadd -r author && useradd -r -g author user1

USER user1

..

# vi Dockerfile

FROM ubuntu:14.04

RUN echo “this is onbuild test”

ONBUILD RUN echo “onbuild!” >> /onbuild_file

# docker build ./ -t onbuild_test:0.0��# docker run -i --rm onbuild_test:0.0 ls /�bin boot dev etc home lib lib64 media mnt opt�proc root run sbin srv sys tmp usr var

94 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어
  • ONBUILD 가 적용된 이미지를 기반으로 하는 Dockerfile

  • ONBUILD 적용된 이미지로 부터 컨테이너 생성
  • ONBUILD 실행 명령어가 적용되어 onbuild_file 확인됨
  • ONBUILD 가 적용된 이미지를 기반으로 하는 Dockerfile

  • ONBUILD 가 적용된 이미지를 기반으로 하는 Dockerfile

94

# vi Dockerfile2

FROM onbuild_test:0.0

RUN echo “this is child image!”

# docker build -f ./Dockerfile2 ./ -t onbuild_test:0.1�Sending build context to Docker daemon 4.096kB�Step 1/2 : FROM onbuild_test:0.0�# Executing 1 build trigger...�Step 1/1 : RUN echo "onbuild!" >> /onbuild_file� ---> Running in 50d56b5426b1� ---> 3bb26a906dda�..

# docker run -i -t --rm onbuild_test:0.1 ls /�bin dev home lib64 mnt opt root sbin sys usr�boot etc lib media onbuild_file proc run srv tmp var

95 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어 �
  • STOPSIGNAL : 컨테이너가 정지될 때 사용될 시스템 콜의 종류 지정

  • StopSignal 값이 SIGKILL 로 설정됨 확인
  • 아무 값도 설정하지 않으면, 기본값은 SIGTERM
  • stopsignal 이미지 빌드 후 컨테이너 생성하기

  • 컨테이너 정보 확인

95

# vi Dockerfile�FROM ubuntu:14.04�STOPSIGNAL SIGKILL

# docker build . -t stopsignal:0.0�Sending build context to Docker daemon 4.096kB�..�Step 2/2 : STOPSIGNAL SIGKILL�..�Successfully tagged stopsignal:0.0

# docker run -itd --name stopsignal_container stopsignal:0.0�a349b4bf3cf4ae50b2d1e324c5a9eacfc54d36dd055718fdd564de0c51e5b0ae

# docker inspect stopsignal_container | grep Stop� "StopSignal": "SIGKILL"

96 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어 �
  • HEALTHCHECK : 이미지로 부터 생성된 컨테이너의 애플리케이션 상태 체크 설정

애플리케이션 프로세스는 살아있으나, 동작하지 않는 상태 방지

  • nginx:healthcheck 이미지 빌드 하기

  • --interval : 컨테이너 상태 체크 주기
  • --timeout : 설정한 시간을 초과하면 상태 체크 실패 간주
  • --retries : 설정 횟수만큼 상태 체크에 실패시 unhealth 생태로 설정
  • 1분에 한번씩 curl 명령 실행, 3초응답 지연이 3회 발생시 unhealth 로 상태변경

96

# vi Dockerfile�FROM nginx�RUN apt-get update -y && apt-get install curl -y�HEALTHCHECK --interval=1m --timeout=3s --retries=3 CMD curl -f http://localhost || exit 1

docker build ./ -t nginx:healthcheck�Sending build context to Docker daemon 4.096kB�Step 1/3 : FROM nginx�..

Successfully built bc27a8263d1d�Successfully tagged nginx:healthcheck

97 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어 �
  • healthcheck 컨테이너 생성

  • 컨테이너 상태 확인

  • -P : 컨테이너 포트를 호스트의 랜덤포트로 노출
  • 컨테이너 정보 확인

97

# docker run -d -P nginx:healthcheck�d4061b732e91acfec1098581b3b3e3859a1c1e70a96e30bd5b00cb271da0a3ed

# docker ps | grep nginx�d4061b732e91 nginx:healthcheck "nginx -g 'daemon ..." 3 minutes ago Up 3 minutes (healthy) 0.0.0.0:32768->80/tcp stupefied_bose

# docker inspect d4061b | grep -B 3 -A 6 health� "StartedAt": "2017-11-14T14:31:06.962028619Z",� "FinishedAt": "0001-01-01T00:00:00Z",� "Health": {� "Status": "healthy",� "FailingStreak": 0,� "Log": [� {� "Start": "2017-11-14T23:33:07.011529837+09:00",� "End": "2017-11-14T23:33:07.055825695+09:00",� "ExitCode": 0,�..

98 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어 �
  • SHELL : 이미지 빌드중 명령 실행을 위한 셸 지정

기본값 [ Linux : /bin/sh -c , Windows : cmd /S /C ]

  • nodetest 이미지 빌드 하기

  • /usr/local/bin/node 의 버전 출력 확인

98

# vi Dockerfile�FROM node�RUN echo hello, node!�SHELL ["/usr/local/bin/node"]�RUN -v

# docker build ./ -t nodetest�Sending build context to Docker daemon 4.096kB�Step 1/4 : FROM node

..

v9.1.0�..

Successfully built 1fad63a47199�Successfully tagged nodetest:latest

99 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어 �
  • COPY : 로컬 디렉토리에서 읽어 들인 컨텍스트를 이미지 파일에 복사

사용 형식은 ADD 와 같음

  • ADD : 로컬파일, URL, tar 파일 등도 복사 가능

  • COPY 와 ADD 차이점
  • COPY 는 파일만 이미지에 복사 가능
  • tar 파일은 자동으로 해제해서 추가 됨

99

COPY test.html /home/

COPY [“test.html”, “/home/”]

ADD http://ftp.daumkakao.com/centos/timestamp.txt /home

ADD test.tar /home

100 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어 �
  • ENTRYPOINT : CMD 와 동일하게 컨테이너가 시작될 때 수행할 명령 실행

커맨드를 인자로 사용할 수 있는 스크립트의 역활을 할 수 있음

  • ENTRYPOINT 명령 실행시 /bin/bash

  • ENTRYPOINT 와 CMD 차이점
  • echo 명령의 인자값으로 “/bin/bash” 사용, 결국 echo 명령 실행
  • CMD 명령 실행시 /bin/bash
  • /bin/bash 명령을 실행
  • CMD 와 ENTRYPOINT 둘다 설정되지 않으면 이미지 빌드시 에러발생

100

# docker run -i -t --name no_entropoint ubuntu:14.04 /bin/bash�root@760b8d745ecc:/#

# docker run -i -t --entrypoint="echo" --name yes_entrypoint ubuntu:14.04 /bin/bash�/bin/bash

101 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어 �
  • ENTRYPOINT 와 --entrypoint 의 우선순위

  • Dockerfile 에 정의한 ENTRYPOINT 는 Docker run 명령에서 --entrypoint 옵션으로

재정의 된 명령으로 덮어 쓰입니다.

  • entrypoint 를 이용한 스크립트 실행
  • 실행할 스크립트는 컨테이너 내부에 존재 해야함
  • COPY 혹은 ADD 명령을 이용해 이미지 빌드시 복사 필요
  • ENTRYPOINT 사용 예
  • [“bin/bash”, “entrypoint.sh”] : JSON 형태 배열로 명령어 정의 가능

101

# docker run -i -t --name entrypoint_sh --entrypoint=”/test.sh” ubuntu:14.04 /bin/bash

# vi Dockerfile

FROM ubuntu:14.04�RUN apt-get update�RUN apt-get install apache2 -y�ADD entrypoint.sh /entrypoint.sh�RUN chmod +x /entrypoint.sh�ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]

102 of 103

Dockerfile

2장 도커엔진

  • Dockerfile 기타 명령어 �
  • 일반형식 사용의 예
  • JSON 배열 형식 사용의 예

  • JSON 배열 형태와 일반 형식의 차이점
  • 명령 실행시 “/bin/sh -c” 가 기본값으로 실행됨
  • 배열로 선언된 실제 명령만 실행됨

102

CMD echo test

# -> /bin/sh -c echo test

ENTRYPOINT /entrypoint.sh

# -> /bin/sh -c /entrypoint.hs

CMD [“echo”, “test”]

# -> echo test

ENTRYPOINT [“/bin/bash”, “/entrypoint.sh”]

# -> /bin/bash /entrypoint.sh

103 of 103

수고하셨습니다.

103