[Docker] 3. 이미지, Dockerfile, 프라이빗 저장소(Docker registry, Harbor)

Jk Lim·2023년 7월 3일
0

MLOps 부트캠프

목록 보기
33/34
post-thumbnail

1. 이미지 관련 명령어

(1) tag

  • 단순히 새로운 이름만 붙여주는 것. 이미지 자체는 똑같기 때문에 IMAGE ID는 같다
docker tag centos:centos7 91root/docker:centos7
docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
91root/docker   centos7   eeb6ee3f44bd   21 months ago   204MB
centos          centos7   eeb6ee3f44bd   21 months ago   204MB
...

(2) push

  • 생성된 이미지를 개인 리포지토리에 업로드 하는 명령어
docker push 91root/docker:centos7

(3) commit

  • 이미지를 생성하지만, 기존의 이미지와 다른 부분만 레이어로 추가해서 생성하는 방식
  • 태그를 다르게 입력해야함.
docker cp /etc/services os7:/tmp # 이미지에 파일을 추가해서 변화를 줌
docker commit os7 91root/docker:commit # 이미지 commit
docker inspect 91root/docker:centos7
...
"RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:174f5685490326fc0a1c0f5570b8663732189b327007e47ff13d2ca59673db02"
...
docker inspect 91root/docker:commit
...
"RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:174f5685490326fc0a1c0f5570b8663732189b327007e47ff13d2ca59673db02",
                "sha256:b3a5d56724c95fc3ef091ba5df15256e5a25d0b38afbf669354caa00b39c6dc6"
...

(4) export / import

  • export : 컨테이너의 파일시스템을 추출하여 아카이브 파일로 생성하는 명령어
  • import : 아카이브 파일을 이미지로 불러오는 명령어
  • import로 만든 이미지는 같은 구성이더라도 레이어가 새롭게 생성, config값도 초기화됨
docker export -o export.tar os7
tar -tf export.tar # 아카이브 파일 구성 확인
docker import export.tar 91root/docker:import # 아카이브 파일을 특정 태그를 붙여 이미지로 불러오기

2. Dockerfile

  • Dockerfile을 통해서 기존 이미지로부터 원하는 대로 customizing한 이미지를 생성할 수 있다.
# Dockerfile
FROM centos:7
MAINTAINER 91root
RUN yum -y install httpd
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
ENV WEBPORT 80
EXPOSE ${WEBPORT}
EXPOSE 443
VOLUME /var/www/html
COPY index.html /var/www/html/index.html
docker build -t 91root/docker:centosweb . # 이미지 만들기. Dockerfile이 있는 디렉토리에서 수행

docker run -d --name centosweb -v centvol:/var/www/html 91root/docker:centosweb # 컨테이너 생성

3. 프라이빗 저장소

  • 이미지 저장을 할 때, 도커허브가 아닌 프라이빗 저장소를 활용할 수도 있다.

(1) Docker registry

  • 아주 간단한 프라이빗 저장소
  • 5000포트를 사용
# 리포지토리 역할을 하는 Docker registry 이미지
docker pull registry:2
# 실행
docker run -d -p 5000:5000 --name registry registry:2
# 이미지 저장하기
docker image tag centos:latest localhost:5000/mycentos:v1
# 이미지 push
docker push localhost:5000/mycentos:v1
# 이미지 업로드된 정보 확인
curl -X GET http://localhost:5000/v2/_catalog
curl -X GET http://localhost:5000/v2/mycentos/tags/list

# 이미지 다시 다운로드하기
docker pull localhost:5000/mycentos:v1
# 이미지로 컨테이너 만들기
docker run -itd --name os localhost:5000/mycentos:v1

(2) Harbor

  • 보안 및 관리 등 부가적인 기능이 포함된 프라이빗 저장소
# docker-compose 설치 (Harbor 설치 시, 필요)
curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose # 파일 실행 권한 부여
docker-compose --version # 버전 확인

# Harbor 설치
curl -LO https://github.com/goharbor/harbor/releases/download/v2.0.2/harbor-offline-installer-v2.0.2.tgz
# [호스트/harbor]
# tmpl 파일 복사
cp harbor.yml.tmpl harbor.yml
vim harbor.yml

# harbor.yml
# set nu

# 도메인 지정
5 hostname: harbor.nobreak.co.kr

# https 주석처리
12 # https related config
13 # https:
14   # https port for harbor, default is 443
15 #  port: 443
16   # The path of cert and key files for nginx
17 #  certificate: /your/certificate/path
18 #  private_key: /your/private/key/path

vim /etc/docker/daemon.json
# daemon.json
# http 통신을 허용하는 설정
{
"insecure-registries" : ["192.168.56.190"]
}

systemctl restart docker
# 실행중인 컨테이너 지우고 설치
# harbor
./install.sh

vim /etc/hosts # 설정한 도메인 명과 harbor ip 값 입력하기

docker login -u admin -p Harbor12345 192.168.56.190 # 로그인
# 태그 입력
docker tag centos:latest 192.168.56.190/library/docker:centos
# harbor서버에 업로드
docker push 192.168.56.190/library/docker:centos
# 이미지 삭제
docker rmi 192.168.56.190/library/docker:centos
# harbor로부터 이미지 다운로드
docker pull 192.168.56.190/library/docker:centos

(참고) HTTPS 로 구축하기

  • harbor 서버에 HTTPS 프로토콜 적용
# CA 개인키, 인증서(공개키) 발급
# 개인키 생성
openssl genrsa -out ca.key 4096
# 인증서(공개키 생성)
openssl req -x509 -new -nodes -sha512 -days 3650 -key ca.key -out ca.crt
# Harbor서버 개인키, CSR 생성
# 개인키 생성
openssl genrsa -out harbor.nobreak.or.kr.key 4096
# CSR 생성
openssl req -sha512 -new -key harbor.nobreak.or.kr.key -out harbor.nobreak.or.kr.csr
# 해당 서버에서 사용할 수 있는 인증서 발급
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in harbor.nobreak.or.kr.csr -out harbor.nobreak.or.kr.crt
# crt -> cert 확장자로 변경
openssl x509 -inform PEM -in harbor.nobreak.or.kr.crt -out harbor.nobreak.or.kr.cert
# 인증서 디렉토리 생성 및 복사
mkdir -p /etc/docker/certs.d/harbor.nobreak.co.kr/
cp harbor.nobreak.or.kr.cert /etc/docker/certs.d/harbor.nobreak.co.kr/ # 서버 공개키
cp harbor.nobreak.or.kr.key /etc/docker/certs.d/harbor.nobreak.co.kr/ # 서버 개인키
cp ca.crt /etc/docker/certs.d/harbor.nobreak.co.kr/ # 인증기관 공개키
# docker 재시작
systemctl restart docker
# [harbor.yml] 내용 수정
# https 주석 해제 및 인증서 경로 입력
# https related config
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /etc/docker/certs.d/harbor.nobreak.co.kr/harbor.nobreak.or.kr.cert
  private_key: /etc/docker/certs.d/harbor.nobreak.co.kr/harbor.nobreak.or.kr.key
# 운영체제에 인증서를 등록해야함
# [호스트/root]
cp harbor.nobreak.or.kr.crt /etc/pki/ca-trust/source/anchors/
cp ca.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust
# [호스트/harbor]
./prepare
docker-compose down -v
docker-compose up -d
# 로그인 및 테스트
docker login harbor.nobreak.co.kr
docker tag centos:latest harbor.nobreak.co.kr/library/docker:v1
docker push harbor.nobreak.co.kr/library/docker:v1

0개의 댓글