본문 바로가기

DevOps/Docker

<Docker> 도커 이미지 만들고 올리기

1. 만들기

* 소개

 - 지금까지는 공식적으로 제공되는 이미지만을 사용했다. 하지만 이미 존재하는 컨테이너를 이용하면 누구나 쉽게 이미지를 만들 수 있다.

 

 

 - 이미지를 만드는 방법에는 두 가지가 있다. 첫 번째는 commit 커맨드로 기존 컨테이너를 이미지로 변환하는 방법이고, 두 번째는 Dockerfile 스크립트로 이미지를 만드는 방법이다.

 

docker commit <컨테이너 이름> <새로운 이미지 이름>

 

 - 위의 명령어를 통해 컨테이너를 이미지로 변환한다. 미리 컨테이너가 준비되어 있어야 한다는 번거로움이 있다.

 - Dockerfile에 스크립트를 작성하면 스크립트를 빌드하여 이미지를 만들 수 있다. 호스트 컴퓨터의 폴더에 파일을 두고 컨테이너에 넣을 파일들도 함께 넣어 아래의 명령어를 실행한다.

 

docker build -t <생성할 이미지 이름> <재료 폴더 경로>

 

* 실습

 - 아파치 컨테이너를 통해 실습해보자.

 

# 아파치 준비
docker run --name apa000ex22 -d -p 8080:80 httpd

 

 - 먼저 아파치를 준비한다. 특별한 수정을 하지 않았지만 수정했다고 가정하고 이를 통해 새로운 이미지를 만들어보자. (컨테이너를 수정하는 것은 아래에서 별도로 다루도록 하겠다.)

 

# 새 이미지 생성
docker commit apa000ex22 ex22_original1

# 이미지 확인
docker image ls

 

 - 목표로 하는 컨테이너 이름을 먼저 입력하고 뒤에 이미지 이름을 지정한다. 이미지 생성 후에는 이미지가 잘 생성되었는지 ls 명령어로 확인한다.

 - 다음은 Dockerfile로 이미지를 만들어보자. 이번에도 httpd 이미지를 사용한다. 파일 복사를 사용하여 이전에 만들어두었던 index.html을 넣은 새 이미지를 만들어보자.

 

From httpd
COPY index.html /usr/local/apache2/htdocs

 

 - 위의 스크립트를 입력한 Dockerfile을 index.html이 있는 경로에 만든다. 그리고 아래의 명령어를 입력하여 이미지를 빌드한다. 스크립트에 입력 가능한 인스트럭션은 아래에서 따로 설명하겠다. 참고로 복사할 원본 경로는 상대경로로 작성하면 되므로 index.html을 그대로 적었다.

 

# 이미지 빌드
docker build -t ex22_original2 /Users/harry/Documents/Github/playground-devops/docker-basic

# 이미지 확인
docker image ls

# 새 이미지 컨테이너 실행
docker run --name apa000ex22 -d -p 8080:80 ex22_original2

 

 - 이미지 빌드에서 이미지명과 Dockerfile과 index.html이 들어있는 경로를 입력한다. 이미지를 확인하고 컨테이너를 실행해서 확인해보면 index.html이 정상적으로 나올 것이다.

 - 도커파일 스크립트에 가장 많이 사용되는 인스트럭션은 FROM, COPY, RUN이며, 그 외에 주로 사용되는 것들은 아래 표와 같다.

 

인스트럭션 내용
FROM 베이스 이미지
ADD 이미지에 파일이나 폴더 추가
COPY 이미지에 파일이나 폴더 추가
RUN 이미지를 빌드할 때 실행할 명령어를 지정
CMD 컨테이너를 실행할 때 실행할 명령어를 지정
ENTRYPOINT 컨테이너를 실행할 때 실행할 명령어를 강제 지정
EXPOSE 이미지가 통신에 사용할 포트를 명시적으로 지정
VOLUME 퍼시스턴시 데이터를 저장할 경로를 명시적으로 지정
ENV 환경변수를 정의
WORKDIR RUN, CMD, ENTRYPOINT, ADD, COPY에 정의된 명령어를 실행하는 작업 디렉토리 지정
LABEL 이름이나 버전, 저작자 정보 설정
USER RUN, CMD, ENTRYPOINT에 정의된 명령어를 실행하는 사용자 또는 그룹을 지정
ARG docker build 커맨드를 사용할 때 입력받을 수 있는 인자를 선언

 

2. 수정하기

 - 컨테이너를 수정하는 방법에는 크게 두 가지 방법이 있다. 대부분 이 두 가지를 혼용한다. 첫 번째는 앞서 배웠던 파일 복사와 마운트다. 두 번째 방법은 컨테이너에서 리눅스 명령어를 실행하는 것이다.

 

 - 컨테이너에서 리눅스 명령어를 실행하려면 리눅스에 명령을 전달해주는 프로그램인 셸이 필요하다. 대부분의 컨테이너에는 일반적으로 사용되는 셸인 bash가 설치되어 있다. 따라서 이번 포스팅에서도 bash를 기준으로 설명한다.

 - bash를 실행하려면 /bin/bash 인자를 전달해야 한다. 이 인자를 docker run 또는 docker exec 커맨드와 함께 사용할 수 있다. exec은 컨테이너 속에서 명령어를 실행하는 커맨드다. 실행 중인 컨테이너에 run을 사용할 수 없으므로 exec을 사용한다.

 

 - 만약 docker run 커맨드에 인자를 붙여버리면 컨테이너에 들어있는 소프트웨어 대신 bash가 실행되므로 run으로 해당 인자를 붙일 일은 거의 없다.

 

docker exec -it apa000ex23 /bin/bash
exit

 

 - bash가 실행되면 셸에 입력된 명령은 도커 엔진이 아닌 해당 컨테이너로 전달된다. 컨테이너를 bash 명령을 통해 수정 작업을 완료했다면 exit 명령어로 컨테이너에서 나올 수 있다.

 

3. 배포

* 용어

 - 지금까지 docker run 커맨드를 사용하여 받아왔던 이미지는 모두 도커 허브에 저장되어 있던 것이다. 우리가 직접 만든 이미지도 도커 허브에 올릴 수 있으며, 비공개 장소에도 올릴 수 있다.

 - 우리가 이미지를 배포하는 장소를 '도커 레지스트리'라고 한다. 공개되어 있는 비공개 장소이든 이미지가 배포되는 장소는 모두 도커 레지스트리이다. 도커 허브는 도커 제작사에서 운영하는 공식 레지스트리다. 도커 레지스트리는 도커 제작사 외에 다른 기업이나 개인도 운영할 수 있으므로 전 세계적으로 많은 수가 있다.

 

네이버 클라우드 (좌) / 카카오 i 클라우드 (우)

 - 네이버에서 운영하는 네이버 클라우드나 카카오에서 운영하는 카카오 i클라우드에도 Container Registry라는 이름으로 서비스를 제공하고 있다.

 - 레지스트리 안에는 '리포지토리'가 존재한다. 레지스트리를 구성하는 단위이며 소프트웨어 단위와 거의 일치한다.

 

(이미지 출처 : https://www.kakaoicloud.com/service/detail/2-18)

 - 위 이미지는 카카오 i클라우드의 레지스트리 서비스다. 각 리포지토리가 소프트웨어 이름으로 만들어져 있는 것을 볼 수 있다.

 - 다음은 '태그'다. 기존에 도커 허브에서 받았던 이미지가 mysql:8과 같은 형식으로 되어 있었다. 이는 로컬 컴퓨터에서 사용되는 명칭이다. 실제 정식 명칭은 레지스트리의 주소와 버전까지 표기한다. 이 부분은 배포와 밀접한 관계가 있으므로 아래에서 좀 더 자세히 알아보자.

 

* 태그

<레지스트리 주소>/<리포지토리 이름>:<버전>

 

 - 태그의 정식 명칭은 위와 같은 형식을 띠고 있으며, 도커 허브는 레지스트리 주소에 ID가 들어갈 수 있다. 만약 우리가 수정한 이미지를 배포하려면 정식 명칭으로 태그를 붙여야 한다.

 

docker tag <원래 이미지 이름> <레지스트리 주소>/<리포지토리 이름>:<버전>

 

 - 위와 같이 tag 명령어를 사용하면 이미지가 정식명칭으로 복제된다. 다음으로 push 명령으로 이미지를 올릴 수 있다. 이 때 어느 레지스트리에 업로드할지도 태그로 판단하며, 리포지토리는 처음 업로드할 때는 존재하지 않고 새로 생성된다.

 

docker push <레지스트리 주소>/<리포지토리 이름>:<버전>

 

 - 참고로 업로드 대상 레지스트리에 따라 로그인을 요구하는 경우도 있다. 이 때에는 docker login 명령어로 해당 레지스트리에 로그인해야 push를 진행할 수 있다. 로그인 명령어에 사용되는 인자나 시크릿 키 등은 해당 레지스트리의 문서에서 대부분 제공하고 있다.

 

 


참고

 

 해당 포스팅은 그림과 실습으로 배우는 도커&쿠버네티스를 읽고 개인적으로 필요한 내용을 추가 및 정리한 글입니다.

 

 

 

그림과 실습으로 배우는 도커 & 쿠버네티스 - YES24

컨테이너나 도커를 도통 이해하기 어려운 분들을 위한 본격 도커 입문서!이 책은 컨테이너 기술이 어렵게 느껴지는 엔지니어나 백엔드 기술에 자신이 없는 분들을 위한 도커 입문서다. 자세한

www.yes24.com