Dockerizing Services - TheOpenCloudEngine/uEngine-cloud GitHub Wiki
ํ์ฌ๊น์ง์ ์์ ๋ค์ local์์ port number๋ฅผ ํ์ฌ, spring-boot:run์ ํ์ฌ ์คํ์ ํ์๋ค.
์ด์ ํ local ๋จธ์ ์์ ์๋์ผ๋ก port number๋ฅผ ๋ถ์ฌํ๊ณ , ์ฌ์ฉํ๊ธฐ ์ํ์ฌ
์ํฌ๋ก๋ ๋ถ์ฐ ์์ง์ ์ฌ์ฉํ๊ฒ ๋๋ค. (workload distribution engine)
1๋ฒ ํญ๋ชฉ๋ค์ microservice ๋ค ์ด๋ค.
3๋ฒ ํญ๋ชฉ์ ์ค์ ๋จธ์ ์ด๋ค. 1์ฐจ์ ์ผ๋ก ์ด ํ๋์จ์ด๋ค์ ๊ฐ์๋จธ์ ์ผ๋ก ํฌ์ฅ์ ํ์ฌ 2๋ฒ ํญ๋ชฉ์ผ๋ก ๋ง๋ค์ด ์ค๋ค.
๊ทธ๋ฆผ์๋ 10๊ฐ์ ๋์ ๊ฐ์๋จธ์ ์ ํ(VM)๋ก ์ค์ ์ ํ์๋ค. ์๋ง์กด์ EC2๊ฐ ๊ทธ๋ฆผ์ 3๋ฒ๊ณผ 2๋ฒ ์์ญ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
1๊ฐ์ ํ์ ๋ชจ๋ ์ฌ์ฉ ํ๋ฉด ๋ญ๋น๊ฐ ์ฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ์๋จธ์ ์ ํ์ ์ค์ ๋ง์ดํฌ๋ก ์๋น์ค๋ค์ ์๊ฐ ์ชผ๊ฐ์ ์์น์ํจ๋ค.
๋นจ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ 1๊ฐ์ ๋ชจ๋ ์ฑ์ธ์ ์์ง๋ง, ์ฌ๋ฌ๊ฐ์ ๋ถ์ฐํ์ฌ ์์น ์ํจ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ฐ VM์์ workload agent๊ฐ ์จ์ด์ ธ ์์ด์, health check๋ฅผ ๊ณ์ ํ๋ค.
์ด๋ฌํ ์์
๋ค์ ์๋ํ ์ํจ ๊ฒ์ด ์ํฌ๋ก๋ ๋ถ์ฐ ์์ง์ด๋ผ๊ณ ํ๋ค.
์ํฌ๋ก๋ ๋ถ์ฐ ์์ง์ ์ฌ๋ฌ ์ข
๋ฅ๊ฐ ์๋ค.
์ต๊ทผ์ ๊ฐ์ฅ ๋จ๊ณ ์๋ ์์ง์ Kubernetes
์ด๋ค. Kubernetes๋ ํ์ด๋์ง ์ผ๋ง ์๋์์ง๋ง google์์ ์ฌ์ฉ์ค์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ตญ๋ด์ ๋ง์ ์ฌ์ฉ์๊ฐ ์๋ ์์ง์ twiter์์ ์ฌ์ฉ์ค์ธ DC/OS
๊ฐ ์๊ณ ,
๊ฐ์ฅ ํ ์๋ฒ์ง ๊ฒฉ์ด cloudfoundry
๋ค. ์ง๊ธ๋ ๋ง์ด ์ฐ์ด๊ณ ์๋ค.
์ ๊ทธ๋ฆผ์์ docker๊ฐ ์ฐจ์งํ๋ ์์ญ์ 2๋ฒํญ๋ชฉ์ ๋นจ๊ฐ์ box๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์ ๋ฆฌ๋ฒฝ์ฒ๋ผ ๊ธ๋ฐฉ๊ธ๋ฐฉ ๋ง๋ค์๋ค๊ฐ, ์ฌ๋ผ์ง๋ ์กด์ฌ์ด๋ค. ๋ฌผ๋ฆฌ์ ์ธ ํํ๋ CPU์์ ํ๋์ Process์ด๋ค.
์ด๊ฒ๋ค์ ์ managingํ ์ ์๋ ๊ฒ์ด Docker Engine์ด๊ณ , Docker์์ ์์ฒด์ ์ธ ์ํฌ๋ก๋ ๋ถ์ฐ ์์ง์
๋ง๋ ๊ฒ์ด docker Swarm ์ด๋ค. Kubernetes ์ ๊ฒฝ์์ ํ๋ค๊ฐ ๋ฐ๋ฆฐ ํ ํ์ฌ๋ ๊ต์ก์ฉ ๋ชฉ์ ์ผ๋ก ๋ง์ด ์ฐ์ธ๋ค.
์ฌ๊ธฐ์๋ linux centos7.2 ๊ธฐ์ค์ผ๋ก ์ค์น๋ฅผ ํ๋๋ก ํ๋ค.
## ๋์ปค ์ค์น
$ curl -fsSL https://get.docker.com/ | sudo sh
$ docker version
## ๋์ปค ์คํ
$ sudo systemctl start docker
Dockerize๋ฅผ ํ๋ค๋ ๊ฒ์ ๊ธฐ์กด์ ์ ์งํ๊ณ ์๋ service๋ฅผ docker ๊ธฐ๋ฐ์ผ๋ก ๋ฐ๊พผ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์์ ์๋ฏธ์์๋ ๋จ์ํ docker image ๋ฅผ ๋ง๋๋ ๊ฒ์ด๊ณ ํฐ ์๋ฏธ๋ docker ๋ฅผ ํ์ฉํด์ cluster ๋ฅผ ๊พธ๋ฏธ๊ณ ์ฌ๊ธฐ์ ๊ธฐ์กด์ ์๋น์ค๋ฅผ ๋น๋/๋ฐฐํฌํ ์ฒด๊ณ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
Dockerize๋ฅผ ์ํํด ๋ณด๊ธฐ ์ํ์ฌ ๊ธฐ์กด์ ๋ฐ์๋ MSAํ๋ก์ ํธ๋ฅผ ํ์ฉํ๋ค.
$ git clone https://github.com/uengine-oss/msa-tutorial-class-management-msa.git
$ cd msa-tutorial-class-management-msa
$ cd clazz
$ mvn package -B
mvn package
๋ ํ์ผ์ compileํ๊ณ JAR๊ฐ์ ๋ฐฐํฌ ๊ฐ๋ฅํ ํ์์ผ๋ก ํจํค์ง๋ฅผ ํ๋ผ๋ ๋ช ๋ น์ด๋ค.
'-B' ์ต์ ์ ๋น-๋ํํ ๋ชจ๋๋ก mvn ์คํ ์ค ๋ํํ ์ ๋ ฅ ๋ชจ๋๊ฐ ๋์ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฒ๋ฆฌํ๋ผ๋ ์๋ฏธ์ด๋ค.
target์ ๋๊ฐ์ jarํ์ผ์ด ์์ฑ์ด ๋์๋ค.
-exec.jar ํ์ผ์ด ์คํ์ฉ jarํ์ผ์ด๊ณ , ๊ทธ๋ฅ jarํ์ผ์ library์ฉ jarํ์ผ์ด๋ค.
์คํ์ฉ jar ํ์ผ์ ๊ทธ๋ฅ ์์ฑ์ด ๋๋๊ฒ์ด ์๋๋ฐ, ์ฌ๊ธฐ์๋ ๋ฐ๋ก ์ฒ๋ฆฌ๋ฅผ ํด์ค์ ์์ฑ์ด ๋ ๊ฒ์ด๋ค.
clazz/pom.xml ์ ๋ณด๊ฒ๋๋ฉด uengine-five ๋ผ๋ parent์์ ์์์ ๋ฐ์๋ค.
<parent>
<groupId>org.uengine</groupId>
<artifactId>uengine-five</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<addResources>true</addResources>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${project.artifactId}</imageName>
<dockerDirectory>.</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
repackage ๋ฅผ ์ฌ์ฉํด์ exec jarํ์ผ์ ํ๋๋ ์์ฑ ํ์๋ค.
docker-maven-plugin
์ ์ฌ์ฉํ์ฌ maven์์ ๋ช
๋ น ํ๋๋ก docker image๊น์ง ๋ง๋๋ plugin์ด๋ค.
์ค์ ๋ ${project.build.finalName}.jar ์ด๋ฆ์ผ๋ก ํ์ผ์ ์์ฑํ์ฌ docker repository์ ๋ฑ๋ก๊น์ง ํด์ค๋ค.
์ด์ ์ด jar ํ์ผ์ ์คํํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
maven ๊ณผ ์คํ๋๋ ๊ฒ์ ๋์ผํ๊ณ , ์ด๋ ๊ฒ jarํ์ผ๋ก ๋ง๋ ๊ฒ์ maven์ dependency๋ฅผ ํด์ ์ํจ๊ฒ์ด๋ค.
$ java -jar clazz-1.0.0-SNAPSHOT-exec.jar
์ด์ java์ dependency๋ฅผ ํด์ ์ํค๋ ค๋ฉด docker๋ก ์คํ์ ์ํค๋ฉด ๋๋ค.
docker๋ก ์คํ์ ์ํค๊ธฐ ์ํด์๋ docker build
๋ผ๋ ๋ช
๋ น์ด๋ฅผ ์คํ์์ผ์ผ ํ๋๋ฐ,
ํด๋น ๋ช
๋ น์ด์๋ Dockerfile ์ด ํ์ํ๋ค. ํ์ฅ์ ์์ด ๋ง๋ค๋ฉด ๋๋ค.
FROM openjdk:8u111-jdk-alpine
VOLUME /tmp
ADD /target/*-exec.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Xmx256M","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
์์ ๋ช
๋ น์ด๋ฅผ ํด์ํ์๋ฉด FROM openjdk:8u111-jdk-alpine ์์์ ์คํ์ผ ํ ๊ฒ์ด๊ณ ,
/tmp ๋ผ๋ VOLUME์ mountํ ๊ฒ์ด๋ค. ํ์ฌํด๋์ exec.jar๋ฅผ app.jar๋ก image์์ ๋ฃ์ผ๋ผ๋ ๋ป์ด๋ค.
EXPOSE ์ผ๋ก 8080 ํฌํธ๋ฅผ openํ๊ณ , ENTRYPOINT ๋ก ์คํ์ ์ต์
์ ์ฃผ์๋ค.
ํ์ผ์ ์์ฑํ์์ผ๋ฉด ์ด์ docker build
๋ฅผ ์คํํ๋ค.
$ sudo docker build . -t clazz-service
Sending build context to Docker daemon 119.3MB
Step 1/5 : FROM openjdk:8u111-jdk-alpine
8u111-jdk-alpine: Pulling from library/openjdk
709515475419: Pull complete
38a1c0aaa6fd: Pull complete
5b58c996e33e: Downloading 7.073MB/49.36MB
...
Successfully built bd09f73f2ee1
Successfully tagged clazz-service:latest
ํด์ํ์๋ฉด ํ์ฌ ํด๋ (.) ์์ -t(ํ๊ทธ) ๋ฅผ ์ฃผ์ด์ docker build๋ฅผ ํ๋ผ๋ ์๋ฏธ์ด๋ค.
docker images
๋ฅผ ํ์ฌ ๋ฐฉ๊ธ ๋ง๋ image๋ฅผ ํ์ธ ํ ์ ์๋ค.
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
clazz-service latest bd09f73f2ee1 4 minutes ago 264MB
์ด์ ๋ง๋ค์ด์ง docker๋ฅผ ์คํ ์ํฌ ์ฐจ๋ก์ด๋ค.
$ sudo docker run clazz-service -P 8080:8081
-P ์ต์ ์ ํธ์คํธ์ ์ปจํ ์ด๋์ ํฌํธ๋ฅผ ์ฐ๊ฒฐ(ํฌ์๋ฉ)