Docker image, Dockerfile II

dazzi·2024년 1월 18일
0

Docker

목록 보기
5/6
post-thumbnail

𝙌. 이미지를 생성하는 방법?

✅ 컨테이너를 이미지로 commit

이 방법은 어플리케이션이 동작하는 환경을 구성하기 위해 일일이 수작업으로 패키지를 설치하고 소스코드를 깃(Git)에서 클론하거나 호스트에서 복사해야 한다. 물론 컨테이너에서 어플리케이션을 구동해보고 이미지로 커밋하기 떄문에 이미지의 동작을 보장할 수 있다.

✅ Dockerfile로 이미지를 생성


✔️ docker는 위와 같은 일련의 과정을 손쉽게 기록하고 수행할 수 있는 docker build 명령어 제공
✔️ 완성된 이미지를 생성하기 위해 컨테이너에 설치해야 하는 패키지, 추가해야하는 소스코드, 실행해야 하는 명령어와 쉘 스크립트 등을 하나의 파일에 기록해두면, 도커는 이 파일을 읽어서 컨테이너에서 작업을 수행한 뒤 이미지로 만듦
✔️ 이러한 작업을 기록한 파일의 이름을 Dockerfile이라고 함.
✔️ build명령어는 Dockerfile을 읽어서 이미지를 생성

💭 Dockerfile

✔️ DockerImage를 생성하기 위한 스크립트(설정파일)이다.
✔️ 여러가지 명령어를 토대로 Dockerfile을 작성한 후 빌드하면 Docker는 Dockerfile에 나열된 명령어를 차례대로 수행하며 DockerImage를 생성해준다.
✔️ Dockerfile을 읽을 줄 안다는 것은 해당 이미지가 어떻게 구성되어 있는지 알 수 있다는 의미이다.

👍 장점

✔️ 이미지가 어떻게 만들어졌는지를 기록
✔️ 배포에 용이
➕ 이미지를 배포할 때 용량이 큰 이미지 파일 자체를 배포하기보다는 그 이미지를 만들 수 있는 스크립트인 Dockerfile만을 배포한다면 매우 편리
✔️ 컨테이너(이미지)가 특정 행동을 수행하도록 한다.

📝 작성 및 명령어

✔️ Dockerfile을 작성할 땐 실제 파일의 이름을 Dockerfile로 해야한다.

FROM

✔️ 베이스 이미지
✔️ 모든 Dockerfile은 반드시 FROM 지시어를 한 번 이상 입력해야 하며 이 FROM 지시어를 시작으로 Dockerfile을 작성한다.
✔️ 이미지 이름의 포맷은 docker run에서 사용하는 이미지 이름과 동일하다.
✔️ 만약 사용하려는 이미지가 도커 엔진에 없다면 자동으로 DockerHub에서 pull 시도한다.

LABEL

✔️ 이미지의 메타데이터를 설정
✔️ key-value 형태
✔️ 여러 개의 메타데이터 저장 가능하다.
✔️ docker inspect 명령어로 확인할 수 있다.
✔️ 기본적으로 optional이기 때문에 생략해도 된다.

WORKDIR

✔️ 명령어를 실행할 디렉토리 작업 디렉토리 를 지정
✔️ cd 명령어와 동일
✔️ 작업 디렉토리를 지정하면 그 이후 명령어는 해당 디렉토리를 기준으로 동작
(만약, WORKDIR /var/dazzi 와 RUN touch test를 실행하면 /var/dazzi/test 가 생성)

EXPOSE

✔️ Dockerfile의 빌드로 생성된 이미지에서 노출할 포트를 지정하는 명령어
✔️ EXPOSE를 설정한 이미지를 기반으로 컨테이너를 생성한다고 해서 이 포트가 호스트의 포트와 바인딩하는 것은 아니며, 단지 해당 이미지를 사용하는 사용자에게 해당 포트를 사용한다고 문서화하는 목적을 가진다.
✔️ 만약 publish하고 싶다면 docker run 명령어에 -p(publish) 옵션으로 지정해주어야 호스트 운영체제에서 해당 포트를 바인딩 한다.

COPY

✔️ 현재 디렉토리 경로의 모든 파일과 디렉토리를 해당 디렉토리에 디렉토리에다가 모두 복사하는 명령어다.
✔️ COPY <src> <dest>의 형식
✔️ src 호스트 운영체제 경로 dest 이미지 상 경로
(만약, COPY package*.json ./ 라고 사용했다면 호스트 운영체제의 현재 디렉토리 상에 있는 package로 시작해서 .json으로 끝나는 모든 파일을 복사해서 이미지 상의 경로로 현재 디렉토리에다가 전부 복사하는 명령을 실행)

RUN

✔️ 이미지를 만들기 위해 컨테이너 내부에서 명령어를 실행
✔️ 새로운 레이어에서 명령어를 실행하고 새로운 이미지 생성
✔️ 명령을 실행할 때마다 레이어가 생성되고 캐시

RUN에는 두가지 형식이 있다.

🅰 RUN <명령어> <command>
✔️ 쉘 형식으로 작성해야 하며, 쉘에서 실행
✔️ Linux 기본값 /bin/sh Window 기본값 /S /C

🅱 RUN ["실행 가능한 파일", "param1", "param2"]
✔️ exec 형식

ADD

✔️ 파일을 이미지에 추가
✔️ 파일은 Dockerfile이 위치한 디렉토리인 컨텍스트(Context)에서 가져옴
✔️ JSON 배열의 형태로 ["추가할 파일 이름", "컨테이너에 추가될 위치"]와 같이 사용
✔️ 추가할 파일명은 여러 개 지정 가능. 배열의 마지막 원소가 컨테이너에 추가될 위치

CMD

✔️ 컨테이너를 생성 (docker run)할 때만 실행
✔️ 해당 이미지로 컨테이너를 실행할 때(docker run) 어떤 명령어를 수행할 것인지를 결정하는 명령어
✔️ Dockerfile에서 한 번만 사용
✔️ 컨테이너 생성 시, 추가적인 명령어에 따라 설정한 명령어를 수정할 수 있음
✔️ 즉, CMD는 run 명령어의 이미지 이름 뒤에 입력하는 커맨드와 같은 역할을 하지만 docker run 명령엉에서 커맨드 명령줄 인자를 입력하면 Dockerfile에서 사용한 CMD의 명령어는 run의 커맨드로 덮어 쓰임

명령어 형식

🅰 CMD["<커맨드>", "<파라미터1>", "<파라미터2>"]
🅱 CMD <커맨드><파라미터1><파라미터2>

ENTRYPOINT

✔️ 컨테이너를 시작 (docker start)할 때마다 실행
✔️ 도커 컨테이너가 실행될 때 고정적으로 실행되는 스크립트 혹은 명령어
✔️ 생략 가능, 생략할 경우 커맨드(CMD)에 지정된 명령어로 수행

명령어 형식

🅰 ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]
🅱 ENTRYPOINT <커맨드> <파라미터1> <파라미터2>

𝙌. CMD 와의 차이점

A. ENTRYPOINT는 CMD를 인자로 받아 사용할 수 있는 스크립트의 역할을 할 수 있음

📝 예시

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

실행순서. top > -b > -c

생성한 Dockerfile을 Image로 빌드

이미지 빌드

# docker build -t [이미지이름:이미지버전] [Dockerfile의 경로]
docker build -t apache-image .

생성된 이미지 확인

docker images

웹에 띄울 html 파일 생성

보통 웹으로 띄울 html파일을 아파치 서버에 추가하고 싶을 땐 Dockerfile의 ADD/COPY를 통해 호스트의 파일을 아파치 서버에 옯기는 명령어를 작성 후 빌드한다. 하지만 이렇게 하면 호스트의 html파일과 아파치 서버의 html파일이 동기화 되어 있지 않아 매번 build 해줘야 한다. 비효율적!!! 따라서 도커 볼륨을 사용해 호스트에 html 파일을 만들고 도커 컨테이너에서 그 파일에 접근해 사용하는 방법으로 동기화한다. 호스트에 index.html파일을 생성및 수정한다.

mkdir html && cd html
vi index.html

Image로 Container 생성

컨테이너 생성 시 도커 볼륨을 통해 호스트와 도커 컨테이너의 html 폴더를 동기화

docker run --name apache-container -d -p 80:80 -v ~/html/:/var/www/html apache-image

-d background ahemfh tlfgod

접속 확인

pulbic DNS를 80번 포트로 접속해 접속을 확인

출처:
https://seosh817.tistory.com/381
https://wooono.tistory.com/123
https://tech.cloudmt.co.kr/2022/06/29/도커와-컨테이너의-이해-3-3-docker-image-dockerfile-docker-compose/

0개의 댓글

관련 채용 정보