강의 출처 : https://www.youtube.com/watch?v=0kQC19w0gTI
Run 명령어를 수행하면 Image가 Container가 된다.
내가 직접 Image 파일을 만들려면 어떻게 해야할까?
1. Container파일을 대상으로 commit 명령어를 실행하면, Container는 Image가 된다.
2. Dokcer 파일을 작성한다.
우분투 20.04 버전을 바탕으로 파이썬을 설치하고
/var/www/html 디렉터리를 만들고 해당 디렉터리로 이동한 다음,
index.html파일을 copy하고
파이썬3가 가지고 있는 http.server라는 모듈을 이용해서 웹서버를 구성한다
이처럼 우리가 만들고 싶은 이미지의 형식에 맞게 도커파일을 작성 후,
build 명령을 실행하면
Docker는 docker file을 바탕으로 새로운 이미지를 만들게 된다.
Commit과 build의 차이
공통점 : 이미지를 만드는 명렁어
commit : 이미 우리가 사용하고 있는 container가 있을떄, 이 container를 Image로 만드는 명령어
build : Dokcer를 통해 우리가 만들고 싶은 이미지를 새롭게 생성하는 명령어.
commit은 backup
build는 생성의 느낌
우리의 시나리오
우리는 웹 서버 이미지를 만들고 싶다
이미지에는 웹 서버가 설치되어 있어서 언제든 이미지를 run해서 container를 만들면 바로 사용할 수 있는 웹 서버를 만들고 싶다.
commit이랑 build 모두로 만들어봅시다!
(1) Container 만들고 commit으로 이미지 만들기
docker run --name web-server -it ubuntu:20.04
//ubuntu:20.04 : container 이름
//it : shell에서 명령어 실행하기 위한 옵션
//=> 이미지가 다운로드 된다.
우분투 20.04버전을 기반으로 컨테이너 만들어 봅시다.
docker commit web-server-commit
commit으로 이미지 만들기
docker images
docker images를 통해 Imgae가 만들어졌는지 확인합니다.
(2) Build 명령어로 이미지 만들기
Docker file 생성
FROM ubuntu:20.04
Docker build 명령어
docker build [OPTIONS] PATH | URL | -
# t : 이름 지정
# . : PATH
docker build -t web-server-build .
이제 조금 더 나아가서
우리는 웹서버가 내장된 파이썬 3를 Container안에 설치하고 싶다.
Terminal에서 파이썬 설치하는 법
#최신 버전으로 업데이트
apt update
#파이썬 설치
#apt install python3
Docker file에 파이썬 설치하는 명령어 작성
FROM ubuntu:20.04
RUN apt update && apt install -y python3
WORKDIR /var/www/html
CMD ["python3","-u", "-m", "http.server"]
- DOCKER 파일 내에서 명령어를 실행할 때는 RUN이라는 지시어 사용.
- 명령어가 여러개 일때는 RUN을 중복해서 쓰는 것이 아니라 &&로 명령어를 이어준다
- 보통 Terminal에서 파이썬과 같은 프로그램을 설치할때는 설치할 것인 여부를 묻고 y/n을 입력해줘야 하지만,
- docker에서는 이러한 과정이 있다면 docker 파일이 작동하지 않는다.
=> 자동으로 yes를 눌러주는 옵션인 '-y'를 추가해서 사용자의 개입없이 수행되도록 만든다. - 우리는 웹 서버가 사용자의 요청이 들어왔을떄, 이 요청을 var/www/html 디렉터리에서 찾게 하고 싶다. 그러기 위해서 터미널에서는 아래와 같은 과정을 통해 동작한다.
=> var/www/html 디렉터리를 생성해줘야 한다
=> 단순히 mkdir var/www/html 명령어만 수행시, var과 www 디렉터리가 없기에 에러가 뜬다.
=> 모든 경로를 생성해주는 옵션인 -p를 지정해서 mkdir -p var/www/html
=> 이후 cd 명렁어를 통해 해당 디렉터리로 이동한다.
이 과정을 Docker에서는 WORKDIR 명렁어로 수행한다. - 사용자가 요청이 들어왔을떄, 이 요청에 응답하기 위한 웹 페이지를 생성
Terminal에서는 아래 명령어로 수행
=> echo "Hello, <strong>Docker</strong> - 호스트에 있는 index.html을 /var/www/html로 복사
=> COPY ["index.html", "."] - 파이썬3에 내장된 웹서버가 실행되면서 기본 포트인 8000번 포트에 listening하게 만들기
우리는 도커에서 만들어진 이미지를 컨테이너로 생성할 때 아래 명령어를 실행해서 바로 웹서버를 사용할 수 있는 상태로 만들고 싶다.
Terminal에서
=> python3 -m http.server
=> 이 포트로 사용자들이 접속해서 웹서비스를 활용할 수 있게 된다.
Docker에서
=> CMD ["python3","-u", "-m", "http.server"]
이제 명령어를 통해 위의 Docker file을 이미지로 만들어보자!
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를 바탕으로 web-server라는 이름의 Container를 생성.
똑같은 이름의 컨테이너가 있다면 문제가 되기에, 같은 이름의 컨테이너가 있다면 삭제한다.
Docker 실행 - container의 host는 8888이고, port는 8000번에 연결한다.
RUM과 CMD의 차이
RUN : build가 되는 시점에 실행되는 명령어. RUN의 실행결과는 image에 반영.
CMD : container가 실행될 때 실행되는 명령어. CMD의 결과는 container에 반영
컨테이너 생성시 명령어를 자동으로 실행되는 것을 막고싶을때
docker run 명령어 실행시 pwd를 추가해주면 pwd가 CMD 대신 실행이 돼서 실행 시작 명령어를 변경할 수 있다.(overriding)