开发,设计,生活

开发相关

  • 2014-06-24 11:44:34 2014-06-24 15:35:12[U] 开发相关

    vps个人网站迁移的问题

    4月份的时候,现在的 vps 提供商升级了硬件配置,为了充分使用vps的资源,我只好重装了操作系统。

    本来计划今年把个人的vps主机从国外迁回来,所以为了方便后面的迁移,我把主机上的服务都部署到了 docker 创建的容器环境中,方便后面迁移。

    使用了一段时间,运行比较稳定。


    docker 简单介绍

    Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,可以把整个环境部署到里面,然后打包发放。这个打包包括了容器的操作系统环境,在另一台安装了docker的系统上可以导入镜像文件运行。

    LXC 旨在提供一个共享kernel的 OS 级虚拟化方法,在执行时不用重复加载Kernel, 且container的kernel与host共享,因此可以大大加快container的 启动过程,并显著减少内存消耗。

    docker容器中运行的进程性能接近本地应用程序。


    docker 常用命令

    1. docker pull: 从仓库中拖镜像
    2. docker run:创建容器
    3. docker stop:停止容器运行
    4. docker start:开始容器运行
    5. docker commit:提交容器到镜像
    6. docker images: 查看当前有的镜像
    7. docker ps:查看当前启动的容器


    vps主机环境

    1. vps: linode
    2. 系统: Ubuntu 14.04 LTS
    3. docker: Docker version 0.9.1(直接 apt-get 安装)
    4. image 版本: Ubuntu 12.04 LTS

    需要注意安装 docker 的时候确认内核版本,要在 3.10 以上


    创建 docker 容器

    创建数据目录 /data

    1. /data 目录中将用来存放容器中 mongdb,mysql,redis 等数据库文件,还有个人站点的文件。
    2. 在 /data 中放置了容器启动后执行的脚本文件,这样可以启动容器内的服务。


    创建 /data/docker_config/myboot.sh 脚本

    这个脚本是容器启动后运行的脚本,因为这个脚本是放在/data目录下,所以可以在宿主系统上修改, 这样就可以选择在启动容器的时候是运行shell,还是直接运行服务程序。

    脚本启动的服务:

    1. supervisord 服务,容器内的服务(mysql,mongodb,redis)都是使用这个管理。
    2. 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
    

    1. 上面是创建容器命令,映射容器的80,22,35000端口对外提供服务。
    2. 把本地的目录 /data 挂载到容器中
    3. 设置容器启动执行的脚本文件 /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
    


    创建自己的镜像文件

    配置完成后进行下面操作:

    1. 退出容器,用命令 docker.io stop mydocker_c 停止容器运行。
    2. 修改容器启动脚本配置直接启动服务,然后重新启动容器(docker.io start mydocker_c),用 ssh 登录容器,看配置的服务是否都正常启动。
    3. 确认一切正常后用命令停止容器运行。
    4. 使用 docker.io commit 创建当前系统的镜像文件,以后就可以导出这个镜像文件来使用了。


    完成

    容器现在启动后,可以自动运行部署的服务。

    现在可以 push 镜像文件到远程的仓库( [ https://index.docker.io/ https://index.docker.io/] ),也可以导出使用。个人站点迁移的时候只要把镜像文件导出,并且把 /data 目录打包重新在新的机器上导入镜像文件,解压 /data 目录即可使用(mysql 数据库可能需要用脚本导出再导入,要根据自己的配置来调整,mongodb服务器的数据文件可以直接使用)