Docker - 5. Image 만들기

2020-02-25

Index


  1. Docker
    1. Docker 개념
    2. Docker Install
    3. Docker Command
    4. Docker Example
    5. Image 만들기
    6. Dockerfile
    7. Docker Compose
    8. Image 저장소

  1. Container Orchestration
    1. Container Orchestration 이란
    2. kubernetes(1)
    3. kubernetes(2)
    4. kubernetes install
    5. kubernetes ui
    6. kubernetes를 이용해 배포해보기
    7. kubectl CLI

  1. Provisioning
    1. Provisioning이란
    2. Ansible
    3. Ansible을 이용해 kubernetes cluster 생성하기

목표

이번엔 Docker Image를 직접 만들어 보도록 하겠습니다.
Image를 만드는 방법은 2가지가 있습니다. (제가 아는 바로는)

  1. 베이스 이미지 (Os만 설치된 Container)를 만들어 놓고 Container에서 필요한 작업을 한 뒤 container commit으로 Image 생성
  2. Dockerfile 을 이용한 Image생성

두 가지 케이스 다 실습해보도록 하겠습니다.
실습환경은 ces때 진행했던 broker-api 로 하겠습니다.

설치순서

1. Base Image(OS)로 Container생성 후 commit 로 Image생성하기.

1-1. CentOS Image를 다운받습니다.

1
sudo docker pull centos

image31

1-2. Container 생성하기

image32

1-3. Container 들어가기

image33

1-4. Container 내부에 OpenJdk8 설치하기

1-5. application jar 다운로드

image35

1-6. application start

1
java -server -Dspring.profiles.active=dev -jar broker-api.jar &

image36

1-7. application 구동 확인

정상적으로 구동된 것을 확인 할 수 있습니다.

image37

1-8. image 생성하기

정상적으로 구동된 것을 확인했으니, 해당 Container 기준으로 Image생성을 해보겠습니다.
새로 생성할 Image name 은 broker-api1 로 설정하겠습니다.
broker-api1이라는 image가 생성 된것을 확인 할 수 있습니다.

1
sudo docker commit centos broker-api1

image38

1-9. 생성된 image로 container 구동하기.

image39

1-10. application 구동확인

2. Dockerfile 을 이용한 Image생성

이번엔 동일한 작업을 Dockerfile을 이용해서 Image생성을 해보겠습니다.
위 생성 방식은 나름 복잡(?) 하게 구성된 것에 비해 Dockerfile 생성 방식은 좀더 simple(?) 합니다.
Dockerfile에 대한 설명은 다음장에 설명하겠습니다.

2-1. Dockerfile 작성

2-2. Dockerfile build

작성한 Dockerfile을 이용해 Image생성을 해보겠습니다.
Dockerfile이 있는 경로에서 아래 명령어로 broker-api2 이라는 image를 생성합니다.

1
sudo docker build -t broker-api2 .

image40

‘broker-api2’라는 Image 가 생성된 것을 확인 할 수 있습니다.
image41

2-3. 생성된 image로 container 구동하기.

1
2
3
4
sudo docker run -itd \
-p 18080:18080 \
-v /home/thinkub0219/webapp:/home/webapp \
--name "broker-api2" broker-api2

image42

2-4. application 구동확인

정상적으로 접근되는 것을 확인 할 수 있습니다.

image43

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