åºæã®ä»£ããã«
仿¥ãç§ã¯å€¢ãèŠãŸããããŸãã§æ°å¹ã®å€§ããã«åºããããã®ããã«
ãããã€ããäœããã®çš®é¡ã®ãœã±ããã§ç«ã¡åŸçããã³ã³ãããŒã§èµ·åããŸãã
ãªãŒããŒã¬ã€ãããã¯ãŒã¯ã«å²ãåœãŠãããèš±å¯ããããã©ã³ã¹ããŒã
ä»ã®ã³ã³ããã§ã®ãµãŒãã¹ã®ãã¹ã...
ãŸã docker rmãå®è¡ããŠããŸãã
å°ãåãŸã§ãç§ã¯éåžžã«ã¯ãŒã«ãªããŒã ã®ã¡ã³ããŒã«ãªããããšã¯å¹žéã§ãã
Centos-admin.ruã§ ãç§ã®ãããªäººã
ãšåºäŒããŸãããæ°ãããã¯ãããžãŒãæå¥œå®¶ããããŠãã çŽ æŽããã人ãã¡ã«æ
ç±ãæã£ãŠããå¿ãåãããã人ã
ã ãã®ããããã§ã«2æ¥ç®ã«ååãšç§ã¯ããããã³ã°å¯èœãªãã®ããã¹ãŠãããã³ã°ãããå¿
èŠããã1ã€ã®ãããžã§ã¯ãã«åãçµãŸããŸããããµãŒãã¹ã®é«å¯çšæ§ã確ä¿ããããšã¯éåžžã«éèŠã§ããã
ãããŸã§ã¯ãç§ã¯æ®éã®LinuxããŒã¹ã®ã«ãŒã 管çè
ã§ãããããã«ã皌åæéãapt-get-installedããã±ãŒãžãæ§æã«ãŒã«ãåèµ·åãµãŒãã¹ãã¿ã€ã«ãã°ã枬å®ããŸããã äžè¬çã«ã圌ã¯ç¹ã«åªããå®çšçãªã¹ãã«ãæã£ãŠããŸããã§ãã;圌ã¯
ãããå¯Ÿã®æŠå¿µã«ã€ããŠå
šãäœãç¥ããŸããã§ããã
ç㯠ãDockerã«å®è³ªçã«ãªãã¿ããªããäžè¬çã«ã圌ãã©ã®ãããªæ©äŒãé ããŠããã®ãã«ã€ããŠã»ãšãã©ç¥ããŸããã§ããã ãããŠèªååããŒã«ããããµãŒããŒãšããŸããŸãªbashã¹ã¯ãªãããæ§æããããã«ansibleã®ã¿ã䜿çšããŸããã
ãã®ãããžã§ã¯ãã§ã®äœæ¥äžã«åŸãçµéšã«åºã¥ããŠãå°ãå
±æããããšæããŸãã
Dockeråãããã¯ã©ã¹ã¿ãŒã解決ããå¿
èŠãããã¿ã¹ã¯ïŒ
-åçã€ã³ãã©ã¹ãã©ã¯ãã£ã
-倿Žã®è¿
éãªå®è£
ã
-ã¢ããªã±ãŒã·ã§ã³ã®å±éã®ç°¡çŽ åã
䜿çšãããããŒã«ïŒ
-ããã«ãŒ
-Docker swarmïŒãšãŒãžã§ã³ã+管çïŒ
-é äº
-ç»é²è
-é äºãã³ãã¬ãŒã
-Dockeräœæ
-æ
ããŒã«ã®èª¬æïŒ
Docker
Habrãå«ãDockerã«é¢ããèšäºã¯ãã§ã«ãããããããŸããã ãããäœã§ãããã詳现ã«èª¬æãã¹ãã§ã¯ãªããšæããŸãã
ãã¹ãŠã®äººã®ç掻ãç°¡çŽ åããããŒã«ã éçºè
ããã¹ã¿ãŒãã·ã¹ãã 管çè
ãã¢ãŒããã¯ãã«ã
Dockerã䜿çšãããšãã»ãŒãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ãã»ãŒãã¹ãŠã®ãã©ãããã©ãŒã ã§äœæãå®è¡ãå±éã§ããŸãã
Dockerã¯gitãšæ¯èŒã§ããŸãããã³ãŒããæäœããã³ã³ããã¹ãã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³å
šäœãæäœããã³ã³ããã¹ãã§æ¯èŒã§ããŸãã
ããã§ã¯ããã®çŽ æŽããã補åã®åã³ã«ã€ããŠå€ãã話ãããšãã§ããŸãã
Docker swarm
Swarmã¯ããã¹ãŠã®ãã¹ãïŒããŒãïŒã1ã€ã®ã¯ã©ã¹ã¿ãŒã«è«ççã«çµåããæ©èœãæäŸããŸãã
ããã¯ãã©ã®ããŒãã§ãã®ã³ã³ãããŸãã¯ãã®ã³ã³ãããå®è¡ããããèããå¿
èŠããªãããã«æ©èœããŸãã Swarmã¯ç§ãã¡ã®ããã«ãããè¡ããŸãã ã¢ããªã±ãŒã·ã§ã³ããã©ãããã§èµ·åãããã ãã§ãã
Swarmã®æäœ-ã³ã³ãããŒã®ããŒã«ãæäœããŸãã Swarmã¯Docker APIã䜿çšããŠã³ã³ãããæäœããŸãã
éåžžãã³ãã³ãã©ã€ã³ã§äœæ¥ããå Žåã倿°ãæå®ãããšäŸ¿å©ã§ã
export DOCKER_HOST=tcp:
ãããŠãéåžžã©ããdockerã³ãã³ãã䜿çšããŸããããã§ã«ããŒã«ã«ããŒãã§ã¯ãªããã¯ã©ã¹ã¿ãŒå
šäœã§æ©èœããŠããŸãã
--labelãªãã·ã§ã³ã«æ³šæããŠãã ããã ããã䜿çšããŠãããŒãã®ããŒããæå®ã§ããŸãã ããšãã°ãSSDãã£ã¹ã¯ãæèŒãããã·ã³ããããPosrgreSQLã䜿çšããŠã³ã³ãããèµ·åããå¿
èŠãããå Žåãã¯ã©ã¹ã¿ãŒå
ã®ãã©ãããã§ã¯ãªããé«éãã£ã¹ã¯ãã€ã³ã¹ããŒã«ãããŠããããŒãäžã«ãããŸãã
ããŒãããŒã¢ã³ã«ã©ãã«ãå²ãåœãŠãŸãã
docker daemon --label com.example.storage="ssd"
æå®ãããã©ãã«ã®ãã£ã«ã¿ãŒã§PostgreSQLãéå§ããŸãã
docker run -d -e constraint:com.example.storage="ssd" postgres
ãã£ã«ã¿ãŒã®è©³çްSwarmã¯ã©ã¹ã¿ã®
startegyãªã©ã®ãã©ã¡ãŒã¿ãæ€èšãã䟡å€ããããŸãã ãã®ãã©ã¡ãŒã¿ãŒã䜿çšãããšãã¯ã©ã¹ã¿ãŒã®ããŒãéã§è² è·ãããå¹ççã«åæ£ã§ããŸãã
3ã€ã®
æŠç¥ãã©ã¡ãŒã¿ãŒã
ããŒãã«å²ãåœãŠãããšãã§ã
ãŸã ã
-ã¹ãã¬ãã
ä»ã®
æŠç¥ãã©ã¡ãŒã¿ãŒãæå®ãããŠããªãå Žåãããã©ã«ãã§äœ¿çšãããŸãã ãã®å Žåããã®ããŒãã§å®è¡ãããŠããã³ã³ãããä»ã®ããŒããããå°ãªãå Žåãswarmã¯æ°ããã³ã³ãããèµ·åããŸãã ãã®ãã©ã¡ãŒã¿ãŒã¯ãã³ã³ãããŒã®ç¶æ
ãèæ
®ããŸããã ãã¹ãŠåæ¢ããããšãã§ããŸããããã®ããŒãã¯æ°ããã³ã³ãããéå§ããããã«éžæãããŸããã
-ãã³ããã¯
å察ã«ããã®ãã©ã¡ãŒã¿ãŒã䜿çšãããšãswarmã¯ãçŒçãžã®ã³ã³ãããŒã§åããŒããè©°ãŸãããšããŸãã 忢ããã³ã³ãããããã§èæ
®ãããŸãã
-ã©ã³ãã
ååã¯ããèªäœãç©èªã£ãŠããŸãã
é äº
é äºã¯ããããã§ã«æ©æ¬ã®ã®ã£ã³ã°ã
ãã·ã³ãŒãã®å¥ã®çŽ æŽããã補åã§ãããVagrantãä»ã®å€ãã®ãããªçŽ æŽãããããŒã«ã§ç§ãã¡ãåã°ããŸãã
Consulã¯ãç»é²è
ã«ãã£ãŠææ°ã®ç¶æ
ã«ç¶æããã忣åã®äžè²«ããæ§æãªããžããªãšããŠæ©èœããŸãã
ãšãŒãžã§ã³ããšãµãŒããŒã§æ§æãããŸãïŒN / 2 + 1ãµãŒããŒã®ã¯ã©ãŒã©ã ïŒã ãšãŒãžã§ã³ãã¯ã¯ã©ã¹ã¿ãŒã®ããŒãã§èµ·åããããµãŒãã¹ã®ç»é²ãæ€èšŒã¹ã¯ãªããã®å®è¡ãããã³ConsulãµãŒããŒã®çµæã®å ±åã«é¢äžããŸãã
Consulã
ããŒå€ã¹ãã¢ãšããŠäœ¿çšããŠãã³ã³ããã®é¢ä¿ãããæè»ã«æ§æããããšãã§ããŸãã
ãŸããConsulã¯ãç»é²è
ããµããŒãããŠãããã§ãã¯ã®ãªã¹ãã«åŸã£ãŠãã«ã¹ãã§ãã«ãŒãšããŠæ©èœããŸãã
ãµãŒãã¹ããã§ãã¯ãããŒãããããŠãã¡ããREST APIã®ã¹ããŒã¿ã¹ã衚瀺ã§ããWeb UIããããŸãã
ãã§ãã¯ã«ã€ããŠå°ãïŒ
ã¹ã¯ãªããã¹ã¯ãªãããã§ãã¯ã ã¹ã¯ãªããã¯ã¹ããŒã¿ã¹ã³ãŒããè¿ãå¿
èŠããããŸãã
-çµäºã³ãŒã0-åæ Œã®ã¹ããŒã¿ã¹ããã§ãã¯ã€ã³ããŸãïŒã€ãŸãããµãŒãã¹ã¯ãã¹ãŠæ£åžžã§ãïŒ
-çµäºã³ãŒã1-èŠåã¹ããŒã¿ã¹ã®ãã§ãã¯ã€ã³
-ãã®ä»ã®ã³ãŒã-倱æã¹ããŒã¿ã¹ã確èªãã
äŸïŒ
ããã¥ã¡ã³ãã«ã¯ãnagiosãã©ã°ã€ã³ã«äŒŒããã®ã®äœ¿çšäŸãèšèŒãããŠããŸãã
{ "check": { "id": "mem-util", "name": "Memory utilization", "script": "/usr/local/bin/check_mem.py", "interval": "10s" } }
gist.github.com/mtchavez/e367db8b69aeba363d21TCPæå®ããããã¹ãå/ IPã¢ãã¬ã¹ã®ãœã±ãããããã¯ããŸãã äŸïŒ
{ "id": "ssh", "name": "SSH TCP on port 22", "tcp": "127.0.0.1:22", "interval": "10s", "timeout": "1s" }
HTTPæšæºHTTPãã§ãã¯ã®äŸïŒ
REST API Consulãä»ããŠãã§ãã¯ãç»é²ããããšã«å ããŠã-lïŒ
label ïŒåŒæ°ã䜿çšããŠãã³ã³ãããŒã®éå§æã«ãã§ãã¯ããã³ã°ãããããšãã§ããŸãã
äŸãšããŠãdjango + uwsgiã䜿çšããŠã³ã³ãããèµ·åããŸãã
docker run -p 8088:3000 -d --name uwsgi-worker --link consul:consul -l "SERVICE_NAME=uwsgi-worker" -l "SERVICE_TAGS=django" \ -l "SERVICE_3000_CHECK_HTTP=/" -l "SERVICE_3000_CHECK_INTERVAL=15s" -l "SERVICE_3000_CHECK_TIMEOUT=1s" uwsgi-worker
Consul UIã«ã¯ãæšæºã®djangoããŒãžã®ããããŒã衚瀺ãããŸãã ãã§ãã¯ã¹ããŒã¿ã¹ãåæ Œã§ããããšãããããŸããããã¯ããã¹ãŠããµãŒãã¹ã§æ£åžžã§ããããšãæå³ããŸãã

ãŸãã¯ãhttpçµç±ã§REST APIã«ãªã¯ãšã¹ããè¡ãããšãã§ããŸãã
curl http://<consul_ip>:8500/v1/health/service/uwsgi-worker | jq .
[ { "Node": { "Node": "docker0", "Address": "127.0.0.1", "CreateIndex": 370, "ModifyIndex": 159636 }, "Service": { "ID": "docker0:uwsgi-worker:3000", "Service": "uwsgi-worker", "Tags": [ "django" ], "Address": "127.0.0.1", "Port": 8088, "EnableTagOverride": false, "CreateIndex": 159631, "ModifyIndex": 159636 }, "Checks": [ { "Node": "docker0", "CheckID": "serfHealth", "Name": "Serf Health Status", "Status": "passing", "Notes": "", "Output": "Agent alive and reachable", "ServiceID": "", "ServiceName": "", "CreateIndex": 370, "ModifyIndex": 370 }, { "Node": "docker0", "CheckID": "service:docker1:uwsgi-worker:3000", "Name": "Service 'uwsgi-worker' check", "Status": "passing", "Notes": "", "Output": "", "ServiceID": "docker0:uwsgi-worker:3000", "ServiceName": "uwsgi-worker", "CreateIndex": 159631, "ModifyIndex": 159636 } ] } ]
HTTPãµãŒãã¹ã2xxå¿çã¹ããŒã¿ã¹ãè¿ãéããConsulã¯ãããçããŠãããšèŠãªããŸãã å¿çã³ãŒãã429ïŒèŠæ±ãå€ãããïŒã®å Žå-æ€èšŒã¯èŠåç¶æ
ã«ãªããä»ã®ãã¹ãŠã®ã³ãŒãã¯å€±æãšããŠããŒã¯ãããConsulã¯ãã®ãµãŒãã¹ã倱æãšããŠããŒã¯ããŸãã
ããã©ã«ãã§ã¯ãhttpãã§ãã¯ééã¯10ç§ã§ãã ã¿ã€ã ã¢ãŠããã©ã¡ãŒã¿ãå®çŸ©ããããšã«ãããç°ãªãééãæå®ã§ããŸãã
Consul Templateã¯ãæ€èšŒã®çµæã«åºã¥ããŠããã©ã³ãµãŒã«æ§æãã¡ã€ã«ãçæããŸãããã©ã³ãµãŒã¯Nçªç®ã®ãæ£åžžãªãã¯ãŒã«ãŒã䜿çšãããã©ã³ãµãŒã¯ã¯ãŒã«ãŒã«ãªã¯ãšã¹ããéä¿¡ããŸãã
é äºãžã®æ°ããå°åæã®ç»é²ïŒ
curl -XPUT -d @_ssh_check.json http://<consul_ip>:8500/v1/agent/check/register
ssh_check.jsonãã¡ã€ã«ã®
æ€èšŒãã©ã¡ãŒã¿ãŒã¯
次ã®ãšããã§ãã
{ "id": "ssh", "name": "SSH TCP on port 22", "tcp": "<your_ip>:22", "interval": "10s", "timeout": "1s" }
ãã§ãã¯ãç¡å¹ã«ããŸãã
curl http:
Consulã®å¯èœæ§ã¯éåžžã«å€§ãããæ®å¿µãªãã1ã€ã®èšäºã§ããããã¹ãŠãç¶²çŸ
ããããšã¯åé¡ã§ãã
åžæãã人ã¯ãå€ãã®äŸãããããã¹ãŠã«ã€ããŠååã«æžãããŠãã
å
¬åŒããã¥ã¡ã³ããåç
§ã§ããŸãã
ç»é²è
ç»é²è
ã¯ãå®è¡äžã®Dockerã³ã³ãããŒã®å€æŽã«é¢ããæ
å ±æäŸè
ãšããŠæ©èœããŸãã ã³ã³ããã®ãªã¹ããç£èŠããã³ã³ãããèµ·åãŸãã¯åæ¢ããå Žåã«Consulã«é©åãªå€æŽãå ããŸãã ç»é²è
ã¯ãæ°ããã³ã³ããã®äœæãå«ããŠãããã«Consulã®ãµãŒãã¹ã®ãªã¹ãã«åæ ããŸãã
ãŸããã³ã³ããã¡ã¿ããŒã¿ã«åºã¥ããŠãã«ã¹ãã§ãã¯ãšã³ããªãConsulã«è¿œå ããŸãã
ããšãã°ã次ã®ã³ãã³ãã§ã³ã³ãããèµ·åããå ŽåïŒ
docker run --restart=unless-stopped -v /root/html:/usr/share/nginx/html:ro --links consul:consul -l "SERVICE_NAME=nginx" -l "SERVICE_TAGS=web" -l "SERVICE_CHECK_HTTP=/" -l "SERVICE_CHECK_INTERVAL=15s" -l "SERVICE_CHECK_TIMEOUT=1s" -p 8080:80 -d nginx
ç»é²è
ã¯nignxãµãŒãã¹ãConsulã«è¿œå ãããã®ãµãŒãã¹ã®HTTPãã§ãã¯ãäœæããŸãã
詳现é äºãã³ãã¬ãŒã
Hashicorpããæ¥ããã1人ã®ãã°ãããããŒã«ã Consulã«å€ããããã®äžã«ãããã©ã¡ãŒã¿ãŒ/å€ã®ç¶æ
ã«å¿ããŠãããšãã°ã³ã³ãããŒå
ãªã©ã®ãã³ãã¬ãŒãã«åŸã£ãŠãã¡ã€ã«ã®ã³ã³ãã³ããçæã§ããŸãã Consul Templateã¯ãConsulã§ããŒã¿ãæŽæ°ãããšãã«ããŸããŸãªã³ãã³ããå®è¡ããããšãã§ããŸãã
äŸïŒ
NGINXïŒ
server.conf.ctmplãã¡ã€ã«ãäœæããŸã
upstream fpm { least_conn; {{range service "php"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1; {{else}}server 127.0.0.1:65535{{end}} } server { listen 80; root /var/www/html; index index.php index.html index.htm; server_name your.domain.com; sendfile off; location / { } location ~ \.php$ { fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass fpm; fastcgi_index index.php; include fastcgi_params; } }
Consulãã³ãã¬ãŒããå®è¡ããŸãã
consul-template -consul <your_consul_ip>:8500 -template server.conf.ctmpl -once -dry
-dryãã©ã¡ãŒã¿ãŒã¯çµæã®æ§æãstdoutã«è¡šç€ºãã-onceãã©ã¡ãŒã¿ãŒã¯consul-templateã1åå®è¡ããŸãã
upstream fpm { least_conn; server 127.0.0.1:9000 max_fails=3 fail_timeout=60 weight=1; } server { listen 80; root /var/www/html; index index.php index.html index.htm; server_name your.domain.com; sendfile off; location / { } location ~ \.php$ { fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass fpm; fastcgi_index index.php; include fastcgi_params; } }
ã芧ã®ãšãããConsulã«phpãšããIPã¢ãã¬ã¹ãšãµãŒãã¹ããŒããèŠæ±ãããã³ãã¬ãŒãããæ§æãã¡ã€ã«ã衚瀺ããŸãã
nginxæ§æãã¡ã€ã«ãææ°ã®ç¶æ
ã«ä¿ã€ããšãã§ããŸãã
consul-template -consul <your_consul_ip>:8500 -template server.conf.ctmpl:/etc/nginx/conf.d/server.conf:service nginx reload
ãããã£ãŠãConsulãã³ãã¬ãŒãã¯ãµãŒãã¹ãç£èŠããããããnginxæ§æã«è»¢éããŸãã ãµãŒãã¹ãçªç¶ã¯ã©ãã·ã¥ããå ŽåããŸãã¯ããŒãã倿Žãããå ŽåãConsulãã³ãã¬ãŒãã¯æ§æãã¡ã€ã«ãæŽæ°ããnginxããªããŒãããŸãã
ãã©ã³ãµãŒïŒnginxãhaproxyïŒã«Consulãã³ãã¬ãŒãã䜿çšãããšéåžžã«äŸ¿å©ã§ãã
ããããããã¯ãã®ãã°ãããããŒã«ã䜿çšã§ãããŠãŒã¶ãŒäºäŸã®1ã€ã«ãããŸããã
Consul Templateã®è©³çŽ°ç·Žç¿ãã
ãããã£ãŠãããŒã«ã«ãã¹ãã«4ã€ã®ä»®æ³ãã·ã³ããããDebian 8 Jessieãã€ã³ã¹ããŒã«ãããŠãããã«ãŒãã«ããŒãžã§ã³ã3.16ã§ããããã®ãã¯ãããžãŒã¹ã¿ãã¯ã«æ
£ããŠãã¯ã©ã¹ã¿ãŒã§äœããã®Webã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããšããæéãšèŠæããããŸãã
ç°¡åãªã¯ãŒããã¬ã¹ããã°ãäœæããŸãããã
*
ããã§ã¯ãSwarmããŒããšConsulããŒãéã§TLSãèšå®ããç¬éãçç¥ããŸããããŒãã®ç°å¢ãèšå®ããŸãã
åä»®æ³ãã·ã³ïŒä»¥äžãããŒããšåŒã³ãŸãïŒã«ãªããžããªã远å ããŸã
echo "deb http://apt.dockerproject.org/repo debian-jessie main" > /etc/apt/sources.list.d/docker.list
ãããŠãç°å¢ã«å¿
èŠãªããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
apt-get update apt-get install ca-certificates apt-key adv
ãã©ã€ããªããŒãã§ã®ãã€ã³ãã£ã³ã°ã®éå§ïŒ
docker run --restart=unless-stopped -d -h `hostname` --name consul -v /mnt:/data \ -p `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8300:8300 \ -p `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8301:8301 \ -p `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8301:8301/udp \ -p `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8302:8302 \ -p `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8302:8302/udp \ -p `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8400:8400 \ -p 8500:8500 \ -p 172.17.0.1:53:53/udp \ gliderlabs/consul-server -server -rejoin -advertise `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'` -bootstrap
--restart = without-stoppedãªãã·ã§ã³ã¯ã
docker -daemonãæåã§åæ¢ãããŠããªãå Žåãdocker-daemonãåèµ·åããŠãã³ã³ãããå®è¡ãç¶ã
ãŸã ã
Consulã®èµ·ååŸãsystemdã®docker-daemonèµ·åãã©ã¡ãŒã¿ãŒãä¿®æ£ããå¿
èŠããããŸã
/etc/systemd/system/multi-user.target.wants/docker.serviceãã¡ã€ã«ã§ãExecStartè¡ã次ã®ããã«å€æããå¿
èŠããããŸãã
ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://<your_ip>:2375 --storage-driver=aufs --cluster-store=consul://<your_ip>:8500 --cluster-advertise <your_ip>:2375
ãããŠããã®åŸããŒã¢ã³ãåèµ·åããŸã
systemctl daemon-reload service docker restart
Consulã皌åããŠããããšã確èªããŸãã
docker ps
次ã«ããã©ã€ããªããŒãã§swarm-managerãå®è¡ããŸãã
docker run --restart=unless-stopped -d \ -p 3375:2375 \ swarm manage \ --replication \ --advertise `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:3375 \ consul://`ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8500/
manageã³ãã³ãã¯ãããŒãã§SwarmãããŒãžã£ãŒãèµ·åããŸãã
--replicationãªãã·ã§ã³ã¯ãã¯ã©ã¹ã¿ãŒã®
ãã©ã€ããªããŒããš
ã»ã«ã³ããªããŒãéã®ã¬ããªã±ãŒã·ã§ã³ãæå¹ã«ããŸãã
docker run --restart=unless-stopped -d \ swarm join \ --advertise=`ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:2375 \ consul://`ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8500/
joinã³ãã³ãã¯ãã³ã³ããå
ã®ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããŒããswarmã¯ã©ã¹ã¿ãŒã«è¿œå ããŸãã
Consulã¢ãã¬ã¹ãæž¡ãããšã«ããããµãŒãã¹æ€åºæ©èœã远å ããŸãã
ãããŠããã¡ãããç»é²è
ïŒ
docker run --restart=unless-stopped -d \ --name=registrator \ --net=host \ --volume=/var/run/docker.sock:/tmp/docker.sock \ gliderlabs/registrator:latest \ consul://`ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8500
次ã«ãæ®ãã®ããŒãã«é²ã¿ãŸãããã
Consulã®èµ·åïŒ
docker run --restart=unless-stopped -d -h `hostname` --name consul -v /mnt:/data \ -p `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8300:8300 \ -p `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8301:8301 \ -p `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8301:8301/udp \ -p `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8302:8302 \ -p `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8302:8302/udp \ -p `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8400:8400 \ -p `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8500:8500 \ -p 172.17.0.1:53:53/udp \ gliderlabs/consul-server -server -rejoin -advertise `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'` -join <primary_node_ip>
ããã§ã
-joinãã©ã¡ãŒã¿ãŒã§ã¯ãäžèšã§æ§æãããã©ã€ããªããŒãã®ã¢ãã¬ã¹ãæå®
ããå¿
èŠããããŸãã
SwarmãããŒãžã£ãŒïŒ
docker run --restart=unless-stopped -d \ -p 3375:2375 \ swarm manage \ --advertise `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:3375 \ consul://`ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8500/
ããŒããã¯ã©ã¹ã¿ãŒã«æ¥ç¶ããŸãã
docker run --restart=unless-stopped -d \ swarm join \ --advertise=`ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:2375 \ consul://`ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8500/
Consulã§ãµãŒãã¹ãç»é²ããããã®ç»é²è
ã
docker run --restart=unless-stopped -d \ --name=registrator \ --net=host \ --volume=/var/run/docker.sock:/tmp/docker.sock \ gliderlabs/registrator:latest \ -ip `ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'` \ consul://`ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`:8500
ãã¯ã€ãã¯ã³ãã³ããã«ã€ããŠå°ã
ãã¹ãŠã®ã³ã³ãããåèµ·åããŸã
docker stop $(docker ps -aq);docker start $(docker ps -aq)
ãã¹ãŠã®ã³ã³ãããåé€
docker stop $(docker ps -aq);docker rm $(docker ps -aq)
éã¢ã¯ãã£ããªã³ã³ããããã¹ãŠåé€ããïŒ
docker stop $(docker ps -a | grep 'Exited' | awk '{print $1}') && docker rm $(docker ps -a | grep 'Exited' | awk '{print $1}')
ãã¹ãŠã®ããªã¥ãŒã ãåé€ããïŒããžãŒæéåãã«ãªããªãïŒ
docker volume rm $(docker volume ls -q);
ãã¹ãŠã®ç»åã®åé€ïŒããžãŒæéåããªãïŒ
docker rmi $(docker images -q);
ããã³ããšã³ã
ãããã£ãŠãã¯ã©ã¹ã¿ãŒã¯äœæ¥ãšé²åŸ¡ã®æºåãã§ããŠããŸãã ãã©ã€ããªããŒãã«æ»ã£ãŠãããã³ããšã³ããã©ã³ãµãŒãå®è¡ããŸãããã
äžã§è¿°ã¹ãããã«ãã³ãã³ãã©ã€ã³ã§äœæ¥ãããšãã倿°ãæå®ãããšäŸ¿å©ã§ã
export DOCKER_HOST=tcp:
ãããŠãéåžžã©ããdockerã³ãã³ãã䜿çšããŸããããã§ã«ããŒã«ã«ããŒãã§ã¯ãªããã¯ã©ã¹ã¿ãŒå
šäœã§æ©èœããŠããŸãã
phusion-baseimageã€ã¡ãŒãžã䜿çšããããã»ã¹ã§å°ã倿ŽããŸãã Consulãã³ãã¬ãŒãã远å ããŠãnginxæ§æãã¡ã€ã«ãææ°ã®ç¶æ
ã«ä¿ã¡ããã®äžã«çšŒåäžããã³äœæ¥äžã®ã¯ãŒã«ãŒã®ãªã¹ããä¿æããå¿
èŠããããŸãã nginx-lbãã©ã«ããŒãäœæãããã®äžã«æ¬¡ã®å
容ã®DockerfileãäœæããŸãã
é衚瀺ã®ããã¹ã FROM phusion/baseimage:0.9.18 ENV NGINX_VERSION 1.8.1-1~trusty ENV DEBIAN_FRONTEND=noninteractive # Avoid ERROR: invoke-rc.d: policy-rc.d denied execution of start. RUN echo "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d RUN curl -sS http://nginx.org/keys/nginx_signing.key | sudo apt-key add - && \ echo 'deb http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list && \ echo 'deb-src http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list && \ apt-get update -qq && apt-get install -y unzip ca-certificates nginx=${NGINX_VERSION} && \ rm -rf /var/lib/apt/lists
次ã«ãnignxèµ·åã¹ã¯ãªãããäœæããå¿
èŠããããŸãã nginx.serviceãã¡ã€ã«ãäœæããŸãã
Consul Templateèµ·åã¹ã¯ãªããïŒ
çŽ æŽãããã æ¬¡ã«ãConsulãã³ãã¬ãŒãçšã®nginxæ§æãã¡ã€ã«ãã³ãã¬ãŒããå¿
èŠã§ãã app.confãäœæããŸãã
é衚瀺ã®ããã¹ã upstream fpm { least_conn; {{range service "fpm"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1; {{else}}server 127.0.0.1:65535{{end}} } server { listen 80; root /var/www/html; index index.php index.html index.htm; server_name domain.example.com; sendfile off; location / { try_files $uri $uri/ /index.php?q=$uri&$args; } location /doc/ { alias /usr/share/doc/; autoindex on; allow 127.0.0.1; allow ::1; deny all; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/www; } location ~ \.php$ { try_files $uri =404; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass fpm; fastcgi_index index.php; include fastcgi_params; } location ~ /\.ht { deny all; } }
次ã«ã倿Žãããã€ã¡ãŒãžãäœæããå¿
èŠããããŸãã
docker build -t nginx-lb .
ã¯ã©ã¹ã¿ãŒã®åããŒãã§ãã®ç»åãæåã§åéããããç¡æã®
Docker Hubã¯ã©ãŠãã«ã¢ããããŒãããŠããã€ã§ãã©ãããã§ãäžèŠãªãžã§ã¹ãã£ãŒãªãã§æ®åœ±ã§ãã2ã€ã®ãªãã·ã§ã³ããããŸãã ãŸãã¯ãå人ã®
Dockerã¬ãžã¹ããªå
ã
Docker Hubã®æäœã«ã€ããŠã¯ã ããã¥ã¡ã³ã㧠詳ãã説æããŠã ãŸã ã
ä»ãäœãèµ·ãã£ãã®ããèŠãæã§ãã ã³ã³ãããèµ·åããŸãã
docker run -p 80:80 -v /mnt/storage/www:/var/www/html -d --name balancer --link consul:consul -l "SERVICE_NAME=balancer" -l "SERVICE_TAGS=balancer" \ -l "SERVICE_CHECK_HTTP=/" -l "SERVICE_CHECK_INTERVAL=15s" -l "SERVICE_CHECK_TIMEOUT=1s" nginx-lb
ãã©ãŠã¶ãã€ã€ããŠç¢ºèªããŠãã ããã ã¯ããåœŒã¯æªãã²ãŒããŠã§ã€ãäžããã§ãããããªããªã ã¹ã¿ãã£ãã¯ãããã¯ãšã³ãããããŸããã
ããã¯ãšã³ã
ããŠãããã³ããšã³ããèŠã€ããŸããã 誰ããPHPã³ãŒããåŠçããå¿
èŠããããŸãã ããã¯
ãFPMã䜿çšããWordPressã®
ã€ã¡ãŒãžã«åœ¹ç«ã¡ãŸã
ããã§ããç»åããããã«ä¿®æ£ããå¿
èŠããããŸãã ã€ãŸããConsulãã³ãã¬ãŒãã远å ããŠãMySQLãµãŒããŒãæ€åºããŸãã ããããããŒã¿ããŒã¹ãµãŒããŒãå®è¡ãããŠããããŒããæ¯å調ã¹ãŠãã€ã¡ãŒãžã®èµ·åæã«ãã®ã¢ãã¬ã¹ãæåã§æå®ããå¿
èŠã¯ãããŸãããïŒ ããã«ã¯ããã»ã©æéã¯ããããŸããããç§ãã¡ã¯æ ãè
ã§ããããæ lazã¯é²æ©ã®ãšã³ãžã³ãã§ãïŒcïŒã
Dockerfile FROM php:5.6-fpm # install the PHP extensions we need RUN apt-get update && apt-get install -y unzip libpng12-dev libjpeg-dev && rm -rf /var/lib/apt/lists/* \ && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \ && docker-php-ext-install gd mysqli opcache # set recommended PHP.ini settings # see https://secure.php.net/manual/en/opcache.installation.php RUN { \ echo 'opcache.memory_consumption=128'; \ echo 'opcache.interned_strings_buffer=8'; \ echo 'opcache.max_accelerated_files=4000'; \ echo 'opcache.revalidate_freq=60'; \ echo 'opcache.fast_shutdown=1'; \ echo 'opcache.enable_cli=1'; \ } > /usr/local/etc/php/conf.d/opcache-recommended.ini VOLUME /var/www/html ENV WORDPRESS_VERSION 4.4.2 ENV WORDPRESS_SHA1 7444099fec298b599eb026e83227462bcdf312a6 # upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress RUN curl -o wordpress.tar.gz -SL https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz \ && echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c - \ && tar -xzf wordpress.tar.gz -C /usr/src/ \ && rm wordpress.tar.gz \ && chown -R www-data:www-data /usr/src/wordpress ADD https://releases.hashicorp.com/consul-template/0.12.2/consul-template_0.12.2_linux_amd64.zip /usr/bin/ RUN unzip /usr/bin/consul-template_0.12.2_linux_amd64.zip -d /usr/local/bin # . ADD db.conf.php.ctmpl /db.conf.php.ctmpl # consul-template ADD consul-template.sh /usr/local/bin/consul-template.sh # MySQL WP ADD mysql.ctmpl /tmp/mysql.ctmpl COPY docker-entrypoint.sh /entrypoint.sh # grr, ENTRYPOINT resets CMD now ENTRYPOINT ["/entrypoint.sh"] CMD ["php-fpm"]
MySQLèšå®ãã³ãã¬ãŒãdb.conf.php.ctmplãäœæããŸãã
<?php {{range service "mysql"}} define('DB_HOST', '{{.Address}}'); {{else}} define('DB_HOST', 'mysql'); {{end}} ?>
ãããŠãconsul-template.shèµ·åã¹ã¯ãªããïŒ
MySQLãµãŒããŒæ€åºãã³ãã¬ãŒãmysql.ctmplïŒ
{{range service "mysql"}}{{.Address}} {{.Port}} {{end}}
docker-entrypoint.shã¹ã¯ãªãã
ã§ã¯ãããã€ãã®ä¿®æ£ãå¿
èŠã§ãã ã€ãŸããConsulãã³ãã¬ãŒããæ¥ç¶ããŠMySQLãµãŒããŒãæ€åºããããã©ã«ãã§127.0.0.1ã®ã¿ããªãã¹ã³ãããããfpmã
0.0.0.0ã«åãæ¿ããŸãã
ããŠãç»åãçµã¿ç«ãŠãŸãããïŒ
docker build -t fpm .
Wordpressã®å
šæ©èœãå®è¡ããããŒã¿ããŒã¹ãµãŒããŒããªãããããŸã èµ·åããå¿
èŠã¯ãããŸããã
docker run --name fpm.0 -d -v /mnt/storage/www:/var/www/html \ -e WORDPRESS_DB_NAME=wordpressp -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpress \ --link consul:consul -l "SERVICE_NAME=php-fpm" -l "SERVICE_PORT=9000" -p 9000:9000 fpm
ããŒã¿ããŒã¹ïŒ
ãã¹ã¿ãŒ
MySQL 5.7ã€ã¡ãŒãžã
ããŒã¿ããŒã¹ãšããŠäœ¿çšã
ãŸã ã
ãŸããå°ãä¿®æ£ããå¿
èŠããããŸãã ããªãã¡ïŒ2ã€ã®ç»åãäœæããŸãã 1ã€ã¯ãã¹ã¿ãŒçšã2ã€ç®ã¯ã¹ã¬ãŒãçšã§ãã
Master.
Dockerfile FROM debian:jessie # add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added RUN groupadd -r mysql && useradd -r -g mysql mysql RUN mkdir /docker-entrypoint-initdb.d # FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db: # File::Basename # File::Copy # Sys::Hostname # Data::Dumper RUN apt-get update && apt-get install -y perl pwgen
MySQL:
:
docker build -t mysql-master .
docker run --name mysql-master.0 -v /mnt/volumes/master:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=rootpass -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress -e MYSQL_DB=wordpress -e REPLICATION_MASTER=true -e REPLICATION_USER=replica -e REPLICATION_PASS=replica --link consul:consul -l "SERVICE_NAME=master" -l "SERVICE_PORT=3306" -p 3306:3306 -d mysql-master
, MySQL (REPLICATION_USER, REPLICATION_PASS, REPLICATION_MASTER, REPLICATION_SLAVE).
Slave
Slave , MySQL Master- . Consul Template:
Dockerfile FROM debian:jessie # add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added RUN groupadd -r mysql && useradd -r -g mysql mysql RUN mkdir /docker-entrypoint-initdb.d # FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db: # File::Basename # File::Copy # Sys::Hostname # Data::Dumper RUN apt-get update && apt-get install -y perl pwgen
Consul Template, mysql-master.ctmpl:
{{range service "master"}}{{.Address}} {{.Port}} {{end}}
åéãããã®ïŒ
docker build -t mysql-slave .
以äžãéå§ããŸãã
docker run --name mysql-slave.0 -v /mnt/volumes/slave:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=rootpass -e REPLICATION_SLAVE=true -e REPLICATION_USER=replica -e REPLICATION_PASS=replica --link=consul:consul -l "SERVICE_NAME=slave" -l "SERVICE_PORT=3307" -p 3307:3306 -d mysql-slave
, .
docker run --name fpm.0 -d -v /mnt/storage/www:/var/www/html \ -e WORDPRESS_DB_NAME=wordpressp -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpress \ --link consul:consul -l "SERVICE_NAME=php-fpm" -l "SERVICE_PORT=9000" -l "SERVICE_TAGS=worker" -p 9000:9000 fpm
, , , Wordress .
â
docker logs <container_name>
Docker-compose.
, , , ⊠, , ? â
docker-compose .
. Docker-compose YAML, . .
, - docker-compose.yml.
é衚瀺ã®ããã¹ã mysql-master: image: mysql-master ports: - "3306:3306" environment: - "MYSQL_DATABASE=wp" - "MYSQL_USER=wordpress" - "MYSQL_PASSWORD=wordpress" - "REPLICATION_MASTER=true" - "REPLICATION_USER=replica" - "REPLICATION_PASS=replica" external_links: - consul:consul labels: - "SERVICE_NAME=mysql-master" - "SERVICE_PORT=3306" - "SERVICE_TAGS=db" volumes: - '/mnt/storage/master:/var/lib/mysql' mysql-slave: image: mysql-slave ports: - "3307:3306" environment: - "REPLICATION_SLAVE=true" - "REPLICATION_USER=replica" - "REPLICATION_PASS=replica" external_links: - consul:consul labels: - "SERVICE_NAME=mysql-slave" - "SERVICE_PORT=3307" - "SERVICE_TAGS=db" volumes: - '/mnt/storage/slave:/var/lib/mysql' wordpress: image: fpm ports: - "9000:9000" environment: - "WORDPRESS_DB_NAME=wp" - "WORDPRESS_DB_USER=wordpress" - "WORDPRESS_DB_PASSWORD=wordpress" external_links: - consul:consul labels: - "SERVICE_NAME=php-fpm" - "SERVICE_PORT=9000" - "SERVICE_TAGS=worker" volumes: - '/mnt/storage/www:/var/www/html'
«» , .
docker-compose up
ãããã«
â .
Swarm . , . « ».
â .
, â . â . .
â .
, .
â .
docker-compose .
.
, Docker stateful-. flocker, , «» .
glusterfs, lsyncd. Glusterfs, , , .
, â .
PShow-to, .
/ , , .