安装docker

在win 10环境下使用时,试了三个版本,首先是Docker for Windows Installer和InstallDocker.msi都没有安装成功,前者只能在专业版以上的win10系统才能安装。只有DockerToolbox.exe才适用于我的家庭版 win10,下载链接:ready-to-get-started

然后选择默认选项进行安装,发现它把git卸载又重装了一遍,所以如果已经安装了git window客户端,应该可以在默认选项中取消勾选git, 不用再重装git了。

卡在检测已创建实例那里比较久,想拷贝一下查查为什么,结果ctrl+c好像直接使它取消了,然后就run下去了。。或者也是刚好处理完的时机?

最后就是显示了docker的字符logo,背着箱子的鲸。

输入docker run hello-world运行一个实例来测试docker是否生效。如果看到成功运行的提示那么就说明docker正常运行了。

创建express应用

确保 express 应用在开发环境测试可以正常运行的情况下,在项目根目录加入文件 Dockerfile,这个文件包含了用于创建docker镜像的命令。

FROM registry.docker-cn.com/library/node:8.11
MAINTAINER voezy
ADD . /app/
WORKDIR /app
RUN npm install
EXPOSE 3000
CMD [ "npm", "start"]

第一句是基于哪个镜像,这里用了docker-cn的加速镜像,因为官方在国外的镜像有时候实在太慢。

第二句指明了维护者。

第三句创建文件 /app。

第四句指明工作目录位于新建的app。

RUN后面的命令用于在镜像中安装这个express应用的依赖。

EXPOSE指定要暴露的端口。

最后一句是这个express应用的启动命令。

输入命令进行构建:docker build -t netease-music-site-express .,不能少了最后的点,这个点表示将当前目录所有文件复制到镜像中。

然后输入命令:docker run -d -p 9000:3000 netease-music-site-express,就可以打开 localhost:9000 查看效果了。要注意的是,如果是windows环境,因为docker是基于linux核心的,所以这个镜像应用其实是运行在一个虚拟机中的,该虚拟机的ip也就是docker初始化完成时提示的ip。所以windows下打开 192.168.99.100:9000 查看效果。

绑定docker账户并上传镜像

https://hub.docker.com/ 注册账户。

在 docker 命令行中输入 docker login

然后输入用户名和密码,就登陆成功了。

给镜像添加tag:

docker tag netease-music-site-express voezy/netease-music-site-express

然后推送镜像到docker hub:

docker push voezy/netease-music-site-express

推送成功后,默认似乎是公开的。

服务器中安装docker并拉取镜像进行部署

ssh 登陆到服务器,输入以下命令进行docker的安装:

curl https://releases.rancher.com/install-docker/17.12.sh | sh

安装完成后,输入docker login进行登陆,如果是自己的非公开镜像,应该是要登陆才能下载的。

然后输入sudo docker pull voezy/netease-music-site-express 拉取镜像。

镜像下载完毕后,输入命令运行镜像:

sudo docker run -d -p 9000:3000 --restart=always voezy/netease-music-site-express

--restart=always 使镜像应用中断时自动重启。也许可以部分代替pm2的功能。

这样子,在浏览器中打开 主机ip:9000 应该可以看到express应用运行成功了。

nginx代理express

安装nginx:

sudo apt-get install nginx

安装完毕后,修改nginx的配置文件。

cd /etc/nginx/sites-available

然后输入命令进行编辑:

sudo vi default

可以看到有许多默认的配置,如果觉得有必要,可以把默认配置文件备份一下。

删除旧的配置,新的配置如下:

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass http://127.0.0.1:9000;
  }
}

访问 example.com 时,nginx会把所有流量转发到本机的9000端口,也就是方才docker镜像中express应用所占用的端口,所以这个域名的所有动作都交给这个 express 应用处理。

保存后,可以用命令 sudo nginx -t 来检查配置文件有没有错误。

重启nginx:

sudo /etc/init.d/nginx stop
sudo /etc/init.d/nginx start

或者用 sudo nginx -s reload

开机自启nginx:

systemctl start nginx
systemctl enable nginx

开机自启docker

sudo systemctl enable docker
sudo usermod -aG docker 用户名