Index
- Docker
- Container Orchestration
- Provisioning
목표
이번엔 Docker Image를 직접 만들어 보도록 하겠습니다.
Image를 만드는 방법은 2가지가 있습니다. (제가 아는 바로는)
- 베이스 이미지 (Os만 설치된 Container)를 만들어 놓고 Container에서 필요한 작업을 한 뒤 container commit으로 Image 생성
- Dockerfile 을 이용한 Image생성
두 가지 케이스 다 실습해보도록 하겠습니다.
실습환경은 ces때 진행했던 broker-api 로 하겠습니다.
설치순서
- CentOS 설치
- OpenJdk8 설치
- application jar파일 다운로드
- application start
1. Base Image(OS)로 Container생성 후 commit 로 Image생성하기.
1-1. CentOS Image를 다운받습니다.
1 | sudo docker pull centos |
1-2. Container 생성하기
- -p 옵션으로 application 사용하는 18080포트 연결 목적
- -v 옵션으로 application jar 파일 mount 목적
1
2
3
4sudo docker run -itd \
-p 18080:18080 \
-v /home/thinkub0219/webapp:/home/webapp \
--name "centos" centos
1-3. Container 들어가기
- jdk 가 설치 되지 않은것을 확인 할 수 있습니다.
1
sudo docker exec -it centos /bin/bash
1-4. Container 내부에 OpenJdk8 설치하기
- jdk 가 설치 된 것을 확인 할 수 있습니다.
1
2
3
4yum update -y; \
yum install -y java-1.8.0-openjdk-devel.x86_64; \
easy_install supervisor; \
yum clean all
1-5. application jar 다운로드
- 현재 gitlab 환경이 내부망으로 컴파일 된 jar 파일 upload 처리함
- 정상 적인 case로는 git clone으로 source code download 후 build 처리하는 것을 추천함.
- 아래 이미지와 같이 mount 된 volume에 jar파일 upload 하면 docker 에 mount된 경로에서 확인이 가능함.
1-6. application start
1 | java -server -Dspring.profiles.active=dev -jar broker-api.jar & |
1-7. application 구동 확인
정상적으로 구동된 것을 확인 할 수 있습니다.
1-8. image 생성하기
정상적으로 구동된 것을 확인했으니, 해당 Container 기준으로 Image생성을 해보겠습니다.
새로 생성할 Image name 은 broker-api1 로 설정하겠습니다.
broker-api1이라는 image가 생성 된것을 확인 할 수 있습니다.
1 | sudo docker commit centos broker-api1 |
1-9. 생성된 image로 container 구동하기.
- 기존 생성된 container를 삭제합니다.
- 생성된 image를 이용해 container를 구동합니다.
1
2
3
4sudo docker run -itd \
-p 18080:18080 \
-v /home/thinkub0219/webapp:/home/webapp \
--name "broker-api1" broker-api1
1-10. application 구동확인
확인해보면 정상적으로 구동되지 않은 것을 확인 할 수 있습니다.
- 이유는 application start가 되지 않았기 때문입니다. container내부 환경요인은 정상 설치가 되었습니다.
- application 구동을 진행하면 정상적으로 사이트 접근이 가능합니다.
2. Dockerfile 을 이용한 Image생성
이번엔 동일한 작업을 Dockerfile을 이용해서 Image생성을 해보겠습니다.
위 생성 방식은 나름 복잡(?) 하게 구성된 것에 비해 Dockerfile 생성 방식은 좀더 simple(?) 합니다.
Dockerfile에 대한 설명은 다음장에 설명하겠습니다.
2-1. Dockerfile 작성
- centos 로 base image 를 지정한다.
- 작성자는 mhlee@saltlux.com 이다.
- JAVA_HOME 환경변수를 지정한다.
- openJdk를 설치한다.
- source를 copy 한다
(주의점은 container내부는 절대경로 지정이 가능하나 외부경로는 상대경로를 지정해줘야함)
- port 설정을 한다
- container 실행시 실행스크립트를 작성한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18FROM centos
MAINTAINER mhlee@saltlux.com
ENV JAVA_HOME /usr/lib/jvm/java-openjdk
# Install Packages & open jdk 1.9
RUN yum update -y; \
yum install -y java-1.8.0-openjdk-devel.x86_64; \
easy_install supervisor; \
yum clean all
# source copy
COPY ./webapp /home/webapp
# app start
EXPOSE 18080
CMD java -server -Dspring.profiles.active=dev -jar /home/webapp/broker-api.jar
2-2. Dockerfile build
작성한 Dockerfile을 이용해 Image생성을 해보겠습니다.
Dockerfile이 있는 경로에서 아래 명령어로 broker-api2
이라는 image를 생성합니다.
1 | sudo docker build -t broker-api2 . |
‘broker-api2’라는 Image 가 생성된 것을 확인 할 수 있습니다.
2-3. 생성된 image로 container 구동하기.
1 | sudo docker run -itd \ |
2-4. application 구동확인
정상적으로 접근되는 것을 확인 할 수 있습니다.
Dockerfile을 사용해야 하는 이유
2가지 방법을 봤을때 Dockerfile을 사용하는게 좀더 simple(?) 해 보이는건 제 착각 일까요?
첫번째 방법으로 Image를 생성한 경우 Image가 삭제 되었을때 Image를 재생성 하는 과정이 Dockerfile에 비해
다소 복잡하고 step에 대한 누락이 발생 할 가능성이 있습니다.
거기에 반해 Dockerfile을 Git으로 관리하게 되면 Dockerfile 의 변경 History관리가 가능하고 버전 관리가 가능하고
Image 재생성 과정이 단순해 집니다.
참고
https://www.docker.com
http://pyrasis.com/book/DockerForTheReallyImpatient
https://www.44bits.io/ko/post/almost-perfect-development-environment-with-docker-and-docker-compose
https://tech.osci.kr/docker/2018/09/10/45749387/
https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html