Docker

[Docker 입문] 도커에서 이미지를 만드는 방법 _생활코딩

scone 2023. 1. 23. 19:24

[ 이미지 만드는 법 2가지 ]

1. Commit

  • 이미 존재하는 컨테이너를 이미지로 백업하는 용도

 

2. Build

  • 존재하지 않는 이미지를 생성하는 것

 

https://www.youtube.com/watch?v=0kQC19w0gTI


[ Docker commit ]

docker extension 이 vs code에 깔려있다면 보다 편하게 container 상황을 확인할 수 있다.

docker run --name web-server -it ubuntu:20.04

코드를 실행시키면 ubuntu:20.04 도커 이미지를 설치하고, 이를 가지고 web-server라는 이름의 컨테이너를 만들어준다.

-it 라는 옵션을 통해 컨테이너 안의 본셸을 열어놓을 수 있었다.

 

docker commit web-server web-server-commit

 

"web-server" 라는 내 컨테이너를 "web-server-commit" 이라는 이름의 이미지로 저장하였다.

 


[ Docker build ]

Dockerfile 을 만들었습니다.

 

명령어를 통해 build를 해 봅니다.

docker build -t web-server-build .

-t 옵션은 tag를 의미합니다. web-server-build 라는 이름의 이미지를 만들겠다는 의미입니다.

경로는 현재 경로 . 로 설정하였습니다.

 

다음과 같이 docker image가 생성되었습니다.

 


파이썬3 안에 서버가 내장되어 있기 때문에 python3를 설치하려 합니다.

 

[ web-server-commit ]

commit 에 대한 연습이기 때문에 컨테이너 안에서 다음의 명령어를 진행해줍니다.

 

1. 컨테이너 안에서 python3 를 설치해 줍시다.

apt update
apt install python3

2. 웹서버가 사용자 요청이 들어왔을 때, 그 요청을 /var/www/html 에서 찾도록 만들고 싶습니다.

mkdir -p /var/www/html
cd /var/www/html
  • -p 옵션을 주면 경로에 해당하는 폴더 전체가 생성된다고 합니다.

3. 사용자에게 요청이 들어왔을 때, 그 요청을 응답해줄 기본 웹페이지 생성

echo "Hello, <strong>Docker</strong>" > index.html

4. python3 에 내장되어있는 웹서버가 실행이 되면서 기본 포트인 8000번 포트에 Listening 하게 됩니다.

python3 -m http.server

 

[ web-server-build ]

build에 대한 연습이기 때문에 Dockerfile를 먼저 작성해줍니다.

1. 컨테이너 안에서 python3 를 설치해 줍시다.

  • RUN apt update && apt install -y python3
  • RUN 명령어를 여러번 쓸 수도 있지만, RUN 명령어를 여러번 쓰면 레이어 여러 개가 생성되기 때문에 추천하지 않는다고 합니다.
  • 따라서 && 라는 키워드를 통해 한 줄로 명령어를 이어서 작성해 줍니다.
  • -y 옵션을 넣어주지 않으면 설치 중간에 설치 하시겠습니까? 라는 메세지가 뜨게 되고 docker가 제대로 build 되지 않게 됩니다.

2. 웹서버가 사용자 요청이 들어왔을 때, 그 요청을 /var/www/html 에서 찾도록 만들고 싶습니다.

  • WORKDIR /var/www/html
  • 디렉토리가 없다면 디렉토리를 만들고
  • 사용자를 디렉토리로 이동하고
  • 이후 실행하는 run, entry point, cmd 등의 명령어가 실행될 때, WORKDIR 을 대상으로 그 명령어가 실행이 됩니다.

3. 사용자에게 요청이 들어왔을 때, 그 요청을 응답해줄 기본 웹페이지 생성

  • RUN echo "Hello, <strong>Docker</strong>" > index.html
  • WORKDIR 안에 index.html이 생겨나게 된다.

또는 다음의 방법을 쓸 수 있습니다.

  • COPY ["index.html", "."]
  • HOST에 있는 index.html을 WORKDIR 에 복사하라는 명령어 입니다.

4. python3 에 내장되어있는 웹서버가 실행이 되면서 기본 포트인 8000번 포트에 Listening 하게 됩니다.

  • CMD ["python3", "-u", "-m", "http.server"]
  • Docker에서 python3에 내장된 웹서버를 실행하기 위해서는 python3에 기본적으로 포함된 속성으로 인해서 -u 옵션을 주어야만 실행되고 있는 log가 화면으로 출력되게 됩니다.
  • RUN 은 Build 가 되는 시점에 실행되는 명령어 입니다. (이미지에 반영)
  • CMD는 컨테이너가 실행될 때 실행되는 명령어 입니다. (컨테이너에 반영)

5. 이제 만든 Dockerfile로 이미지 생성 및 컨테이너를 실행시켜 봅시다.

docker build -t web-server-build .;
docker rm --force web-server;
docker run -p 8888:8000 --name web-server web-server-build;

web-server-build 라는 이름으로 build 하였고,

web-server 라는 컨테이너는 제거해주고, web-server 라는 이름으로 컨테이너를 만들었습니다.

8000번 포트에서 listening 하고 있는 python3 기본 웹서버가 실행이 되었습니다.

 

 

 

* 참고로 CMD 명령어를 실행시키고 싶지 않다면, 뒤에 pwd를 붙여서 CMD 대신 pwd를 실행시킬 수 있습니다. (오버라이딩)

 

docker build -t web-server-build .;
docker rm --force web-server;
docker run -p 8888:8000 --name web-server web-server-build pwd;