基于 docker 的個人網站部署
vps個人網站遷移的問題
4月份的時候,現在的 vps 提供商升級了硬件配置,為了充分使用vps的資源,我只好重裝了操作系統。
本來計劃今年把個人的vps主機從國外遷回來,所以為了方便后面的遷移,我把主機上的服務都部署到了 docker 創建的容器環境中,方便后面遷移。
使用了一段時間,運行比較穩定。
docker 簡單介紹
Docker 是 PaaS 提供商 dotCloud 開源的一個基于 LXC 的高級容器引擎,可以把整個環境部署到里面,然后打包發放。這個打包包括了容器的操作系統環境,在另一臺安裝了docker的系統上可以導入鏡像文件運行。
LXC 旨在提供一個共享kernel的 OS 級虛擬化方法,在執行時不用重復加載Kernel, 且container的kernel與host共享,因此可以大大加快container的 啟動過程,并顯著減少內存消耗。
docker容器中運行的進程性能接近本地應用程序。
docker 常用命令
-
docker pull: 從倉庫中拖鏡像
-
docker run:創建容器
-
docker stop:停止容器運行
-
docker start:開始容器運行
-
docker commit:提交容器到鏡像
-
docker images: 查看當前有的鏡像
-
docker ps:查看當前啟動的容器
vps主機環境
-
vps: linode
-
系統: Ubuntu 14.04 LTS
-
docker: Docker version 0.9.1(直接 apt-get 安裝)
-
image 版本: Ubuntu 12.04 LTS
需要注意安裝 docker 的時候確認內核版本,要在 3.10 以上
創建 docker 容器
創建數據目錄 /data
-
/data 目錄中將用來存放容器中 mongdb,mysql,redis 等數據庫文件,還有個人站點的文件。
-
在 /data 中放置了容器啟動后執行的腳本文件,這樣可以啟動容器內的服務。
創建 /data/docker_config/myboot.sh 腳本
這個腳本是容器啟動后運行的腳本,因為這個腳本是放在/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服務器的數據文件可以直接使用)