使用 Docker 搭建开发环境

依照以下操作,你可使用DockerMacLinux上搭建PPMessage开发环境。


前言:Docker 的作用 ?

Docker allows you to package an application with all of its dependencies into a standardized unit for software development. Docker containers wrap up a piece of software in a complete filesystem that contains everything it needs to run: code, runtime, system tools, system libraries – anything you can install on a server. This guarantees that it will always run the same, regardless of the environment it is running in.

简而言之,Docker可以将PPMessage运行时的所有依赖软件打包成为一个Docker镜像。借助于此镜像,PPMessage可以在任何支持Docker的机器上运行,并且效果完全一样。

安装 Docker

首先仔细阅读Docker的官方引导文档 docker getting started ,了解Docker的基本概念和安装、使用方法。

当你安装完Docker后,应该首先验证一下Docker命令是否可用。

  • Mac

    点击 启动面板(LaunchPad) 里的 Docker Quickstart Terminal 打开 Terminal

    等待Docker启动完毕,输入命令docker info。如果没有显示错误,说明Docker命令可用。

    需要注意的是,在Mac下,必须通过Docker Quickstart Terminal打开的Terminal才可以使用Docker命令。

  • Linux

    打开系统Terminal, 输入命令docker info。如果没有错误,则说明 Docker 命令可用。

    如果提示以下错误:

    Cannot connect to the Docker daemon. Is ‘docker -d’ running on this host?

    则先尝试重启 Docker 服务

    1. sudo service docker restart

    如果之后执行docker info还是出错的话,则将当前用户加入到docker group中,执行

    1. sudo usermod -aG docker $USER

    然后重新以当前用户登录系统,再打开系统Terminal,就应该可以使用Docker命令了。

下载 PPMessage镜像

安装好Docker之后,下一步是下载PPMessage镜像。镜像托管在Docker Hub上,你可以搜索ppmessage找到它。要下载PPMessage镜像,打开Terminal,输入命令:

  1. docker pull ppmessage/ppmessage

下载过程可能比较漫长,等待过程中你可继续执行下面的步骤。

下载 PPMessage 源码

启动 PPMessage 之前,首先需要获取PPMessage的源码。源码托管在 github 上。

假设你将PPMessage克隆到目录~/Documents/ppmessage

  1. git clone git@github.com:PPMESSAGE/ppmessage.git

下载geolite2

进入~/Documents/ppmessage目录,执行

  1. ppmessage/scripts/download_geolite2.sh

下载bower, npm依赖

首先需要安装nodejs,在Mac上通过以下命令安装

  1. brew install nodejs

Debian\Ubuntu上,通过以下命令安装nodejs 4.x

  1. curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
  2. sudo apt-get install -y nodejs

然后,用npm安装cnpm, bower, gulp

  1. sudo npm install -g cnpm bower gulp

最后,下载PPCom, PPKefu, PPConsolebower,npm依赖。进入~/Documents/ppmessage目录,执行

  1. ./dist.sh bower
  2. ./dist.sh npm

在国内,从npm官方镜像源下载npm包速度比较慢,且会出现资源被屏蔽的现象。此时可以用./dist.sh cnpm代替上面的./dist.sh npm, 这会从淘宝npm镜像源下载npm依赖。

配置 PPMessage

参考配置PPMessage,生成配置文件。

启动 PPMessage

启动 PPMessage 之前,确认你已经完成以下步骤:

  • 下载PPMessage镜像
  • 下载PPMessage源码
  • 配置PPMessage
  • 下载bower, npm依赖

然后,输入以下命令启动PPMessage(根据实际情况,你可能需要改变某些参数)

  1. docker run -it -p 8080:8080 -v ~/Documents/ppmessage:/ppmessage ppmessage/ppmessage

-p 8080:8080 表示将本地的8080端口映射到Docker容器的8080端口,如此就可以通过本地的8080端口访问在Docker容器中运行的PPMessage

-v ~/Documents/ppmessage:/ppmessage 表示将本地的PPMessage源码目录映射到Docker容器/ppmessage目录,如此可实现在本机开发源码,在Docker容器里运行代码。

你也可以通过运行脚本 ~/Documents/ppmessage/ppmessage/docker/run-ppmessage.sh 来启动 PPMessage

访问 PPMessage

在用Docker启动PPMessage之后,我们还需要生成PPCom, PPKefu, PPConsole运行时所需要的js,css文件,才能使用这三个模块。

进入~/Documents/ppmessage目录,执行

  1. ./dist.sh gulp

以后,当你更新PPMessage源码后,都要重复这一操作。

现在,你可以访问PPMessage的各模块,

访问地址格式为:http_protocol://server_ip:server_port/xxxx。例如http://127.0.0.1:8080/ppkefu, http://192.168.99.100:8080/user

  • http_protocol与配置文件里nginxssl设置有关,为http或者https

  • server_port是配置文件里nginx监听端口,为80或8080。

  • server_ipDocker MachineIP,在linuxMac下获取方式不同。

    • Linux

      Docker直接运行在操作系统上,server_ip就是’127.0.0.1’。

    • Mac

      Docker运行在虚拟机中,server_ip是虚拟机的IP。要获取这个IP,打开Terminal,执行

      1. docker-machine ip default

      这会给出Docker虚拟机的 IP 地址,例如IP是 192.168.99.100

可能出现的错误:

  • 登录、注册时,出现ppauth 400 error

    解决办法:先更新PPMessage源码(git pull),然后执行./dist.sh gulp,最后清空浏览器缓存。

关闭、重新启动 PPMessage

通过docker run启动PPMessage总是会新建一个Docker容器,然后在新容器中初始化并运行 PPMessage

实际上我们总是希望可以重用第一次创建的容器,因为这样才可以保留使用过程中产生的数据。

要做到这点,我们需要获取到容器的ID,然后对容器进行启动,重启,关闭等操作。

请参考以下命令。

  • 查看所有容器

    1. docker ps -a

    这会给出所有Docker容器的列表,你需要记住ppmessage/ppmessage 对应的容器id,以便对其进行关闭、启动、重启操作。

  • 关闭容器

    1. docker stop container_id
  • 启动容器

    1. docker start container_id
  • 重启容器

    1. docker restart container_id
  • 删除容器

    1. docker rm contaniner_id