之前一直用 linode 的 vps,上面有 docker 起来的亲友团 shadowsocks 翻墙管理 ss-panel ,和放在 LNMP 上面的 typecho 博客。网友翔子说准备要换到新的香港vps,于是匆匆忙忙就只做了两个动作备份数据:

  1. docker commit ss-panel 的容器,然后直接 docker push 上去 docker.io。因为实在不想压缩下载经本地了,那个神经病镜像原来已经3G多 =。=
  2. 备份了 mysql 的博客 sql (连博客代码都忘记拉回下来,还好原来本地有一份以前的备份,看了名字,文件夹 sae_ 开头的,久经风霜有点历史的代码了。原来是从 SAE 那边一直转移过来的)

然后。。。感觉慢慢来,最重要的备份都备份好啦,nginx 的配置没有备份,还有些 bypy 什么的工具都没有备份,都随意了。反正不急。。。但想不到的是。。

昨晚月黑风高,linode 的 vps 突然欠费停机了,登进去后台,大大的欠费公告!
天那噜,网友翔子带着他的信用卡跑路了!跑路了!!

欠费

于是只能快速拿到新 vps 的ip、账号、密码,开始迁移!!

1 vps 原来已经装好了 docker 了,首先迁移的是 shadowsocks 翻墙管理平台 ss-panel !

  1. docker pull ss-panel的镜像地址 (为了安全,镜像地址我就不写了,> <)
  2. docker run -p 88:80 -name=ss-panel 这个 ss-panel 镜像
  3. 在 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
  1. 到域名注册商修改A记录,泛域名 *.jmcn.cc 和 域名 jmcn.cc 都绑到 vps 的 ip 。

大功告成!

顺便打个广告:想要翻墙快来找我,包年 RMB 60 就可以啦 !!

2 然后是 typecho 博客的迁移步骤开始:

  • 想了想,特么的 2G 内存啊,一下子吃光了,LNMP 不装 https://lnmp.org/ 的包了,直接上 docker 的 LNMP 吧!
  1. 找到 github 上面有 docker-lnmp ,看了下并没有什么毛病,而且可以 docker-compose 启动,于是就用这个吧,按自己需要再改造一哈。
  2. 安装 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
  1. 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
  1. 开始 docker-compose 构建和启动:
cd docker-lnmp

docker-compose build

docker-compose up -d
  1. 第4步彻底完成后,就有几个容器启动成功了:
  • dockerlnmp_nginx-proxy_1 对外端口 80
  • dockerlnmp_nginx_1 不对外开放端口
  • dockerlnmp_mysql_1 对外端口 3306
  • dockerlnmp_fpm_1 不对外开放端口
  • dockerlnmp_phpmyadmin_1 不对外开放端口
  1. 一开始访问 http://jmcn.cc 的时候,就会看到 phpinfo( ) 打印出来的信息。
  2. 将博客代码放到 .app/src 文件夹中,重新运行 install.php ,检查看能不能连到数据库。想着之后再重新导入 sql 就好了。然后发现只检测到 SQLite 的 Pdo 驱动,那应该是 fpm 构建的dockerfile 缺少了 mysql 的扩展了。
  3. 修改 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
  1. 重新访问 http://jmcn.cc/install.php ,这次能检查到 mysql 驱动了!

mysql

host 填入 mysql,(这个是mysql的服务名);端口填 3306 ;然后是用户名 root 和 密码。

到 phpmyadmin 新建一个数据库,把这个数据库名填进去,然后安装 typecho 博客成功后,再重新导入之前备份的 sql 。

  1. 我的博客复活了!!!欢迎访问 http://jmcn.cc
  2. 等等,我点了好多 .html 的链接页面都报 404 了!发现原来是 nginx 配置没有开启页面伪静态啊!我的天!好多事情啊~
  3. 那么,就去修改 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 等等的静态文件设置缓存,发现有点问题,迟点再埋这个坑,暂时可以不用。

  1. 重新启动这个 dockerlnmp_nginx_1 容器:
docker rm -f dockerlnmp_nginx_1

docker-compose up -d
  1. 就这样,我的博客完完全全复活了!!!欢迎访问 http://jmcn.cc

3 补充内容,不错的 docker 容器管理工具 —— shipyard !

shipyard 一年前安装过,现在变得漂亮又好用,还支持 swarm !

有两种部署方式:

  1. 我用了 Automated 的方式部署:
curl -sSL https://shipyard-project.com/deploy | bash -s
  1. 部署成功后,将 shipyard-controller 的容器删除掉,按自己口味自定义一下:
docker rm -f shipyard-controller
  1. 我不想它对外开放 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