작업/docker

dockerfile

한종서 2024. 1. 31. 17:51

vi  Dockerfile

FROM    ubuntu

MAINTAINER    이름이니셜 <이메일계정>

LABEL    "version" = "3.0"



docker   build   -t    myimg:3.0    .

 

Dockerfile 에서 사용하는 논리연산자

&& –  AND 연산자

→ 예)   cp   &&   cal

cal   &&   cp

 

||  –  OR 연산자

;  –  명령어의 나열

→  예)    cal  ;   sleep  20  ;   date ;   cp   ;   lsblk 



vi   lunch.txt

FROM    ubuntu

MAINTAINER    이름이니셜 <이메일계정>

LABEL    "version" = "3.0"

RUN    useradd   bbb

RUN    apt-get  update

RUN    apt-get   -y  install   nginx

RUN    echo   아무글자나입력   >   /usr/share/nginx/html/index.html

RUN    echo   아무글자나입력   >   /var/www/html/index.html

RUN    rm   -rf    /var/lib/apt/lists/*

RUN    mkdir   /WebData



rm  -f  Dockerfile

 

docker  build  -t   myimg:4.0    -f  lunch.txt     .

 

vi   lunch.txt

FROM    ubuntu

MAINTAINER    이름이니셜 <이메일계정>

LABEL    "version" = "3.0"

RUN    useradd   bbb   &&  \

apt-get  update   &&  \

apt-get   -y  install   nginx  &&   \

echo   hello docker >   /usr/share/nginx/html/index.html  &&  \

echo  hello docker  >   /var/www/html/index.html  &&  \

rm   -rf    /var/lib/apt/lists/*   &&  \

mkdir   /WebData

 

docker  build  -t   myimg:5.0    -f  lunch.txt     .

 

docker   image   ls  

--> 레이어를 많이 만들면  이미지 사이즈가 커진다.

그래서 && ,||, ;를 사용해서 하나의 명령에 집어 넣으려고 한다.

 

CMD와 ENTRYPOINT의 공통점

이미지가 컨테이너로 실행될 때 명령어 및 인자 값을 지정할 때 사용

--> 컨테이너의 PID 1번 프로세스를 지정한다.

 

CMD와 ENTRYPOINT의 차이점

ENTRYPOINT는  반드시 수행해야 하는 명령어를 지정 ( 유저가 변경 불가능)

CMD는 유저에 의해 변경 가능한 것. 옵션 인자 등.

 

 

docker   build    -t   myimg    . 

 

docker   run   -d   --name  myweb    -p  8282:80    myimg

→  docker  ps 

→  윈도우 웹브라우저  –  http://192.168.137.10:8282

→  rmac

 

vi    cold.txt

FROM   centos

ENTRYPOINT  ["ping",  "localhost"]

CMD  ["-c", "3"]



docker   build    -t   myping:1.0    -f  cold.txt     .

 

docker   run    --name  c2   myping:1.0

 

docker   run    --name  c3   myping:1.0    -c  10

ps   --forest    →   sh   →   ps   --forest  

 

exit

일반적으로 RUN명령은 Shell 방식으로 쓰고

CMD, ENTRYPOINT는 Exec방식으로 사용. -> (shell형식으로 사용하면, shell이 먼저 실행되고 그 쉘에 의해 CMD 명령이 실행된다. -> PID 1번이 shell로 지정이 된다.)

 

COPY 명령어와 ADD 명령의 차이점

vi   index.html

<html>

<body  bgcolor=green>

<h1>  hello  Dockerfile </h1>

</body>

</html>

 

vi   Dockerfile

FROM    ubuntu

MAINTAINER    이름이니셜 <이메일계정>

LABEL    "version" = "3.0"

RUN    useradd   bbb   &&  \

apt-get  update   &&  \

apt-get   -y  install   nginx  &&   \

rm   -rf    /var/lib/apt/lists/*   &&  \

mkdir   /WebData

COPY   index.html   /usr/share/nginx/html/index.html    ←  수정한 부분

COPY   index.html   /var/www/html/index.html    ←   수정한 부분

CMD  ["nginx",  "-g",  "daemon off;"]



docker  build   -t   myweb    . 

→  docker   image  ls  

 

docker   run   -d   --name  c4   -p   8484:80    myweb

→   docker   ps 

→   웹브라우저   –  http://192.168.137.10:8484



vi   Dockerfile

FROM   centos

COPY    index.html     /aaa/index.html

COPY    webdata.tar    /bbb/



cp    /etc/passwd       .    →    ls    

 

tar   -cvf   webdata.tar      cold.txt    index.html    passwd   →   ls 

 

tar   -tvf   webdata.tar

 

docker  build   -t   testimg:1.0     .

 

docker   run   -it   --name  testcon1    testimg:1.0

→  ls   / 

→  ls  -l   /aaa

→  ls  -l   /bbb

→  exit



vi   Dockerfile

FROM   centos

ADD    index.html     /aaa/index.html

ADD    webdata.tar    /bbb/

ADD    https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-online-installer-v2.10.0.tgz   /ccc/1.tgz



docker  build   -t   testimg:2.0     .

 

docker    run   -it   --rm   --name   c5    testimg:2.0

→  ls   / 

→  ls  -l  /aaa

→  ls  -l   /bbb

 

ADD 명령어는 tar파일을 추가하면 압축이 해제되면서 저장.

온라인 상의 데이터도 추가 가능.

COPY는 시스템 내부에 있는 데이터만 복사 가능

 

ENV, 
EXPOSE

vi   Dockerfile

FROM     nginx:1.12

ADD    index.html     /usr/share/nginx/html/index.html

ENV    DBUSER   aaa

ENV    DBPASS=123

EXPOSE   443



docker   build   -t   www     .

 

docker   image  inspect   nginx:1.12   |   grep   -A  3   ExposedPorts

 

docker   image  inspect   www  |   grep   -A  3   ExposedPorts

 

 

docker   run   -d   --name  c1  -p   9090:80    www

→  웹브라우저  –  http://192.168.137.10:9090

 

docker   exec  -it  c1   /bin/bash

→  env  |  grep  DB

→  exit

 

rmac

 

 

 

 

VOLUME, WORKDIR

 

vi   Dockerfile

FROM   centos

VOLUME     /lasttime

WORKDIR    /123

WORKDIR    k8s



docker   build   -t   myimg:1.0    .  

 

docker   volume   ls  

 

docker   run    -it    --name  c2    myimg:1.0

→  pwd

→  Ctrl + p,  Ctrl + q



docker   volume   ls  

 

docker   inspect    c2   |  grep   -A  10   Mounts

 

 

USER

id    →    su  -  일반유저명    →   id    →   exit    →  id  

 

docker   run  -d   --name  c3    -p   8787:80   httpd

docker   exec   -it   c3  /bin/bash

→   id

→   exit

 

vi   Dockerfile

FROM   centos

RUN     useradd  bbb

RUN     whoami

USER   bbb

RUN     whoami



docker   build   -t   myuser   .

 

docker    run   -it   --name  c5    myuser

→   id 

 

 

ARG : 도커파일 내에서 변수를 선언하여 사용할 수 있음.

 

ONBUILD : 이 이미지를 빌드할 때에는 실행되지 않고 빌드한 이미지를 다른 도커파일에서 FROM으로 사용할 때 실행된다. (여러사람이 개발을 하는 경우, 사용자가 이미지를 사용 시 필수 데이터? 가 있어야 하는 경우.)

 

vi   a.txt

FROM   nginx

RUN   useradd   testweb

RUN   mkdir   /webdata

ONBUILD   ADD   devops.tar   /usr/share/nginx/html/

ENV    Ver    1.0



docker   build   -t     webdev    -f  a.txt     .

 

devops.tar가 없음에도 불구하고 빌드시에 에러가 발생되지 않는다. -> 실행이 안 됨.

 

cp    ~/3day/index.html     /etc/passwd       .     →   ls  

 

tar  -cvf   devops.tar    a.txt   index.html   passwd    →   ls  



vi  Dockerfile

FROM    webdev

WORKDIR    /webdata



mv    devops.tar    /tmp

 

docker   build    -t   finalweb   .

 

mv    /tmp/devops.tar     .

 

docker   build    -t   finalweb   .

 

docker   run   -d   --name   www4    -p  7080:80    finalweb

→  docker   ps

→  웹브라우저  –  http://192.168.137.10:7080

 

docker   exec   -it   www4   /bin/bash

→  pwd  

→  ls   /usr/share/nginx/html

→  env

→  exit

 

rmac

 

HEALTHCHECK

  리눅스 리턴코드

cal  →   echo  $?

sleep   30    →   echo  $?

ls    /et     →   echo  $?

 

ps   --forest   →    sh    →   ps   --forest   →   exit   →   echo  $?

sh   →   ps   --forest  →   exit  숫자   →  →   echo  $?

 

vi   Dockerfile

FROM   nginx

HEALTHCHECK   --interval=30s   --timeout=3s  --retries=2   CMD  curl  -f   http://localhost/index.html  ||  exit 1