# DockerFile 을 이용하여 나만의 Docker Image \[Tomcat+Jenkins] 만들기

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

## 1. 먼저 알아 두기     &#x20;

### 1.1 DockerFile 이란?

> DockerFile 은 코드의 형태로 인프라를 구성하는 방법을 텍스트 형식으로 저장해 놓은 파일이며 docker build 를 사용하여 자신만의 이미지를 만들 수 있다.

### 1.2 Docker Build 란?   &#x20;

> DockerFile 및 컨텍스트로부터 이미지를 빌드하는 Docker 명령

### 1.3 Docker-Compose 란?

> Compose는 멀티 컨테이너 도커 애플리케이션을 정의하고 실행하는 도구이다. YAML 파일을 사용하여 애플리케이션의 서비스를 구성하며 하나의 명령을 가지고 모든 컨테이너의 생성 및 시작 프로세스를 수행한다.

### 1.4 Jenkins 란?

> 소프트웨어 개발 시 [지속적 통합](https://ko.wikipedia.org/wiki/%EC%A7%80%EC%86%8D%EC%A0%81_%ED%86%B5%ED%95%A9)(continuous integration) 서비스를 제공하는 툴이다. 다수의 개발자들이 하나의 프로그램을 개발할 때 버전 충돌을 방지하기 위해 각자 작업한 내용을 공유 영역에 있는 Git등의 저장소에 빈번히 업로드함으로써 지속적 통합이 가능하도록 해 준다.
>
> 출처 :  <https://ko.wikipedia.org/wiki/%EC%A0%A0%ED%82%A8%EC%8A%A4_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)>

## 2. DockerFile을 이용하여 만들어 보자!!!    &#x20;

### 2.1 서비스 설계 구성 &#x20;

|           구분          |     Service     |
| :-------------------: | :-------------: |
| Docker Hub Base Image | Centos 7.9.2009 |
|       Developer       |    OpenJDK11    |
|        Service        |   Tocmat 9.0.8  |
|      Jenkins Src      | Jenkins 2.319.2 |
|      Service Port     |        80       |

### 2.2 dockerfiles 폴더 구성       &#x20;

|                 폴더 및 파일                |                설명               |
| :------------------------------------: | :-----------------------------: |
|               dockerfile               |       DockerFile Build 파일       |
| apache-tomcat-9.0.8-pre-install.tar.gz |    Tomcat 설정 및 Jenkins 압축 파일    |
|           ./conf/context.xml           |     Tomcat Manager 접근 제어 설정     |
|            ./conf/server.xml           |       Tomcat Service 포트 설정      |
|         ./conf/tomcat-user.xml         | Tomcat Manager User/Password 설정 |
|           docker-compose.yml           |       docker-compose 실행 파일      |

{% file src="<https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2Ffi09mb8LhF8M5sxarAeU%2Fdockerfile%5BTomcat%2BJenkins%5D.zip?alt=media&token=e72ca285-1fef-484f-935f-495a3ddd3371>" %}
DockerFile\[Tomcat+Jenkins] 압축 파일    &#x20;
{% endfile %}

### 2.3 Docker Image 만들기(Tomcat + Jenkins)     &#x20;

{% code title="dockerfile" %}

```
FROM centos:7.9.2009

#서버 시간 설정
ENV TZ Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

#서버 홈폴더 설정
RUN mkdir /home/jenkins

#서버 yum update 및 openjdk 설치
RUN yum update -y && yum install epel-release java-11-openjdk-devel -y 

#tomcat+jenkins 압축 파일 복사
COPY apache-tomcat-9.0.8-pre-install.tar.gz /home/jenkins/apache-tomcat-9.0.8.tar.gz

#압축 해제
RUN cd /home/jenkins && tar -zxvf apache-tomcat-9.0.8.tar.gz

#서비스 포트 지정
EXPOSE 80

#작업 폴더 설정
WORKDIR /home/jenkins

#Tomcat 서비스 시작
CMD ["/home/jenkins/apache-tomcat-9.0.8/bin/catalina.sh", "run"]
```

{% endcode %}

{% file src="<https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2Fh0XEtL3109tmlZasVYiK%2Fdockerfile?alt=media&token=b17a0373-a4f3-4f0b-a5a5-5ac3142ae261>" %}
dockerfile 원본 파일   &#x20;
{% endfile %}

### 2.4 DockerFile Build 후 Docker Hub 업로드 하기  &#x20;

{% tabs %}
{% tab title="Tomcat+Jenkins" %}
**Step1. docker loign** <br>

**Step2. 작성 한 DockerFile 에서 빌드 하기**

&#x20; **• docker build -t tomcat\_mariadb:jenkins1.0 .**

&#x20; **• docker images ## 로컬에 저장된 Docker Images 확인**<br>

**Step3. 로컬에 만든 이미지 실행 및 확인**

&#x20; **• docker run -d -p 80:80 tomcat\_mariadb:jenkins1.0**<br>

**Step4. Docker Hub 이미지 업로드**

&#x20; **• docker tag tomcat\_mariadb:jenkins1.0 bchwang/tomcat\_mariadb:jenkins1.0**

&#x20; **• docker push bchwang/tomcat\_mariadb:jenkins1.0**<br>

**Step5. Docker Hub 에 등록된 이미지 확인**

&#x20; **• Docker Hub 에 개인 개정으로 로그인 후 Docker Image 및 Tag 확인**\
\
**Step6. Docker Hub 에 등록된 이미지로 실행 하기**&#x20;

&#x20; **• docker run -d -p 80:80 bchwang/tomcat\_mariadb:jenkins1.0**
{% endtab %}
{% endtabs %}

## 3. docker 를 이용하여 실행 하기&#x20;

### 3.1 docker 실행 하기&#x20;

```
# docker run --name project1 -d -p 80:80 bchwang/tomcat_mariadb:jenkins1.0
Unable to find image 'bchwang/tomcat_mariadb:jenkins1.0' locally
jenkins1.0: Pulling from bchwang/tomcat_mariadb
Digest: sha256:a44086d7242cd88c5e1abef7a99c5a5bd5fe1762e5eaa8ce58c2232e75eeff05
Status: Downloaded newer image for bchwang/tomcat_mariadb:jenkins1.0
e54875e866040c63e383de6424a516398ebe7ef3235994d4a2d9c9ffa895cd49

# docker ps
CONTAINER ID   IMAGE                               COMMAND                  CREATED          STATUS          PORTS                NAMES
2c12c471ad47   bchwang/tomcat_mariadb:jenkins1.0   "/home/jenkins/apach…"   24 seconds ago   Up 22 seconds   0.0.0.0:80->80/tcp   project1

# docker logs -f project1
07-Feb-2022 13:29:42.336 INFO [Finalizing set up] jenkins.install.SetupWizard.init

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

75c34fe2059a4ec69b1d0e6e03e3ffed  #### Jenkins 초기 비밀번호    

This may also be found at: /root/.jenkins/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************
```

### 3.2 Tomcat+Jenkins 설정 확인  &#x20;

#### 3.2.1 Tomcat 설정 확인(server.xml)&#x20;

> Tomcat 서비스 포트(80) 설정 하기 위해 server.xml 파일을 수정 하여 적용
>
> 파일 위치 : /home/jenkins/apache-tomcat-9.0.8/conf
>
> ```
> <Connector port="80" protocol="HTTP/1.1"
>            connectionTimeout="20000"
>            redirectPort="8443" />
> ```

#### 3.2.2 Tomcat 설정 확인(tomcat-user.xml) &#x20;

> Tomcat Manager 로그인 권한 및 계정/비밀번호 설정
>
> &#x20;-> 계정 : admin, 비밀번호 : 1234567890&#x20;
>
> 파일 위치 : /home/jenkins/apache-tomcat-9.0.8/conf&#x20;
>
> ```
>   <role rolename="manager"/>
>   <role rolename="manager-gui" />
>   <role rolename="manager-script" />
>   <role rolename="manager-jmx" />
>   <role rolename="manager-status" />
>   <role rolename="admin"/>
>   <user username="admin" password="1234567890" roles="admin,manager,manager-gui, manager-script, manager-jmx,  manager-status"/>
> ```

#### 3.2.3 Tomcat 설정 확인(context.xml)&#x20;

> Tomcat Manager 접근 제한 설정
>
> &#x20;-> 제한 없음 설정    &#x20;
>
> 파일 위치 : /home/jenkins/apache-tomcat-9.0.8/webapps/manager/META-INF&#x20;
>
> ```
>    <!--Valve className="org.apache.catalina.valves.RemoteAddrValve"
>          allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /-->
> ```

## 4. docker-compose.yml 을 이용하여 실행 하기     &#x20;

### 4.1 docker-compose.yml 파일 &#x20;

```
version: '2'

services:
  tomcat_jenkins1.0:
    image: bchwang/tomcat_mariadb:jenkins1.0
    ports:
      - '80:80'
    volumes:
      # data 폴더와 instance 폴더 동기  
      - "./data:/home/jenkins/data:rw"
      # context.xml 파일(Tomcat Manager 접근 제한 설정)        
      #- "./conf/context.xml:/home/jenkins/apache-tomcat-9.0.8/webapps/manager/META-INF/context.xml"
      # server.xml 파일(Tomcat Serivce Port 설정)
      #- "./conf/server.xml:/home/jenkins/apache-tomcat-9.0.8/conf/server.xml"
      # tomcat-users.xml 파일(Tomcat Manager User/Password 설정 :: admin / 1234) 
      #- "./conf/tomcat-users.xml:/home/jenkins/apache-tomcat-9.0.8/conf/tomcat-users.xml"
```

{% file src="<https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FguvBQuJ59JJNQMpLFzhU%2Fdocker-compose.yml?alt=media&token=0489c750-bb4c-4512-b076-e9d9ac1a005a>" %}
docker-compose.yml 파일 &#x20;
{% endfile %}

### 4.2 docker-compose 실행 방법  &#x20;

```
# docker-compose up -d
Creating network "jenkins_default" with the default driver
Creating jenkins_tomcat_jenkins1.0_1 ... done

# docker ps 
CONTAINER ID   IMAGE                               COMMAND                  CREATED         STATUS         PORTS                NAMES
450fb13bace8   bchwang/tomcat_mariadb:jenkins1.0   "/home/jenkins/apach…"   5 seconds ago   Up 3 seconds   0.0.0.0:80->80/tcp   jenkins_tomcat_jenkins1.0_1

# docker exec -it 450fb13bace8 /bin/bash
[root@450fb13bace8 jenkins]# ls
apache-tomcat-9.0.8  apache-tomcat-9.0.8.tar.gz  data
```

### 4.3 docker-compose 중지 방법   &#x20;

```
# docker-compose down
Stopping jenkins_tomcat_jenkins1.0_1 ... done
Removing jenkins_tomcat_jenkins1.0_1 ... done
Removing network jenkins_default
```

### 4.4 conf 폴더 파일 정보  &#x20;

> [#3.2-tomcat+jenkins](#3.2-tomcat+jenkins "mention")에서 설정 파일 정보 확인        &#x20;

## 5. Tomcat+Jenkins 접속 화면   &#x20;

### 5.1 Tomcat Manager 접속 화면  &#x20;

> <http://localhost/manager/html> 접속  &#x20;

![Tomcat Manager 접속 화면     ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FPl6aaDCAmb2qH9F84TCQ%2Fimage.png?alt=media\&token=0c079b18-8831-46e1-a9cd-dc1f7b999a2d)

![Tomcat Manager Login 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FcaM3LlO8KVm5cpGx62ru%2Fimage.png?alt=media\&token=72098b91-5013-4d4c-b6f3-a9662f735bb0)

### 5.2 Jenkins 접속 화면    &#x20;

> <http://localhost/jenkins/> 접속 &#x20;

![Jenkis 접속 화면  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2Fm8a0CJ50jI9SNLfunxca%2Fimage.png?alt=media\&token=9705e200-d341-4065-abca-c54b14ab349e)

![Jenkins Administrator Password 입력 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FiFmt5WKCF2mBr961BHqs%2Fimage.png?alt=media\&token=5bf472f0-6dbf-4461-ae91-39d92a774ab1)

![Tomcat catalina.out Log 파일에 Jenkins Administrator 접속 정보  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FTDgpo1CzB7GDtiWKubY2%2Fimage.png?alt=media\&token=e716c7d1-43ed-4541-a6b9-de9b0fedf7de)

![Jenkins Plugins Install 화면  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FR1rPwvuK5zHEYafsnXTA%2Fimage.png?alt=media\&token=f8b3d325-e76a-4de9-b00c-3b638501fca7)

![Jenkins Getting Started 화면  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FSP9nqypErtVf7vpCnC7P%2Fimage.png?alt=media\&token=73911cbb-a584-4528-9608-1c36d39f1e39)

![Jenkins Admin User 생성 화면    ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FnB2VOWxRF4NhgdbVXd25%2Fimage.png?alt=media\&token=3183090a-afdf-4bbb-9859-75de1d8feaeb)

![Jenkins Instance Configuration 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FYmEIfDDB6g78ZZZ6t07J%2Fimage.png?alt=media\&token=9fbb4b33-3683-401a-9481-27df4c8fe4ad)

![Jenkins Start 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FaJCdejFow6bWntYDn95K%2Fimage.png?alt=media\&token=aa5b4a53-f3e5-4dcd-bbd3-28361e59066f)

![Jenkins 접속 화면   ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FdvYFfqzlu8bJVaeHyHEI%2Fimage.png?alt=media\&token=7845c8cc-4d90-4074-b4c4-5cc1882aa1da)

## 00. 오류 해결하기  &#x20;

### 00.1 Jenkins Administrator 초기 비밀번호&#x20;

> Jenkins Admin 초기 비밀번호는 /root/.jenkins/secrets/initialAdminPassword 에 저장되어 있음.         &#x20;

```
# docker ps
CONTAINER ID   IMAGE                               COMMAND                  CREATED          STATUS          PORTS                NAMES
e06afb6798ff   bchwang/tomcat_mariadb:jenkins1.0   "/home/jenkins/apach…"   57 minutes ago   Up 57 minutes   0.0.0.0:80->80/tcp   project1

# docker exec -it e06afb6798ff /bin/bash
[root@e06afb6798ff jenkins]# cd 

[root@e06afb6798ff ~]# ls -alh
total 44K
dr-xr-x--- 1 root root 4.0K Feb  7 15:20 .
drwxr-xr-x 1 root root 4.0K Feb  7 15:18 ..
-rw-r--r-- 1 root root   18 Dec 29  2013 .bash_logout
-rw-r--r-- 1 root root  176 Dec 29  2013 .bash_profile
-rw-r--r-- 1 root root  176 Dec 29  2013 .bashrc
drwxr-x--- 3 root root 4.0K Feb  7 15:20 .cache
-rw-r--r-- 1 root root  100 Dec 29  2013 .cshrc
drwxr-x--- 3 root root 4.0K Feb  7 15:18 .java
drwxr-x--- 9 root root 4.0K Feb  7 15:19 .jenkins
-rw-r--r-- 1 root root  129 Dec 29  2013 .tcshrc
-rw------- 1 root root 3.4K Nov 13  2020 anaconda-ks.cfg

[root@e06afb6798ff ~]# cd .jenkins/secrets
[root@e06afb6798ff secrets]# ls -al initialAdminPassword
-rw-r----- 1 root root 33 Feb  7 15:18 initialAdminPassword

[root@e06afb6798ff secrets]# cat initialAdminPassword
0bac68086c2042899be70b9d984bae6e
```

> 또는 Tomcat Logs 폴더의 catalina.out 에 Jenkins admin 정보가 남겨져 있음.  &#x20;

![Tomcat catalina.out 파일  ](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FgNGoiglfLP0idIqUQACo%2Fimage.png?alt=media\&token=6c3ed61c-16ca-4cc1-9082-7ddb5b5036c4)

### 002. Tomcat Manager 접속 에러 \[403 Access Denied]

![Tomcat Manager 403 Error](https://674794822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MXjvaK4Gw77FbwOuHWJ%2Fuploads%2FbPpVgTSxbbmynKZ7Trhn%2Fimage.png?alt=media\&token=d32c955c-c181-448b-a680-812c91f1e68d)

> 위의 그림과 같은 Tomcat Manager 접속 에러 \[403 Access Denied] 화면인 경우 context.xml 설정파일을 확인하여야 함. [#3.2.3-tomcat-context.xml](#3.2.3-tomcat-context.xml "mention")참고                &#x20;

### 003. Tomcat Manager Login 안됨 &#x20;

> Tomcat Manager 접속 하였을때 Login 이 안되는 경우 tomcat-users.xml 의 설정 값을 확인 하여야 함 . [#3.2.2-tomcat-tomcat-user.xml](#3.2.2-tomcat-tomcat-user.xml "mention") 참고          &#x20;

{% hint style="info" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**무료**</mark>**&#x20;교육일정** : <https://doc.skill.or.kr/2022-NHN-Cloud-Education>
{% endhint %}

{% hint style="warning" %}
**2022년 NHN Cloud&#x20;**<mark style="color:red;">**행사/프로모션**</mark>**&#x20;정보 공유** : <https://doc.skill.or.kr/2022-NHN-Cloud-Event-Promotion>
{% endhint %}

{% embed url="<https://paypal.me/shop2002>" %}
donation
{% endembed %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.skill.or.kr/dockerfile-docker-image-tomcat+jenkins.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
