4月份的時候,如今的 vps 提供商升級了硬件配置,爲了充分使用vps的資源,我只好重裝了操做系統。node
原本計劃今年把我的的vps主機從國外遷回來,因此爲了方便後面的遷移,我把主機上的服務都部署到了 docker 建立的容器環境中,方便後面遷移。mysql
使用了一段時間,運行比較穩定。nginx
Docker 是 PaaS 提供商 dotCloud 開源的一個基於 LXC 的高級容器引擎,能夠把整個環境部署到裏面,而後打包發放。這個打包包括了容器的操做系統環境,在另外一臺安裝了docker的系統上能夠導入鏡像文件運行。web
LXC 旨在提供一個共享kernel的 OS 級虛擬化方法,在執行時不用重複加載Kernel, 且container的kernel與host共享,所以能夠大大加快container的 啓動過程,並顯著減小內存消耗。redis
docker容器中運行的進程性能接近本地應用程序。sql
docker pull: 從倉庫中拖鏡像mongodb
docker run:建立容器docker
docker stop:中止容器運行shell
docker start:開始容器運行數據庫
docker commit:提交容器到鏡像
docker images: 查看當前有的鏡像
docker ps:查看當前啓動的容器
vps: linode
系統: Ubuntu 14.04 LTS
docker: Docker version 0.9.1(直接 apt-get 安裝)
image 版本: Ubuntu 12.04 LTS
須要注意安裝 docker 的時候確認內核版本,要在 3.10 以上
/data 目錄中將用來存放容器中 mongdb,mysql,redis 等數據庫文件,還有我的站點的文件。
在 /data 中放置了容器啓動後執行的腳本文件,這樣能夠啓動容器內的服務。
這個腳本是容器啓動後運行的腳本,由於這個腳本是放在/data目錄下,因此能夠在宿主系統上修改, 這樣就能夠選擇在啓動容器的時候是運行shell,仍是直接運行服務程序。
腳本啓動的服務:
supervisord 服務,容器內的服務(mysql,mongodb,redis)都是使用這個管理。
sshd服務,遠程訪問。
#!/usr/bin/env bash # 容器啓動時啓動服務程序 if [ -f /bin/bashno ]; then # 容器啓動時啓動 shell #if [ -f /bin/bash ]; then /bin/bash else cron /usr/sbin/munin-node --config /etc/munin/munin-node.conf supervisord /usr/sbin/sshd -D fi
# 從 https://index.docker.io/ 下載鏡像 docker.io pull ubuntu # 建立容器 docker.io run -d -m 3G -h 'mydocker' -p 80:80 -p 32000:22 -p 35000:35000 -p 37064:37064 \ -v /data:/data -w /data --name mydocker_c ubuntu /data/docker_config/myboot.sh
上面是建立容器命令,映射容器的80,22,35000端口對外提供服務。
把本地的目錄 /data 掛載到容器中
設置容器啓動執行的腳本文件 /data/docker_config/myboot.sh
docker.io ps -a
第一次啓動容器時,配置啓動執行腳本啓動從 shell 啓動,這樣執行命令 docker.io start mydocker_c 就能夠啓動到 shell,就能夠安裝須要的軟件和服務了。
安裝sshd,supervisord,mongodb,mysql,redis等程序
配置 supervisord 管理服務程序。
配置 supervisord 管理 mongodb 服務, 建立文件 /etc/supervisor/conf.d/mongodb.conf,內容以下:
[program:mongodb] autostart=true user=mongodb directory=/var/run/mongodb/ command=mongod run -f /etc/mongodb.conf --pidfilepath /var/run/mongodb/mongodb.pid
用 supervisord 管理其餘服務的方法與上面相同。
# 啓動服務 user@host: ~ $ supervisorctl start # 查看服務狀態 user@host: ~ $ supervisorctl status mongodb RUNNING pid 14, uptime 5:50:47 mysql RUNNING pid 21, uptime 5:50:47 nginx RUNNING pid 16, uptime 5:50:47 redis RUNNING pid 15, uptime 5:50:47 sentry-web:sentry-web_00 RUNNING pid 19, uptime 5:50:47 sentry-web:sentry-web_01 RUNNING pid 20, uptime 5:50:47 sentry-web:sentry-web_02 RUNNING pid 17, uptime 5:50:47 sentry-web:sentry-web_03 RUNNING pid 18, uptime 5:50:47 webpy:00 RUNNING pid 32, uptime 5:50:47 webpy:01 RUNNING pid 33, uptime 5:50:47 webpy:02 RUNNING pid 25, uptime 5:50:47 webpy:03 RUNNING pid 27, uptime 5:50:47 webpy:04 RUNNING pid 41, uptime 5:50:47 webpy:05 RUNNING pid 42, uptime 5:50:47 webpy:06 RUNNING pid 35, uptime 5:50:47 webpy:07 RUNNING pid 36, uptime 5:50:47
配置完成後進行下面操做:
退出容器,用命令 docker.io stop mydocker_c 中止容器運行。
修改容器啓動腳本配置直接啓動服務,而後從新啓動容器(docker.io start mydocker_c),用 ssh 登陸容器,看配置的服務是否都正常啓動。
確認一切正常後用命令中止容器運行。
使用 docker.io commit 建立當前系統的鏡像文件,之後就能夠導出這個鏡像文件來使用了。
容器如今啓動後,能夠自動運行部署的服務。
如今能夠 push 鏡像文件到遠程的倉庫( [ https://index.docker.io/ https://index.docker.io/] ),也能夠導出使用。我的站點遷移的時候只要把鏡像文件導出,而且把 /data 目錄打包從新在新的機器上導入鏡像文件,解壓 /data 目錄便可使用(mysql 數據庫可能須要用腳本導出再導入,要根據本身的配置來調整,mongodb服務器的數據文件能夠直接使用)