본문 바로가기
Tech/Containers

[Docker]컨테이너를 이용하여 웹 어플리케이션 배포하기(3티어구조) #1

by 타이호 2018. 3. 26.
반응형

Kubernetes나 기타 container platform은 Docker image를 배포하곤 한다.

결국에는 Docker를 이해해야 위의 Platform을 이해 할 수 있기 때문에 Docker를 이용하여 기본적인 3 티어 구조 (Web, Was, DB)를 구성하고 배포해보고자 한다.


준비사항

a. WEB : apache 2.4

b. WAS : Tomcat

c. DB : MySQL

d. 샘플 코드 : https://github.com/spring-petclinic/spring-framework-petclinic.git


Docker 설치 : virtual box에 ubuntu 16.04를 설치하고 아래 명령어를 통해 설치한다.

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt update
apt-cache madison docker-ce
sudo apt-get install docker-ce=17.12.1~ce-0~ubuntu
sudo docker run hello-world 

Petclinic 소스를 빌드한다.

a. Clone the source code

git clone https://github.com/spring-petclinic/spring-framework-petclinic.git

b. Install Java

sudo apt-get install openjdk-8-jdk maven

c. Configure environment variable

/etc/environment

JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

d. Build the source code 

외부에 있는 mysql 서버에 접속한다고 가정하고, pom.xml에도 아래 부분 처럼 mysql docker container 이름을 지정한다.

<profile>

<id>MySQL</id>

<properties>

    <db.script>mysql</db.script>

    <jpa.database>MYSQL</jpa.database>

    <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>

    <jdbc.url>jdbc:mysql://mysql-petclinic:3306/petclinic?useUnicode=true</jdbc.url>

    <jdbc.username>root</jdbc.username>

    <jdbc.password>petclinic</jdbc.password>

</properties>

<dependencies>

     <dependency>

           <groupId>mysql</groupId>

           <artifactId>mysql-connector-java</artifactId>

           <version>${mysql-driver.version}</version>

           <scope>runtime</scope>

    </dependency>

</dependencies>

</profile>

pom.xml을 수정한다음 아래 명령어로 java코드를 빌드하면 target 디렉토리 아래에 petclinic.war파일이 생성된다.

mvn clean package -Dmaven.test.skip=true -P MySQL


Build Docker Image

a. Dockerfile을 생성한다 : tomcat Dockerfile

위에 빌드된 war파일을 현재 디렉토리로 복사하고 Dockerfile을 생성한다.

# Pull base image

From tomcat:8-jre8


# Maintainer

MAINTAINER "TaeHo <me@kangtaeho.com">


# Copy to images tomcat path

ADD petclinic.war /usr/local/tomcat/webapps/

b. docker hub에 있는 image를 가져오고, 그것을 이용하여 custom image를 생성한다.

docker build -t tomcat-petclinic .

$ docker build -t tomcat-petclinic .

Sending build context to Docker daemon  37.57MB

Step 1/3 : From tomcat:8-jre8

 ---> 516082cd94fa

Step 2/3 : MAINTAINER "TaeHo <me@kangtaeho.com">

 ---> Using cache

 ---> 0ca846ceeed3

Step 3/3 : ADD petclinic.war /usr/local/tomcat/webapps/

 ---> c0c1cc671c1e

Successfully built c0c1cc671c1e

Successfully tagged tomcat-petclinic:latest

c. docker container를 실행한다.

docker run -it --rm -p 8080:8080 --name was  tomcat-petclinic

위 명령어로 tomcat container를 실행하면 mysql 주소를 알 수 없기 때문에 오류가 발생한다.


MySQL 컨테이너와 Tomcat 컨테이너와 연동하기

a. MySQL 컨테이너 실행하기

docker run --name mysql-petclinic -e MYSQL_ROOT_PASSWORD=petclinic -e MYSQL_DATABASE=petclinic -p 3306:3306 mysql:5.7.8

b. Tomcat 컨테이너 실행하기

tomcat 컨테이너에서 mysql 컨테이너의 ip로 접속할 수 있겠지만, static ip가 아니기 때문에 mysql 컨테이너의 이름으로 접속을 해야 할 필요가 있다. 이럴 경우 link 옵션을 통해 컨테이너를 구동하면 tomcat 컨테이너에서 mysql 컨테이너로 이름으로 접속할 수 있다
link 옵션으로 구동하면 /etc/hosts에 링크된 컨테이너 ip가 들어간다.

$ docker exec -it e61f4f25d4e4 /bin/bash
root@e61f4f25d4e4:/usr/local/tomcat# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 mysql-petclinic 70ada55a63be
172.17.0.3 e61f4f25d4e4
root@e61f4f25d4e4:/usr/local/tomcat# ping mysql-petclinic
PING mysql-petclinic (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.080 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.075 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.063 ms

최종 어플리케이션 확인





반응형