*이미지 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."
1 2 | [root@host01-2 overlay2]# docker build --build-arg user=somebodyElse | cs |
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 | 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가 된다...
'Docker(도커) Kubernetes' 카테고리의 다른 글
docker 볼륨(volume) 컨테이너 마운트 방법 (0) | 2018.05.24 |
---|---|
Docker Container 메모리 / CPU 제어 (0) | 2018.05.23 |
Docker Container와 Host간 web server storage를 공유하도록 만들기 (0) | 2018.05.23 |
Docker 이미지란, 도커 이미지 layer 파일시스템 구조, UTS, PID 호스트 네임스페이스 공유 (0) | 2018.05.23 |
docker 명령어, 프로세스 관리, 실행, 이미지/컨테이너 개념 (0) | 2018.05.21 |