상세 컨텐츠

본문 제목

Private 도커 Registry 설치 및 설정

Ops/Kubernetes

by 크리두 2020. 11. 10. 14:45

본문

반응형

도커 설치

sudo yum install docker
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Resolving Dependencies
--> Running transaction check
---> Package docker.x86_64 0:19.03.6ce-4.amzn2 will be installed
--> Processing Dependency: runc >= 1.0.0 for package: docker-19.03.6ce-4.amzn2.x86_64
--> Processing Dependency: containerd >= 1.3.2 for package: docker-19.03.6ce-4.amzn2.x86_64
--> Processing Dependency: pigz for package: docker-19.03.6ce-4.amzn2.x86_64
--> Processing Dependency: libcgroup for package: docker-19.03.6ce-4.amzn2.x86_64
--> Running transaction check
---> Package containerd.x86_64 0:1.3.2-1.amzn2 will be installed
---> Package libcgroup.x86_64 0:0.41-21.amzn2 will be installed
---> Package pigz.x86_64 0:2.3.4-1.amzn2.0.1 will be installed
---> Package runc.x86_64 0:1.0.0-0.1.20200204.gitdc9208a.amzn2 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===============================================================================================================
 Package            Arch           Version                                     Repository                 Size
===============================================================================================================
Installing:
 docker             x86_64         19.03.6ce-4.amzn2                           amzn2extra-docker          37 M
Installing for dependencies:
 containerd         x86_64         1.3.2-1.amzn2                               amzn2extra-docker          24 M
 libcgroup          x86_64         0.41-21.amzn2                               amzn2-core                 66 k
 pigz               x86_64         2.3.4-1.amzn2.0.1                           amzn2-core                 81 k
 runc               x86_64         1.0.0-0.1.20200204.gitdc9208a.amzn2         amzn2extra-docker         2.6 M

Transaction Summary
===============================================================================================================
Install  1 Package (+4 Dependent packages)

서버 재시작 시 구동

모든 서버는 장애 혹은 이슈 발생으로 인해 재시작할 경우가 있다. 재시작 시 바로 docker가 시작되도록 설정을 하려면 다음 명령어를 이용해 설정한다.

$ sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service

Docker 시작

$ sudo systemctl start docker

그룹에 사용자 추가하기

기본적으로 docker는 root 권한 계정으로 동작을 하게 되어 docker 명령어 앞에 sudo를 붙여야하는 불편한점이 있다. aws ec2 기본 유저인 ec2-user도 사용가능하도록 사용자를 추가해준다.

$ sudo usermod -aG docker ec2-user

Docker 확인

사용자 추가 후 바로 명령어를 할 경우 안된다면 터미널 종료 후, 다시 접속해서 시도하면 된다.

$ docker ps

Docker registry 원격 접속

현재는 localhost를 통하여 볼수 있지만 외부 망, 다른 곳(원격지)에서 접속을 할 경우도 발생한다. 여러 서버를 관리하다 보면 다른 위치에 있는, 즉 다른 네트워크를 통해 들어올수 있어야 한다. 도메인이 있다면 DNS 설정 서비스를 통하여 해당 서버 IP로 접근 가능하도록 등록할 수 있다. 가비아, godaddy, 닷네임 등 웹호스팅 업체를 살펴보면 가끔 할인을 해서 저렴한 가격에 도메인을 구입할 수 있다.

이 문서에서는 닷네임에서 발급받은 테스트 도메인을 통해 연결해보겠다. 일단

를 접속해 본다.

접속 후, 로그인을 하면 내 정보를 들어가면 도메인 관리가 있다. 아래에 보면 관리라는 버튼을 누르면 도메인 관련된 설정을 관리하는 페이지로 넘어가게 된다.

 

도메인 서비스 관리

도메인 서비스 관리 페이지로 오게 되면 좌측 사이드 바 메뉴에서 DNS 설정 - 도메인레코드관린(DNS)를 클릭한다.

 

 

다음 화면은 DNS 설정이 나오게 되는데 A레코드 설정에서 추가를 클릭한다. 닷네임 도메인 네임서버를 그대로 사용하게되면 무료로 이용이 가능하다. 추가 버튼을 누르고 나면 구매한 도메인 앞에 필요한 내용을 적으면 된다. 예를 들어 docker-repo.example.com을 입력(2번)하고 만들어 놓은 docker registry 서버 IP를 오른쪽(3번)에 넣으면 된다. 그 다음 저장을 누르게 되면 적용이 되지만 네임서버 변경에 적용되려면 시간이 필요하다. 각 업체마다 연결 처리를 해주는데 시간이 다 다르기 때문에 미리 해두는게 좋다.

 

연결 확인

$ docker tag hello-world docker-repo.example.com:5000/hello-world

연결한 도메인을 이용하여 tag를 붙여 이미지를 생성한다.

$ docker images
REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
registry                                    latest              2d4f4b5309b1        4 months ago        26.2MB
docker-repo.example.com:5000/hello-world   latest              bf756fb1ae65        10 months ago       13.3kB
hello-world                                 latest              bf756fb1ae65        10 months ago       13.3kB
localhost:5000/hello-world                  latest              bf756fb1ae65        10 months ago       13.3kB

이미지를 확인하면 기존에 localhost로 만들어진 것 외에 도메인을 이용해서 tag한 이미지가 만들어져 있다. 이 상태에서 docker push를 하면 실패하게 된다.

$ docker push docker-repo.example.com:5000/hello-world
The push refers to repository [docker-repo.example.com:5000/hello-world]
Get https://docker-repo.example.com:5000/v2/: http: server gave HTTP response to HTTPS client

docker registry는 로컬머신에서 사용하는게 아니라면 https만 지원을 하기 때문에 생기는 오류이다. 원격 접속하기 위해 docker registry 설정을 추가해 주어야 한다.

$ docker stop docker-registry && docker rm docker-registry
docker-registry
docker-registry

현재 올라가 있는 registry 컨테이너를 내리고 삭제한다.

SSL 인증서를 발급을 해야하는데 돈이 있다면 구입해서 사용하면 된다. 하지만 테스트나 개인용으로 사용하기에는 개인 서명 SSL을 생성하여 사용해도 충분하다. openssl을 이용하여 개인키를 생성할 것인데 ec2에는 이미 설치되어 있을 것이다.

$ openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

개인 서명 SSL 생성

$ mkdir sslkey && cd sslkey && openssl genrsa -des3 -out docker.key 2048
Generating RSA private key, 2048 bit long modulus
.............................................................................................+++
.+++
e is 65537 (0x10001)
Enter pass phrase for docker.key:
Verifying - Enter pass phrase for docker.key:

개인 서명 키를 생성하고 비밀번호를 누르고 enter, 다시 한번 같은 비밀번호를 입력하고 enter를 누르면 생성된다. 다음은 인증 요청서를 생성한다.

$ openssl req -new -key docker.key -out docker.csr
Enter pass phrase for docker.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:KR
State or Province Name (full name) []:Seoul
Locality Name (eg, city) [Default City]:Gurogu
Organization Name (eg, company) [Default Company Ltd]:google
Organizational Unit Name (eg, section) []:Test
Common Name (eg, your name or your server's hostname) []:docker-repo.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:Test
An optional company name []:google

인증서 발급을 위한 csr 파일을 생성한다. key파일에서 입력한 비밀번호를 넣으면 생성을 시작한다. 서명 내용은 크게 상관 없으나 대충 맞춰서 입력을 한다.

$ cp docker.key docker.key.origin && openssl rsa -in docker.key.origin -out docker.key && rm docker.key.origin Enter pass phrase for docker.key.origin:
writing RSA key
$ openssl x509 -req -days 730 -in docker.csr -signkey docker.key -out docker.crt         
Signature ok
subject=/C=KR/ST=Seoul/L=Gurogu/O=google/OU=Test/CN=docker-repo.yamflix.shop
Getting Private key

개인키에서 패스워드를 제거하고 인증 기간을 설정하여 생성한다. 인증 기간은 원하는 기간만큼 설정하면 되는데 여기서는 1년으로 생성하였다.

$docker run -d -p 5000:5000 --restart=always --name docker-registry \
  -v /home/ec2-user/sslkey:/certs \
  -e Re
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/docker.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/docker.key \
  registry
3984fde85abc4d7fadd2b99e507e73af07af410e918e33d20d2da213664ba7d9

2번째 /home//sslkey 부분에서 자신의 linux username으로 폴더가 생성되어 있으므로 username부분을 수정하여 입력하고 컨테이너를 실행한다. 여기선 aws ec2를 사용하여 ec2-user로 입력하면 된다.

docker registry가 실행이 되면 로컬에서 다시 push를 시도한다.

$ docker push docker-repo.example.com:5000/hello-world   
The push refers to repository [docker-repo.example.com:5000/hello-world]
Get https://docker-repo.example.com:5000/v2/: x509: certificate signed by unknown authority

사설 인증서를 사용하면 현재 사용하는 서버의 docker가 push를 하지 못하는 것이다. insecure-registry를 추가하여 설정하면 가능하다.

$ echo '{ "insecure-registries":["docker-repo.example.com:5000"] }' > /etc/docker/daemon.json

위 명령어를 통해 insecure-registries를 추가하여 pull을 하면 성공한다.

반응형

'Ops > Kubernetes' 카테고리의 다른 글

RBAC Authorization  (0) 2021.10.20
K8S ingress에 대하여  (0) 2021.06.24
K8S Master Clustering 설치 및 구성  (0) 2020.05.28
K8S node Internal IP 변경  (0) 2020.04.23
Docker 설치 및 세팅(CentOS 7)  (0) 2020.01.07

관련글 더보기

댓글 영역