# 5. Docker 이미지 빌드 및 배포 설정

이전시간에서는 **Github Integration**플러그인을 활용하여 젠킨스 서버로 Github 레파지토리의 **소스코드**를 불러오고, **Maven Integration**플러그인을 활용하여 소스코드를 **jar**파일로 **Build**하는 작업까지 완료했습니다. 다음 순서로는 Build완료한 jar파일을 별도의 컨테이너로 **배포**하여 애플리케이션을 서비스해보도록 하겠습니다.&#x20;

### 0. MySql Server 생성

* DB는 젠킨스의 CI/CD대상이 아니므로 별도의 파일로 관리하지 않을 예정.

`docker container run -d --name=mysqldb --restart=always -e MYSQL_ROOT_PASSWORD=education -e MYSQL_DATABASE=guestbook -p 3306:3306 mysql:8`

* 컨테이너 현황

<figure><img src="https://3572862491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUON3CGxVeoUR2YdtAhxl%2Fuploads%2Fq723kV5iGichNykGUxYI%2Fimage.png?alt=media&#x26;token=f5917d2d-9075-4fd9-a88c-5cf5a156ab50" alt=""><figcaption></figcaption></figure>

### 1.  도커 파일 생성

어플리케이션을 컨테이너에서 서비스하기 위해서는 컨테이너를 생성할 수 있는 **이미지**가 필요합니다. 도커 이미지는 아래 도커파일을 통해 생성하도록 하겠습니다. (편의를 위해 아래 파일은 github상 올려둠)

```docker
#사용할 베이스 이미지
FROM openjdk:8

ARG VERSION

#복사할 jar파일의 [현재위치] -> [복사될 위치]
COPY target/guestbook-0.0.1-SNAPSHOT.jar /app/guestbook.jar

LABEL maintainer="mkm" \
      title="Guestbook App" \
      version="$VERSION" \
      description="This image is guestbook service"
      
ENV APP_HOME /app
EXPOSE 10000
VOLUME /app/upload

#컨테이너 실행시 호출할 명령어
WORKDIR $APP_HOME
ENTRYPOINT ["java"]
CMD ["-jar", "guestbook.jar"]
```

### 2. 도커 이미지 생성

생성한 도커파일을 기반으로 도커이미지를 build하기 위해 **도커파일이 존재하는 경로**에서 아래 명령어를 입력하도록 하겠습니다.

#### 1) 도커 내부 접속

* 도커로 젠킨스 컨트롤러에 접속하여, Dockerfile이 존재하는 위치까지 이동

<pre><code>docker exec -it [container_id or name] bash

cd /var/jenkins_home/workspace/<a data-footnote-ref href="#user-content-fn-1">MavenProject</a>
</code></pre>

#### 2) 도커 이미지 빌드

`docker build --no-cache -t wombat1234/cicd_guestbook:1.0 --build-arg VERSION=1.0 .`

현재 디렉토리에 존재하는 Dockerfile을 기반으로 `wombat1234/cicd_guestbook:1.0`라는 이미지를 빌드하는 명령어입니다.`wombat1234`에는 본인의 도커하브 id를 입력하도록 하세요.

<figure><img src="https://3572862491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUON3CGxVeoUR2YdtAhxl%2Fuploads%2F9GAs0FoTj6aW0c5Xn8p0%2Fimage.png?alt=media&#x26;token=b68af17d-1afb-4a73-bb3e-002fa2633f85" alt=""><figcaption></figcaption></figure>

### 3. 도커 이미지 push&#x20;

생성한 이미지를 Dcoker Hub로 푸쉬하기 위해선 도커허브로 로그인이 필요하다 단, Personal Access Token을 발급 받아야 로그인이 가능하므로 다음 경로에서 PAT를 발급받고 오도록 하자

<https://app.docker.com/accounts/wombat1234/settings/personal-access-tokens>

<figure><img src="https://3572862491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUON3CGxVeoUR2YdtAhxl%2Fuploads%2FTvtX5n69B1BUmKbdctoo%2Fimage.png?alt=media&#x26;token=159add49-b684-46c2-a67f-48d5a2297543" alt=""><figcaption></figcaption></figure>

`docker login -u <계정명>`

로그인 후 image를 도커허브에 push

`docker image push wombat1234/cicd_guestbook:1.0`

<figure><img src="https://3572862491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUON3CGxVeoUR2YdtAhxl%2Fuploads%2Fey6ei6eJLVWwmdh98WfE%2Fimage.png?alt=media&#x26;token=858d0bcf-3e56-4326-a789-9c406da90826" alt=""><figcaption></figcaption></figure>

### 4. 도커 컨테네이로 방명록 앱 실행(배포)

생성한 이미지를 바탕으로 도커이미지를 실행하여 컨테이너를 생성하도록 하겠습니다.&#x20;

`docker container run --name=guestbookapp --rm -p 8081:10000 -e MYSQL_IP=host.docker.internal -e MYSQL_PORT=3306 -e MYSQL_DATABASE=guestbook -e MYSQL_USER=root -e MYSQL_PASSWORD=education wombat1234/cicd_guestbook:1.0`

<figure><img src="https://3572862491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUON3CGxVeoUR2YdtAhxl%2Fuploads%2FDUm3rGMwnPCzKjaPeral%2Fimage.png?alt=media&#x26;token=21568bd0-2b80-43d1-b614-b4abb6d4d59f" alt=""><figcaption></figcaption></figure>

포트바인딩은 호스트PC에서 8081에 접속시 컨테이너 내부의 10000포트와 연결되도록 설정하였습니다.

### 5. 컨테이너 현황

<figure><img src="https://3572862491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUON3CGxVeoUR2YdtAhxl%2Fuploads%2Fsbe8rz96kseDBoW5Q9Fv%2Fimage.png?alt=media&#x26;token=4ae67c36-83ea-45da-b69a-5e7c1e77e7b6" alt=""><figcaption></figcaption></figure>

[^1]: &#x20;zenkins project name
