ELB+Swarm+Composie+Consuul+Registrator가 꿈을 이룰 수 있을까(2)
저번에 계속.
이전 기사: ELB+Swarm+Composie+Consuul+Registrator가 꿈을 이룰 수 있을까(1)
단거리 브라이언 컨디션 컨디션 만들기
Swarm은 모든 노드와 컨테이너를 알고 있지만 Consuul은 이 노드의 설정만 책임지려고 합니다.
Doker man의/root/docker-host/nodes를 캐서 거기에 새로운docker-compose를 주세요.yml이라고 써주세요.# cd /root/docker-host
# mkdir nodes
# cd nodes
# nano docker-compose.yml
docker-compose.ymlconsul:
command: -server -bootstrap -ui-dir /ui
image: progrium/consul:latest
ports:
- "8300"
- "8400"
- "8500"
- "8600/udp"
environment:
- "affinity:container!=nodes_consul_*"
net: "host"
registrator:
command: consul://127.0.0.1:8500
image: progrium/registrator:latest
volumes:
- "/var/run/docker.sock:/tmp/docker.sock"
environment:
- "affinity:container!=nodes_registrator_*"
net: "host"
이 구성에서.
Swarm은 모든 노드와 컨테이너를 알고 있지만 Consuul은 이 노드의 설정만 책임지려고 합니다.
Doker man의/root/docker-host/nodes를 캐서 거기에 새로운docker-compose를 주세요.yml이라고 써주세요.
# cd /root/docker-host
# mkdir nodes
# cd nodes
# nano docker-compose.yml
docker-compose.ymlconsul:
command: -server -bootstrap -ui-dir /ui
image: progrium/consul:latest
ports:
- "8300"
- "8400"
- "8500"
- "8600/udp"
environment:
- "affinity:container!=nodes_consul_*"
net: "host"
registrator:
command: consul://127.0.0.1:8500
image: progrium/registrator:latest
volumes:
- "/var/run/docker.sock:/tmp/docker.sock"
environment:
- "affinity:container!=nodes_registrator_*"
net: "host"
이 구성에서.서비스 정의의environment
affinity:container!=ほにゃらら
는 같은 노드의 다중 시작을 방지하기 위해 설정된 것입니다여기까지도 고민거리가 없으니 빨리 시동을 걸어라
DOCKER_HOST를 2380 포트(swarm manage)로 향한 후 docker-compose를 진행하면 Swarm API를 통해 컨테이너 제어 가능
# export DOCKER_HOST=tcp://localhost:2380
# pwd
/root/docker-host/nodes
# docker-compose up -d consul
Creating nodes_consul_1...
# docker-compose scale consul=3
Creating nodes_consul_2...
Creating nodes_consul_3...
Starting nodes_consul_2...
Starting nodes_consul_3...
# docker-compose up -d registrator
Creating nodes_registrator_1...
# docker-compose scale registrator=3
Creating nodes_registrator_2...
Creating nodes_registrator_3...
Starting nodes_registrator_2...
Starting nodes_registrator_3...
# docker-compose ps
Name Command State Ports
--------------------------------------------------------------------
nodes_consul_1 /bin/start -server -bootst ... Up
nodes_consul_2 /bin/start -server -bootst ... Up
nodes_consul_3 /bin/start -server -bootst ... Up
nodes_registrator_1 /bin/registrator consul:// ... Up
nodes_registrator_2 /bin/registrator consul:// ... Up
nodes_registrator_3 /bin/registrator consul:// ... Up
아, 얼마나 가벼운가.docker loadbalance 구축
이 docker-loadbalancer는Consuul과 통신하여 서비스의 상태 변화에 따라Consuul-templete를 시작하고 설정 파일을 펼치며 Nginx를 제어합니다.
노드 아무거나 가능하니 수정 설정을 펼치세요# pwd
/root/docker-host
# git clone https://github.com/bellycard/docker-loadbalancer.git loadbalancer
Cloning into 'loadbalancer'...
remote: Counting objects: 40, done.
remote: Total 40 (delta 0), reused 0 (delta 0), pack-reused 40
Unpacking objects: 100% (40/40), done.
Checking connectivity... done.
# cd loadbalancer
# ls -al
-rwxr-xr-x 1 root root 151 Mar 7 10:21 consul-template.service
-rw-r--r-- 1 root root 619 Mar 7 10:21 Dockerfile
-rw-r--r-- 1 root root 164 Mar 7 10:21 .envrc
-rw-r--r-- 1 root root 532 Mar 7 10:21 fig.yml
drwxr-xr-x 8 root root 4096 Mar 7 10:21 .git
-rw-r--r-- 1 root root 420 Mar 7 10:21 nginx.conf
-rwxr-xr-x 1 root root 123 Mar 7 10:21 nginx.service
-rw-r--r-- 1 root root 1064 Mar 7 10:21 README.md
여기에 편집해야 할 것은nginx다.conf와 consuul-template.service
nginx.confupstream nohost {
least_conn;
server 127.0.0.1:65535;
}
upstream testweb {
least_conn;
{{range service "production.testweb"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1;
{{else}}server 127.0.0.1:65535; # force a 502{{end}}
}
server {
listen 80 default_server;
location / {
proxy_pass http://nohost;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name docker.example.com;
location / {
proxy_pass http://testweb;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
이렇게 하면...
서비스 이름(SERVICE NAME) testweb
태그 이름(SERVICE TAGS)
이러한 환경 변수가 있는 컨테이너가 증가할 경우 Consuul-templete는 위의 설정 파일을 실제 IP 및 포트 번호로 확장합니다.
consul-template.service#!/bin/sh
exec consul-template \
-consul=127.0.0.1:8500 \
-template "/etc/consul-templates/nginx.conf:/etc/nginx/conf.d/app.conf:sv hup nginx"
Consuul-template의 시작 옵션에 Consul의 연결 주소가 쓰여 있기 때문에 여기를 바꾸었습니다.
(127..0.1이면 이 컨테이너 안에 있다고 생각되나? 넌 예민해. 호스트 네트워크 기능 덕분에)
만약 다시 쓰기가 완성되었다면, 그것을 구축하여 개인 등록표에 push하시오# docker build .
Sending build context to Docker daemon 113.2 kB
Sending build context to Docker daemon
Step 0 : FROM nginx:1.7
---> 2485b0f89951
Step 1 : MAINTAINER Shane Sveller <[email protected]>
---> Using cache
---> 8b00a2293a97
...
...
...
Step 5 : ADD nginx.service /etc/service/nginx/run
---> b1b0b05a408b
Removing intermediate container ee6e15440531
Step 6 : ADD consul-template.service /etc/service/consul-template/run
---> 1daacc85e833
Removing intermediate container bb545c650ac1
...
...
...
Removing intermediate container 33bab34d8d86
Successfully built d0b8fa1bb2df
# docker tag d0b8fa1bb2df 10.10.0.110:5000/zerobytezero/docker-loadbalancer:latest
# docker push 10.10.0.110:5000/zerobytezero/docker-loadbalancer:latest
The push refers to a repository [10.10.0.110:5000/zerobytezero/docker-loadbalancer] (len: 1)
Sending image list
Pushing repository 10.10.0.110:5000/zerobytezero/docker-loadbalancer (1 tags)
...
...
...
1daacc85e833: Image successfully pushed
c878bca3ec0c: Image successfully pushed
9201627715ed: Image successfully pushed
d0b8fa1bb2df: Image successfully pushed
Pushing tag for rev [d0b8fa1bb2df] on {http://10.10.0.110:5000/v1/repositories/zerobytezero/docker-loadbalancer/tags/latest}
push가 끝나면 각 노드에서 미리 pull하면 OK.
Dockor-compose로 돌아갑니다.yml에 다음 정의를 추가합니다
docker-compose.ymlloadbalancer:
image: 10.10.0.110:5000/zerobytezero/docker-loadbalancer:latest
ports:
- "80"
expose:
- "80"
environment:
- "affinity:container!=nodes_loadbalancer_*"
net: "host"
docker loadbalancer도 각 노드가 하나만 남는 것을 제한해야 합니다
자, loadbalancer도 일어났어요!# docker-compose up -d loadbalancer
Creating nodes_loadbalancer_1...
# docker-compose scale loadbalancer=3
Creating nodes_loadbalancer_2...
Creating nodes_loadbalancer_3...
Starting nodes_loadbalancer_2...
Starting nodes_loadbalancer_3...
나머지는 그냥 내용입니다.
네트워크 컨테이너 준비
아무런 표시가 없으면 외로우니까...# mkdir -p /docker-volumes/testweb
# nano /docker-volumes/testweb/index.php
index.php<?php ini_set('date.timezone', 'Asia/Tokyo'); ?>
<html>
<head>
<title>docker-container</title>
</head>
<body>
<h1>
docker00:<?php echo $_SERVER['SERVER_ADDR']; ?>
</h1>
<ul>
<?php
foreach (getallheaders() as $name => $value) {
echo "<li>$name: $value</li>";
}
?>
</ul>
</body>
</html>
이러한 PHP 파일은 노드별로 구성됩니다.
나는'docker 00'의 부분을 각 절로 바꾸어 출석을 부르면 어느 노드가 내용을 회답하고 있는지 쉽게 알 수 있을 것이라고 생각한다.
Dockor-compose.yml에 다음 내용 추가
docker-compose.ymlwebapps:
image: php:5.6-apache
volumes:
- "/docker-volumes/testweb:/var/www/html"
ports:
- "80"
environment:
- "affinity:container!=nodes_webapps_*"
- SERVICE_80_NAME=http
- SERVICE_NAME=testweb
- SERVICE_TAGS=production
scalewebapps:
image: php:5.6-apache
volumes:
- "/docker-volumes/testweb:/var/www/html"
ports:
- "80"
environment:
- SERVICE_80_NAME=http
- SERVICE_NAME=testweb
- SERVICE_TAGS=production
왜 두 개 골랐어요?
Nginx가 살아있기 때문에 웹 용기가 없으면 502가 되돌아오기 때문에 최저 노드와 같은 웹 서버를 준비해야 한다. 이것이 바로 웹 앱 서비스다.
scalewebapps의 설정은 규칙이 필요 없이 람덤을 노드에 분산시키는 것이고 힘이 부족한 것은 이를 비례자로 대응하는 것이다.
적도 가동# docker-compose up -d webapps
Creating nodes_webapps_1...
# docker-compose scale webapps=3
Creating nodes_webapps_2...
Creating nodes_webapps_3...
Starting nodes_webapps_2...
Starting nodes_webapps_3...
registrator_2 | 2015/03/07 23:21:37 registrator: added: 540cc048a95b ip-10-10-0-50:nodes_webapps_1:80
consul_2 | 2015/03/07 23:21:37 [INFO] agent: Synced service 'ip-10-10-0-50:nodes_webapps_1:80'
registrator_3 | 2015/03/07 23:21:39 registrator: added: 665e35e82457 ip-10-10-0-51:nodes_webapps_2:80
consul_1 | 2015/03/07 23:21:39 [INFO] agent: Synced service 'ip-10-10-0-51:nodes_webapps_2:80'
registrator_1 | 2015/03/07 23:21:39 registrator: added: e9aaf6a0c092 ip-10-10-0-49:nodes_webapps_3:80
consul_3 | 2015/03/07 23:21:39 [INFO] agent: Synced service 'ip-10-10-0-49:nodes_webapps_3:80'
잘, Registrator가 Consuul에 등록되어 있어!
Macbook에/etc/hosts를 써서 각 노드를 방문하고 정상적으로 작동시키면, 노드를 ELB 아래에 놓으십시오.
무거운 짐을 실을 때마다 노드를 잘 만들어서 그린이 하면 대성공!
아이고, 오랜만이다
인프라점의 영혼 ◯!!황금신위
길어졌으니 다음 기사에'비기 노드 트랩'이나'필살 300용기 시동'같은 걸 쓰세요.
파치야, 난 이미 피곤해...
다음 기사: ELB+Swarm+Composie+Consuul+Registrator가 꿈을 이룰 수 있을까(3)
Reference
이 문제에 관하여(ELB+Swarm+Composie+Consuul+Registrator가 꿈을 이룰 수 있을까(2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/zERobYTezERo/items/c37904c20546b3092371
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# pwd
/root/docker-host
# git clone https://github.com/bellycard/docker-loadbalancer.git loadbalancer
Cloning into 'loadbalancer'...
remote: Counting objects: 40, done.
remote: Total 40 (delta 0), reused 0 (delta 0), pack-reused 40
Unpacking objects: 100% (40/40), done.
Checking connectivity... done.
# cd loadbalancer
# ls -al
-rwxr-xr-x 1 root root 151 Mar 7 10:21 consul-template.service
-rw-r--r-- 1 root root 619 Mar 7 10:21 Dockerfile
-rw-r--r-- 1 root root 164 Mar 7 10:21 .envrc
-rw-r--r-- 1 root root 532 Mar 7 10:21 fig.yml
drwxr-xr-x 8 root root 4096 Mar 7 10:21 .git
-rw-r--r-- 1 root root 420 Mar 7 10:21 nginx.conf
-rwxr-xr-x 1 root root 123 Mar 7 10:21 nginx.service
-rw-r--r-- 1 root root 1064 Mar 7 10:21 README.md
upstream nohost {
least_conn;
server 127.0.0.1:65535;
}
upstream testweb {
least_conn;
{{range service "production.testweb"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1;
{{else}}server 127.0.0.1:65535; # force a 502{{end}}
}
server {
listen 80 default_server;
location / {
proxy_pass http://nohost;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name docker.example.com;
location / {
proxy_pass http://testweb;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
#!/bin/sh
exec consul-template \
-consul=127.0.0.1:8500 \
-template "/etc/consul-templates/nginx.conf:/etc/nginx/conf.d/app.conf:sv hup nginx"
# docker build .
Sending build context to Docker daemon 113.2 kB
Sending build context to Docker daemon
Step 0 : FROM nginx:1.7
---> 2485b0f89951
Step 1 : MAINTAINER Shane Sveller <[email protected]>
---> Using cache
---> 8b00a2293a97
...
...
...
Step 5 : ADD nginx.service /etc/service/nginx/run
---> b1b0b05a408b
Removing intermediate container ee6e15440531
Step 6 : ADD consul-template.service /etc/service/consul-template/run
---> 1daacc85e833
Removing intermediate container bb545c650ac1
...
...
...
Removing intermediate container 33bab34d8d86
Successfully built d0b8fa1bb2df
# docker tag d0b8fa1bb2df 10.10.0.110:5000/zerobytezero/docker-loadbalancer:latest
# docker push 10.10.0.110:5000/zerobytezero/docker-loadbalancer:latest
The push refers to a repository [10.10.0.110:5000/zerobytezero/docker-loadbalancer] (len: 1)
Sending image list
Pushing repository 10.10.0.110:5000/zerobytezero/docker-loadbalancer (1 tags)
...
...
...
1daacc85e833: Image successfully pushed
c878bca3ec0c: Image successfully pushed
9201627715ed: Image successfully pushed
d0b8fa1bb2df: Image successfully pushed
Pushing tag for rev [d0b8fa1bb2df] on {http://10.10.0.110:5000/v1/repositories/zerobytezero/docker-loadbalancer/tags/latest}
loadbalancer:
image: 10.10.0.110:5000/zerobytezero/docker-loadbalancer:latest
ports:
- "80"
expose:
- "80"
environment:
- "affinity:container!=nodes_loadbalancer_*"
net: "host"
# docker-compose up -d loadbalancer
Creating nodes_loadbalancer_1...
# docker-compose scale loadbalancer=3
Creating nodes_loadbalancer_2...
Creating nodes_loadbalancer_3...
Starting nodes_loadbalancer_2...
Starting nodes_loadbalancer_3...
아무런 표시가 없으면 외로우니까...
# mkdir -p /docker-volumes/testweb
# nano /docker-volumes/testweb/index.php
index.php<?php ini_set('date.timezone', 'Asia/Tokyo'); ?>
<html>
<head>
<title>docker-container</title>
</head>
<body>
<h1>
docker00:<?php echo $_SERVER['SERVER_ADDR']; ?>
</h1>
<ul>
<?php
foreach (getallheaders() as $name => $value) {
echo "<li>$name: $value</li>";
}
?>
</ul>
</body>
</html>
이러한 PHP 파일은 노드별로 구성됩니다.나는'docker 00'의 부분을 각 절로 바꾸어 출석을 부르면 어느 노드가 내용을 회답하고 있는지 쉽게 알 수 있을 것이라고 생각한다.
Dockor-compose.yml에 다음 내용 추가
docker-compose.yml
webapps:
image: php:5.6-apache
volumes:
- "/docker-volumes/testweb:/var/www/html"
ports:
- "80"
environment:
- "affinity:container!=nodes_webapps_*"
- SERVICE_80_NAME=http
- SERVICE_NAME=testweb
- SERVICE_TAGS=production
scalewebapps:
image: php:5.6-apache
volumes:
- "/docker-volumes/testweb:/var/www/html"
ports:
- "80"
environment:
- SERVICE_80_NAME=http
- SERVICE_NAME=testweb
- SERVICE_TAGS=production
왜 두 개 골랐어요?
Nginx가 살아있기 때문에 웹 용기가 없으면 502가 되돌아오기 때문에 최저 노드와 같은 웹 서버를 준비해야 한다. 이것이 바로 웹 앱 서비스다.
scalewebapps의 설정은 규칙이 필요 없이 람덤을 노드에 분산시키는 것이고 힘이 부족한 것은 이를 비례자로 대응하는 것이다.
적도 가동
# docker-compose up -d webapps
Creating nodes_webapps_1...
# docker-compose scale webapps=3
Creating nodes_webapps_2...
Creating nodes_webapps_3...
Starting nodes_webapps_2...
Starting nodes_webapps_3...
registrator_2 | 2015/03/07 23:21:37 registrator: added: 540cc048a95b ip-10-10-0-50:nodes_webapps_1:80
consul_2 | 2015/03/07 23:21:37 [INFO] agent: Synced service 'ip-10-10-0-50:nodes_webapps_1:80'
registrator_3 | 2015/03/07 23:21:39 registrator: added: 665e35e82457 ip-10-10-0-51:nodes_webapps_2:80
consul_1 | 2015/03/07 23:21:39 [INFO] agent: Synced service 'ip-10-10-0-51:nodes_webapps_2:80'
registrator_1 | 2015/03/07 23:21:39 registrator: added: e9aaf6a0c092 ip-10-10-0-49:nodes_webapps_3:80
consul_3 | 2015/03/07 23:21:39 [INFO] agent: Synced service 'ip-10-10-0-49:nodes_webapps_3:80'
잘, Registrator가 Consuul에 등록되어 있어!Macbook에/etc/hosts를 써서 각 노드를 방문하고 정상적으로 작동시키면, 노드를 ELB 아래에 놓으십시오.
무거운 짐을 실을 때마다 노드를 잘 만들어서 그린이 하면 대성공!
아이고, 오랜만이다
인프라점의 영혼 ◯!!황금신위
길어졌으니 다음 기사에'비기 노드 트랩'이나'필살 300용기 시동'같은 걸 쓰세요.
파치야, 난 이미 피곤해...
다음 기사: ELB+Swarm+Composie+Consuul+Registrator가 꿈을 이룰 수 있을까(3)
Reference
이 문제에 관하여(ELB+Swarm+Composie+Consuul+Registrator가 꿈을 이룰 수 있을까(2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/zERobYTezERo/items/c37904c20546b3092371텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)