-
[Docker] DockerfileCLOUD/Docker 2021. 8. 10. 22:14반응형
Dockerfile을 작성해서 container를 생성해보는 업무가 있었는데, 정리하는김에 인턴할때 사용했던 Dockerfile을 분석해보고 어떤 방식으로 Spring boot 프로젝트를 배포했는지 확인해보려고 한다.
기본 지식
Dockerfile
Dockerfile은 해당 위치에 작성한 후
docker build -t {imagename}:{tagname} .
으로 이미지를 만들어낼 수 있다.FROM과 RUN만 알고있으면 된다!
FROM <IMAGE_NAME>
- FROM은 항상 dockerfile 첫 줄에 온다.
- image_name에는 커스텀 이미지의 기반이 되는 이미지 이름을 지정해준다.
RUN <COMMAND>
ubuntu:18.04 이미지로 bash셸 실행하고 apt update하고 apt install -y git 명령어 실행했던 과정을 dockerfile로작성한다면
FROM ubuntu:18.04 RUN apt update RUN apt install -y git
사용은
$ docker build -t ubuntu:git2 .
주의사항
dockerfile을 실행하는 동안에는 키보드 입력이 불가능하므로 중간에 y로 설치확인하는 과정을 -y옵션으로 미리 지정해주어야한다.
명령어
FROM
- 무조건 base image가 있어야한다.
- ubuntu / centos (버전까지 지정해주는것이 좋음) 와 같은 리눅스 OS나, alpine, UBI와 같은 가벼운 기능 수행을 위한 container전용 OS를 사용하면 된다.
ENV
- 환경변수를 설정해준다.
- 환경변수는 docker run할때
-e <변수>=<값>
으로 지정할 수도 있고RUN export ~~
로 할 수도 있다. 차이점들은 찾아봐야겠다.
RUN
- 컨테이너에서 실행할 내용들 ( 미리 이미지로 만들어둘만한 ) 커맨드들을 RUN을 이용해서 수행한다.
- yum install , apt install 등으로 설치하거나 mkdir, touch, echo, cat, 등
WORKDIR
- cd와 같은 기능을 수행한다.
CMD
- 이미지로 만든 컨테이너를 run할때 다른 값을 주지 않으면 여기서 설정한 커맨드가 수행된다.
- run할때 덮어쓸 수 있다.
- dockerfile내에 1회만 쓸 수 있다.
내가 써본것만, 머릿속에 있는 내용만 정리해 본 것이기 때문에 추가로 명령어가 더 많고, 설명이 부족할 수 있다.
.dockerignore
docker 이미지 생성시 이미지 안에 들어가지 않을 파일을 지정할 수도 있다.
API 서버 docker file 분석
FROM centos:7 # Install basic packages ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 ENV LANG kr_KO.UTF-8 RUN yum -y update RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm RUN yum install -y nginx wget telnet nc tar vim unzip net-tools java-11-openjdk-devel # Wefl setup RUN mkdir -p /admin/operation VOLUME ["/admin/operation"] EXPOSE 80 8080 WORKDIR /admin ADD run.sh /admin/run.sh RUN chmod 755 /admin/run.sh ADD nginx/nginx.conf /etc/nginx/nginx.conf ADD ssl/* /etc/nginx/ ADD war/*.war /admin/ ENTRYPOINT ["/admin/run.sh"]
FROM centos:7
base image가 될 OS는 centos:7을 선택했다.
- CentOs는 Red hat 기반 --> 지금 보니 이제 centos는 없어지고 RHEL(red hat enterprise linux)로 변경된다고 한다.
- 패키지 매니저를 yum을쓴다. 염! 이라고 읽는거같은데 나는 속으로 얌이라고 읽는다. 그게 귀여우니까~
# Install basic packages ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 ENV LANG kr_KO.UTF-8 RUN yum -y update RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm RUN yum install -y nginx wget telnet nc tar vim unzip net-tools java-11-openjdk-devel
인코딩 설정
- JAVA_TOOL_OPTIONS 모든 VM에서 인식되는 환경변수이다. oracle, ibm이 이 java option의 환경변수 이름이 다른데 공통으로 쓰이는걸로 설정해준 것 같다.
- JVM이 입력과 출력으로 변환되는 데이터를
-Dfile.encoding
옵션에서 지정된 인코딩으로 변경되게 해준다. WAS 구동의 JVM파라미터 옵션에 다음을 지정하면 명시적으로 UTF8 charset을 사용하게 된다. - 언어는 kr_KO.UTF-8
사실 잘 모르겠다 이부분..
패키지 설치
rpm과 yum은 리눅스의 패키지 설치 프로그램, 설치 파일과 같다.
rpm
- rpm은 redhat package manager의 약자로 , 프로그램을 설치한 후 바로 실행한다.
- rpm은 패키지 디펜던시가 있어 그 패키지의 필요요소를 다 다운로드받아야만 설치할 수 있다.
- 설치 :
rpm -Uvh *.rpm
- 삭제 :
rpm -e 패키지 이름
- 찾기 (설치된 rpm) :
rpm -qa
- 출력 :
rpm -qf
yum
- rpm의 의존성 문제를 해결해준다. 인터넷을 통해서 필요한 파일을 저장소에서 자동으로 다운로드 받아 설치한다.
- 외부 레파지토리와 서버가 통신이 가능해야한다. ( rpm의 필요한 의존성을 yum은 웹에서 다운로드 받아온다)
- /etc/yum.repos.d 에 repolist들이 들어있다
nginx를 다운로드 받아온다 ( yum 저장소에는 기본 nginx가 없다)
wget : url에 해당하는 파일 설치
tar , unzip : 압축관련
telnet: 모르겠음
net-tools java-11-openjdk-devel
이때 설치한 패키지들은.. 사실 내가 적은게 아니었어서 잘 모르겠다! 나중에 프로젝트 배포할때 직접 알아봐야겠다.
보통 컨테이너에 기본 base image를 설치해 run해본다음 순서대로 프로그램이 실행할 수 있게 설정하는 과정을 거칠텐데, 그때 없다고 나와서 깔아야되는 것들을 하나씩 모아 dockerfile에
RUN yum install ~~~
로 하면 될 것 같다!# Wxxl setup RUN mkdir -p /admin/operation VOLUME ["/admin/operation"] EXPOSE 80 8080 WORKDIR /admin ADD run.sh /admin/run.sh RUN chmod 755 /admin/run.sh ADD nginx/nginx.conf /etc/nginx/nginx.conf ADD ssl/* /etc/nginx/ ADD war/*.war /admin/ ENTRYPOINT ["/admin/run.sh"]
- 컨테이너는 휘발성이므로 컨테이너 실행시 생성되는 데이터들은 종료와함께 사라질 것이다. 이를 보존하기 위해 volume을 쓰는데 dockerfile에서
VOLUME ["/this/is/paht"]
를 선언하면 run 되어서 container로 올라갈 때 자동으로 해당 경로를 host에 연결해/var/lib/docker/volumes/{volume_name}
에 만들어진다고 한다.- volume에 대해서는 더 좋은 방법으로 연결하는게 출처로 남긴 블로그에 써져있으니 나중에 사용해봐야겠다 !
EXPOSE
는 컨테이너와 호스트를 연결할 포트번호를 설정해주는 것이다. 이때 연결한 후 실제docker run -p
을 통해 노출시켜주어야 한다. ( expose는docker run --expose
의 역할 )- EXPOSE 80 8080 은 이 도커이미지는 80,8080 포트를 외부에 공개할 예정이라고 '선언', '명시' 해준 느낌이다.
docker run -it -p 8080:80 webserver
는 호스트의 80포트가 컨테이너의 8080포트로 연결된다는 뜻docker ps
에서ports
정보로 확인할 수 있다.
ADD <복사할 파일 경로 > <이미지에서 위치할 파일 경로>
디렉토리는 안되고 파일만 된다.- 쉘스크립트를 작성해 컨테이너에서 실행해줄 것
run.sh
#!/bin/bash # RUN NGINX nginx # RUN APPLICATION echo "spring boot profile" echo " - ${SPRING_PROFILES_ACTIVE}" java -cp ./:/admin/operation/ \ -Xms4096m -Xmx4096m \ -jar /admin/*.war \ --server.port=8080 "$@"
- 쉘 스크립트 작성시 첫줄에는 무조건
#!/bin/bash
가 들어가야 한다. - 나중에 프로젝트 배포해보면서 java 값들 알아봐야겠다
nginx파일은 나중에 ..
docker 공부만해보고, 이전에는 같이 플젝하는 오빠가 만든 여기 적은 dockerfile을 어떻게쓰는지도 모르고 그냥 가져다 썼는데 실제로 내가 dockerfile을 작성해야되는 일을 하면서 드디어 이해할 수 있게 되었다!!
사실 이거때문에 도커, 컨테이너,, 뭐 클라우드 하고싶다고 얘기 했는데 .. 생각보다 너무 딥한 클라우드 플랫폼 일을 하고 있어서 힘들지만 여태까지 배운 내용들이 있어서 이 설정값들을 하나하나 이해할 수 있던것 같기도 하고..
잘 모르겠다 ^^;;
여튼 앞으로 하는 프로젝트들 얼른 좀 모양 잡아서 dockerfile 작성하고 얼른 서버로 배포해봐야겠다.~!!!
출처
[rpm yum](
'CLOUD > Docker' 카테고리의 다른 글
[docker] 명령어 (0) 2021.07.19 [Docker] 3. 이미지만들고 배포 (0) 2021.02.23 [Docker] 2 설치.컨테이너 실행 (0) 2021.02.23 도커란 무엇인가 (0) 2021.02.23