手工部署容器应用——容器虚拟机 ############################## 概述 ======= 如果您的应用的依赖包比较复杂,无法直接上传或者通过新浪云的云端构建程序构建的时候,您可以通过线上手工部署的方式来部署您的程序,手工部署的过程和使用云主机、VPS等差不多,下文中我们将一步一步教您如何在新浪云手工部署一个应用。 .. warning:: 手工部署主要用来在线构建容器镜像、运行调试,线上环境请 **一定要打成镜像** 后再部署。 创建实例 ========== 首先,进入云应用首页,点击『创建应用』创建一个新的应用。应用类型选择『自定义 / 容器 / 手工部署』。 .. image:: ../../images/docker-vm-create.png 按照自己的需求,选择一个操作系统镜像,选择机器的配置,输入应用名,然后点击创建应用,一个新的容器虚拟机就创建成功了。 登录实例 ========== 虚拟机创建成功后,控制台会跳转到『容器管理』页面,等容器虚拟机启动成功(状态为运行)时,点击容器虚拟机右侧的『终端』,就可以直接在 WEB 中直接进入 ssh 登录进容器虚拟机了。 .. image:: ../../images/docker-vm-management.png 你也可以通过 SSH/SFTP 客户端工具来登录管理实例,详细见: :doc:`vm-login-with-ssh-client` 。 安装应用程序 ============= 进入容器虚拟机的 ssh 终端后,就可以跟普通的虚拟机一样的的管理了。(下文中,我们 CentOS-7 系统安装配置运行一个 Nginx 服务器为示例)。 .. code-block:: console $ yum install epel-release $ yum install nginx 启动应用程序 ============= 现在访问应用 URL,页面会返回 502 ,因为现在还没有进程在处理请求。 应用创建后,新浪云会自动给容器虚拟机添加一个 HTTP 负载均衡,您只需要在容器虚拟机中启动一个应用程序,让程序监听在 **5050** 端口上,就可以通过应用的二级域名 http://应用名.applinzi.com 来访问自己的应用程序了。 修改 Nginx 的配置文件 */etc/nginx/nginx.conf* ,修改以下配置: :: daemon off; worker_processes 2; http { ... server { listen 5050 default_server; ... } } .. warning:: 注意其中的 daemon 选项,所有启动的应用程序必须启动在前台,不能是后台程序。 我们在终端中启动 Nginx 。 .. code-block:: console $ nginx 现在,再访问应用的 URL,就能看到 Nginx 的 Welcome 页面了。 调试和测试时,您可以直接在 ssh 终端中启动应用程序,但是如果虚拟机重启或者应用程序异常退出,通过 ssh 终端启动的程序不会被系统自动重启,如果需要自己的应用程序能自动重启,你需要使用系统的进程管理工具来启动应用程序,容器虚拟机默认的进程管理工具是 Mint ,在系统的 */etc/* 目录下新建一个配置文件, *Procfile* ,添加如下配置: web: nginx 在命令行中执行 *mint start web* ,即可使用 Mint 来启动 web 进程,现在进程已经由系统来管理,虚拟机如果重启会自动启动该进程。 Mint 进程管理工具 -------------------- Mint 的配置文件为 */etc/Procfile* ,Procfile 中每一行定义一个要启动的进程,格式为: 进程名:启动命令 配置示例: :: web: go run web.go -a :$PORT worker: bundle exec ruby worker.rb Mint 支持如下命令: .. code-block:: console $ mint -- 打印帮助信息 $ mint reload -- 重新读取配置文件并重启所有进程 $ mint start XXX -- 启动进程名为 XXX 的进程 $ mint stop XXX -- 停掉进程名为 XXX 的进程 $ mint restart XXX -- 重启进程名为 XXX 的进程 $ mint status -- 打印所有运行的进程运行状况 Mint 会自动重启异常退出的进程,但是如果进程连续 3 次启动不到 1 分钟就退出,Mint 会认为进程无法启动而不再重启。 Crontab 定时任务 ------------------ 容器虚拟机默认没有安装 `crond `_ ,如果你需要使用容器虚拟机的 crontab 功能,您需要安装并运行 crond 进程。(以 CentOS 为例): .. code-block:: console $ yum install cronie 将 crond 启动命令加入到 */etc/Procfile* : :: crond: crond -n 最后,执行 *mint start crond* 启动 crond 进程。 创建镜像 =========== 手工部署完一台虚拟机后,你可以给虚拟机创建镜像,在容器虚拟机的右侧选择『打包镜像』。 .. image:: ../../images/docker-create-image.png 其中 **启动命令** 是你要让容器启动后要运行的程序。这个命令必须运行在前台,否则容器会启动失败。 创建出来的镜像可以直接用来启动新的应用,在创建应用的时候选择『自定义/容器/我的镜像』,选择刚才打包出来的镜像即可。 .. note:: 强烈建议在完成环境制作后打包镜像保存。