본문 바로가기

비공_스터디

[책]시작하세요! 도커


uname -r ##docker는 최소 3.10 이상의 커널 버전 필요

[Amazon Linux Docker Install]


sudo yum update -y

sudo yum install -y docker

sudo service docker start


##ec2-user -> docker Group 

sudo usermod -a -G docker ec2-user 



[Docker 엔진 및 명령어]


##docker 정보 출력, Cannot connect Message 발생 시 reboot

docker info


leedoing/ubuntu:14.04 ##저장소/OS:버전


##도커 생성

docker create -i -t --name myContainer centos:7  ## -i: in&output, -t: tty, [docker pull -> docker create]

docker start myContainer ##도커 실행

docker attach myContainer ##도커 접속(create 시 -i -t 옵션)


##도커 이미지 확인

docker images


##나갈 때는 ctl+p+q를 통해 exited 되지 않도록


##도커 프로세스 확인

docker ps -a -q ##(-a: 전체, -q: 도커 ID 출력)


##도커 run&stop(주로 사용)

docker run -i -t --name mycontainer -p 3306:3306 -p 192.168.0.100:7777:80 ubuntu:14.04 ##Port 바인딩

docker stop mycontainer


##도커 삭제

docker rm id&name

docker rm $(docker ps -a -q) ##전체 삭제, 실행 중인 도커는 삭제되지 않음

docker container prune ##전체 삭제, 실행 중인 도커까지 삭제


##도커 Rename

docker rename hello_world my_container


##도커 세부정보 확인

docker inspect my_container |grep ~


##도커 백그라운드 실행(-i, -t 옵션과 구분), 포그라운드 프로세서가 다운되면 도커는 exited

docker run -d --name detach_test ubuntu:14.04


##도커 포그라운드 실행에서 명령어 사용

docker exec -i -t mycontainer /bin/bash

export ##도커 환경변수 확인


##도커 MySQL(워드프레스) 이미지 실행

docker run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql:5.7


##도커 워드프레스 이미지 실행

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


##포그라운드 모드에서 바로 명령어 실행

docker exec -i -t wordpress ping -c 2 mysql

docker exec -i -t wordpress /bin/bash ##포그라운드 실행 도커 접근


##--link를 통해 NAT로 할당 받은 내부 IP 사용 가능하나, 대게 Alias를 통해 사용

--link wordpressdb:mysql



[도커 볼륨, P.36]

##호스트 볼륨 공유

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  ##-v: 호스트볼륨:도커볼륨, 호스트볼륨이 없어도 도커는 자동으로 생성되며 동기화가 아닌 호스트 파일시스템의 mount 개념(호스트 파일이 도커 이미지에 덮어쓰기)


docker run -d -e WORDPRESS_DB_PASSWORD=password --name wordpress_hostvolume --link wordpressdb_hostvolume:mysql -p 80 wordpress


##볼륨 공유 확인

docker stop wordpress_hostvolume wordpressdb_hostvolume

docker rm wordpress_hostvolume wordpressdb_hostvolume


##디렉터리 단위뿐 아니라 파일 단위 공유도 가능하며, 동시에 여러 개의 -v 옵션도 사용 가능

echo hello >> /home/hello && echo hello2 >> /home/hello2

docker run -i -t --name file_volume -v /home/hello:/hello -v /home/hello2:/hello2 ubuntu:14.04


##컨테이너 볼륨

docker run -i -t --name volumes_from_container --volumes-from volume-overide ubuntu:14.04 ##--volumes-from: 컨테이너 볼륨 공유, 호스트의 볼륨을 공유하는 것(NAS 형태)


##도커 볼륨

docker volume create --name myvolume ##도커 볼륨 생성

docker volume ls ##도커 볼륨 확인

docker run -i -t --name myvolume_1 -v myvolume:/root/ ubuntu:14.04 ## 도커볼륨:컨테이너볼륨

echo hello volume! >> /root/volume ## /root 경로에 파일 생성

docker run -i -t --name myvolume_2 -v myvolume:/root/ ubuntu:14.04 ## /root에 volume 파일이 저장되어 있음

docker inspect --type volume myvolume ##json 형식으로 도커 볼륨이 호스트 어느 위치에 mount 되어 있는지 확인 가능

##예시

[

{

"CreatedAt": "2018-03-05T11:53:59Z",

"Driver": "local",

"Labels": {},

"Mountpoint": "/var/lib/docker/volumes/myvolume/_data",

"Name": "myvolume",

"Options": {},

"Scope": "local"

}

]

docker run -i -t --name volume_auto -v /root ubuntu:14.04 ##볼륨 위치를 지정하지 않으면 무작위의 16진수 형태 이름으로 호스트에 저장됌. 

docker container inspect volume_auto |greo Source ## -v 옵션의 경우 도커 컨테이너가 exited 된 상태에서도 저장되어 있음, -v 옵션이 없을 경우 exited 된 도커 컨테이너의 볼륨은 삭제됌


docker volume prune ##모든 도커 볼륨을 삭제, 호스트에서 데이터를 저장하는 설계: stateless, 호스트에서만 데이터를 저장하는 설계: stateful



[도커 네트워크, p46]

##호스트에서 ifconfig 입력 시 veth 확인 가능(virtual eth)


yum -y install bridge-utils ## brctl(브릿지) 명령어


brctl show docker0 ##도커와 호스트 네트워크 인터페이스 바인딩 확인

bridge name     bridge id               STP enabled     interfaces

docker0         8000.024239c5ffe2       no              veth3eec700

                                                                    veth6e37a40

                                                                    veth936b0c6


docker network ls ##도커 네트워크 명령어

NETWORK ID          NAME                DRIVER              SCOPE

cf7c90128b67        bridge                 bridge              local

c004f6e53177        host                    host                local

89aeb3f72ea9        none                    null                local


docker network inspect bridge ##도커 네트워크에 세부 구성 확인

##아무 설정을 하지 않으면 도커 컨테이너는 자동적으로 docker() 브릿지를 사용

...

            "Config": [

                {

                    "Subnet": "172.17.0.0/16",

                    "Gateway": "172.17.0.1"

                }

            ]

...


[브리지 네트워크, p50]

docker network create --driver bridge mybridge ##도커 네트워크 브릿지 생성

docker network inspect mybridge ##생성한 도커 네트워크 설정 정보 확인

docker run -i -t --name mynetwork_container --net mybridge ubuntu:14.04 ##--net: 컨테이너 네트워크 설정

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


[호스트 네트워크, p50]

docker run -i -t --name network_host --net host ubuntu:14.04 ##도커 네트워크에 호스트 네트워크를 그대로 사용


[None 네트워크, p51]

docker run -it --name network_none --net none ubuntu:14.04 ##None 네트워크 도커 컨테이너 생성


[컨테이너 네트워크, p52]

docker run -itd --name network_container_1 ubuntu:14.04 ##-itd 옵션을 함께 사용하면 입출력&tty로 컨테이너가 실행되지만 컨테이너 내부로 접속되지는 않음, 테스트 시 유용

docker run -itd --name network_ontainer_2 --net container:network_container_1 unbuntu:14.04 ## network_container_1 네트워크를 공유


#Alias를 사용하여 network bridge 구성

docker run -itd --name network_alias_container1 --net mybridge --net-alias alicek106 ubuntu:14.04

docker run -itd --name network_alias_container2 --net mybridge --net-alias alicek106 ubuntu:14.04

docker run -itd --name network_alias_container3 --net mybridge --net-alias alicek106 ubuntu:14.04

##mybridge network를 통해서 컨테이너에 eth0가 순차적으로 부여

##컨테이너 내부에서 net-alias인 alicek106에 Request 시에 도커 내장 DNS를 통하여 컨테이너 1, 2, 3이 RR 방식으로 동작함


dig alicek106 ##각 컨테이너의 A record가 반환 


[컨테이너 로깅, p56]

docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=1234 mysql:5.7 ##MySQL 컨테이너 생성

docker logs mysql ##MySQL 컨테이너 로그 출력

docker run -d --name no_passwd_mysql mysql:5.7

docker logs no_passwd_mysql ##MySQL 컨테이너 로깅을 통해 컨테이너 디버깅 가능

docker logs --tail 2 mysql ##tail 옵션 사용 가능(그 외 --since timestamp / -f -t 옵션을 통해 시간 출력 가능)

##포그라운드 컨테이너 외에 -it 옵션을 사용한 컨테이너의 경우에는 bash 쉘에서 입출력한 내용을 확인 가능


[Syslog 사용, p59]

cat /var/lib/docker/containers/${container_id}/${container_id}.json.log ##해당 경로에 컨테이너 로그 저장

##그 밖에 각종 로깅 프로그램을 이용하여 각종 로그를 저장할 수 있음

docker run -d --name syslog_container --log-driver=syslog ubuntu:14.04 echo syslogtest

##host syslog에 로그가 기록되어 있음


docker run -it -h rsyslog --name rsyslog_server -p 514:514 -p 514:514/udp ubuntu:14.04

docker run -it --log-driver=syslog --log-opt syslog-address=tcp://172.17.0.6:514 --log-opt tag="mylog" ubuntu:14.04

echo test

##syslog 서버에 들어가면 test 메시지가 mylog tag로 기록되어 있음/ IP는 host 주소(Local의 경우: localhost)


docker run -it --log-driver=syslog --log-opt syslog-address=tcp://172.17.0.6.154:514 --log-opt tag="mailog" --log-opt syslog-facility="mail" ubuntu:14.04 ##log-opt syslog-facility 옵션에 따라 로깅 파일 저장을 분류할 수 있음


[fluentd 로깅, p62]

docker run --name mongoDB -d -p 27017:27017 mongo ##mongoDB 설치

docker run -d --name fluentd -p 24224:24224 -v $(pwd)/fluent.conf:/fluentd/etc/fluent.conf -e FLUENTD_CONF=fluent.conf alicek106/fluentd:mongo ##fluentd 설치 local에서 사용하지 않아 -v 옵션 사용하지 않음

docker run -p 80:80 -d --log-driver=fluentd --log-opt fluentd-address=localhost:24224 --log-opt tag=docker.nginx.webserver nginx


[AWS 클라우드워치 로깅, p65]

docker run -it --name cloudwatch_logging --log-driver=awslogs --log-opt awslogs-region=ap-northeast-2 --log-opt awslogs-group=docker-test --log-opt awslogs-stream=docker-test ubuntu:14.04


[나름 응용 학습, nignx log -> 클라우드워치 로깅]

docker run -it -p 80:80 -d --log-driver=awslogs --log-opt awslogs-region=ap-northeast-2 --log-opt awslogs-group=docker-test --log-opt awslogs-stream=docker-test nginx


[컨테이너 자원 할당 제한, p70]

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

docker update --cpuset-cpus=1 centos 


##메모리 제한은 최소 4MB 단위는 m, g이며 메모리가 초과되면 OOM 발생으로 컨테이너가 종료(도커 이미지에 따라 메모리를 너무 작게 설정하면 컨테이너가 실행 자체가 안 됨)

docker run -d --memory="1g" --name momory_1g nginx

docker inspect momory_1g |grep \"Memory\"


##기본적으로 컨테이너의 Swap 메모리는 기본 메모리의 2배로 생성

docker run -it --name swap_500m --momory=200m --momry-swap=500m ubuntu:14.04 


##컨테이너 CPU 제한(CPU shares 값 1024는 CPU 할당 1의 비율을 뜻하고, 2048은 2배의 CPU 할당 시간을 갖음)

docker run -it --name cpu_share --cpu-shares 2048 ubuntu: 14.04

docker run -d --name cpu_1024 --cpu-shares 1024 alicek106/stress stress --cpu 1

docker run -d --name cpu_512 --cpu-shares 512 alicek106/stress stress --cpu 1 ##1024대비 512는 CPU 사용률 50% 확인


docker run -d --name cpuset_2 --cpuset-cpus=2 alicek106/stress stress --cpu 1 ##사용 CPU Core를 분류할 수 있음

htop ##htop 명령어를 통해 특정 CPU 사용량을 확인


[CFS(Completely Fair Scheduler) 주기 설정_기본 100ms이며 대부분 사용자는 default 값 사용한다고 공식문서에 적혀있음;]

docker run -d --name quota_1_4 --cpu-period=100000 --cpu-quota=25000 alicek106/stress stress --cpu 1

##100000 = 100ms로 cpu-quota는 100000에서 25000만큼 할당하여 CPU 주기를 1/4로 구성하는 설정으로 CPU 성능이 일반(100ms)보다 1/4로 감소

docker run -d --name quota_1_1 --cpu-period=100000 --cpu-quota=100000 alicek106/stress stress --cpu 1

##cpu-quota는 cpu-period 옵션에서 얼마를 컨테이너에게 할당할 것인지를 의미

(참고: https://www.joinc.co.kr/w/man/12/docker/limits)


[연장 학습]

##--cpus은 docker 1.13 에서 추가된 옵션

##이전 버전 1.12 이하에서는 컨테이별 CPU 사용 격리를 위해 세 가지 방법이 존재

##1.12 이하 버전에서는 --cpu-shares, --cpuset, cfs quota 세 가지 옵션을 통해 CPU 사용 격리

##cfs를 이용한 CPU 격리 방법은 좋은 선택 중 하나지만, user interface로 인한 불편함(정확한 계산)으로 심플하게 CPU 격리환경을 구성하기 어려움으로 공식적으로 --cpus 사용을 권장(리눅스 스케쥴러인 cfs는 잘 이해가 안 됨)

(참고: https://docs.docker.com/config/containers/resource_constraints/#configure-the-default-cfs-scheduler)

(참고: https://blog.docker.com/2017/01/cpu-management-docker-1-13/)


[Block I/O 제한, p76]

##--device-write-bps, --device-read-bps, --device-write-iops --device-read-iops 옵션을 통해 Disk 성능을 제어

##Disk Block Bandwidth 제한

docker run -it --device-write-bps /dev/xvda:1mb ubuntu:14.04

dd if=/dev/zero of=test bs=1M count=10 oflag=direct

##Disk Block IOPS 제한

docker run -it --device-write-iops /dev/xvda:5 ubuntu:14.04

dd if=/dev/zero of=test bs=1M count=10 oflag=direct

docker run -it --device-write-iops /dev/xvda:10 ubuntu:14.04

dd if=/dev/zero of=test bs=1M count=10 oflag=direct


[컨테이너 저장 공간 설정, p77]

##도커 엔진이 AUFS 스토리지 드라이버를 사용하면 컨테이너는 호스트와 저장 공간의 크기를 공유하지만, 디바이스매퍼 드라이버를 사용 시에는 10GB의 저장 공간을 할당

##DOCEKR_OPTS 옵션에 --storage-driver=devicemapper --storage-opt dm.basesize=20G(컨테이너 기본 저장 공간) 백앤드 스토리지 드라이버로 디바이스 매퍼

##디바이스매퍼를 사용하지 않다가 --storage-driver 옵션으로 디바이스매퍼를 지정하면 기존 도커 컨테이너와 이미지는 사용 불가(이미지와 컨테이너 초기화), 드라이버 설정에서 원래 설정으로 수정하면 재사용 가능(스토리지 드라이버별 데이터는 /var/lib/docker에 저장)

##디바이스매퍼를 사용해야만 컨테이너의 저장 공간을 늘릴 수 있음


[도커 이미지, p79]

docker search ubuntu ##도커허브 이미지 검색

docker run -it --name commit_test ubuntu:14.04 ##도커 테스트 이미지 생성

#echo test_first! >> first

#docker commit [option] CONTAINER [repository[:tag]]

docker commit -a "alicek106" -m "my first commit" commit_test commit_test:first ##detached 모드, 커맨드 등 컨테이너의 설정까지 이미지와 저장

docker images #도커 이미지 확인

docker run -it --name commit_test2 commit_test:first

echo test_second! >> second

docker inspect images-id #grep Layers 항목 확인


##도커 이미지는 incremental backup이며, 이미지 삭제 시 당연히 해당 이미지의 레이어 파일 삭제는 되지 않음

docker rmi commit_test:first ##도커 이미지 삭제는 컨테이너부터 삭제해야됨

docker stop commit_test2 && docker rm commit_test2

docker rmi commit_test:first

docker images -f 도커이미지 ##-f 옵션을 통해 강제로 도커 이미지를 삭제는 가능함, 삭제 시 기존 컨테이너는 이미지 이름이 None으로 표기(dangling 이미지)

docker images -f dangling=true ##dangling 이미지 확인

docker image prune ##dangling 이미지 전부 삭제

docker rm $(docker images -a |grep "<none>" |awk '{print $3}') ##댕글 이미지를 사용하는 컨테이너부터 삭제


[도커 이미지 추출, p86]

docker save -o ubuntu_14_04.tar ubuntu:14.04

docker export -o rootFS.tar mycontainer

docker import rootFS.tar myimage:0.0 ##export, import의 도커 이미지 저장 방식은 레이어 구조 방식이 아니기 때문에 지양


[도커 이미지 배포, p87]

##도커 이미지 배포는 save, load, export, import 방식을 사용해도 되지만 지양하는게 좋다

##도커 허브 이용 권장(github처럼 Public, Private 존재) 물론, 사설 레지스트리도 구성 가능

docker run -it --name commit_container1 ubuntu:14.04

docker commit commit_container1 myimagename:0.0

docker tag myimagename:0.0 601kecila/yimagename:0.0 ##tag 지정

docker login ##도커 허브에 접속, /계정명/.docker/config.json에 도커 로긴 정보 저장

docker push 601kecila/myimagename:0.0 ##태그명이 중복 불가

##도커 허브는 Organizations에서 Group, Team, 권한을 지정할 수 있음, 웹훅을 통해 Build 구성 가능


[도커 사설 레지스트리, p.96]

docker run -d --name myregistry -p 5000:5000 --restart=always registry:2.6 

##--restart=always 옵션: 호스트 및 도커 엔진이 재시작될 때 컨테이너도 재시작(옵션은 always, on-faulure:5: 종료코드가 0이 아닐 경우 5번 재시작, unless-stopped: 명시적으로 컨테이너를 stop 했을 경우 컨테이너는 재시작되지 않음), 레지스트리 컨테이너는 기본적으로 port 5000 사용하며 RESTful API 사용

curl localhost:5000/v2/ ##RESTful API TEST


docker tag myimagename:0.0 localhost:5000/myimagename:0.0 ##사설 레지스트리에 올리기 위해 이미지 tag 지정

docker push localhost:5000/myimagename:0.0 ##사설 레지스트리에 이미지 Push

##기본적으로 docker 엔진의 기본 레지스트리는 https 통신만을 허용, 도커 시작 옵션(vim /etc/init.d/docker)

에 DOCKER_OPTS="--insecure-registry=13.125.189.252:5000" 옵션을 추가한 뒤 도커를 재시작

docker pull localhost:5000/myimagename:0.0 ##사설 레지스트리에서 이미지 Pull

docker rm --volumes myregistry

##레지스트리 컨테이너는 생성과 동시에 컨테이너 내부 디렉터리에 마운트 되는 도커 볼륨을 생성 push 된 이미지 파일은 이 볼륨에 저장되며 레지스트리 컨테이너가 삭제돼도 볼륨은 남아 있음. 컨테이너를 삭제할 때 볼륨도 함께 삭제하고 싶다면 docker rm 명령어에 --volumes 옵션 추가


[Nginx 서버로 접근 권한 생성, p99]

실패-> 공식 도큐먼트 성공(https://docs.docker.com/registry/recipes/nginx/#starting-and-stopping)


##사설 레지스트리 컨테이너의 인증을 위해 Nginx를 통해 레지스트리 컨테이너를 제어하자, 인증서가 없으므로 만들장

mkdir certs

openssl genrsa -out ./certs/ca.key 2048 ##인증 기관 Key 생성(ROOT CA)

openssl req -x509 -new -key ./certs/ca.key -days 365 -out ./certs/ca.crt ##인증 요청서 생성

openssl genrsa -out ./certs/domain.key 2048 ##Public Key 생성

openssl req -new -key ./certs/domain.key -subj /CN=13.125.189.252 -out ./certs/domain.csr ##Public 인증서 생성

echo subjectAltName = IP:13.125.189.252 > extfile.cnf 

openssl x509 -req -in ./certs/domain.csr -CA ./certs/ca.crt -CAkey ./certs/ca.key -CAcreateserial -out ./certs/domain.crt -days 365 -extfile extfile.cnf ##Root, Public 인증서를 이용하여 Private 인증서 생성

yum -y install httpd-tools ##htpasswd 설치

htpasswd -c htpasswd leedoing ##

mv htpasswd certs/


(nginx ssl config, p.101)

docker run -d --name myregistry --restart=always registry:2.6 ##레지스트리 재생성

docker run -d --name nginx_frontend -p 443:443 --link myregistry:registry -v $(pwd)/certs/:/etc/nginx/conf.d nginx:1.9 #certs를 볼륨으로 묶고 link Alias를 이용하여 regstry 연동

인증 Error 발생(신뢰할 수 없는 Self-signed 인증서는 도커에서 차단)


(p.103)

cp certs/ca.crt /etc/pki/ca-trust/source/anchors/ ##호스트에서 신뢰할 수 있는 인증서로 해당 인증서 추가

update-ca-trust ##추가추가


service docker resart

docker start nginx_frontend


docker login https://13.125.189.252

docker tag myimagename:0.0 13.125.189.252/myimagename:0.0 ##Push를 위한 Image tag 재설정

docker push 13.125.189.252/myimagename:0.0


[사설 레지스트리 RESTful API, p103], 해결 안 됨(80 port, connection refused error)

(참고: https://docs.docker.com/registry/spec/api/)

curl -u leedoing:passwd https://13.125.189.252/v2/_catalog ##registry에 저장된 이미지 목록 확인

curl 13.125.189.252:5000/v2/myimagename/tags/list ##registry에 저장된 이미지 태그 리스트까지 확인


curl -i --header "Accept: application/vnd.docker.distribution.manifest.v2+json" 13.125.189.252:5000/v2/myimagename/manifests/0.0 ##이미지 정보까지 확인(Etag 값)

[root@ip-10-0-1-42 ~]# curl -i --header "Accept: application/vnd.docker.distribution.manifest.v2+json" 13.125.189.252:5001/v2/myimagename/manifests/0.0

HTTP/1.1 200 OK

Content-Length: 1357

Content-Type: application/vnd.docker.distribution.manifest.v2+json

Docker-Content-Digest: sha256:52286464db54577a128fa1b1aa3c115bd86721b490ff4cbd0cd14d190b66c570

Docker-Distribution-Api-Version: registry/2.0

Etag: "sha256:52286464db54577a128fa1b1aa3c115bd86721b490ff4cbd0cd14d190b66c570"

X-Content-Type-Options: nosniff

Date: Thu, 22 Mar 2018 08:58:28 GMT


{

   "schemaVersion": 2,

   "mediaType": "application/vnd.docker.distribution.manifest.v2+json",

   "config": {

      "mediaType": "application/vnd.docker.container.image.v1+json",

      "size": 3614,

      "digest": "sha256:f975c50357489439eb9145dbfa16bb7cd06c02c31aa4df45c77de4d2baa4e232"

   },

   "layers": [

      {

         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",

         "size": 42963776,

         "digest": "sha256:22dc81ace0ea2f45ad67b790cddad29a45e206d51db0af826dc9495ba21a0b06"

      },

...

}


curl -i --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -X DELETE 13.125.189.252:5001/v2/myimagename/manifests/sha256:6aexxxxxxxxx  ##이미지 레이어에서 manifest 정보를 삭제

##그러나 삭제는 되지 않음. 컨테이너 환경 변수에 삭제 기능 활성화를 지정 필요, 삭제 시 202 code 반환

##또한, 실제로 레지스트리에서 이미지가 삭제된 것은 아니며 매니페슽 파일만 삭제된 것으로 실제 레이어의 다이제스트 값을 입력해 이미지를 삭제해야 한다.


docker run -d --name registry_delete_enabled -p 5001:5000 --restart=always -e REGISTRY_STORAGE_DELETE_ENABLED=true registry:2.6  ##컨테이너의 환경 변수에 레지스트리 이미지 삭제 기능 활성화


curl -X DELETE -i 13.125.189.252:5001/v2/myimagename/blobs/sha256:22dc81ace0ea2f45ad67b790cddad29a45e206d51db0af826dc9495ba21a0b06 ##레이어 파일의 다이제스트를 각각 삭제해줘야 실제로 레지스트리의 이미지가 삭제


docker run -d -p 5001:5000 --name registry_delete_enabled --restart=always -e REGISTRY_STORAGE_DELETE_ENABLED=true -e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/va/lib/mydocker registry:2.6 ## -e: 환경변수 옵션으로 이미지 삭제뿐 아니라 스토리지 백앤드, 이미지 레이퍼 파일이 저장될 디렉터리, 훅 설정 등이 가능


docker exec registry_delete_enabled cat /etc/docker/registry/config.yml ##매번 -e 옵션을 통해 컨테이너를 생성할 필요없이 /etc/docker/registry/config.yml을 통해 환경변수 셋팅이 가능


config.yml (p.108) ##로그 출력 레벨 info / 이미지 파일 저장 공간은 /registry_data, 이미지 삭제 API 활성화. http addr은 레지스트리 주소를 바인딩할 주소

version: 0.1

log:

level: info

storage:

filesystem:

rootdirectory: /registry_data

delete:

enabled: true

http:

addr: 0.0.0.0:5000


docker tag ubuntu:14.04 localhost:5002/ubuntu:14.04

docker push localhost:5002/nginx.latest

docker exec yml_registry ls /registry_data ##docker 이미지 저장 확인

##-e 옵션 혹은 yml을 통해서 레지스트리 이미지 저장 경로를 지정(S3도 가능한 부분), 지정을 하지 않으면 기본적으로 /var/lib/registry에 저장됨


[Dockerfile, p109 드디어 도커파일...]

[이미지를 생성하는 방법]

1. 깡통 이미지 컨테이너 생성

2. Application 구성

3. 컨테이너 이미지로 커밋

##Dockerfile을 통해 위 일련의 과정을 자동화(패키지, 쉘 구성 등)

echo test >> test.html ##테스트용 더미파일 생성

mkdir dockerfile && cd dockerfile

vim Dockerfile ##도커파일 명령어는 주로 대문자로 표기


FROM ubuntu:14.04 

##base가 될 이미지

MAINTAINER leedoing 

##이미지를 생성한 오너(일반적으로 이메일 등 기록)

LABEL "purpose"="practice"

##메타데이터(key:value 형태) inspect로 확인 가능

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"] 

## RUN["실행 가능한 파일", "명령줄1", "명령줄2, ..]형식 가능

EXPOSE 80 

##Dockerfile의 빌드로 생성된 이미지에서 노출될 포트(호스트와 포트 바인딩 의미는 아님)

CMD apachectl -DFOREGROUND 

##컨테이너가 시작도리 때마다 실행할 명령어(JSON 형태로 RUN 형식 가능)


docker build -t mybuild:0.0 ./ 

##Dockerfile Build -t 옵션은 이미지 이름 생성(옵션이 없으면 16진수 형태로 저장), ./ 경로는 외부도 가능


docker run -d -P --name myserver mybuild:0.0 ##-P 옵션은 Dockerfile의 expose 옵션과 port 포워딩(순차적)


[빌드 과정, p117]

빌드 컨텍스트 Read(Dockerfile이 위치한 디렉터리) -> ADD,COPY를 통해 빌드 컨텍스트에 파일을 이미지에 추가

빌드 컨텍스트는 하위 경로 모두 Read 하기 때문에 필요한 파일들만 빌드 컨텐스트에 포함하도록

불필요한 파일이 있다면 .dockerignore 파일(cf. gitignore) 사용(Dockerfile과 동일한 경로에 존재해야됨) 

vim .dockerignore

test2.html

*.html

*/*.html

test.htm? ##*, ?. ! 옵션 사용 가능


이미지 빌드는 컨테이너를 통해 실행되며 ADD, RUN 등 명령어가 실행될 때 각 컨테이너가 생성되며 이미지 레이어를 만듦

docker build --no-cache -t mybuild:0.0 ./ ## 이미지 빌드에서 각 레이어는 캐싱되기 때문에 RUN git clone과 같이 캐시에 문제가 될 수 있는 명령어는 --no-cache 옵션 사용


docker build --cache-from nginx my_extend_nginx:0.0 ##Dockerfile에 일부 내용을 추가해 사용할 경우 nginx:latest 이미지를 캐시로 사용할 수 있음


[기타 Dockerfile 명령어, 122]

ENV(환경 변수) / VOLUME(호스트 공유 볼륨) / ARG(INPUT) / USER(권한)


Onbuild(이미지 상속) / STOPSIGNAL(시스템콜 종류?) / HEALTHCHECK / SHELL(기본 쉘 설정) / ADD(외부 자원+tar 압축 풀기 지원) > COPY, 보안 및 기타 이유로 COPY 권장 / entrypoint(명령어 지정, CMD를 인자 값으로 받음)


[도커 허브엥서 Dockerfile로 빌드, p134]

패키치 설치 yum, apt-get 시 역슬래쉬로 가독성을 높임

# vim Dockerfile

...

RUN apt-get install package-1 \

package-2 


이미지 용량 관련

이미지 레이어에 주의하여 RUN && 사용

RUN 커맨드를 이용하여 파일 생성 후 RUN 으로 해당 파일을 삭제하더라도 이미지에서는 해당 용량을 차지, 따라서 RUN &&을 이용하여 이미지 크기를 줄이는 것을 권장


이미지를 공유하여 각 Application의 컨테이너를 사용하면 이미지 용량을 줄일 수 있음


[2.5 도커 데몬, p143]

도커 데몬 API가 사용 가능(RESTful API 방식)

SSL를 통해 API 보안이 가능


[2.5 도커 데몬 모니터링, p171]

events(docker events --filter 'type=image')

stats(docker stats --no-stream)

system df(docker system df)

cAdvisor(구글에서 만든 도커 모니터링 툴) - Docker 클러스터 모니터링에 한계

UCP 도커 클러스터 구성 상용 솔루션(도커 클러스터 모니터링의 경우 대부분 상용 솔루션)


[2.5.5 Remote API 라이브러리 사용, p178]

각 언어마다 Remote API 라이브러리를 제공











'비공_스터디' 카테고리의 다른 글

AWS SSO와 Directory Service 연동하기  (0) 2019.12.24
[책]시작하세요! 도커  (0) 2018.03.05
   (0) 2016.01.21
[책]인프라 엔지니어의 교과서  (0) 2016.01.13