본문 바로가기
Docker(도커)

도커(3일차)

by 세용용용용 2023. 6. 29.

6장

이미지 제작

 

(1) 이미지 태그

이미지를 업로드 할 떄 이름이 중요하다. 하지만 이미지의 이름을 변경하는 것은 따로 없으며, 태그 기능을 사용하여 이미지를 가리키는 이름을 하나 추가하는 형태임. 이미지를 업로드 하려는 목적이라면 태그를 지정할 때 "허브id/저장소이름:태그" 형태를 유지하는 것이 좋다!!!

 

1) docker tag

태그는 리눅스의 하드 링크를 생성하는 것과 비슷하다. 기능 또한 그러함

docker tag centos:latest sy02229/docker:centos >>> centos:latest 이미지에 nobreak/docker:centos 태그를 부여한다

docker images 명령으로 확인해보기

 

 

 

2) 이미지 업로드

이미지를 업로드 하려면 먼저 저장소에 로그인 해야됨!!! 로그인 후에 push 명령으로 업로드를 할 수 있다!!!

 

1. docker login

docker login 명령으로 저장소에 로그인 할수 있음!!! 서버를 지정하지 않으면 도커 허브가 기본 값이며, 프라이빗 이미지 저장소의 주소를 지정하면 해당 저장소에 로그인

docker login >>> 도커 허브에 로그인하는 명령어

 

이후 로그아웃을 하고 싶다면 docker logout 명령 사용!!

 

2. docker push

저장소에 이미지를 업로드 할 수 있다.

docker push sy02229/docker:centos >>> sy02229/docker:centos 이미지를 도커 허브에 저장하는 명령이다

업로드된 이미지는 도커 허브에서 확인할 수 있다. 

 

 

3) 이미지 제작

컨테이너를 사용해 이미지를 제작하는 방법은 다음과 같음

* 생성된 컨테이너에서 이미지를 생성

* 컨테이너의 파일 시스템을 추출하여 이미지를 생성

 

1. docker commit 

생성된 컨테이너를 기반으로 이미지를 생성한다.

 

docker cp /etc/services os7:/tmp >>> 이미지를 제작하기 위해 호스트의 /etc/services 파일을 이전에 만들어두었던 os7컨테이너의 /tmp디렉토리에 복사한다

docker commit os7 sy02229/docker:commit >>> docker commit 명령으로 sy02229/docker:commit 이미지를 생성

[ 컨테이너 os7의 현재 상태가 캡처되어 새로운 이미지가 생성됩니다. 이미지의 저장소는 sy02229/docker이고 태그는 commit입니다. 필요에 따라 저장소와 태그를 원하는 대로 변경할 수 있습니다. ]

 

docker images로 생성되었는지 확인!!!

 docker commit 명령으로 이미지 생성시 이미지 레이어가 하나 더 추가 된다

docker inspect sy02229/docker:commit

 

commit 추가실습

1. centos:7 이미지로 python_os 컨테이너 생성(hellow world출력) 후 이 컨테이너를 이미지로 생성!!

먼저 docker run -itd --name python_os centos:7 >>> python_os라는 이름을 가진 CentOS 7 컨테이너가 백그라운드에서 실행됩니다.

 

docker exec python_os yum -y install python >>> python_os라는 이름을 가진 컨테이너 내부에서 yum 명령어를 사용하여 Python을 설치

docker exec python_os mkdir /app >>> python_os라는 이름을 가진 컨테이너 내부에서 mkdir /app 명령어가 실행

 

vi test.py로 파일을 만들고 그 안에 print('hello world")

 

docker cp ./test.py python_os:/root/ >>> 현재 디렉토리에 있는 test.py 파일을 호스트에서 python_os 컨테이너의 /root/ 경로로 복사

 

현재 python_os : python이 설치됨 , /app, /root/test.py

포트 80, 443 오픈, WorkingDir디렉토리 /app로 설정, Volume설정 /app로 설정, test.py파일이 컨테이너 실행될떄 자동으로 실행되도록 이미지를 만들어보자

이미지 이름은 custom_python:v1 로 만들어 보자

 

docker commit --change 'CMD ["/usr/bin/python","/root/test.py"]' --change "EXPOSE 80" --change "EXPOSE 443" --change "WORKDIR /app" --change "VOLUME /app" python_os custom_python:v1

 

docker images로 이미지 생성됬는지 확인

위의 명령어를 실행하면 python_os 컨테이너의 현재 상태를 캡처하여 새로운 이미지인 custom_python:v1을 생성합니다. --change 옵션을 사용하여 변경 내용을 지정합니다.

  • --change 'CMD ["/usr/bin/python","/root/test.py"]': 컨테이너가 실행될 때 실행되는 명령어를 /usr/bin/python /root/test.py로 설정합니다.
  • --change "EXPOSE 80": 컨테이너가 호스트에 노출할 포트 80을 지정합니다.
  • --change "EXPOSE 443": 컨테이너가 호스트에 노출할 포트 443을 지정합니다.
  • --change "WORKDIR /app": 컨테이너 내에서 작업 디렉토리를 /app으로 설정합니다.
  • --change "VOLUME /app": 컨테이너의 /app 경로를 볼륨으로 설정합니다.

 

docker run --name custompy custom_python:v1

 

2. docker export / import

컨테이너의 파일 시스템을 추출하여 아카이브 파일로 생성할 수 있다.

docker export 명령을 사용할 떄 반드시 -o 옵션을 함께 사용!!!!

그렇지 않으면 아카이브 파일이 생성되지 않는다.

docker export -o export.tar os7 >>> os7 컨테이너의 파일 시스템을 추출하여 아카이브 파일로 생성한다!!!

tat tf export.tar >>> export.tar 파일의 내용을 확인하면 컨테이너에 존재했던 파일들을 알 수 있다.

 

ls 명령어로 확인

 

docker import >>> export로 추출된 아카이브 파일을 이미지화한다!!!

docker import export.tar sy02229/docker:import >>> export.tar 파일을 이미지로 생성한다

docker inspect sy02229.docker:import >>> inspect로 살펴보면 commit와 다르게 대부분의 값이 비어 있는걸 알 수 있다. 또 레이어도 하나로 통합됨

완전히 새로은 layers가 만들어진다!!!

import로 만든 이미지는 config값이 다 소멸한다

즉, import로 만들게되면 config값이 소멸되고 layers값도 완전히 새롭게 만들어진다!!!

이 이미지로 컨테이너를 실행하려면 반드시 지정된 이미지 뒤에 반드시 명령어를 지정해야됨

 

 

(2) Dockerfile

도커는 Dockerfile을 사용해 이미지를 제작할 수 있다. Dockerfile은 코드 형태의 텍스트 문서이며, 여러 가지 지시어를 사용해 이미지를 제작할 수 있다!!! 일반적으로 이미지를 생성할 떄 commit이나 import 보다는 Dockerfile을 사용함 , 이유는 코드 형태로 되어 있어 버전 관리도 용이하고, 이미지의 기능을 파악하기도 쉽다. 그리고 가장 큰 이유는 컨테이너가 실행하는 CMD 또는 ENTRYPOINT는 commit이나 import로는 지정하기 어렵다. 따라서 개발자가 이미지를 만들어야되면 Dockerfile를 사용한다.

 

Dockerfile 지시어

FROM : 베이스 이미지 지정 (centos7)

MAINTAINER : 이미지 작성자 명시 (sy02229)

RUN : 이미지 생성하면서 실행할 명령어 지정(최초 이미지 생성시 딱 한번만 생성되는 명령어)(yum -y install httpd)

CMD : 컨테이너의 애플리케이션 지정( 컨테이너 실행될때 마다 실행됨)("/usr/sbin/httpd", "-D", "FOREGROUND")

ENV : 컨테이너의 환경 변수 지정 (WEBPORT 80)

EXPOSE : 컨테이너의 포트 지정(${WEBPORT})

EXPOSE 443

ADD : 이미지 생성시 파일 추가

COPY : 이미지 생성시 파일 복사

VOLUME : 컨테이너의 볼륨 지정

USER : 컨테이너의 사용자 지정

WORKDIR : 컨테이너 작업 디렉토리 지정

 

3) Dockerfile 이미지 제작

docker build 명령으로 DOckerfile을 지정해 이미지를 제작할 수 있다.

필수 옵션은 아닌데 -t 옵션으로 이미지 이름을 지정하는 것이 좋다. 그렇지 않으면 이미지를 사용시 ID값으로 사용해야됨. PATH에는 Dockerfile라는 이름의 파일을 가지고 있는 디렉토리경로를 지정해야 하며, 만약 파일 이름이 Dockerfile이 아닌 경우 다른 옵션을 추가로 사용해야 한다.

Dockerfile을 작성할 떄 작업용 디렉토리를 생성하고 접근하여 사용하는 것이 권장됨. 이유는 이미지를 제작하면서 필요한 파일을 COPY하거나 ADD할 떄 같은 위치에 있어야 상대경로로 적어 편리하기 때문이다. 또한 공유의 목적도 있다.

 

실습

mkdir centos_web && cd centos_web

그리고 Dockerfile을 생성

Dockerfile

 

만약 Dockerfile에서 COPY 또는 ADD 지시어로 호스트의 파일을 이미지에 추가한다면 docker build 명령 전에 파일을 생성해야 한다.

echo "CentOS apache" > index.html

 

작업이 모두 완료되었으면 docker bulid 명령을 실행

docker build -t sy02229/docker:centosweb . >>> 현재 디렉토리(.)를 빌드 컨텍스트로 사용하여 Dockerfile을 찾아 sy02229/docker:centosweb 이미지를 빌드

 

docker images 명령으로 확인한다.

 

 

7장 프라이빗 이미지 저장

도커가 기본적으로 사용하는 이미지 저장소는 도커 허브이다. 하지만 도커허브는 기본적으로 퍼블릭 이미지 저장소로 사용되기 떄문에 기업이 자체적으로 보관하려면 별도로 프라이빗 이미지 저장소를 구성해야됨. 프라이빗 이미지 저장소는 경우에 따라 내부망 뿐아닌 인증을 통해 외부에서도 접근 가능하도록 구성할 수 있다.

 

1) 프라이빗 이미지 저장소 : 기업이 사내에 구축하여 내부 또는 외부에서 사용할 수 있도록 만든 이미지 저장소이다.

 

2) 프라이빗 이미지 저장소 종류 : 초기에는 도커 레지스트리를 주로사용, 요즘에는 다양한 프라이빗 이미지 저장소 서비스가 있기 때문에 필요에 따라 골라서 사용하면됨

 

1. 도커 레지스트리 : 요즘엔 이미지 형태로 제공되 여러 가지 옵션을 함께 사용하여 컨테이너로 실행하면 프라이빗 이미지 저장소로 사용할 수 있다. 하지만 다른 서비스에 비해 기능이 적어 인기가 떨어짐

 

2.Nexus : Sonatype Inc에서 만든 Maven Respository를 관리하기 위한 프로젝트. Maven Repository를 사설로 구축하여 공통 라이브러리 배포 용도나 다른 Maven Repository를 캐시 하여 빠르게 다운로드하는 기능이었다. 버전3부터는 npm 프라이빗 저장소와 프라이빗 이미지 저장소까지 구축 할 수 있다.

 

3. JFrog Artifactory : 도커 외에도 쿠버네티스 배포를 위한 Helm Chart 저장소를 제공한다. 빌드 환경과 통합하여 안정적인 원격 프라이빗 이미지 저장소를 제공한다.

 

4. Portus : 오픈소스 사용자 인증 기능과 LDAP 연동을 제공한다. 프라이빗 이미지 저장소로는 간단한 htpasswd 사용자 인증 기능만 제공한다.

 

5. harbor : RBAC기반으로 CNCF에서 관리하는 오픈 소스 컨테이너 이미지 레지스트르이다. 웹 인터페이스, 이미지 취약점 스캐닝, 멀티테넌트, 복제, 이미지 서명 등의 기능을 제공한다. 또한 다양한 서드파티 제품들과의 호환 제공하기 떄문에 편리하다.

 

 

프라이빗 이미지 저장소 구축

프라이빗 이미지 저장소로 Harbor를 구축한다.

 

Harbor 설치 절차

1. 도커 컴포즈 설치

도커를 사용해 Harbor를 설치하려면 도커 컴포즈가 필요하다. 먼저 도커 사이트에서 도커 컴포즈를 설치하는 문서를 찾아 설치하도록 한다.

밑에 명령어 입력

 

sudo chmod +x /usr/local/bin/docker-compose >>> docker-compose 명령이 /usr/local/bin/docker-compose에 다운로드되었다. 이 파일에 실행권한을 부여해 실행할 수 있도록 한다.

 

docker-compose --version >>> 설치가 되었는지 확인할 수 있다.

 

2. 최신버전 다운

harbor 설치 가이드에 있는 경로에서 압출 파일을 다운로드 한다.

curl -LO https://github.com/goharbor/harbor/releases/download/v2.0.2/harbor-offline-installer-v2.0.2.tgz

 

ls로 확인

tar zxf harbor-offline-installer-v2.0.2.tgz >>> 압축해제'

 

압축이 해제되면 harbor라는 디렉토리가 생성되어 있다.

이 디렉토리에 들어가 harbor.yml.tmlp 파일을 편집해야됨

https 관련 설정은 전부 주석으로 채운다.

마지막으로 도커 데몬의 설정을 추가한다.

이 과정서 192.168.56.102는 윈도우에서 도커 호스트로 사용되는 가상머신으로 통신 가능한 ip임 실제 사용할 떄는 Harbor컨테이너에 접근할 때 사용하는 ip를 지정해야 한다.

설정을 완료했으면 docker 데몬을 재시작한다!!!

docker systemctl restart docker

 

install.sh 스크립트 실행

이전 컨테이너와 충돌하지 않도록 실핼하기 전 사용했던 모든 컨테이너를 삭제하고 실행한다.

모든 컨테이너를 삭제하려면 docker rm -f $(docker ps -aq) 명령을 사용한다

 

기존에 설치된 docker-compose를 제거합니다.

sudo rm /usr/local/bin/docker-compose

 

docker-compose를 다운로드하고 설치합니다. 최신 버전의 docker-compose를 설치하려면 아래 명령을 실행하세요:
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

 

설치된 docker-compose에 실행 권한을 부여합니다.

sudo chmod +x /usr/local/bin/docker-compose

 

./install.sh >> install.sh 스크립트 실행

 

 

이미지 업로드 및 다운로드

도커 허브에 이미지를 업로드했던 것과 같이 프라이빗 이미지 저장소에도 이미지를 업로드할 수 있다.

 

1) 로그인

프라이빗 이미지 저장소에 이미지를 업로드하려면 도커 허브와 마찬가지로 로그인을 해야 한다. 

이번에는 Harbor의 기본 사용자 admin으로 로그인 해보자

docker login -u admin -p Harbor12345 192.168.56.102

 

vi /etc/hosts

 

 

2) 이미지 업로드

이미지 다운

docker pull centos:latest

 

이미지 업로드 하려면 태그를 지정해야 한다. 태그를 지정하는 방식은 Harbor의 주소/ 프로젝트이름/ 저장소이름:태그 이다. admin 사용자의 기본 프로젝트는 library이다.

따라서 태그로 이미지의 이름을 192.168.56.102/library/docker:centos 지정한다

docker tag centos:latest 192.168.56.102/library/docker:centos

 

태그 지정했다면 이미지 업로드 한다

docker push 192.168.56.102/library/docker:centos

 

3) 이미지 다운로드

업로드된 이미지 정상적 다운로드 되는지 확인 위해 192.168.56.102/library/docker:centos 이미지를 삭제

docker rmi 192.168.56.102/library/docker:centos

 

docker pull 명령으로 다시 이미지를 다운로드 한다.

docker pull 192.168.56.102/library/docker:centos

 

 

4) 이미지 확인

Harbor에 업로드된 이미지를 확인하려면 대시보드를 사용해야 한다.

이전에 업로드했던 centos 태그 이미지를 볼 수 있다.