Workload Distribution with Docker Swarm - TheOpenCloudEngine/uEngine-cloud GitHub Wiki
Dockerizing Services μμ clazz μλΉμ€λ₯Ό Dockerizing νλ λ²μ λνμ¬ νμ΅νμλ€.
κ·Έλ¬λ λ§€λ² μ΄λ κ² νκ°μ© μλΉμ€λ₯Ό λμ°λ λ°©λ²μ mvnμ΄λ java -jarλ‘ μ€νμν€λ κ²κ³Ό λ³ μ°¨μ΄κ° μλ€.
μ΄λ²μκ°μλ Docker Swarm μ ν΅νμ¬ microserviceλ€μ νλ²μ μ¬λ¦¬λ λ²μ λνμ¬ νμ΅νλ€.
Docker Swarmμ μ¬μ©νκΈ° μνμ¬μλ docker-compose νμΌμ ν΅νμ¬ μ€μ νλ€.
services:
class-api:
image: clazz-service:latest
deploy:
replicas: 2 # μμ
μ(μΈμ€ν΄μ€)λ 2κ°λ₯Ό νμ μ μ§νλ€
restart_policy: # health check
condition: on-failure
volumes:
- /tmp:/tmp
ports:
- "8088:8080"
depends_on:
- registry
course-api:
image: course-service:latest
deploy:
replicas: 2
restart_policy:
condition: on-failure
volumes:
- /tmp:/tmp
ports:
- "8089:8080"
depends_on: # registry κ° λ¬ νμ imageλ₯Ό μ€ννλ€.
- registry
proxy:
image: api-gateway:latest
deploy:
replicas: 1
restart_policy:
condition: on-failure
ports:
- "8080:8080"
depends_on:
- registry
registry:
image: uengine-registry-server:latest
deploy:
replicas: 1
restart_policy:
condition: on-failure
ports:
- "8761:8761"
νμΌ μ€λͺ
μ νμλ©΄ registry μ proxy , class-api, course-apiλ₯Ό λμ΄λ€.
μ΄μ pageμμ class-api λ₯Ό dockerizeνμμΌλ λλ¨Έμ§ μλΉμ€λ€λ λͺ¨λ dockerize ν΄μ€λ€.
$ cd course/
$ sudo docker build . -t course-service
$ cd ..
$ cd proxy-service/
$ sudo docker build . -t api-gateway
$ cd ..
$ cd registry-service/
$ sudo docker build . -t uengine-registry-server
$ sudo docker images
uengine-registry-server latest 315b6ac665a9 9 seconds ago 185MB
api-gateway latest 5045d31821f4 33 seconds ago 184MB
course-service latest 404c3bd9dae8 57 seconds ago 264MB
clazz-service latest bd09f73f2ee1 2 hours ago 264MB
https://github.com/uengine-oss/msa-tutorial-class-management-msa νλ‘μ νΈλ₯Ό 보μλ©΄
μ΅μμ parent νλ‘μ νΈμμ modules λ‘ childλ€μ λ¬Άμ΄ λκ³ , docker-compose.yml μ μμ±νμκ³ ,
κ°μμ module μ Dockerfileμ μμ± νμ¬ κ΅¬μ±νμλ€.
$ ls
README.md clazz customer pom.xml registry-service sme
calendar course docker-compose.yml proxy-service shared-model
$ docker swarm init
docker swarm join --token SWMTKN-1-4mclslij7bs1n52zolzv4uqc68756bkrv5gwnmg4qg3lmk9bth-dnd0uczlrlr8dj7et1lzrbzbs 192.168.0.17:2377
docker swarm init
μ νκ² λλ©΄ join λ¬Έκ΅¬κ° λμ€λλ° initμ ν μλ²κ° masterκ° λκ³ , joinμ ν΅νμ¬
μ¬λ¬λμ μλ²λ₯Ό worker λ‘ λ¬Άμ ν clusterλ‘ κ΅¬μ±μ ν μ μλ€.
$ sudo docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_default
Creating service getstartedlab_proxy
Creating service getstartedlab_registry
Creating service getstartedlab_class-api
Creating service getstartedlab_course-api
-c μ΅μ
μ change λͺ
λ ΉμΌλ‘, docker-compose.yml μ΄ λ³κ²½λμ΄λ λ³κ²½λ νμΌμ μ½μ΄μ updateνλ€.
replicas: 3 μΌλ‘ λ³κ²½νμ¬ scale up μ ν μ μ μ¬μ©νλ€.
μ μΌ λ€μ getstartedlab μ stackμ μ΄λ¦μ μ£Όμλ€.
stack μμ μμλ sudo docker stack rm getstartedlab
μ νλ©΄ λλ€.
νλμ© κ°μμ network λ₯Ό νλμ© λ§λ€μ΄ μ£Όκ³ , μλΉμ€λ₯Ό νλμ© docker runμ μ€ν μμΌμ€λ€.
$ sudo docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
r942gyy8dto2 getstartedlab_class-api replicated 2/2 clazz-service:latest *:8088->8080/tcp
tpya4amt0nrq getstartedlab_course-api replicated 2/2 course-service:latest *:8089->8080/tcp
70408gcri6m9 getstartedlab_proxy replicated 1/1 api-gateway:latest *:8080->8080/tcp
qtrs2bj6jz46 getstartedlab_registry replicated 1/1 uengine-registry-server:latest *:8761->8761/tcp
$ sudo docker container ls
REPLICAS λ‘ μ€μ ν μλΉμ€λ€μ΄ κ°μ κ°―μλ§νΌ λ μμ΄μ docker container ls
λ₯Ό νμμλ μ΄ 6κ°μ containerκ° λμκ°κ³ μλκ²μ νμΈ ν μ μλ€.
restart_policy μ΅μ
μ μνμ¬ class-api μ νκ°μ μλΉμ€λ₯Ό kill νμ¬λ μλΉμ€κ° λ€μ μ΄μλλκ²μ νμΈν μ μλ€.
$ docker ps
$ docker kill r942gyy8dto2
## λ°λ‘ μ€ννμ¬ μλΉμ€κ° kill λκ² νμΈ
$ docker container ls
## μ‘°κΈλ€μ μλΉμ€κ° λ€μ μ΄μλλκ² νμΈ
$ docker container ls
$ http 192.168.0.17:8089/courses
$ http 192.168.0.17:8080/courses
http 192.168.0.17:8080/courses
λ₯Ό νκ² λλ©΄ ZuulException μ΄ λ°μνκ² λλλ°
νμ¬ μμ μμλ local κΈ°μ€μΌλ‘ eureka λ₯Ό λΆμ¬λμ μκΈ°λ Error μ΄λ€.
μ¬κΈ°κΉμ§κ° κΈ°λ³Έμ μΈ Workload Distribution Engineμ λμ ꡬ쑰μ΄λ€.