도커이미지
2.3 도커 이미지
도커는 도커 허브(Docker Hub)라는 중앙 이미지 저장소에서 이미질ㄹ 내려받음
docker create, docker run, docker pull의 명령어로 이미지를 내려받을때 도커허브에서 해당 이미지를 검색하고 내려 받음
2.3.1 도커 이미지 생성
앞에서 처럼 docker search를 통해 검색한 이미지를 pull 명령어로 내려받아 사용할 수도 있지만 도커로 개발하는 많은 경우에는 컨테이너에 애플리케이션을 위한 특정 개발 환경을 직접 구축한 뒤 사용자만의 이미지를 직접 생성 할 수도 있음
docker commit 명령어를 통해 ofiical 이미지를 수전해 나만의 이미지를 만들 수 있음
2.3.2 이미지 구조의 이해
위와 같이 컨테이너 이미지로 만드는 작업은 commit 명령어로 쉽게 수행할 수 있음
이미지의 구조를 살펴보기 위해 docker insepct로 찍어보면 레이어가 16진수 해시값으로 곂곂이 쌓여 있는것을 볼 수 있다.
이미지를 커밋 할 때 컨테이너에서 변경된 사항만 새로운 레이어를 저장
이미지 레이어 구조는 docker history 명령어를 통해 좀 더 쉽게 확인할 수 있음 이 명령어는 이미지가 어떤 레이어로 생성됐는지 출력
docker rmi image:tag 를 통해 이미지를 삭제할 수 있음
이미지를 사용중일때는 -f 옵션 사용
컨테이너가 사용중인 이미지를 강제 삭제하면 이미지 이름이 none으로 변경되며 이러한 이미지들을 댕글링 이미지 라고 한다.
이미지를 삭제할 때 해당하는 부모 이미지가 존재하지 않아야만 해당 이미지 파일이 삭제 됨
2.3.3 이미지 추출
도커 이미지를 단일 바이너리 파일로 저장 해야할 때가 있음 이때 docker save 명령어를 통해 컨테이너의 커맨드, 이미지 이름과 태그 등 이미지의 모든 메타데이터를 포함해 하나의 파일로 추출할 수 있음
해당 파일을 다시 불러올 때는 docker load라는 명령어를 사용(완전 동일한 이미지).
유사 명령어로는 export 와 import가 있음 docker export로 이미지를 추출하면 tar 파일로 추출하며 컨테이너 및 이미지에 대한 설정 정보를 저장하지 않음
불러올 때는 Import로 수행
이미지를 단일 파일로 저장하는 것은 효율적인 방법은 아님 레이어 구조의 파일이 단일 파일이 아니기 때문에 여러 버전의 이미지를 추추랗면 이미지 용량을 각기 차지하게 됨
2.3.4 이미지배포
이미지를 생성했따면 배포할 방법이 필요함 이를 위해 docker push 등과 같은 옵션으로 업로드가 가능
유사 git
2.3.4.1 도커 허브 저장소
도커 사이트 접속해서 래파지토리 생성 이미지 올리고 배포하는 과정 (유사 github) 과정 생략
2.3.4.2 도커 사설 레지스트리
도커 사설 레지스트리를 사용하면 개인 서버에 이미지를 저장할 수 있는 저장소를 만들 수 있음.
docker run -d --name myregistry \\
-p 5000:5000
--restart=always \\
registry:2.6
레지스트리 이미지를 연결해 사용함
docker tag my-image-name:0.0 ${DOCKER_HOST_IP}:5000/my-image-name:0.0
도커 이미지 태그 다는 명령
docker push ip-addr:5000/my-image-name
도커 허브에서 이미지를 push 할 때와 같음
엔진엑스로 서버로 접근 권한 생성
도커 데몬에 —insecure-registry 옵션만 추가하면 별도의 인증 절차 없이 레지스트리 컨테이너에서 이미지를 push, pull 할 수 있음 docker login 명령으로 통해 미리 정의된 계정으로 로긴 할 수 있음
인증정보를 설정할 수도 있지만 여기서는 별도의 Nginx 서버 컨테이너를 생성해 레지스트리 컨테이너와 연동하는 방식을 설명
로그인 인증 기능은 보안을 적용하지 않은 레지스트리 컨테이너에서는 사용할수 없으므로 스스로 인증한 인증서와 키를 발급함으로써 TLS를 적용하는 방법을 함께 설명함
Self-sgined ROOT 인증서파일을 생성함 인증서 정보를 입려력하는 칸에 전부 공백을 입력해도 상관없음
openssl genrsa -out ca.key 2048 # oepenSSL을 통해 키 생성
openssl req -x509 -new -key ca.key -days 10000 -out ca.crt # 키를 기반으로 X509인증서 생성
생성한 ROOT 인증서로 레지스트리 컨테이너에 사용될 인증서를 생성함 인증서 서명요청 파일인 CSR(certifacate signing request) 파일을 생성하고 ROOT 인증서로 새로운 인증서를 발급함 레지스트리 컨테이너가 존재하는 도커 서버의 IP로 도메인이나 이름을 입력함 이 IP로 Nginx 서버 컨테이너에 접근 함
openssl genrsa -out domain.key 2048
openssl rq -new -key domain.key -subj /CN=${DOCKER_HOST_IP} -out domain.csr
echo subjectAltName = IP:{DOCKER_HOST_IP} > extfile.cnf
openssl x509 -req -in domain.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out domain.crt -days 10000 -extfile extfile.cnt
htpasswd -c htpasswd alicek106
my htpasswdcerts
다음 내용을 certs 디렉터리에 nginx.conf 파일로 저장함 Nginx서버에서 SSL 필요한 각종 파일의 위치이와 레지스트리 컨테이너로우 프락시를 설정함 ROOT 인증서를 생성할 때와 마찬가지로 더커호스트의 서버의 IP를 입력함
nginx.conf 설정파일 (교제 참조)
다음 명령어로 엔진엑스 서버 컨테이너를 생성함 nginx.Cconf domain.crt, domain.key 파일이 존재하는 auth 디렉터리를 -v 옵션으로 컨테이너에 공유함
docker run -d --name nginx_frontend \\
-p 443:443 \\
--link mytegistry:registry \\
-v $(pwd)/certs/:/etc/nginx/conf.d \\
nginx:1.9
그러나 신뢰할 수 없는 인증서인 Self-Signed 인증서를 사용했으므로 도커에서 이를 사용하지 못하도록 에러를 출력함 따라서 인증서를 신뢰할 수 있는 인증서 목록에 추가함
update-ca-certificates
인증서를 추가한 다음, 도커를 재시작하고 Noginx 서버 컨테이너를 시작함
사설 레지스트리 Restful API
생략 (일반적인 API 사용 내용 )