Bootstrap

win10下docker部署nginx+node+mongodb+redis学习

环境介绍

docker的好处有很多,这里就不多说了,win10上安装docker要求是专业版的win10,而我们一般买的是家庭版的,家庭版可以通过激活码升级成专业版,至于激活码,读者们可以去某宝买,不贵。当然win10家庭版上也可以通过一些复杂的配置让其能跑docker,这个可以自行百度。


我这里假定读者们已经在win10中安装并配置好docker,这里我就简单的说一下我的docker配置吧。

这里shared Drivers表示配置共享区,我这里让d盘的文件可以被共享到docker容器中。

image

在Daemon中配置docker下载的源:

image

docker的配置大致就这么多,这个你们在搜安装教程的时候应该都有介绍。


在具体配置docker前我先简单介绍下个人理解的docker的作用机制和我开发过程中的常用命令,如果你已经比较熟悉docker可以跳过这部分的介绍。

docker分为容器镜像,可以相互转化,一般容器基于一个镜像创建,容器配置好内部环境后可以打包成镜像,然后push到云端,其他有docker环境的机器可以直接pull然后就可以创建容器运行了。具体的命令大家可以参考官网,菜鸟教程或者一些博客,部分学习链接我后面会贴出来。

我个人的理解是每个容器相当于一个“独立”的简易linux环境,有点像虚拟机,说它是独立的但又不像,因为我在一个容器中安装ping指令,在其他容器中也可以用ping,但不同容器的服务确实可以指定同一个端口,就好像不在同一台机器上。既然是独立的环境,那么你项目中用的很多ip地址就可能得换一换了,这就体现在数据库的连接和nginx的反向代理上。比如我数据库分为两个容器,一个由redis镜像生成,一个由mongodb生成,而我nodejs应用要连接这两个容器的话就得指定这两个容器所在的ip,而不是localhost,这个时候的localhost指向的容器,而非宿主机的localhost,这个得理解。

再说一说我nginx容器的反向代理,刚开始我以为只需要反向代理我容器的ip就行了,可是我试了很多次后就是失败。nginx映射到宿主机的端口就是不能访问我的项目,仔细想了想,nginx的代理和我vue开发中的代理跨域有几分相像,就是把请求的它的转到请求他代理的端口上,如果连他代理的端口都不能访问项目,那当然无法访问,带着疑问,我把我node的容器的ip加端口3000输入在浏览器上面的地址上,确实无法访问,这是docker内部的ip,它内部通过建立端口映射到宿主机后才可以在宿主机上用localhost或者ipv4的地址加端口访问,所以我最终还是把我的node项目暴露出来,建立端口映射,比如是3001:3000,那么我们输入localhost:3001就相当于访问我node容器的3000了,结果果然如我猜想,项目能访问,接下来我再将nginx的代理转到宿主机的ipv4上,建立端口映射80:80,那么我们访问localhost时,这个访问会从默认端口80进去nginx容器端口80,被nginx转到宿主机ipv4下的3001端口,再从这个端口进入node容器的3000端口,就达到访问我们项目的目的了。


前面废话这么多都是为了我接下来的配置做铺垫,不多说了,直接上代码吧。


我用的docker-compose一键部署,这里展示我的配置文件:
docker-compose.yml

version: '3.7'
services:
  mongodbservice:
    image: mongo:3.2 #镜像
    container_name: mongodbservice #容器名
    deploy: #这个配置到好像会报警告,说会忽视,不碍事,也可以不加
      restart_policy:
        condition: on-failure #none on-failure any
        delay: 5s
        max_attempts: 3
        window: 60s  #deploy配置到这里结束
    volumes: #文件映射
       - ./mongo3.2/mongod.conf.orig:/etc/mongod.conf.orig #自定义mo
;