티스토리 뷰

728x90
반응형

도커 이미지

도커는 기본적으로 도커 허브라는 중앙 이미지 저장소에서 이미지를 내려받는다.

이미지 저장소를 다른 사람들에게 공개하지 않기 위해 비공개 저장소를 사용하려면 비공개 저장소의 수에 따라 요금을 지불해야 한다. 이를 해결하기 위해 도커 이미지 저장소를 직접 구축해 비공개로 사용할 수도 있다.

도커 엔진에서 docker search 명령어를 사용하여 어떤 이미지가 있는지 확인할 수 있다.

$ docker search ubuntu



도커 이미지 생성

컨테이너에 애플리케이션을 위한 특정 개발 환경을 직접 구축한 뒤 사용자만의 이미지를 직접 생성해야 하는 경우가 많다. 컨테이너 안에서 작업한 내용을 이미지로 만드는 방법을 알아보자.

$ docker run -it --name commit_test ubuntu:14.04
root@aef3354235eif:/# echo test_first >> first

컨테이너에서 호스트로 빠져나와 commit 명령어를 입력해 컨테이너로 이미지를 만들자. 명령어의 형식은 아래와 같다.

$ docker commit [OPTIONS] CONTAINER [REPOSITORY:TAG]
$ docker commit \
-a "ihp001" -m "my first commit" \
commit_test \
commit_test:first

이미지의 이름을 commit_tset로, 태그를 first로 설정했다. -a옵션은 author를 뜻하고, -m 옵션은 커밋 메시지를 뜻하며, 이미지에 포함도리 부가 설명이다. docker images로 이미지가 생성됐는지 확인한다.

commit_test:first 이미지로 또 새로운 commit_test:second를 생성한다.



이미지 구조 이해

이미지를 좀 더 효율적으로 다루기 위해 컨테이너가 어떻게 이미지로 만들어지며, 이미지의 구조는 어떻게 돼 있는지 알 필요가 있다.

$ docker inspect ubuntu:14.04
$ docker inspect commit_test:first
$ docker inspect commit_test:second

주의 깊게 살펴볼 항목은 가장 아랫부분에 있는 Layers 항목이다.

example

example

docker images에서 위 3개의 이미지 크기가 각각 188MB라고 출력돼도 188MB 크기의 이미지가 3개 존재하는 것은 아니다. 이미지를 커밋할 때 컨테이너에서 변경된 사항만 새로운 레이어로 저장하고, 그 레이어를 포함해 새로운 이미지를 생성하기 때문이다.

example

ubuntu:14.04 이미지로 commit_test:first 이미지를 만들고, commit_test:first를 이미지로 commit_test:second 이미지를 만들었을 때, commit_test:first 이미지를 삭제했다고 해서 실제로 해당 이미지의 레이어 파일이 삭제되지 않는다. commit_test:first 이미지를 기반으로 하는 하위 이미지인 commit_test:second 이미지가 존재하기 때문이다. 따라서 실제 이미지 파일을 삭제하지 않고 레이어에 부여된 이름만 삭제한다(삭제시에 Untagged: .. 이런식으로 출력됨). commit_test:second 이미지를 삭제하면 "Deleted:"라는 출력 결과가 뜨고 이미지 레이어가 실제로 삭제가 됨다.



이미지 추출

도커 이미지를 별도로 저장하거나 옮기는 등 필요에 따라 이미지를 단일 바이너리 파일로 저장해야 할 때가 있다. docker save 명령어를 사용하면 컨테이너의 커맨드, 이미지 이름과 태그 등 이미지의 모든 메타데이터를 포함해 하나의 파일로 추출할 수 있다.

$ docker save -o ubuntu_14_04.tar ubuntu:14.04

추출된 이미지는 load 명령어로 도커에 다시 로드할 수 있다.

$ docker load -i ubuntu_14_04.tar



이미지 배포

저장소에 이미지 올리기

도커 허브를 가입하고 저장소를 생성해서 이미지를 올려보자.

$ docker run -it --name commit_container1 ubuntu:14.04
root@234234cff3:/# echo my first push >> test

$ docker commit commit_container1 uaena:0.0
sha256:~~

$ docker tag uaena:0.0 ihp001/uaena:0.0

uaena:0.0이라는 이미지로 커밋한다. 그런데 이미지 저장소로 올리려면 이미지가 저장되는 저장소 이름으로 설정해야 하므로 저장소이름을 이미지 앞에 추가한다. 이때는 tag 명령어를 사용해서 이미지 이름을 추가한다.

이름을 변경하고 다음 명령어로 도커 허브 서버에 로그인한뒤, push명령어로 이미지 저장소에 올리자.

$ docker login

$ docker push ihp001/uaena:0.0
...
~~: Pushed
~: Mounted from library/ubuntu
...
...
...

자신이 수정한 부분의 레이어만 저장소로 전송되고, 나머지 레이어는 ubuntu:14.04 이미지에서 생성되어 도커 허브의 우분투 이미지 저장소에 이미 존재하므로 전송되지 않는다.

도커에서 이미지를 내려받을때는 아래의 명령어로 내려받는다.

$ docker pull ihp001/uaena:0.0



도커 사설 레지스트리

사설 레지스트리 컨테이너 생성

도커 사설 레지스트리를 사용하면 개인 서버에 이미지를 저장할 수 있는 저장소를 만들 수 있다. 이 레지스트리는 컨테이너로서 구현되므로 이에 해당하는 도커 이미지가 존재한다.

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

$ curl localhost:5000/v2/
{}



사설 레지스트리에 이미지 push

$ docker tag uaena:0.0 192.168.35.43:5000/uaena:0.0

$ dockr push 192.168.35.43:5000/uaena:0.0
The push refers to repository [192.168.35.43:5000/uaena]
Get https://192.168.35.43:5000/v2/: http: server gave HTTP response to HTTPS client

$ docker pull 192.168.35.43:5000/uaena:0.0

push가 되지 않을것이다. 왜냐하면 도커 데몬은 HTTPS를 사용하지 않은 레지스트리 컨테이너에 접근하지 못하도록 설정하기 때문이다(--insecure-registry 옵션으로 push, pull 가능).



Nginx 서버로 접근 권한 생성

Nginx 서버 컨테이너를 생성하고 레지스트리 컨테이너와 연동하여 인증 절차를 만들어보자. 우선 TLS를 적용해야 한다. 정보 입력은 전부 엔터를 쳐도 괜찮다.

$ mkdir certs
$ openssl genrsa -out ./certs/ca.key 2048
$ openssl req -x509 -new -key ./certs/ca.key -days 10000 -out ./certs/ca.crt

이 ROOT 인증서로 레지스트리 컨테이너에 사용될 인증서를 생성한다. 인증 서명 요청 파일인 CSR(certificate signing request) 파일을 생성하고 ROOT 인증서로 새로운 인증서를 발급한다. 밑의 명령어에서 IP는 본인 IP를 입력해야된다. 이 IP로 Nginx 서버 컨테이너에 접근할 것이다.

$ openssl genrsa -out ./certs/domain.key 2048
$ openssl req -new -key ./certs/domain.key -subj /CN=192.168.35.43 -out ./certs/domain.csr
$ echo subjectAltName = IP:192.168.35.43 > extfile.cnf
$ openssl x509 -req -in ./certs/domain.csr -CA ./certs/ca.crt -CAkey ./certs/ca.key -CAcreateserial -out ./certs/domain.crt -days 10000 -extfile extfile.cnf

다음 명령어를 입력해 레지스트리에 로그인시에 사용할 계정과 비밀번호를 저장하는 파일을 생성합니다. ihp001대신 본인이 사용할 아이디를 입력하면ㅊㅍ된다.

$ sudo apt-get install apache2-utils -y
$ htpasswd -c htpasswd ihp001
# 비번입력
$ mv htpasswd certs/

다음 내용을 certs 디렉터리에 nginx.conf 파일로 저장한다. Nginx 서버에서 SSL 인증에 필요한 각종 파일의 위치와 레지스트리 컨테이너로의 Proxy를 설정한다. 마찬가지로 밑에도 자신의 IP를 써준다.

upstream docker-registry {
  server registry:5000;
}
server {
  listen 443;
  server_name 192.168.35.43;
  ssl on;
  ssl_certificate /etc/nginx/conf.d/domain.crt;
  ssl_certificate_key /etc/nginx/conf.d/domain.key;
  client_max_body_size 0;
  chunked_transfer_encoding on;

  location /v2/ {
    if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
      return 404;
    }
    auth_basic "registry.localhost";
    auth_basic_user_file /etc/nginx/conf.d/htpasswd;
    add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;

    proxy_pass http://docker-registry;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_read_timeout 900;
  }
}

끝났다. 기존에 생성한 레지스트리 컨테이너가 있다면 삭제하고 다시 생성하자. 그 다음 Nginx 서버 컨테이너를 생성하자. 위에서 생성한 nginx.conf, domain.crt, domain.key 파일이 존재하는 certs 디렉터리를 -v 옵션으로 컨테이너에 공유한다. 443포트도 연결한다. --link 옵션은 내부 IP를 알 필요 없이 항상 컨테이너에 별명으로 접근하도록 설정한다.

$ docker stop myregistry; docker rm myregistry
$ docker run -d --name myregistry --restart=always registry
$ docker run -d --name nginx_frontend -p 443:443 --link myregistry:registry -v $(pwd)/certs/:/etc/nginx/conf.d nginx
$ docker ps
# 생성된거 확인

다음 우리가 직접 서명한 인증서를 신뢰할 수 있는 인증서 목록에 추가해야한다.

$ sudo cp certs/ca.crt /usr/local/share/ca-certificates/
$ sudo update-ca-certificates
$ service docker restart
$ docker start nginx_frontend

이제 도커 로그인으로 인증 요청하고 레지스트리 컨테이너에 이미지를 push해보자.

$ docker login 192.168.35.43
...
...
Login Succeeded

$ docker tag uaena:0.0 192.168.35.43/uaena:0.0
$ docker push 192.168.35.43/uaena:0.0





출처
시작하세요! 도커/쿠버네티스(용찬호 저, 위키북스)
example

728x90
반응형
댓글
반응형
250x250
글 보관함
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday
링크