이미지를 만드는 방법은 두 가지가 있다. commit은 이미 사용하고 있는 컨테이너를 이미지로 백업을 하는 느낌이고, build는 도커 파일을 통해 만들고 싶은 이미지를 생성하는 식이다.
수정한 컨테이너에 commit을 하면, 그 컨테이너가 새로운 이미지가 된다. 그 이미지를 run 하면 컨테이너가 만들어진다. 그렇게 만든 이미지를 push하면 다른 개발자들도 pull 받을 수 있게 되고, docker hub와 같은 레지스트리에 업로드를 하면 전 세계 사람들이 pull 받을 수 있다.
ubuntu
이미지를 바탕으로 하는 web-server
라는 이름의 컨테이너를 생성한다. 이미지 태그는 버전 확인을 위해 20.04
로 붙였다. -it
옵션은 실행되자마자 터미널이 켜지도록 한다.
docker pull ubuntu:20.04
docker run --name web-server -it ubuntu:20.04
commit 명령어를 쓸 때에는 컨테이너를 지정한 후에 이미지를 지정하면 된다. web-server
컨테이너를 commit 하여 web-server-commit
이미지를 만들어보자.
docker commit web-server web-server-commit
docker images
명령어로 이미지가 잘 만들어 졌는지 확인할 수 있다.
파이썬3 안에는 웹 서버가 내장되어 있다. 이 웹 서버를 사용하기 위해서 설치를 해보자. 패키지를 설치하기 전에는 apt update
로 업데이트 먼저 실행한다.
apt update
apt install python3
웹서버의 사용자 요청을 찾는 디렉토리를 생성한다.-p
옵션을 추가하면 경로 전체가 생성된다.
mkdir -p /var/www/html
사용자 요청에 응답해 줄 웹페이지를 만들자.
echo "Hello, <strong>Docker</strong>" > index.html
파이썬3의 웹 서버 실행.
python3 -m http.server
commit으로 이미지를 만들게 되면 이미지가 어떻게 만들어졌고, 그 안에 무엇이 있는지 확인이 어렵다. 그래서 파일을 생성해서 이미지를 만드는 build 방식을 권장한다.
visual studio에 Dockerfile
파일을 만들었다. 확장 프로그램으로 도커를 설치하면 귀여운 고래 파일을 만들 수 있다. ubuntu:20.04
라는 이름의 컨테이너를 생성한다.
FROM ubuntu:20.04
web-server-build
라는 이미지를 만든다. -t
옵션은 이름 태그다.
docker build -t web-server-build .
도커 파일 안에서 명령어를 실행 할 때마다 레이어(layer)가 생성되기 때문에, 명령어들은 하나로 연결(&&
)해서 사용하는걸 권장한다.
-y
옵션을 추가하면 자동으로 yes가 되어 중간에 사용자의 입력이 기록되지 않게 한다. 도커 파일이 작동되게 하기 위해 붙여준다.
RUN apt update && apt install -y python3
작업 디렉토리가 없다면 디렉토리를 만들고 그 위치로 이동하는 명령어를 입력한다. 명령어가 실행하게 되면 www에 대해서 실행된다.
WORKDIR /var/www/html
위 commit 방식처럼 RUN echo "Hello, <strong>Docker</strong>" > index.html
명령어를 입력해도 되지만, index.html
파일을 host에서 image로 복사하는 방법도 있다. COPY
는 현재 패키지 설치 정보를 도커 이미지에 복사해준다.
# `index.html`을 www html로 복사하는 명령어
COPY ["index.html","."]
도커 파일에서 만든 이미지를 컨테이너로 생성 할 때, 바로 웹 서버를 이용할 수 있는 상태로 만들 때는 CMD
명령어를 사용한다. 이 때, -u
옵션을 줘야 실행되고 있는 현 상태가(log) 화면에 출력된다.
CMD ["python3", "-u", "-m", "http.server"]
run은 build가 되는 시점에 실행되는 명령어고 cmd는 컨테이너가 실행될때 시행돼서 run이 실행된 결과는 이미지에 반영되고, cmd가 실행된 결과는 컨테이너에 반영된다.
이제 실행해보자. web-server-build
를 바탕으로 web-server
라는 이름의 컨테이너를 생성한다. 생성 전에 같은 이름의 컨테이너가 있으면 문제가 생기기 때문에 지우는 작업을 먼저 한다.
docker build -t web-server-build .;
docker rm --force web-server;
docker run -p 8888:8000 --name web-server web-server-build pwd;
웹 서버가 자동으로 실행됐다. 자동으로 실행되지 않도록 하기 위해서는 run 뒤에 pwd를 붙이면, cmd 대신 pwd가 실행돼서 실행하는 시작 명령을 변경 할 수 있다(오버라이딩).
웹 서버가 아니라 pwd가 실행되는 것을 볼 수 있다.