Blog服务器迁移小记 - all in docker
之前一直用 linode 的 vps,上面有 docker 起来的亲友团 shadowsocks 翻墙管理 ss-panel ,和放在 LNMP 上面的 typecho 博客。网友翔子说准备要换到新的香港vps,于是匆匆忙忙就只做了两个动作备份数据:
- docker commit ss-panel 的容器,然后直接 docker push 上去 docker.io。因为实在不想压缩下载经本地了,那个神经病镜像原来已经3G多 =。=
- 备份了 mysql 的博客 sql (连博客代码都忘记拉回下来,还好原来本地有一份以前的备份,看了名字,文件夹 sae_ 开头的,久经风霜有点历史的代码了。原来是从 SAE 那边一直转移过来的)
然后。。。感觉慢慢来,最重要的备份都备份好啦,nginx 的配置没有备份,还有些 bypy 什么的工具都没有备份,都随意了。反正不急。。。但想不到的是。。
昨晚月黑风高,linode 的 vps 突然欠费停机了,登进去后台,大大的欠费公告!
天那噜,网友翔子带着他的信用卡跑路了!跑路了!!
于是只能快速拿到新 vps 的ip、账号、密码,开始迁移!!
1 vps 原来已经装好了 docker 了,首先迁移的是 shadowsocks 翻墙管理平台 ss-panel !
- docker pull ss-panel的镜像地址 (为了安全,镜像地址我就不写了,> <)
- docker run -p 88:80 -name=ss-panel 这个 ss-panel 镜像
- 在 iptable 添加一些开放的端口,ip 地址为容器的 ip:
iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 1040 -j DNAT --to-destination 172.17.0.4:1040
iptables -t nat -A POSTROUTING -s 172.17.0.4/32 -d 172.17.0.4/32 -p tcp -m tcp --dport 1040 -j MASQUERADE
- 到域名注册商修改A记录,泛域名 *.jmcn.cc 和 域名 jmcn.cc 都绑到 vps 的 ip 。
大功告成!
- 访问 http://jmcn.cc:88 亲友团的 shadowsocks 又可以用啦!
顺便打个广告:想要翻墙快来找我,包年 RMB 60 就可以啦 !!
2 然后是 typecho 博客的迁移步骤开始:
- 想了想,特么的 2G 内存啊,一下子吃光了,LNMP 不装 https://lnmp.org/ 的包了,直接上 docker 的 LNMP 吧!
- 找到 github 上面有 docker-lnmp ,看了下并没有什么毛病,而且可以 docker-compose 启动,于是就用这个吧,按自己需要再改造一哈。
- 安装 docker-compose,按官网的方法:
curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
- git clone [email protected]:micooz/docker-lnmp.git ,修改 docker-compose.yml 文件,分别有下面几点,组成的架构如图:
- 添加 nginx-proxy 作为 80 端口的负载均衡(Load Balancer),可以支持虚拟域名,方便域名管理,这点棒棒的!
# nginx-proxy
nginx-proxy:
image: 'jwilder/nginx-proxy'
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- 因为我的 nginx-proxy 不用 ssl,所以要注释掉下面一层 nginx 的 443 端口和 certificates ,并加上虚拟域名的环境变量:
# web server
nginx:
image: nginx:latest
ports:
- "80"
volumes:
# app
- ./app/src:/usr/share/nginx/html
# nginx configs
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/conf.d/:/etc/nginx/conf.d/:ro
# certificates
# - ./nginx/ca/server.crt/:/etc/nginx/server.crt:ro
# - ./nginx/ca/server.key/:/etc/nginx/server.key:ro
environment:
- VIRTUAL_HOST=*.jmcn.cc,jmcn.cc
restart: always
links:
- fpm:__DOCKER_PHP_FPM__
- 为了方便操作 mysql ,顺手把 phpmyadmin 也加上去了:
phpmyadmin:
image: index.docker.io/phpmyadmin/phpmyadmin
ports:
- "80"
links:
- mysql
environment:
- PMA_HOST=mysql
- VIRTUAL_HOST=mysql.jmcn.cc
- 开始 docker-compose 构建和启动:
cd docker-lnmp
docker-compose build
docker-compose up -d
- 第4步彻底完成后,就有几个容器启动成功了:
- dockerlnmp_nginx-proxy_1 对外端口 80
- dockerlnmp_nginx_1 不对外开放端口
- dockerlnmp_mysql_1 对外端口 3306
- dockerlnmp_fpm_1 不对外开放端口
- dockerlnmp_phpmyadmin_1 不对外开放端口
- 一开始访问 http://jmcn.cc 的时候,就会看到 phpinfo( ) 打印出来的信息。
- 将博客代码放到 .app/src 文件夹中,重新运行 install.php ,检查看能不能连到数据库。想着之后再重新导入 sql 就好了。然后发现只检测到 SQLite 的 Pdo 驱动,那应该是 fpm 构建的dockerfile 缺少了 mysql 的扩展了。
- 修改 php-fpm/Dockerfile 文件,在最后添加
RUN docker-php-ext-install pdo_mysql
,最后的 Dockerfile 如下:
######
# See: https://hub.docker.com/_/php/
######
FROM php:7.0.5-fpm
MAINTAINER micooz <[email protected]>
######
# You can install php extensions using docker-php-ext-install
######
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
&& docker-php-ext-install -j$(nproc) iconv mcrypt \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
RUN docker-php-ext-install pdo_mysql
- 重新访问 http://jmcn.cc/install.php ,这次能检查到 mysql 驱动了!
host 填入 mysql,(这个是mysql的服务名);端口填 3306 ;然后是用户名 root 和 密码。
到 phpmyadmin 新建一个数据库,把这个数据库名填进去,然后安装 typecho 博客成功后,再重新导入之前备份的 sql 。
- 我的博客复活了!!!欢迎访问 http://jmcn.cc
- 等等,我点了好多 .html 的链接页面都报 404 了!发现原来是 nginx 配置没有开启页面伪静态啊!我的天!好多事情啊~
- 那么,就去修改 nginx 配置吧,修改 nginx/conf.d/default.conf 文件,加入 rewrite 重写,部分配置如下:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php$1 last;
}
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
期间试过 js/css/jpg/png 等等的静态文件设置缓存,发现有点问题,迟点再埋这个坑,暂时可以不用。
- 重新启动这个 dockerlnmp_nginx_1 容器:
docker rm -f dockerlnmp_nginx_1
docker-compose up -d
- 就这样,我的博客完完全全复活了!!!欢迎访问 http://jmcn.cc
3 补充内容,不错的 docker 容器管理工具 —— shipyard !
shipyard 一年前安装过,现在变得漂亮又好用,还支持 swarm !
有两种部署方式:
- 我用了 Automated 的方式部署:
curl -sSL https://shipyard-project.com/deploy | bash -s
- 部署成功后,将 shipyard-controller 的容器删除掉,按自己口味自定义一下:
docker rm -f shipyard-controller
- 我不想它对外开放 8080 端口,并且要设置个域名给它访问:
docker run \
-ti \
-d \
-e VIRTUAL_HOST=docker.jmcn.cc \
--restart=always \
--name shipyard-controller \
--link shipyard-rethinkdb:rethinkdb \
--link shipyard-swarm-manager:swarm \
shipyard/shipyard:latest \
server \
-d tcp://swarm:3375
于是,我访问 http://docker.jmcn.cc 就能在线管理容器啦,方便快捷启动容器,不需要每次都 ssh 进 vps 操作。
- 最后再附送一个 2048 小游戏,当然,它就是在 shipyard 上面启动出来的: http://2048.jmcn.cc
看到了我名字 ...