利用docker部署nginx-proxy实现ssl证书

前言:学习这个部署的过程中遇到了很多坑,“坑”主要是因为这些东西都没有学过,需要涉及到很多的方面的知识,下面我会涉及到一些。大家知道的就看看,不知道的就去了解一下。其实我也没有太多的去了解,只知道皮毛中的皮毛。这些坑我是一个一个的踩过去的,其中绝大部分坑都是有大神帮我填的。但是最后好歹也是能都跑出来了一个简单的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 [email protected]\

-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\

[email protected]\

-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\

[email protected]\

-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脚本

你可能感兴趣的:(利用docker部署nginx-proxy实现ssl证书)