之魔鬼藏在細節裡
以及其他很複雜但除範例之外
不知道怎麼跑起來的方案😏
大家都說容器化是未來趨勢...
但我們只有一堆Copy & Paste的Server端舊程式...
要用怎樣的方法來最小幅度改造舊程式, 以便能夠用 Docker + Docker Compose的組合, 配合內部架設 Docker庫來做開發時期的維護及營運時期的運行。
首先來說為何要容器化...
從正式上線營運開始後三星期到一個月之間是
關鍵💰觀察期
version: '2'
services:
varnish:
extends:
file: docker-compose.base.yml
service: varnish-base
env_file:
- ./conf/varnish-cache/env/web.env
volumes:
- ./conf/varnish-cache/vcl:/etc/varnish/
links:
- default_site:normal_site
ports:
- "80:80"
networks:
- back_end
# application container
default_site:
extends:
file: docker-compose.base.yml
service: nginx-base
volumes:
- ./conf/nginx/config:/etc/nginx
links:
- phpfpm
volumes_from:
- phpfpm
networks:
- back_end
phpfpm:
extends:
file: docker-compose.base.yml
service: phpfpm-base
volumes:
- ./conf/phpfpm/config:/usr/local/etc
- ./src/php:/var/www/html
links:
- redis0cache
networks:
- back_end
#cache container
redis0cache:
extends:
file: docker-compose.base.yml
service: redis-base
volumes:
- ./conf/redis/config:/usr/local/etc/redis
- ./data/redis:/data
ports:
- "6379:6379"
networks:
- back_end
networks:
back_end:
Compose Project
目錄&namespace的概念docker-compose pull
docker-compose push
這麼簡單piece of cake🍰?!大家可以去吃點心了?!
Layering...
Ops mode
Dev mode
開發時期:
設定檔
Game Table資料導入&驗證審核:
以上所有可發佈docker image都會push到內部Docker庫準備deploy
運營時期:
docker-compose pull
把對應tag版本的docker image下載到伺服器上。
docker-compose up
,啟動服務。
docker-compose pull
抓取對應版本啟動服務應用。
/etc/hosts
mapping dns name to IP:sysctl vm.overcommit_memory=1
chown -R ${UID}:${GID}
Docker容器內的應用需要用到原本倚賴的作業系統服務
(例:Unix/Linux的crontab排程)
怎麼辦?
當然更好的解法是程式改寫成使用其他外部服務
tar
"
command:
tail
指令的workaround轉為使用
ETW、
Fluentd、
Journald、
Splunk等以便簡化容器的Log處理。
#List all container(running or not running):
docker ps -a
#Run container(it will download image -> create container -> run it):
docker run image_name [command to run in container]
#Start a stopped state container:
docker start [container_ID|container_Name]
#Check container detail information(include virtual IP address):
docker inspect [container_ID|container_Name]
#Get container's IP address:
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_ID|container_Name]
#See container's information filter by certain "JSON node":
docker inspect --format='{{json .[JSON_node_name]}}' [container_ID|container_Name]
#Console into running container:
docker exec -it [container_ID|container_Name] bash
#When using docker-compose, this is create new container and run with command:
docker-compose [-f the_yml_file] run yml_defined_service_name bash
#See container's running log:
docker logs [container_ID|container_Name]
#Save container version:
docker commit [container_ID|container_Name] The_name_you_want
#Stop running container:
docker stop
#Show current docker daemon's images:
docker images
#Remove all containers:
docker rm -f $(docker ps -aq)
#Remove all images currently in host:
docker rmi -f $(docker images -aq)
#Remove all volumes in current host:
docker volume rm $(docker volume ls -q)
#Remove all untagged images (images has <none> in REPOSITORY field as example):
docker rmi $(docker images -q -f=dangling=true)
Hard Code
寫入到固定位置檔案的log,導入到docker-engine的預設log機制裡。
[watcher:show_log_worker]
cmd = /usr/bin/tail --retry -f /php_log/access.log --retry -f /php_log/exception.log --retry -f /php_log/error.log --retry -f /php_log/slow.log
copy_env = True
stdout_stream.class = StdoutStream
stderr_stream.class = StdoutStream
[watcher:phpfpm_worker]
cmd = /usr/local/sbin/php-fpm
working_dir=/var/www/html
numprocesses = 1
warmup_delay = 3
graceful_timeout = 10
copy_env = True
stdout_stream.class = StdoutStream
stderr_stream.class = StdoutStream