目前情况下,随着云服务和微服务的蓬勃发展,越来越多的公司和项目向微服务和虚拟化的路上靠拢,既然要虚拟化和容器化,那么docker肯定要掌握的,docker 有什么好处就不用多说了,总之一点,有了docker,我们安装各种环境爽多了。
最近,整理了一下自己使用的测试环境,因此我就下决心使用 docker 来部署一下 nginx ,以后的项目都采用 docker 来进行部署,使用 nginx 来进行反向代理。
那么第一步肯定就是使用 docker 来安装 nginx ,先把镜像拉下来 :docker pull nginx
把镜像来下来之后,我们知道,传统的 容器启动 docker -p port:port -d --name aliasName iamgeName
但是是存在很大的缺点的:
- -p 之后就确定了端口映射,但是做反向代理的时候,端口是不确定的,我们就不能够在启动容器的时候就把端口确定好
- -v 之后我们把宿主机的文件夹挂在到对应的容器内,如果仅仅映射到 nginx.conf 来管理所有的项目,那么这样的话, nginx.conf 中的 server 快就会变得特别多而难以管理。因此,我们可以通过 容器内的 /etc/nginx/conf.d 的来挂载出来,以后就能够在 conf.d 中的为每一个项目来创建一个配置文件进行管理
通过上面两个缺点,我们采用共享宿主机的端口,动态映射式来进行运行 nginx 容器:
docker run -d -v /data/nginx:/nginx_conf -v /data/project:/var/www/html --net host --name nginx nginx
我们等于是配置文件那里 宿主机文件夹 /data/nginx ----> 容器 /nginx_conf,然后把容器内的 /etc/nginx/nginx.conf 拷贝到 /nginx_conf 文件夹内,这样的话宿主机内的 /data/ngixn 就会出现 nginx.conf 文件,当以后我们在宿主机内修改配置文件之后,对应的容器内的 /nginx_conf 对应的也会改变,然后再把它拷贝到 /etc/nginx 内覆盖原来的 nginx.conf ,然后重启 nginx 服务就好了。
这样虽然很麻烦,但是没有什么问题,这个时候就会有人问了,为什么不直接让宿主机挂载容器的 /etc/nginx呢?
我之前就是这样做的,但是不知道是什么原因,容器每次都起不来,查看日志发现是 /etc/nginx 文件夹不存在,但是众所周知,这个文件夹是肯定存在的,王还是那个有人说因为 centos 7 的 SELinux 模块造成的,但是我查看拿了之后,发现那个模块在关闭着,最终这个问题采用了上述的解决办法。
nginx 搞好了之后,就该搞 spring boot 项目的景象了,其实很简单,就是把 jar 包上传到服务器,然后再统计目录下新建 Dockerfile 文件:
FROM java:8
VOLUME /tmp
ADD halo-1.4.1.jar halo-1.4.1.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/halo-1.4.1.jar"]
ADD 你上传的 jar 包名称 自定义名称
ENTRTPOINT 后面是需要执行 jar 包的命令。包的名字替换为你在 ADD 命令中自定义的名称
然后退出编辑,进行制作:
docker built -t tagname .
其中的 tagname 是你制作镜像的标签名字。
随后就可以启动镜像了。
最后我们就需要把nginx反向代理到对应的应用上了,修改nginx.conf:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass localhost:8090;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
这个是需要放到 http 块内的,通常情况下,一个 server 块就对应一个应用
我们来逐条分析每一个字段是什么意思:
listen 80;表示监听服务器的 80 端口;
server_name localhost; 监听的服务器地址
location / 路径匹配
也就是说当地址栏中输入 localhost:80 的时候,转换为 localhost:8090