> For the complete documentation index, see [llms.txt](https://doc.skill.or.kr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://doc.skill.or.kr/dockerfile-docker-image-tomcat+jenkins.md).

# 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="/files/DrUrFWQUinPk4UtAnBOE" %}
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="/files/Lton7Yii9SuejVw35XZ5" %}
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="/files/fEycKXINVEWjw0b5zh13" %}
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 접속 화면     ](/files/am2rluXsI6jJjZYwRDin)

![Tomcat Manager Login 화면   ](/files/FQ0p5unnmpBKmhSvK8FX)

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

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

![Jenkis 접속 화면  ](/files/6lzv8g9i07xfgOjmvdjl)

![Jenkins Administrator Password 입력 화면   ](/files/xHHeIrz1gxojKlev6S8N)

![Tomcat catalina.out Log 파일에 Jenkins Administrator 접속 정보  ](/files/b7QmgA5xe2EVTo0EZMbU)

![Jenkins Plugins Install 화면  ](/files/xrGkZZHEfIrwz2XHGnxZ)

![Jenkins Getting Started 화면  ](/files/65JzRyBzDp4tR3o7PrxJ)

![Jenkins Admin User 생성 화면    ](/files/V8OLHKkIzgh97i1zRB7V)

![Jenkins Instance Configuration 화면   ](/files/G0MwOh7JHxrrcWm6Bc7F)

![Jenkins Start 화면   ](/files/2w26Tm7YfGxdFpuwBh4V)

![Jenkins 접속 화면   ](/files/pMaF7zV5oFRMWryiUMQE)

## 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 파일  ](/files/mWY86TDEWelqZc4i5oqs)

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

![Tomcat Manager 403 Error](/files/2BEEc7s9BBso2QSdEVKz)

> 위의 그림과 같은 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 %}
