도커

[클라우드] 6. Dockerfile 사용하기

트리스탄1234 2022. 8. 7. 09:41
728x90
반응형

이번 포스팅에서는 Dockerfile을 이용해서 image를 생성해 보도록 하겠 습니다.

Docker에서 Image를 생성하는 방법은 3가지가 있습니다.

- Tag 명령 이용하여 새로운 Image만들기

- 실행되는 컨테이너에서 Commit 명령을 이용하여 Image만들기

- Dockerfile일 이용하여 신규 Image 만들기.

Dockerfile은 사용자가 순차적으로 작성한 명령어로 된 Text문서이며, 이 문서는 Context와 함깨 docker build명령어로 이미지를 생성 합니다.

그럼 Dockerfile에 대해서 좀더 자세히 알아 보겠습니다.

아래는 Sample Dockerfile 입니다. Dockerfile에서도 다른 프로그래밍 언어들과 같이 주석은 #으로 처리를 합니다. 그리고 그림에서 보듯이 Dockerfile의 시작은 항상 FROM으로 시작을 해야 합니다.

만약 FROM이 없거나. FROM 앞에 다른 명령어가 있으면 image가 생성이 되지 않습니다.

Dockerfile의 작성 형식은 <명령><매개변수> 순으로 작성이 됩니다.

위의 그림에서 첫번째 라인을 살펴보면, 아래 그림처럼 FROM이 명령이고, 뒤의 golang:1.16-alpine는 매게 변수 입니다. 해석을 해보면 신규로 생성할 image의 버전을 golang:1.16-alpine을 사용해서 생성하라는 의미 입니다.

FROM golang:1.16-alpine AS build

그럼 Docker에서 사용 가능한 명령에 어떤것들이 있고 어떤 내용인지 살펴 봅시다.

  1. FROM: 신규로 생성할 이미지를 기존의 어떤 이미지를 기반으로 할지 정의 합니다.

- FROM ubuntu ==> ubuntu로 부터 이미지 생성

- FROM ubuntu:14.04 ==> ubuntu 14.04로 부터 이미지 생성

2. MAINTAINER: 이미지 생성자의 정보를 설정할때 사용을 합니다. 형식은 자유 입니다.

- MAINTAINER michael, <abc.com> ==> 생성자의 이름과 이메일 정보를 기록

 

3. RUN: FROM에서 정의된 이미지가 생성이고 나서 실행할 스크립트나 명령문을 정의 할때 사용 합니다.

- RUN apt-get install -y nginx ==> nginx를 설치 하는 명령 이빈다.

- RUN echo "Hello Tester" > /tmp/hello ==> /tmp/hello 파일에 Hello Tester라는 문자열을 씁니다.

 

4. CMD: 컨테이너가 시작되고 나서, shell이 실행할 명령을 전달 합니다. Dockerfile에서 한번만 사용 가능

합니다.

- CMD touch /tmp/test/test.txt /tmp밑에 test폴더 밑에 text.txt 파일을 생성

- CMD ["실행파일", "매개변수 1", "매개변수2"]와 같은 형태로도 사용이 가능 합니다.

- ENTRYPOINT와 같이 사용이 될 경우에는 CMD뒤의 매개변수들이 ENTRYPOINT의 입력으로 전달이 됩니다.

example : 아래의 경우에는 CMD뒤의 "hi"가 ENTRYPOINT "echo"명령어 전달이 되어서 hi를 출력합니다.

ENTRYPOINT ["echo"]

CMD ["hI"]

5. ENTRYPOINT: CMD와 마찬가지로 컨테이너의 shell에 실행할 명령을 전달 합니다. Dockerfile에서

한번만 사용 가능 합니다.

- ENTRYPONT touch /tmp/text ==> /tmp 폴더 밑에 text파일을 생성 합니다.

- ENTRYPONT ["/tmp/test.sh", "--hi","test"] ==> test.sh 파일에 hi와 test를 매개변수로 전달 합니다.

6. EXPOSE: 호스트와 연결할 포트 번호를 설정 합니다.

- EXPOSE 80 ==> 80포트를 이용해 호스트를 연결

- EXPOSE 443 ==> 443포트를 이용해 호스트를 연결

7. ENV : ENV 환경 변수를 설정 합니다. ENV로 설정된 환경 변수는 RUN, CMD, ENTRYPOINT에 작용 됩니다.

- ENV TEST 1254 ==> 변수 test에 값을 1254로 설정 합니다.

- ENV PATH /var/bin:$PATH

8. ADD: 이미지에 파일을 추가할때 사용을 합니다. 압축된 파일을 경우 자동으로 압축 해제를 합니다.

- ADD <복사할 위치> <이미지에서 파일이 위치할 경로>의 형식으로 지정합니다.

- ADD *.txt /var/ ==> 모든 txt파일을 /var/ 디렉토리 아래로 복사 합니다.

9. COPY: ADD와 마찬 가지로 이미지에 파일을 추가 합니다. 다만 COPY는 ADD와 같이 압축된 파일을 자동으로 압축 헤제를 하지는 않습니다.

- COPY *.txt /var/ ==> 모든 txt파일을 /VAR/디렉토리 아래로 복사 합니다.

10. VOLUME: 컨테이너의 데이터를 저장할 볼륨을 지정합니다. 호스트의 디렉토리와 연결을 위해서는 -v 옵션을 사용해야 합니다.

- VOLUMN /data ==> /data폴더를 데이터 볼륨으로 지정 합니다.

- docker run -v /root/data:/data example

==> example라는 컨테이너의 /data 폴더를 호스트의 /root/data로 연결 합니다.

11. USER: 명령을 실행할 사용자를 정의 합니다. 이 명령은 RUN, CMD, ENTRYPOINT에 적용 됩니다.

- USER <사용자명> 형식으로 지정되며, Dockerfile에서 USER이후의 라인부터 적용이 됩니다.

12. WORKDIR: RUN, CMD, ENTRYPOINT의 명령이 실행될 디렉토리를 설정 합니다.

-WORKDIR /var/www ==> /var/www를 WORKDIR로 사용을 합니다.

13. ONBUILD : 생성한 이미지를 기바능로 다른 이미지가 생성될때 실행할 명령을 정의 합니다.

- ONBUILD <Dockerfile 명령> < Dockerfile 명령의 매개변수> 형식으로 사용을 합니다.

- ONBUILD ADD text.txt /var/text.txt ==> text.txt파일을 /var/ 밑으로 추가

그럼 위에 배운 명령들 중 몇개를 사용해서 이미지를 생성해 봅시다.

- mkdir명령을 사용해서 dockerfile 디렉토리를 생성

- dockerfile 폴더로 이동후 dockerfile을 생성하여 아래 내용 입력

root@test-VirtualBox:~# mkdir dockerfile
root@test-VirtualBox:~# cd dockerfile/
root@test-VirtualBox:~/dockerfile# vi dockerfile
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
CMD ["/bin/bash"]

docker build -t 명령으로 신규 이미지 생성

root@test-VirtualBox:~/dockerfile# docker build -t mypc/volumn:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM ubuntu
latest: Pulling from library/ubuntu
405f018f9d1d: Pull complete
Digest: sha256:b6b83d3c331794420340093eb706a6f152d9c1fa51b262d9bf34594887c2c7ac
Status: Downloaded newer image for ubuntu:latest
---> 27941809078c
Step 2/5 : RUN mkdir /myvol
---> Running in 91844c0695da
Removing intermediate container 91844c0695da
---> 12be4e294140
Step 3/5 : RUN echo "hello world" > /myvol/greeting
---> Running in 1a9c0c694905
Removing intermediate container 1a9c0c694905
---> af24038dee22
Step 4/5 : VOLUME /myvol
---> Running in e21033ff99fe
Removing intermediate container e21033ff99fe
---> bbb916ebd573
Step 5/5 : CMD ["/bin/bash"]
---> Running in af938f990f92
Removing intermediate container af938f990f92
---> ec55bd1a2b1d
Successfully built ec55bd1a2b1d
Successfully tagged mypc/volumn:1.0
root@test-VirtualBox:~/dockerfile#

생성한 컨테이너를 실행하고 해당 불륨으로 이동해서 파일을 조회해 봅시다.

root@test-VirtualBox:~# docker run -it mypc/volumn:1.0 /bin/bash
root@f1be2082712b:/# exit
root@test-VirtualBox:~# docker volume ls
DRIVER VOLUME NAME
local 49a13c64adba76b8a415bdf45ad282295bc360f83500e54100a17087ca3abf05
local f0f3f2a3b18b5be55b5096116edafeb9dfb517c2f0077405519de3f588173632
local f9fd8be4debaf0660d6c3c29a49a5c02aa66d5b6f336d7a09be11aba31c67432
local volumn1
root@test-VirtualBox:/var/lib/docker/volumes# cd /var/lib/docker/volumes && ls -al
total 48
drwx-----x 6 root root 4096 7월 18 15:21 .
drwx--x--- 13 root root 4096 7월 18 08:42 ..
drwx-----x 3 root root 4096 7월 18 09:50 49a13c64adba76b8a415bdf45ad282295bc360f83500e54100a17087ca3abf05
brw------- 1 root root 8, 5 7월 18 08:42 backingFsBlockDev
drwx-----x 3 root root 4096 7월 14 14:33 f0f3f2a3b18b5be55b5096116edafeb9dfb517c2f0077405519de3f588173632
drwx-----x 3 root root 4096 7월 18 15:21 f9fd8be4debaf0660d6c3c29a49a5c02aa66d5b6f336d7a09be11aba31c67432
-rw------- 1 root root 32768 7월 18 15:21 metadata.db
drwx-----x 3 root root 4096 7월 14 14:48 volumn1

 

728x90
반응형

'도커' 카테고리의 다른 글

[클라우드] 7. Docker Volumn  (2) 2022.08.07
[클라우드] 5. Docker Registry  (0) 2022.08.07
[클라우드] 4. Docker Network  (7) 2022.08.05
[클라우드] 3. Docker 기본 명령어  (8) 2022.08.03
[클라우드]2. Docker 환경 구성 하기  (3) 2022.08.03