Cloud/Docker

[Docker] 도커 이미지 생성: commit, Dockerfile

Yoonsoo Park 2024. 11. 26. 12:35

*해당 포스팅은 다음과 같은 환경에서 진행하였으니, 참고 바랍니다.

  • Docker Community Edition 
  • Ubunto Linux 22.04 (OS에 따라 설치 방법은 다소 상이하나, 사용법은 동일함)
  • VMware  Workstation pro ( x86_64, CPU  x 2, RAM 2GB, HDD 120GB)

 

1. commit으로 도커 이미지 만들기 

 도커 컨테이너를 사용하다보면 기존의 이미지에 네트워크 설정, 패키지 설치 등을 추가해 요구에 맞게 커스터마이징된 이미지가 필요한 경우가 있다. 이러한 이미지를 만들 수 있는 첫 번째 방법이 commit을 활용하는 것이다. commit을 활용하는 방법은 단순하다. 이미지를 기반으로 컨테이너를 만든 후, 필요에 맞게 커스터마이징해서 로컬에 commit하는 것이다. 설정 방법을 알아보자. 

#명령어 사용법#
docker container commit  [옵션] <컨테이너명|컨테이너ID>  [저장소이름/]이미지이름[:태그]  

#옵션#
--author, -a : 이미지 작성자 설정 
--message, -m : 메시지 설정 
--pause, -p : 컨테이너를 일시정지하고 commit 수행

 

예제) httpd 이미지로 컨테이너 생성   웹서버용 이미지 생성해서 컨테이너 만들어보기

cd /root 

mkdir skh-web 

cd skh-web 

vi index.html 

//index.html의 내용
<html> 
<h1>Welcome to SKH WEB ~~!</h1> 
</html> 

docker container run -itd --name=skhweb-base httpd 

docker container cp index.html skhweb-base:/usr/local/apache2/htdocs/ 

docker container exec -it skhweb-base /bin/bash 

docker container commit -a "SKH" skhweb-base skhweb:0.1 

docker image ls

새로 만든 이미지로 컨테이너 3개 구동하고 테스트하기 
docker container run -itd -p 8001:80 --name=skh-web1 skhweb:0.1 

docker container run -itd -p 8002:80 --name=skh-web2 skhweb:0.1 

docker container run -itd -p 8003:80 --name=skh-web3 skhweb:0.1 
docker container ps

도커호스트의 주소와 지정한 포트를 이용해 웹 사이트에 접속해보자!

<접속 화면>

 

 

2. Dockerfile을 이용하여 이미지 만들기

 도커 이미지를 생성할 때는 압도적으로 Dockerfile을 주로 사용한다(commit을 가볍게 다룬 이유..). Dockerfile이란 도커 이미지를 만들 때 사용되는 설계도 정도로 이해하면 된다. Dockerfile 내부에 완성된 이미지를 만들기 위한 여러 패키지, 소스코드, 명령어 들을 기록하고, Dockerfile을 빌드하면 완성된 이미지로 만들어준다. Dockerfile은 Docker Hub에 들어가면 이미지마다 존재하니 참고해보자.

<httpd의 dockerfile>

 

기본적으로 Dockerfile을 작성하기 위해서는 몇 가지 주의사항과 Dockerfile에서 사용되는 명령어들을 숙지해야 한다. 다음 설명을 참고하자. 

 

Dockerfile 작성 시 주의사항

ㄴ 컨테이너에서 수행해야 할 작업을 명시
ㄴ 정해진 형식과 명령어로 작성해야 함
ㄴ 문서 파일로 작성
ㄴ 한 줄에 하나의 명령어로 구성
ㄴ 명령어를 명시하고 뒤에 옵션을 추가
ㄴ 명령어는 대/소문자 상관없으나 일반적으로 대문자로 표기
ㄴ 위에서 아래로 한 줄씩 차례대로 실행됨
ㄴ 주석은 # 기호를 사용

 

Dockerfile 명령어

명령어
설명
FROM
베이스 이미지 지정
LABEL
이미지에 메타데이터 추가 (이미지에 대한 정보)
ADD
추가할 파일/디렉토리 지정
COPY
복사할 파일 지정
RUN
이미지를 만들때 컨테이너 내부에서 실행해야 할 명령어 지정
WORKDIR
작업 디렉토리 지정
EXPOSE
공개할 포트 지정
CMD
컨테이너가 실행될 때 실행할 명령 지정
ENTRYPOINT
컨테이너가 실행될 때 실행할 명령 지정
VOLUME
마운트할 볼륨 지정
ENV
환경변수 설정

 

Dockerfile 예시 

FROM httpd  
#httpd 이미지를 pull 해서 시작한다
LABEL author="YScommit"
LABEL version="0.2"
ADD index.html  /usr/local/apache2/htdocs #httpd의 웹문서 기본 경로
ENV TZ="Asia/Seoul" 
#설정하지 않으면 자동으로 UTC +0
EXPOSE 80

Dockerfile 작성 및 빌드 방법

mkdir /root/test-web
cd /root/test-web
vi Dockerfile #Dockerfile의 이름은 무조건 해당 형식을 맞춰줘야 한다(다르면 인식이 안됨)

#도커 파일 내용 작성

#도커 파일 빌드하기 
docker build -t ysweb:0.2 /test_web
(기본 형식:  docker build [옵션] <Dockerfile이 있는 디렉토리 경로>  )

docker image ls
docker image rm  //만약 이미지를 삭제해야 할 경우

<Dockerfile 빌드 및 확인>

 

 

 

힘들지만 오늘도 해낸 나를 위한 한 마디,

"마이너스에 집중하면, 마이너스만 부각될 뿐이다. 그리고 이것은 결국 실패와 결핍만 가득한 삶을 불러온다. 그러므로, 원하는 것을 얻기 위해서는 모든 장애물, 환경을 무시하고, 꾸준히 원하는 대상에 몰입해야 한다. 인간은 산만한 존재이기 때문에 쉽지 않겠지만, 내가 목표한 무언가에 다다르기 위해서는 반드시 해내야만 하는 것이다."