前言:学习这个部署的过程中遇到了很多坑,“坑”主要是因为这些东西都没有学过,需要涉及到很多的方面的知识,下面我会涉及到一些。大家知道的就看看,不知道的就去了解一下。其实我也没有太多的去了解,只知道皮毛中的皮毛。这些坑我是一个一个的踩过去的,其中绝大部分坑都是有大神帮我填的。但是最后好歹也是能都跑出来了一个简单的helloworld。关于进一步的怎样把咱们的项目都部署成功目前还在研究中。我写这个主要是怕以后再写好多东西就记不得那么全了,所以赶紧写出来。给大伙介绍我是怎么踩坑的。
具体步骤:
(一).写一个HTML,里面就一句helloworld
(二).把这个东西打包成docker image
(三).使用打包的docker image启动一个container
(四) . 用浏览器访问container,应该可以看到之前在html页面的helloworld
(五).用Nginx-proxy代理对container的访问
(六).加https
实现步骤
(一)写一个HTML,里面就一句helloworld
新建一个index.html这个都会就不多说了
(二,三,四)把这个东西打包成docker image
1.安装docker
(1)标题是用docker部署的当然得用docker,所以得了解docker,安装docker客户端,版本号是17.06的,务必是高版本的(这里有个大坑我先不说)。
(2)学习一下docker基本命令,例如docker ps 、docker ps -a 、docker logs 、docker images 。网上有资源
2.创建镜像创建container
因为我之前峰哥没有给我脚本,我是按我自己的脚本练的。然后我就在网上找了一个教程开始学习。(这是第一个坑,我应该拉取的是nignx:latest基础镜像,不然怎么操作都不会成功)
分享链接http://www.cnblogs.com/liusc/p/docker_node.html
$sudo docker pull node:latest
了解的内容有:
(1).多级目录的创建并切换到该目录下,mkdir –p node/website&&cd node/website
(2).创建文件package.jsontouch package.json
(3).编辑文件vim package.json
(4).构建imagesudo docker build –t name
(5) .查看imagedocker images
(6).运行imagedocker run –d--name containerName –p port1:port2 imageName
-d:表示容器在后天运行
--name:容器名称
-p表示端口映射。把本机的port1端口映射到容器的port2端口。这样外网就能通过本机的port1端口访问到我们的web了
imageName :表示这个image代表的REPOSITORY
如果(6)部署成功就可以curl了。Curl http://www.parkhome.wang就可以访问到helloworld .当然没那么简单其实是要在本地配置一些东西的(这是第二个坑),要在本地的/etc文件夹里面的hosts添加127.0.0.1www.parkhome.wang才能成功,我是Mac的,window系统的hosts位于c:\Windows\System\drivers\etc\hosts。因为我用的是Mac,且/etc文件里的东西是不可以改的,用vim hosts可以修改但是就是保存不了,折腾了好长时间才解决要加sudo才能保存能够。这时候就要了解linux系统的一些权限设置。分享链接:http://www.cnblogs.com/123-/p/4189072.html,
这就差不多curl成功了。
(五).用Nginx-proxy代理对container的访问
部署Nginx-proxy(做这一步就是一个坑,因为我没意识到之前镜像不是Nginx的镜像,所以会影响到下一步成功,)
分享链接:https://github.com/jwilder/nginx-proxy
(1).看英文文档,还好有Google翻译。
(2).跑命令
docker run –d –p 80:80 –v /ver/run/docker.sock:/tmp/docker.sock:ro jwildwer/nginx-proxy
-v挂载目录,而为什么要/ver/run/docker.sock这个可以参考:
http://www.cnblogs.com/fundebug/p/6723464.html。
(3)然后再跑docker run –e VIRTUAL_HOST =www.parkhome.wang
-d containterName
containterName:表示在步骤二里创建的容器。
然后再curl http://www.parkhome.wang也能够跑出来。这中间还是有些小坑的,具体的记不得了。遇到再说吧。
4.部署Nginx-proxy-compose
官方解释:它是一个用于Nginx-proxy的轻量级协同容器,它允许创建/更新让我们自动加密证书。
需要删掉之前的Nginx-proxy,因为只暴露了80端口,加ssl有个特别的端口443,所以还要添加这个端口。所以上面的命令改为
docker run -d --name nginx-proxy -p 80:80 -p 443:443 \
-v/var/run/docker.sock:/tmp/docker.sock:ro \
-v${HOME}/var/data/nginx-proxy/certs:/etc/nginx/certs:ro \
-v/etc/nginx/vhost.d \
-v/usr/share/nginx/html \
jwilder/nginx-proxy
然后创建容器nginx-proxy-compose
docker run -d \
--namenginx-proxy-companion \
-v/var/run/docker.sock:/var/run/docker.sock:ro \
--volumes-fromnginx-proxy \
-v${HOME}/var/data/nginx-proxy/certs:/etc/nginx/certs:rw \
jrcs/letsencrypt-nginx-proxy-companion
虽然容器能够创建成功,但是在docker logs的时候还是报错。这个是因为我在创建Nginx容器的时候拉取的是node镜像不是Nginx,所以一直没发现。之后问峰哥,峰哥直接丢了一个脚本过来前两个都能跑通。在跑Nginx-proxy-compose容器的时候还是不行。
峰哥发的脚本:
(1)跑Nginx容器
docker run -d\
--name myapp \
-eVIRTUAL_HOST=www.parkhome.wang\
-eVIRTUAL_PORT=80 \
-eLETSENCRYPT_HOST=www.parkhome.wang\
-e LETSENCRYPT_EMAIL=no-reply@parkhome.wang\
-p 81:80 \
-v${HOME}/var/data/myapp/data:/usr/share/nginx/html \
nginx
(2)跑nginx-proxy容器
docker run -d\
--name myapp \
-eVIRTUAL_HOST=www.parkhome.wang\
-eVIRTUAL_PORT=80 \
-eLETSENCRYPT_HOST=www.parkhome.wang\
-eLETSENCRYPT_EMAIL=no-reply@parkhome.wang\
-p 81:80 \
-v${HOME}/var/data/myapp/data:/usr/share/nginx/html \
nginx
(3)跑Nginx-proxy-compose容器
docker run -d\
--name myapp \
-eVIRTUAL_HOST=www.parkhome.wang\
-e VIRTUAL_PORT=80\
-eLETSENCRYPT_HOST=www.parkhome.wang\
-eLETSENCRYPT_EMAIL=no-reply@parkhome.wang\
-p 81:80 \
-v${HOME}/var/data/myapp/data:/usr/share/nginx/html \
nginx
为什么不行?因为生成ssl证书是要确保第三方服务也就是其他的电脑能访问到这个域名。而我的域名是在本地设置的第三方怎么可能访问到我的本地服务呢。所以需要云主机。还好公司有一台闲置的云主机。这就需要了解一些服务器的知识了,还需要了解dns域名服务器。这里要搞清楚为什么要用dns服务器,它可以让服务能被本地的和第三方访问到,而本地的hosts也是可以解析的但是不能被第三方访问到。我们的parkhome.wang域名是在阿里云上申请的。因为理解错了一个概念就是dns服务器不需要自己搭。阿里云上就自带有dns服务器。直接将腾讯云上的云主机的ip设置成58.87.101.174 www.parkhome.wang就OK了。
(六)加https
云服务器上部署,需要了解一些云服务器的一些知识。这个自己看文档吧。
咱们的云主机的系统是Ubuntu14.04的.需要安装一些工具docker,git,docker-compose。(这里又有一个坑,docker版本太低导致在最后阶段出现的error。废了大半天才知道是这个原因。我的版本是docker17.06的)
跑上面峰哥给的脚本。肯定都能跑出来。之后测试一下出现这个错误
curl:http://www.parkhome.wang:
是因为服务器有防火墙。要想访问这个端口必须的对这个端口开放。需要在腾讯云主机上开放这个端口。云服务上一般都会有安全组这个功能就是设置防火墙的。需要了解一下安全组。
将81端口开放。再访问就能访问到hellworld了。只要开发端口基本就没什么问题了。最后也还要开发80,443端口。https://www.parkhome.wang基本就能跑出来了。
部署咱们的官网
将咱们的官网部署成HTTPS需要跑通shell脚本