본문 바로가기

Micro Service Architecture/Docker

3. [docker] dockerfile build

반응형

1. 컨테이너를 commit 하여 이미지를 생성하는 방법과 더불어 dockerfile을 이용하여 이미지를 생성할 수 있다.

## Dockerfile 생성.(이름은 꼭 Dockerfile 이어야한다.)
## FROM : 원본 이미지
## RUN : 원본이미지에 실행할 작업
[root@docker_test]# cat Dockerfile
FROM centos:latest
RUN yum update -y
 
 
## 생성한 Dockerfile을 가지고 build 해본다
[root@docker_test]# docker build -t centos:test .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM centos:latest
 ---> 831691599b88
Step 2/2 : RUN  yum update -y
 ---> Running in 853918858d0f
CentOS-8 - AppStream                            1.5 MB/s | 5.8 MB     00:03   
CentOS-8 - Base                                 864 kB/s | 2.2 MB     00:02   
CentOS-8 - Extras                               5.3 kB/s | 7.0 kB     00:01   
Dependencies resolved.
================================================================================
 Package               Arch        Version                    Repository   Size
================================================================================
Upgrading:
 bind-export-libs      x86_64      32:9.11.13-5.el8_2         BaseOS      1.1 M
 gnutls                x86_64      3.6.8-11.el8_2             BaseOS      915 k
 libnghttp2            x86_64      1.33.0-3.el8_2.1           BaseOS       77 k
Installing dependencies:
 trousers-lib          x86_64      0.3.14-4.el8               BaseOS      169 k
Installing weak dependencies:
 trousers              x86_64      0.3.14-4.el8               BaseOS      153 k
 
Transaction Summary
================================================================================
Install  2 Packages
Upgrade  3 Packages
 
Total download size: 2.4 M
Downloading Packages:
(1/5): trousers-0.3.14-4.el8.x86_64.rpm         148 kB/s | 153 kB     00:01   
(2/5): trousers-lib-0.3.14-4.el8.x86_64.rpm     153 kB/s | 169 kB     00:01   
(3/5): bind-export-libs-9.11.13-5.el8_2.x86_64. 587 kB/s | 1.1 MB     00:01   
(4/5): gnutls-3.6.8-11.el8_2.x86_64.rpm         704 kB/s | 915 kB     00:01   
(5/5): libnghttp2-1.33.0-3.el8_2.1.x86_64.rpm    44 kB/s |  77 kB     00:01   
--------------------------------------------------------------------------------
Total                                           752 kB/s | 2.4 MB     00:03    
warning: /var/cache/dnf/BaseOS-f6a80ba95cf937f2/packages/trousers-0.3.14-4.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - Base                                 1.6 MB/s | 1.6 kB     00:00   
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key) <security@centos.org>"
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : trousers-lib-0.3.14-4.el8.x86_64                       1/8
  Running scriptlet: trousers-lib-0.3.14-4.el8.x86_64                       1/8
  Running scriptlet: trousers-0.3.14-4.el8.x86_64                           2/8
  Installing       : trousers-0.3.14-4.el8.x86_64                           2/8
  Running scriptlet: trousers-0.3.14-4.el8.x86_64                           2/8
  Upgrading        : gnutls-3.6.8-11.el8_2.x86_64                           3/8
  Upgrading        : libnghttp2-1.33.0-3.el8_2.1.x86_64                     4/8
  Upgrading        : bind-export-libs-32:9.11.13-5.el8_2.x86_64             5/8
  Running scriptlet: bind-export-libs-32:9.11.13-5.el8_2.x86_64             5/8
  Cleanup          : libnghttp2-1.33.0-1.el8_0.1.x86_64                     6/8
  Cleanup          : gnutls-3.6.8-10.el8_2.x86_64                           7/8
  Cleanup          : bind-export-libs-32:9.11.13-3.el8.x86_64               8/8
  Running scriptlet: bind-export-libs-32:9.11.13-3.el8.x86_64               8/8
  Verifying        : trousers-0.3.14-4.el8.x86_64                           1/8
  Verifying        : trousers-lib-0.3.14-4.el8.x86_64                       2/8
  Verifying        : bind-export-libs-32:9.11.13-5.el8_2.x86_64             3/8
  Verifying        : bind-export-libs-32:9.11.13-3.el8.x86_64               4/8
  Verifying        : gnutls-3.6.8-11.el8_2.x86_64                           5/8
  Verifying        : gnutls-3.6.8-10.el8_2.x86_64                           6/8
  Verifying        : libnghttp2-1.33.0-3.el8_2.1.x86_64                     7/8
  Verifying        : libnghttp2-1.33.0-1.el8_0.1.x86_64                     8/8
 
Upgraded:
  bind-export-libs-32:9.11.13-5.el8_2.x86_64    gnutls-3.6.8-11.el8_2.x86_64  
  libnghttp2-1.33.0-3.el8_2.1.x86_64          
 
Installed:
  trousers-0.3.14-4.el8.x86_64         trousers-lib-0.3.14-4.el8.x86_64       
 
Complete!
Removing intermediate container 853918858d0f
 ---> 245b08b27f6f
Successfully built 245b08b27f6f
Successfully tagged centos:test
 
 
 
## image 확인
[root@docker_test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED                  SIZE
nginx               latest              8cf1bfb43ff5        Less than a second ago   132MB
centos              test                245b08b27f6f        29 seconds ago           253MB
nginx               add_plo             1ce4194fd0ba        About an hour ago        132MB
centos              latest              831691599b88        3 weeks ago              215MB
[root@ docker_test]# docker run -it centos:latest bash
 
 
## history 확인
[root@docker_test]# docker history centos:test
IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT
245b08b27f6f        About a minute ago   /bin/sh -c yum update -y                        37.9MB             
831691599b88        3 weeks ago          /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                 
<missing>           3 weeks ago          /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                 
<missing>           3 weeks ago          /bin/sh -c #(nop) ADD file:84700c11fcc969ac0…   215MB

 

2. Dockerfile 커맨드

## 기반이 되는 이미지 레이어입니다.
## <이미지 이름>:<태그> 형식으로 작성
FROM ubuntu:14.04
    
## 도커이미지가 생성되기 전에 수행할 쉘 명령어
## app 디렉토리 생성
RUN mkdir -p /app
 
## Docker 이미지 내부에서 RUN, CMD, ENTRYPOINT의 명령이 실행될 디렉터리를 설정합니다.
WORKDIR /app
 
    
 
## 현재 디렉터리에 있는 파일들을 이미지 내부 /app 디렉터리에 추가함
## ADD <현재디렉토리> <이미지 내부 디렉토리>
## 주의 : <현재디렉토리>는 상대경로 이며 절대경로는 들어 갈수 없다.
ADD     . /app
 
 
RUN apt-get update
RUN apt-get install apache2
RUN service apache2 start
 
 
## VOLUME은 디렉터리의 내용을 컨테이너에 저장하지 않고 호스트에 저장하도록 설정합니다.
## 데이터 볼륨을 호스트의 특정 디렉터리와 연결하려면 docker run 명령에서 -v 옵션을 사용해야 합니다.
## ex) -v /root/data:/data
VOLUME ["/data", "/var/log/httpd"]
 
 
 
## 하기 포트를 외부로 노출합니다.
## 호스트와 연결할 포트 번호입니다.
EXPOSE 80
 
       
 
## 쉘을 사용하지 않고 컨테이너가 시작되었을 때 logbackup 스크립트를 실행
## 컨테이너가 시작되었을 때 실행할 실행 파일 또는 셸 스크립트입니다.
## 해당 명령어는 DockerFile내 1회만 쓸 수 있습니다.
CMD ["/app/log.backup.sh"]

 

3. CMD와 ENTRYPOINT의 차이점.
- CMD : 컨테이너가 실행될 때의 인자값으로 주로 사용.
- ENTRYPOINT : 컨테이너가 실행될 때의 default 실행.

## CMD의 예
## 아래와 같이 이미지 빌드
CMD ["/bin/df", "-h"]
 
 
## 컨테이너 실행
## CMD의 명령이 실행됨
❯ docker run --name plo-df plo/df
Filesystem Size Used Avail Use% Mounted on
overlay 59G 5.6G 50G 11% /
tmpfs 64M 0 64M 0% /dev
tmpfs 1000M 0 1000M 0% /sys/fs/cgroup
/dev/sda1 59G 5.6G 50G 11% /etc/hosts
shm 64M 0 64M 0% /dev/shm
tmpfs 1000M 0 1000M 0% /proc/acpi
tmpfs 1000M 0 1000M 0% /sys/firmware
 
## 컨테이너 실행시 추가 인자값을 주면
## CMD의 내용은 무시되고 추가 인자값의 내용이 출력 됨.
docker run --name plo-df plo/df ps -aef
 
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 15:19 ? 00:00:00 ps -aef
 
 
 
 
 
 
## ENTRYPOINT 의 예
## 아래와 같이 이미지 빌드
ENTRYPOINT ["/bin/df", "-h"]
 
 
## 컨테이너 실행
## ENTRYPOINT 명령이 실행되며 CMD와 다르지 않음.
❯ docker run --name plo-df plo/df
Filesystem Size Used Avail Use% Mounted on
overlay 59G 5.6G 50G 11% /
tmpfs 64M 0 64M 0% /dev
tmpfs 1000M 0 1000M 0% /sys/fs/cgroup
/dev/sda1 59G 5.6G 50G 11% /etc/hosts
shm 64M 0 64M 0% /dev/shm
tmpfs 1000M 0 1000M 0% /proc/acpi
tmpfs 1000M 0 1000M 0% /sys/firmware
 
 
## 컨테이너 실행 시 추가 인자값을 주면
## ENTRYPOINT의 인자값으로 넘겨지며 다음과 같이 에러 발생
❯ docker run --name plo-df plo/df:entry ps -aef
 
 
/bin/df: invalid option -- 'e'
Try '/bin/df --help' for more information.
 
 
## 컨테이너 inspect 확인
❯ docker inspect plo-df
...
    "Cmd": [ "ps", "-aef" ],
...
    "Image": "plo/df:entry",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": [ "/bin/df", "-h" ],
...
 
 
## 컨테이너가 실행될 때 실행할 default 명령은 ENTRYPOINT로 정의 하는 것이 좋으며
## CMD는 인자 값으로 정의 목적으로 사용하는 것이 좋다.
반응형

'Micro Service Architecture > Docker' 카테고리의 다른 글

5. [docker] container run  (0) 2021.03.16
4. [docker] container, image 삭제  (0) 2021.03.16
2. [docker] images commit  (0) 2021.03.16
1. [docker] images  (0) 2021.03.16
0. [docker] 설치  (0) 2021.03.16