728x90
Docker - Docker image 만들기 (Dockerfile & build)
이번 포스팅에서는 docker image를 만들 때 Dockerfile과 build명령어를 사용해서 docker image를 만들어 보자
1. Image 만드는 두가지 방법
commit과 build의 차이점
1. commit은 이미 사용하고 있는 container가 있을 때 그 컨테이너를 이미지로 만드는 백업과 같은 개념이고
2. build는 dockerfile을 이용해서 이미지를 구체적으로 시간의 순서에 따라 기록해서 이미지를 생성하는 개념이다
2. 예상 시나리오
우리는 도커 이미지를 만든건데 그 이미지에는 웹서버가 설치되어 있어서 언제든 run 명령어로 컨테이너를 만들면 바로바로 사용할 수 있는 웹서버 이미지 만들고 싶다.
3. 실습
※ 참고로 이전에 포스팅했던 commit 사례
# 1번 터미널
docker run —name web-server -it ubuntu:20.04
# 2번 터미널
docker commit web-server web-server-commit
docker images
3-1. Dockerfile 내용
FROM ubuntu:20.04
3-2. 터미널
- . : 현재 디렉토리에 dockerfile이 있고 이미지를 만들 때 사용할 파일이 현재 위치에 위치시키기 위함이다
# Dockerfile 있는 경로에서 실행
docker build -t web-server-build .
3-3. 컨테이너 안에서 python3 설치
- python3 안에 웹서버가 내장되어있기 때문에 python3 설치
3-4. 컨테이너 내부에서 명령어 실행을 위한 Dockerfile 수정
- 아래 명령어를 컨테이너 내부에서 바로 실행할 수 있게 하기 위함이다
apt update
apt install python3
- Dockerfile 내용
- RUN 명령어를 실행시킬때마다 레이어라는 게 생성해서 가급적 한 줄로 작성하는 게 좋다
- -y: 설치 할때 중간에 y/n 입력하게 하는 명령어 있을 때 자동으로 y 입력하게 하는 옵션
FROM ubuntu:20.04
#RUN apt update
#RUN apt install python3
RUN apt update && apt install -y python3
- 내가 만든 웹서버가 사용자 요청 들어왔을때 그 요청을 /var/www/html에서 찾게 하고 싶을 때, /var/www/html 경로를 생성해야 한다
※ 원래 terminal cli 명령어
mkdir -p /var/www/html → -p 명령어는 www 디렉토리 없어도 무조건 생성시키는 옵션
cd /var/www/html
- /var/www/html 경로가 없으면 생성해 주고 디렉터리 이동을 전부 포함하는 내용
- 앞으로 실행할 RUN, 엔트리포인트, cmd 명령어 실행할 때 cd /var/www/html 경로에서 실행
WORKDIR /var/www/html
3-5. 이때 사용자가 요청이 들어왔을 때 응답해 줄 기본 웹페이지 생성
1. index.html 파일
- 1안
- echo “hello, <strong>Docker</strong>” index.html : “” 안의 내용을 index.html 파일로 저장한다
FROM ubuntu:20.04
RUN apt update && apt install -y python3
WORKDIR /var/www/html
# 이렇게 하면 위의 WORKDIR 에서 명시한 디렉토리 안에서 해당 명령어 실행
RUN echo “hello, <strong>Docker</strong>” index.html
- 2안
- host에 있는 파일을 컨테이너 안으로 copy
FROM ubuntu:20.04
RUN apt update && apt install -y python3
WORKDIR /var/www/html
# 왼쪽: host에 있는 index.html 파일을
# 오른쪽: . 경로인 /var/www/html 내부경로로 복사하라는 뜻
COPY ["index.html", "."]
2. python3 -u -m http.server
- python3에 내장되어 있는 웹서버가 실행되면서 기본 포트인 8000 포트에서 리스닝하고
- -u: docker에서 웹서버 실행을 위해선 python3에 기본적으로 포함되어 있는 웹서버 특성으로 -u 명령어 필수로 작성해야 함. 이렇게 해야 실행되고 있는 로그가 화면으로 출력된다
- -m: 모듈을 실행. Python 내장 HTTP 서버를 실행한다는 뜻이다
FROM ubuntu:20.04
RUN apt update && apt install -y python3
WORKDIR /var/www/html
CMD ["python3", "-u", "-m", "http.server"]
3-6. dockerfile 만들고 실행 테스트
docker build -t web-server-build .;
docker rm --force web-server;
docker run -p 8888:8000 --name web-server web-server-build;
4. RUN, CMD 차이
- RUN 명령어
- RUN 명령어는 이미지 빌드 단계에서 실행된다. 즉, Docker 이미지를 생성할 때 컨테이너 내부에서 명령을 실행한다.
- 주로 이미지를 빌드하는 과정에서 패키지 설치, 소스 코드 컴파일, 파일 복사 등의 작업을 수행하는 데 사용된다.
- RUN 명령어에서 수행한 작업은 이미지 레이어에 저장되므로 이후 이미지에서 이 작업을 재사용할 수 있다.
- 예를 들어, 다음과 같은 Dockerfile 코드에서 RUN을 사용하여 패키지를 설치하고 소스 코드를 복사할 수 있다.
FROM ubuntu:20.04
RUN apt update && apt install -y python3
WORKDIR /app
COPY . /app
- CMD 명령어
- CMD 명령어는 컨테이너를 시작할 때 실행된다. 즉, 이미지로부터 컨테이너를 생성하고 시작할 때 해당 명령이 실행한다.
- CMD 명령어는 Dockerfile에서 한 번만 사용되며, 여러 번 사용할 경우 마지막에 정의한 CMD가 사용된다.
- 주로 컨테이너 실행 시 애플리케이션을 시작하는 명령을 지정하는 데 사용된다.
- 예를 들어, 앞서 언급한 Dockerfile에서 CMD를 사용하여 Python 웹 서버를 시작할 수 있다.
CMD ["python3", "-u", "-m", "http.server"]
- 그런데 CMD에 작성한 명령어가 자동으로 실행되지 않게 하려면 run 명령어 뒤에 pwd 입력
- pwd 쓰면 CMD 명령어 대신에 실행
docker build -t web-server-build .;
docker rm --force web-server;
docker run -p 8888:8000 --name web-server web-server-build pwd;
[Docker] Docker의 이해 - Docker image 만들기 (commit 명령어 사용)
출처: https://youtu.be/0kQC19w0gTI?si=Uq5rMdt6chGLRWRv
'Docker' 카테고리의 다른 글
[Docker] docker run httpd 명령어 쳤을때 AH00558 경고 나올때 (0) | 2023.10.22 |
---|---|
[Docker] Docker의 이해 - Docker hub로 이미지 공유하기 (push) (2) | 2023.10.22 |
[Docker] Docker의 이해 - Docker image 만들기 (commit 명령어 사용) (0) | 2023.10.21 |
[Docker] Docker의 이해 - Docker Compose (1) | 2023.10.21 |
[Docker] Docker의 이해 - CLI 명령어 (2) | 2023.10.20 |