본문 바로가기
Docker

[Docker] Dockerfile

by 기리의 개발로그 2022. 2. 24.

Dockerfile 이란

Docker 상에서 작동시킬 컨테이너의 이미지를 생성하기 위한 설정 파일이며, docker build 명령을 통해 Dockerfile에 기술된 설정 정보를 바탕으로 이미지를 생성할 수 있다.

FROM

어떤 이미지로부터 새로운 이미지를 생성할지를 나타내는 베이스 이미지

FROM centos:centos7
$ docker build -t dockerfile .

Sending build context to Docker daemon  2.048kB
Step 1/1 : FROM centos
 ---> 0f3e07c0138f
Successfully built 0f3e07c0138f
Successfully tagged dockerfile:latest
$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
dockerfile             latest              0f3e07c0138f        4 weeks ago         220MB

RUN

이미지를 생성하는 과정에서 실행될 명령

FROM ubuntu:16.04

RUN mkdir /test
RUN apt-get update
RUN apt-get install -y nginx
RUN echo "hello docker"
$ docker build -t dockerfile1 .

Sending build context to Docker daemon  2.048kB
Step 1/5 : FROM ubuntu:16.04
 ---> 5f2bf26e3524
Step 2/5 : RUN mkdir /test
 ---> Using cache
 ---> 315fa275f252
Step 3/5 : RUN apt-get update
 ---> Running in 83d0f70d1074
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://security.ubuntu.com/ubuntu xenial-security InRelease [109 kB]
...
Reading package lists...
Removing intermediate container 83d0f70d1074
 ---> 82891da53879
Step 4/5 : RUN apt-get install -y nginx
 ---> Running in 1783722f3948
Reading package lists...
Building dependency tree...
Reading state information...
...
Processing triggers for systemd (229-4ubuntu21.22) ...
Removing intermediate container 1783722f3948
 ---> 7db54b9f0832
Step 5/5 : RUN echo "hello docker"
 ---> Running in 99c53e230659
hello docker
Removing intermediate container 99c53e230659
 ---> 29b06a231dab
Successfully built 29b06a231dab
Successfully tagged dockerfile1:latest
$ docker images

REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
dockerfile1            latest              29b06a231dab        2 minutes ago       205MB
ubuntu                 16.04               5f2bf26e3524        2 days ago          123MB
$ docker run -it dockerfile1

root@2d5230899d57:/# ls -al
total 76
drwxr-xr-x   1 root root 4096 Nov  3 08:59 .
drwxr-xr-x   1 root root 4096 Nov  3 08:59 ..
drwxr-xr-x   2 root root 4096 Nov  3 08:48 test
root@2d5230899d57:/etc# ls -al
total 360
drwxr-xr-x 1 root root    4096 Nov  3 08:59 .
drwxr-xr-x 1 root root    4096 Nov  3 08:59 ..
drwxr-xr-x 6 root root    4096 Nov  3 08:56 nginx

CMD

이미지를 바탕으로 생성된 컨테이너 안에서 실행될 명령
Dockerfile에는 하나의 CMD 명령만 기술 가능
container 실행 시 run을 통해 명령어 및 인자값을 전달하면 CMD에 명시된 인자 값은 무시

FROM ubuntu:16.04

RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install nginx

EXPOSE 80

CMD nginx -g 'damon off;'
$ docker build -t dockerfile2 .
Sending build context to Docker daemon  2.048kB
Step 1/5 : FROM ubuntu:16.04
 ---> 5f2bf26e3524
Step 2/5 : RUN apt-get -y update && apt-get -y upgrade
 ---> Running in 7b68cb919c2f
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
...
Removing intermediate container 7b68cb919c2f
 ---> a9bc7e4fe027
Step 3/5 : RUN apt-get -y install nginx
 ---> Running in 9bd2ad70033d
Reading package lists...
Building dependency tree...
...
Processing triggers for systemd (229-4ubuntu21.22) ...
Removing intermediate container 9bd2ad70033d
 ---> 751624ca203c
Step 4/5 : EXPOSE 80
 ---> Running in 2d79da4cbdd7
Removing intermediate container 2d79da4cbdd7
 ---> 684a0a59a7e3
Step 5/5 : CMD nginx -g 'damon off;'
 ---> Running in e3b5d3dc203b
Removing intermediate container e3b5d3dc203b
 ---> 5612afcbc523
Successfully built 5612afcbc523
Successfully tagged dockerfile2:latest
$ docker images

REPOSITORY             TAG                 IMAGE ID            CREATED              SIZE
dockerfile2            latest              5612afcbc523        About a minute ago   205MB
$ docker run -d -p 8082:80 dockerfile2

de432b250dcafe0b6de7e0e31108eca059195995f0d22a1c117fbc1862d327ac
$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
de432b250dca        dockerfile2         "nginx -g 'daemon of…"   2 seconds ago       Up 1 second         0.0.0.0:8082->80/tcp   festive_pare
FROM ubuntu:16.04

CMD ["echo", "Hello CMD"]
$ docker build -t dockerfile3 .

Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM ubuntu:16.04
 ---> 5f2bf26e3524
Step 2/2 : CMD ["echo", "Hello CMD"]
 ---> Running in 68daca9db5d6
Removing intermediate container 68daca9db5d6
 ---> 04721077a911
Successfully built 04721077a911
Successfully tagged dockerfile3:latest
$ docker run -it dockerfile3

Hello CMD
$ docker run -it dockerfile3 test

$ docker run -it dockerfile3 "/bin/echo" "HI"

HI

ENTRYPOINT

이미지를 바탕으로 생성된 컨테이너 안에서 실행될 명령
CMD와 달리 container 실행 시 run을 통해 명령어 및 인자값을 전달해도 기존의 명령이 실행

FROM ubuntu:16.04

ENTRYPOINT ["echo", "Hello ENTRYPOINT"]
$ docker build -t dockerfile4 .

Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM ubuntu:16.04
 ---> 5f2bf26e3524
Step 2/2 : ENTRYPOINT ["echo", "Hello ENTRYPOINT"]
 ---> Running in 059f7f22e938
Removing intermediate container 059f7f22e938
 ---> b8e3559cdd3d
Successfully built b8e3559cdd3d
Successfully tagged dockerfile4:latest
$ docker run -it dockerfile4

Hello ENTRYPOINT
$ docker run -it dockerfile4 test

Hello ENTRYPOINT test

ENV

환경변수 설정

FROM ubuntu:16.04

ENV PATH /home
CMD echo $PATH
$ docker build -t dockerfile5 .

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu:16.04
 ---> 5f2bf26e3524
Step 2/3 : ENV PATH /home
 ---> Using cache
 ---> 79678e5170f7
Step 3/3 : CMD echo $PATH
 ---> Using cache
 ---> 5b6301b6d7f9
Successfully built 5b6301b6d7f9
Successfully tagged dockerfile5:latest
$ docker run -it dockerfile5

/home

WORKDIR

생성할 컨테이너 내의 현재경로 지정

FROM ubuntu:16.04

WORKDIR home
WORKDIR DIR

CMD ["/bin/bash", "-c",  "pwd"]
$ docker build -t dockerfile6 .

Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM ubuntu:16.04
 ---> 5f2bf26e3524
Step 2/4 : WORKDIR home
 ---> Using cache
 ---> 814f2aff4e46
Step 3/4 : WORKDIR DIR
 ---> Using cache
 ---> b5c1d8c8cac6
Step 4/4 : CMD ["/bin/bash", "-c", "pwd"]
 ---> Using cache
 ---> 3246ae187202
Successfully built 3246ae187202
Successfully tagged dockerfile6:latest
$ docker run -it dockerfile6

/home/DIR
FROM ubuntu:16.04

WORKDIR home
WORKDIR DIR
$ docker build -t dockerfile6 .

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu:16.04
 ---> 5f2bf26e3524
Step 2/3 : WORKDIR home
 ---> Using cache
 ---> 814f2aff4e46
Step 3/3 : WORKDIR DIR
 ---> Using cache
 ---> b5c1d8c8cac6
Successfully built b5c1d8c8cac6
Successfully tagged dockerfile6:latest
$ docker run -it dockerfile6

root@18007ff9830f:/home/DIR#

EXPOSE

컨테이너의 공개 포트 번호 지정

FROM ubuntu:16.04

RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install nginx

EXPOSE 80

CMD nginx -g 'damon off;'

ADD

ADD <복사할 파일 경로> <이미지에서 파일이 위치할 경로>
이미지에 호스트상의 파일이나 디렉토리를 추가

FROM ubuntu:16.04

ADD host.html /docker.html 
ADD test /docker_dir 
ADD hos* /docker_dir/ 
ADD hos?.html /docker_dir/ 
ADD test.tar.gz /
ADD https://www.wings.msn.to/index.php /docker_dir/web/
  • 복사할 파일 경로는 컨텍스트 아래를 기준으로 하며 컨텍스트 바깥의 파일, 디렉토리나 절대경로는 사용할 수 없다.
  • 복사할 파일 경로에는 파일뿐만 아니라 디렉토리도 설정할 수 있으며 디렉토리 지정 시 디렉토리의 모든 파일을 복사한다. 또한, 와일드 카드를 사용하여 특정 파일만 복사할 수 있다.
  • 복사할 파일 경로에 인터넷이 있는 파일의 URL을 설정할 수 있다.
  • 복사할 파일 경로의 압축파일이 있는 경우, 압축을 해제하고 tar를 풀어서 추가된다. 단, 인터넷에 있는 파일 URL은 압축만 해제한 뒤 tar 파일이 그대로 추가된다.
  • <이미지에서 파일이 위치할 경로>의 마지막에 /가 있으면 디렉토리가 생성되고 그 아래 파일이 복사된다.
  • <이미지에서 파일이 위치할 경로>은 항상 절대 경로로 설정해야 한다.
  • ADD A.txt B.txt 형식인 경우 A.txt가 B.txt 이름으로 복사된다.
FROM ubuntu:16.04

ADD host.html /docker_dir/
$ docker build -t dockerfile7 .

Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM ubuntu:16.04
 ---> 5f2bf26e3524
Step 2/2 : ADD host.html /docker_dir/
 ---> 66555d611940
Successfully built 66555d611940
Successfully tagged dockerfile7:latest
$ docker run -it dockerfile7

root@6f5bc56088cc:/# ls -al
total 76
drwxr-xr-x   1 root root 4096 Nov  3 13:26 .
drwxr-xr-x   1 root root 4096 Nov  3 13:26 ..
drwxr-xr-x   2 root root 4096 Nov  3 13:26 docker_dir

root@6f5bc56088cc:/docker_dir# ls -al
total 12
drwxr-xr-x 2 root root 4096 Nov  3 13:26 .
drwxr-xr-x 1 root root 4096 Nov  3 13:26 ..
-rw-rw-r-- 1 root root   45 Nov  3 13:25 host.html

COPY

COPY <복사할 파일 경로> <이미지에서 파일이 위치할 경로>
이미지에 호스트상의 파일이나 디렉토리를 추가
ADD 명령어와 달리 압축 파일을 추가할 때 압축을 해제하지 않으며, 파일 URL도 사용할 수 없다.

FROM ubuntu:16.04

COPY host.html /docker.html 
COPY test /docker_dir
COPY hos* /docker_dir/ 
COPY hos?.html /docker_dir/ 
  • 복사할 파일 경로는 컨텍스트 아래를 기준으로 하며 컨텍스트 바깥의 파일, 디렉토리나 절대경로는 사용할 수 없다.
  • 복사할 파일 경로에는 파일뿐만 아니라 디렉토리도 설정할 수 있으며 디렉토리 지정 시 디렉토리의 모든 파일을 복사한다. 또한, 와일드 카드를 사용하여 특정 파일만 복사할 수 있다.
  • 복사할 파일 경로의 압축파일이 있는 경우, 압축을 해제하지 않고 복사한다.
  • <이미지에서 파일이 위치할 경로>의 마지막에 /가 있으면 디렉토리가 생성되고 그 아래 파일이 복사된다.
  • <이미지에서 파일이 위치할 경로>은 항상 절대 경로로 설정해야 한다.
  • COPY A.txt B.txt 형식인 경우 A.txt가 B.txt 이름으로 복사된다.
FROM ubuntu:16.04

WORKDIR /docker_idr
COPY test docker_dir_sub
$ docker build -t dockerfile8 .

Sending build context to Docker daemon  4.608kB
Step 1/3 : FROM ubuntu:16.04
 ---> 5f2bf26e3524
Step 2/3 : WORKDIR /docker_idr
 ---> Running in 322fa8ddf935
Removing intermediate container 322fa8ddf935
 ---> 9eb4c931b670
Step 3/3 : COPY test docker_dir_sub
 ---> 2335c08e48e8
Successfully built 2335c08e48e8
Successfully tagged dockerfile8:latest
$ docker run -it dockerfile8

root@b6dde00fc6e9:/docker_idr# ls
docker_dir_sub
root@b6dde00fc6e9:/docker_idr/docker_dir_sub# ls
addtest.txt
반응형

'Docker' 카테고리의 다른 글

[Docker] Docker 명령어(3)  (0) 2022.02.23
[Docker] Docker 명령어(2)  (0) 2022.02.23
[Docker] Docker 명령어(1)  (0) 2022.02.23
[Docker] Docker 설치  (0) 2022.02.22
[Docker] Docker란?  (0) 2022.02.22

댓글