이 글은 [2024 NEW] 개발자를 위한 쉬운 도커 강의를 듣고 작성한 글입니다! 모든 강의자료 이미지 출처는 해당 강사님께 있습니다.
이미지를 만드는 방법
이미지를 만드는 방법은 크게 2가지가 있다. 실행중인 컨테이너를 그 상태 그대로 이미지로 만들어내는 커밋 방식과 Dockerfile이라는 명세서를 이용해서 이미지를 만들어내는 빌드 방식이 존재한다. 대부분 빌드 방식을 사용하지만, 빌드 방식이 커밋 방식을 기반으로 동작하기 때문에 빌드 방식도 알아야 한다.
커밋을 통해 이미지 만들기(Nginx) 실습
-it 옵션을 이용하면 실행할 컨테이너와 직접 상호작용이 가능하다. cmd에 들어가는 실행 명령어에 리눅스의 쉘을 명령어로 주어야 한다. 즉, bin/bash 를 입력하면 된다.
새로 배운 명령어는 다음과 같다.
docker run -it --name 컨테이너명 이미지명 bin/bash : 컨테이너 실행과 동시에 터미널 접속
docker commit -m 커밋명 실행중인 컨테이너명 생성할 이미지명 : 실행 중인 컨테이너를 이미지로 생성
터미널을 2개 띄워서 실습을 진행한다.
(터미널1) nginx 이미지을 실행함과 동시에 Bash에 접근할 수 있다.
docker run -it --name officialNginx nginx bin/bash
(터미널1) 실행중인 nginx 컨테이너 안에서 파일 리스트를 출력한 결과를 볼 수 있다.
ls -al
(터미널2) 컨테이너의 실행 상태를 확인할 수 있다. 터미널1의 터미널 ID와 터미널 2의 컨테이너의 ID가 같은 것을 확인할 수 있다.
docker ps
(터미널1) 기본 nginx 이미지의 index.html 파일 내용을 수정한다. redirection 연산자인 > 를 사용해서 echo 결과를 파일로 저장할 수 있다.
echo hello-my-nginx > /usr/share/nginx/html/index.html
(터미널1) 수정된 내용으로 hello-my-nginx가 출력되는 것을 볼 수 있다.
cat /usr/share/nginx/html/index.html
(터미널2) 실행중인 officialNginx 컨테이너를 이미지로 커밋한다.
docker commit -m "edited index.html by kms" -c 'CMD ["nginx", "-g", "daemon off;"]; officialNginx kms02171/commitnginx
(터미널2) 생성된 이미지를 확인할 수 있다.
docker image ls kms02171/commitnginx
(터미널2) 생성된 이미지의 히스토리를 확인할 수 있다.
docker image history kms02171/commitnginx
레이어가 추가된 것을 확인할 수 있다. 커밋되기 전까지는 컨테이너의 읽기/쓰기 레어어였지만 커밋을 통해 기존의 nginx 이미지의 맨 위에 한 장을 추가하여 새로운 이미지를 생성한 것이다.
(터미널2) 새로 만든 이미지로 컨테이너를 실행한다.
docker run -d -p 80:80 --name my-nginx kms02171/commitnginx
(터미널2) 컨테이너의 실행을 확인한다.
docker ps
localhost로 접속하면 hello-my-nginx가 나온다.
실습에 사용된 컨테이너를 모두 삭제한다.
docker rm -f officialNginx my-nginx
레지스트리로 이미지를 푸시한다.
docker push kms02171/commitnginx
이미지 커밋 정리
이미지 커밋이란 현재 실행중인 컨테이너의 상태를 그대로 새로운 이미지로 저장하는 것을 의미힌다. 현재 실행중인 컨테이너는 이미지의 읽기 전용 레이어 위에 컨테이너의 읽기/쓰기 레이어가 올라가 있다. 이미지의 읽기 전용 레이어는 nginx 의 레이어이고, 이 위에서 수정한 사항들은 컨테이너의 읽기/쓰기 레이어에 저장되어 있다. 이 상태를 커밋 명령어를 사용하여 새로운 이미지로 만든다. commitnginx 이미지로 새로운 컨테이너를 실행하면 commitnginx 에서 제공하는 응답은 hello-my-nginx 라는 페이지가 된다.
커밋 방식을 사용하면 기존 레이어에 새로운 레이어를 한 장 추가할 수 있다.
이미지 빌드, IaC(Infrastructure as Code)의 개념
IaC는 현대 인프라 구성 중 가장 중요한 방법론 중 하나이다. 도커에서 IaC를 이용하여 코드로 이미지를 관리하는 방식이 이미지 빌드이다. IaC 방법을 사용하면 코드로 인프라 상태를 관리할 수 있다. 코드의 상세 작업 내용이 기록되어 있고, 프로그램이 작업을 한다. 프로그램이 작업하기 때문에 작업을 더 빠르고 안전하게 작업할 수 있다. 코드에 들어가는 내용은 일련의 작업 명세서로 사용된다. 명세서를 깃허브와 같은 소스코드 레파지토리에 저장하면 인프라의 상태도 소스코드 처럼 버전관리를 할 수 있다. 도커는 Dockerfile 이라는 소스코드를 사용하여 인프라의 상태를 저장하는 이미지를 만들 수 있다.
도커의 커밋과 빌드 비교
커밋 방식은 이미지를 만들 때 마다 컨테이너를 실행해야 하고, 사용자가 명령어를 직접 입력해야 한다. 커밋 하나당 이미지의 레이어가 하나가 추가되기 때문에, 여러 개의 레이어를 추가하고 싶으면 여러 번의 커밋을 수행해야 한다. 이런 과정은 복잡하기 때문에 사람이 직접 작업하면 문제가 발생할 가능성이 크다.
그래서 도커 이미지를 생성할 때는 대부분 빌드 방식을 사용한다.
빌드 방식은 컨테이너를 생성하고 커밋하는 것을 도커가 대신 수행한다. 도커에게 어떤 작업을 수행할 지 명세와 같은 것을 작성하는 파일이 Dockerfile 이다. 이미지 제작자가 도커가 이해할 수 있는 문법에 따라 Dockerfile을 작성하면, 도커는 임시 컨테이너를 생성하고 실행하여 사용자가 정의한 작업을 한 후 커밋을 한다. 코드이기 때문에 애플리케이션 소스코드와 관리할 수 있고, 버전 관리도 가능하다. Dockerfile에는 이미지를 어떻게 만드는지에 대한 세부 내용이 기재되어 있고, 도커는 Dockerfile을 해석하여 이미지를 제작해 준다.
새로 배운 명령어는 다음과 같다.
docker build -t 이미지명 Dockerfile 경로 : Dockerfile을 통해 이미지 빌드
Dockerfile의 문법은 지시어와 지시어의 옵션으로 구성된다. 지시어는 FROM, COPY, CMD 등이 있다.
FROM 이미지명은 베이스 이미지를 지정하는 것으로, 필수값이다. 베이스 이미지란 이미지를 빌드할 때 처음 시작할 이미지를 말한다. 이미지를 빌드할 때 필요한 파일시스템이 있는 이미지를 베이스 이미지로 지정하는 것이 좋다. 예를 들어서 node.js 애플리케이션을 실행하려면 node.js가 설치되어 있는 이미지를 베이스 이미지로 선택하는 것이 좋다. Java 애플리케이션을 실행하려면 자바 런타임이 설치되어 있는 이미지를 베이스 이미지로 선택하는 것이 좋다.
CMD ["명령어"]는 컨테이너 실행 시 명령어를 지정할 수 있다. 이 명령어는 메타 데이터의 CMD 필드에 저장된다.
빌드를 통해 이미지 만들기(Nginx) 실습
실습을 진행할 폴더를 만들고 해당 폴더로 이동한다.
mkdir easy-docker
cd easy-docker
실습 파일을 받고 브랜치를 이동한다.
git clone https://github.com/daintree-henry/build.git
도커 파일을 직접 작성하고 싶다면 00-init 브랜치로, 도커 파일 작성을 건너뛰고 싶으면 01-dockerfile 브랜치로 이동하면 된다.
git switch 00-init
git switch 01-dockerfile
실습을 진행할 폴더로 이동한다.
cd build/01.buildnginx
Dockerfile에는 다음과 같이 작성되어 있다.
FROM nginx:1.23
COPY index.html /usr/share/nginx/html/index.html
CMD ["nginx", "-g", "daemon off;"]
FROM 지시어로 nginx의 1.23 버전을 베이스 이미지로 지정했다. 이 이미지는 nginx 소프트웨어와 기본 index.html 파일을 가지고 있다.
COPY 지시어로 index.html로 /usr/share/nginx/html/index.html 을 덮어쓰기 한 것을 볼 수 있다. index.html은 Dockerfile과 같은 경로에 있는 index.html 파일이다.
CMD 지시어는 nginx를 컨테이너로 실행할 때 nginx 웹서버를 실행하도록 지정하는 부분이다.
같은 경로에 index.html 이 존재하고, 파일 내용은 다음과 같다.
Hello kms
터미널을 통해 이미지 빌드하자. 일반적으로 Dockerfile이 존재하는 경로에서 빌드 명령어를 실행하는 것이 좋다. 그렇지 않으면 별도로 Dockerfile 경로를 지정해 주어야 한다.
Dockerfile을 사용해 이미지명은 buildnginx로 지정하고 이미지를 빌드한다. .은 현재 디렉토리를 의미한다.
docker build -t kms02171/buildnginx .
빌드로 제작한 이미지로 컨테이너를 실행해보자.
docker run -d -p 80:80 --name build-nginx kms02171/buildnginx
컨테이너를 삭제한다.
docker rm -f build-nginx
이미지를 레지스트리에 푸시한다.
docker push kms02171/buildnginx
이미지 빌드 정리
커밋은 사용자가 직접 이미지를 만드는 방법이다.
빌드는 도커 데몬이 Dockerfile에 작성된 지시어를 통해 이미지를 자동으로 만들어주는 방법이다. 도커 빌드는 IaC 개념으로 인프라의 상태를 Dockerfile 이라는 코드로 관리할 수 있다. 하나의 커밋은 기존 레이어에 하나의 새로운 레이어를 추가한다.
'Docker' 카테고리의 다른 글
Dockerfile 지시어 (1) | 2024.02.27 |
---|---|
빌드 컨텍스트 (0) | 2024.02.20 |
이미지와 레이어 (0) | 2024.02.19 |
이미지 레지스트리 (0) | 2024.02.19 |
컨테이너의 라이프사이클 (0) | 2024.02.17 |