*이미지 Tag 명 변경 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@host01-2 overlay2]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
testrun                 latest              f18e71700865        2 hours ago         303MB
<none>                  <none>              8af1360f5b43        2 hours ago         303MB
hongtest                latest              9a8341b96270        3 hours ago         98.4MB
<none>                  <none>              ab0f85b7f2e6        3 hours ago         1.13MB
<none>                  <none>              9579d5ccef21        3 hours ago         1.13MB
hongimages              latest              f6d8cd4a7d71        3 hours ago         1.13MB
ubuntu                  14.04               8cef1fa16c77        3 weeks ago         223MB
ubuntu                  latest              452a96d81c30        3 weeks ago         79.6MB
registry                2.5                 36e3b1f8d3f1        4 months ago        37.8MB
reg.cloud.com/ubuntu    latest              20c44cd7596f        6 months ago        123MB
reg.cloud.com/busybox   latest              6ad733544a63        6 months ago        1.13MB
reg.cloud.com/centos    latest              d123f4e55e12        6 months ago        197MB
[root@host01-2 overlay2]# vi ~/.bashrc
[root@host01-2 overlay2]# docker tag hongtest registry:3.0
[root@host01-2 overlay2]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
testrun                 latest              f18e71700865        2 hours ago         303MB
<none>                  <none>              8af1360f5b43        2 hours ago         303MB
hongtest                latest              9a8341b96270        3 hours ago         98.4MB
registry                3.0                 9a8341b96270        3 hours ago         98.4MB
<none>                  <none>              ab0f85b7f2e6        3 hours ago         1.13MB
<none>                  <none>              9579d5ccef21        3 hours ago         1.13MB
hongimages              latest              f6d8cd4a7d71        3 hours ago         1.13MB
ubuntu                  14.04               8cef1fa16c77        3 weeks ago         223MB
ubuntu                  latest              452a96d81c30        3 weeks ago         79.6MB
registry                2.5                 36e3b1f8d3f1        4 months ago        37.8MB
reg.cloud.com/ubuntu    latest              20c44cd7596f        6 months ago        123MB
reg.cloud.com/busybox   latest              6ad733544a63        6 months ago        1.13MB
reg.cloud.com/centos    latest              d123f4e55e12        6 months ago        197MB
[root@host01-2 overlay2]#
 
cs



*이미지 Tag 삭제(명령어는 없고 이미지를 지우면 된다) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@host01-2 overlay2]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
testrun                 latest              f18e71700865        2 hours ago         303MB
<none>                  <none>              8af1360f5b43        2 hours ago         303MB
registry                3.0                 9a8341b96270        3 hours ago         98.4MB
hongtest                latest              9a8341b96270        3 hours ago         98.4MB
<none>                  <none>              ab0f85b7f2e6        3 hours ago         1.13MB
<none>                  <none>              9579d5ccef21        3 hours ago         1.13MB
hongimages              latest              f6d8cd4a7d71        3 hours ago         1.13MB
ubuntu                  14.04               8cef1fa16c77        3 weeks ago         223MB
ubuntu                  latest              452a96d81c30        3 weeks ago         79.6MB
registry                2.5                 36e3b1f8d3f1        4 months ago        37.8MB
reg.cloud.com/ubuntu    latest              20c44cd7596f        6 months ago        123MB
reg.cloud.com/busybox   latest              6ad733544a63        6 months ago        1.13MB
reg.cloud.com/centos    latest              d123f4e55e12        6 months ago        197MB
[root@host01-2 overlay2]# docker rmi hongtest
Untagged: hongtest:latest
[root@host01-2 overlay2]#
 
cs



*docker image tag의 latest 포인터 이동(3.0을 latest로 만들기) :

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@host01-2 overlay2]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
registry                3.0                 9a8341b96270        3 hours ago         98.4MB
registry                2.5                 36e3b1f8d3f1        4 months ago        37.8MB
[root@host01-2 overlay2]# docker tag registry:3.0 registry:latest
[root@host01-2 overlay2]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
registry                3.0                 9a8341b96270        3 hours ago         98.4MB
registry                latest              9a8341b96270        3 hours ago         98.4MB
registry                2.5                 36e3b1f8d3f1        4 months ago        37.8MB
 
 
 
cs


*Dockerfile 만들기


Dockerfile은 쉽고 간단하며 명확한 구문을 갖는 텍스트 파일로 이미지 생성을 위한 핵심 요소!


-인스트럭션: 대소문자를 구분하지 않지만 가독성을 위해 대문자 사용! 구성 순서가 중요

-주석 : #

-MAINTAINER: 구성 위치 상관없으며 레이어를 생성하지 않음


*인스트럭션 종류

FROM

MAINTAINER

LABEL

RUN

COPY files 

ADD files

EXPOSE


ENTRYPOINT

CMD



- ADD와 COPY의 구분

1
2
3
4
5
6
7
8
COPY files/nginx.conf /etc/nginx/nginx.conf
#COPY는 url을 지정할 수 없다
 
ADD files/nginx.conf /etc/nginx/nginx.conf
#ADD는 url을 지정할 수 있다
 
#주의사항 files는 현재 커서가 있는 위치를 의미한다
#nginx.conf 뒤에 /가 붙으면 해당 폴더 밑에 파일들을 copy한다는 의미(따라서 /는 빼야 )
cs


RUN, COPY, ADD를 할 때마다

Docker에서는 임시 레이어를 만들고 Commit을 수행한다.

그리고 결국 Alpine까지 4개의 레이어로 구성된 이미지가 만들어진다!


*RUN 명령어를 시작할 때 아래와 같이 실행하면 좋은점:
=>RUN은 이미지 빌드 명령어임! 실행 인스트럭션이 아님!

임시 레이어를 매번 생성하지 않아 시간이 단축됨.


좋은 예)

RUN apk add --update nginx && \

       rm -rf /var/cache/apk/* && \

       mkdir -p /tmp/nginx/


나쁜 예)

RUN apk add --update nginx

RUN rm -rf /var/cache/apk/*

RUN mkdir -p /tmp/nginx/



*ENDPOINT 와 CMD는 실행 인스트럭션임(기본적으로 1회만 실행)

=>이미지 생성 시 영향 없음


1) Shell :  ping $HOSTNAME

2) DockerFile : ["ping", "$HOSTNAME"]  

// ping은 shell명령어, $HOSTNAME은 파라미터

// 그래서 2)번은 실행이 안된다...아래와 같이 입력 필요

// ["/bin/bash", "-c", "ping"]

ENTRYPOINT["sh start.sh"]

CMD echo $HOSTNAME

=>CMD안에 값을 overwrite한다


*LABEL은 메타데이터 인스트럭션임

ex1) LABEL description="This is an example Dockerfile for NGINX."

=> Key = description

=> Value = "This is an example Dockerfile for NGINX."


ex2) LABEL key1="value1" \
               key2="value2" \
               key3="value3" 

*ARGS와 ENV : 

ARGS user=kim
ENV password=passwd

- ARGS는 runtime 순간에만 수행되고 없어진다.
- ENV는 docker run 시에도 변수를 사용할 수 있다(runtime 순간 이후에도 메모리에 변수가 떠있다)

*ARG 인스트럭션 :

FROM ubuntu
ARG user=hong
ARG version
1
2
[root@host01-2 overlay2]# docker build --build-arg user=somebodyElse
 
cs
=>user 파라미터가 runtime 빌드 시 덮어씌워진다 






*EXPOSE 인스트럭션

EXPOSE는 config(설정)과는 전혀 상관없다.

정보 제공을 위한 것!


EXPOSE 80

EXPOSE 443


Config에 들어가는 것이 아니라, 단순 Information을 위함

그럼 왜 쓰느냐?

web 서버가 80이 아닌 다른 포트(5500)으로 떴을 시 다른 프로세스가 통신할 때 조회가 필요할 수 있으니 정보를 입력해놓는다.


EXPOSE 80/UDP

EXPOSE 1000-2000

#port range 설정



*RUN 인스트럭션(Cache 문제)


아래 예시를 보자 : 


1) 

FROM reg.cloud.com/ubuntu

RUN apt-get update

RUN apt-get install -y mongodb-server


2) 10년 후

FROM reg.cloud.com/ubuntu

RUN apt-get update

RUN apt-get install -y mongodb-server

RUN apt-get install -y nodejs


(mongodb-server는 당연히 최신으로 받을것으로 예상되지만 10년 전 repo를 그대로 가져옴...cache 재활용의 문제...최신 것으로 받으려면 FROM절을 다르게 해야 함)

=> Docker Cache를 안 쓰게 할 수도 있지만...OFF를 해버리면 전체에서 Cache를 안 쓰는 것으로 판단한다. 오래걸림.


1
2
[root@host01-2 overlay2]# docker build --no-cacheColored by Color Scripter
cs



*USER 인스트럭션 : 

USER tomcat

이라고 하면 이 인스트럭션 이후부터는 root계정이 아닌 tomcat 계정으로 실행하게 된다


만약 계정이 없다면 RUN BUILD 시 생성해준다: 


1
2
RUN groupadd -r tomcat && useradd -r -g tomcat:tomcat 
cs


*HEALTHCHECK 인스트럭션


웹서버를 구성한다고 가정했을 때 컨테이너가 up 상태로 되어 있다 하더라도, ip:port로 request를 했을 때 웹페이지가 실행이 안되는 경우가 있다. 


이런 상황을 방지하기 위해 HEALTHCHECK를 활용하면 좋다 : 

1
2
3
HEALTHCHECK --interval=<interval> --timeout=<timeout> CMD <commadn>
 
HEALTHCHECK --interval=5m --imeout=2s --retries=3 CMD curl -f http://localhost/ || exit 1
cs





*SHELL 인스트럭션 ; 


기본 등록 Shell이 올라가도록 설정


SHELL ["executable", "parameters"]

 

ex)

SHELL ["/bin/sh", "-c"]





* DOCKERFILE - 권장사항


.dockerignore 이라는 파일이 존재한다. 이미지 생성 작업 중에 불필요한 파일을 로드하지 않도록 설정하는 파일임!


*DOCKERFILE로 이미지 생성하기

docker build -f <dockerfile의 파일이름과 경로, 생략시 dockerfile 사용> -t <생성될 이미지에 적용할 이름>


ex) docker build .

docker build -t hong/myapp

docker build -t hong/myapp:1.0.0 -t hong/myapp:latest


*DOCKERFILE 예시 : 

1
2
3
4
5
6
7
8
9
10
11
FROM ubuntu:latest
MAINTAINER HONG <hk@daum.net>
RUN apt-get update && apt-get install -y mysql-client mysql-server
ENV username mysqluser
ENV password pass
ENV database db1
ADD databasesetup.sh /
RUN chmod 644 /databasesetup.sh
RUN "/usr/bin/sh databasesetup.sh"
EXPOSE 3306
CMD ["/usr/bin/mysqld_safe"
cs


ENTRYPOINT는 Shell 파일(ex: temp.sh)

CMD는 해당 Shell 파일에 넘겨줄 Parameter를 넣는다

=> CMD["tmp1", "tmp2"] 인데

docker run 시 뒤에 parameter가 1개만 있을 경우

(ex: docker run --rm image:v1 aux)

실행 shell파일은 temp.sh aux가 된다...


+ Recent posts