Docker Admin (기본)
강사 : 김정석
목차
1장 도커란 ?
2장 도커엔진
1장 도커란 ?
도커(Docker)
1장 도커란 ?
4
가상머신 과 도커 컨테이너
1장 도커란 ?
5
윈도우 도커엔진 설치
1장 도커란 ?
도커 엔진을 구성
6
리눅스 도커엔진 설치
1장 도커란 ?
7
# uname -r�3.10.0-514.el7.x86_64 |
# yum remove docker docker-common docker-selinux docker-engine |
리눅스 도커엔진 설치
1장 도커란 ?
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 |
도커데몬
1장 도커란 ?
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
개발자
도커데몬
1장 도커란 ?
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 [])�.. |
도커데몬
1장 도커란 ?
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 |
도커데몬
1장 도커란 ?
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
2장 도커 엔진
도커 이미지와 컨테이너
2장 도커엔진
alicek106/ubuntu:14.04
14
저장소 이름
이미지 버전
이미지 이름
도커 이미지와 컨테이너
2장 도커엔진
예) 웹 서버 도커 이미지로 부터 여러개의 컨테이너 생성 = 개수만큼의 웹서버
예) 우분투 이미지로 별도의 컨테이너 생성 후 Apache, Mysql 설치/삭제 가능
15
도커 컨테이너 다루기
2장 도커엔진
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:/# |
도커 컨테이너 다루기
2장 도커엔진
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� |
도커 컨테이너 다루기
2장 도커엔진
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 |
도커 컨테이너 다루기
2장 도커엔진
19
# docker start mycentos�mycentos��[root@docker1 ~]# docker attach mycentos�[root@250c54187b22 /]# |
# docker start 250c54�250c54 �# docker attach 250c54�[root@250c54187b22 /]# |
도커 컨테이너 다루기
2장 도커엔진
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 |
도커 컨테이너 다루기
2장 도커엔진
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 |
도커 컨테이너 다루기
2장 도커엔진
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) |
도커 컨테이너 다루기
2장 도커엔진
특정 호스트 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 |
컨테이너 애플리케이션 구축
2장 도커엔진
24
# docker run -d \�> --name wordpressdb \�> -e MYSQL_ROOT_PASSWORD=password \�> -e MYSQL_DATABASE=wordpress \�> mysql:5.7 |
컨테이너 애플리케이션 구축
2장 도커엔진
wordpressdb 컨테이너를 mysql 별명으로 접근가능
주의사항 : --link 에 입력된 컨테이너가 중지 또는 존재하지 않으면 실행 불가능
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 |
컨테이너 애플리케이션 구축
2장 도커엔진
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 |
도커 볼륨
2장 도커엔진
예) mysql 의 DB 저장 데이터는 컨테이너 레이어 공간에 저장됨
27
도커 볼륨
2장 도커엔진
리눅스 시스템 관점 : 파일 및 디렉토리를 마운트하는 구조
호스트 /home/wordpress_db =공유= 컨테이너 /var/lib/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) |
도커 볼륨
2장 도커엔진
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)� |
도커 볼륨
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! |
도커 볼륨
2장 도커엔진
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"� }�] |
도커 볼륨
2장 도커엔진
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", |
도커 볼륨
2장 도커엔진
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 |
! 에러발생
도커 볼륨
2장 도커엔진
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 |
도커 볼륨
2장 도커엔진
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 |
도커 네트워크
2장 도커엔진
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>�.. |
도커 네트워크
2장 도커엔진
37
# brctl show�bridge name bridge id STP enabled interfaces�docker0 8000.024252d9f225 no veth95fa667 |
도커 네트워크
2장 도커엔진
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"� }�.. |
도커 네트워크
2장 도커엔진
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 |
도커 네트워크
2장 도커엔진
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 |
도커 네트워크
2장 도커엔진
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 |
도커 네트워크
2장 도커엔진
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" |
도커 네트워크
2장 도커엔진
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 |
컨테이너 로깅
2장 도커엔진
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�.. |
컨테이너 로깅
2장 도커엔진
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 |
컨테이너 로깅
2장 도커엔진
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 |
컨테이너 로깅
2장 도커엔진
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 |
컨테이너 자원
2장 도커엔진
# 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�.. |
컨테이너 자원
2장 도커엔진
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 |
컨테이너 자원
2장 도커엔진
2048 값은 일반 컨테이너 보다 CPU 할당 시간이 2배
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 |
컨테이너 자원
2장 도커엔진
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 |
컨테이너 자원
2장 도커엔진
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 |
컨테이너 자원
2장 도커엔진
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 |
컨테이너 자원
2장 도커엔진
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 |
도커 이미지
2장 도커엔진
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] |
도커 이미지
2장 도커엔진
56
(1) ubuntu:15.04 (2) commit_test:first (3) commit_test:second
(1)
(2)
(3)
도커 이미지
2장 도커엔진
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 |
도커 이미지
2장 도커엔진
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 |
도커 이미지
2장 도커엔진
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"�.. |
도커 이미지
2장 도커엔진
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 |
도커 이미지
2장 도커엔진
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 |
도커 이미지
2장 도커엔진
이미지 삭제는 부모 레이어가 존재 하지 않을때 삭제됨
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 |
도커 이미지
2장 도커엔진
기존 이미지 정보를 모두 포함하므로 동일하게 이미지가 생성됨
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 |
도커 이미지
2장 도커엔진
ex) 컨테이너 변경사항, detached 모드, 컨테이너 커맨드 등
64
# docker export -o rootFS.tar mycontainer # docker import rootFS.tar myimage:0:0 |
도커 이미지
2장 도커엔진
추출한 이미지 파일을 복사 후 저장
파일용량이 크고 도커엔진이 많을때 배포가 어려움
이미지 클라우드 저장소
회원 가입을 통한 Public 무료저장소 와 Private 유료 저장소 사용가능
사용자가 직접 도커 이미지 저장소(Docker Private Registry)를 직접 구성
저장소 서버, 저장공간을 사용자가 직접 관리 해야함
회사 사내망 환경에서 이미지 배포시 좋은방법
65
도커 이미지
2장 도커엔진
66
도커 이미지
2장 도커엔진
67
도커 이미지
2장 도커엔진
68
도커 이미지
2장 도커엔진
69
도커 이미지
2장 도커엔진
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� |
도커 이미지
2장 도커엔진
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 |
도커 이미지
2장 도커엔진
72
도커 이미지
2장 도커엔진
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�.. |
도커 이미지
2장 도커엔진
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�.. |
도커 이미지
2장 도커엔진
도커 엔진을 재시작하면 컨테이너도 재시작 됨
컨테이너가 재시작 되지 않도록 설정
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 |
도커 이미지
2장 도커엔진
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 |
도커 이미지
2장 도커엔진
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 |
도커 이미지
2장 도커엔진
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 |
Dockerfile
2장 도커엔진
79
Ubuntu:14.04
or
Centos:7
myapp:0.0
1. 컨테이너 생성
2. 애플리케이션 설치
3. 컨테이너 커밋
새로운 컨테이너
애플리케이션 설치�컨테이너
Dockerfile
2장 도커엔진
80
myapp:0.0
2. Dockerfile 빌드
FROM ubuntu 14.04
RUN apt-get update
RUN apt-get install..
Dockerfile
2장 도커엔진
시나리오 : 웹서버를 설치하고, 로컬에 있는 test.html -> 컨테이너 /var/www/html 복사
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 |
Dockerfile
2장 도커엔진
docker inspect 명령어로 이미지 메타데이터 정보 확인가능
명령어의 옵션/인자 값은 배열형태로 전달
Dockerfile 명령어는 쉘을 사용하지 않기 때문에 쉘을 정의해야한다
예) RUN [“sh”, “-c”, “echo $MY_ENV”]
82
Dockerfile
2장 도커엔진
-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�.. |
Dockerfile
2장 도커엔진
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이 위치한 경우의 파일들)
디렉토리 : ./
Dockerfile
2장 도커엔진
85
# docker build -t mybuild:0.0 ./�Sending build context to Docker daemon 3.072kB |
# vi .dockerignore test2.html *.html */*.html !test.htm? |
Dockerfile
2장 도커엔진
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
새 이미지 레이어
새 이미지 레이어
새 이미지 레이어
Dockerfile
2장 도커엔진
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 |
Dockerfile
2장 도커엔진
이미지 레이어를 생성함
88
# docker build --cache-from nginx my_extend_nginx:0.0 . |
# docker build --no-cache -t mycache:0.0 . |
Dockerfile
2장 도커엔진
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 |
Dockerfile
2장 도커엔진
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 /�.. |
Dockerfile
2장 도커엔진
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 |
Dockerfile
2장 도커엔진
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 |
Dockerfile
2장 도커엔진
실행할 명령어를 추가
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 |
Dockerfile
2장 도커엔진
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 |
Dockerfile
2장 도커엔진
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" |
Dockerfile
2장 도커엔진
애플리케이션 프로세스는 살아있으나, 동작하지 않는 상태 방지
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 |
Dockerfile
2장 도커엔진
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,�.. |
Dockerfile
2장 도커엔진
기본값 [ Linux : /bin/sh -c , Windows : cmd /S /C ]
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 |
Dockerfile
2장 도커엔진
사용 형식은 ADD 와 같음
99
COPY test.html /home/ COPY [“test.html”, “/home/”] |
ADD http://ftp.daumkakao.com/centos/timestamp.txt /home ADD test.tar /home |
Dockerfile
2장 도커엔진
커맨드를 인자로 사용할 수 있는 스크립트의 역활을 할 수 있음
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 |
Dockerfile
2장 도커엔진
재정의 된 명령으로 덮어 쓰입니다.
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"] |
Dockerfile
2장 도커엔진
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