*
*
*
* 前言 <https://blog.csdn.net/bestcxx/article/details/80957711#前言>
* 先了解一下情况 <https://blog.csdn.net/bestcxx/article/details/80957711#先了解一下情况>
* 需求:宿主机中的tomcat
<https://blog.csdn.net/bestcxx/article/details/80957711#需求宿主机中的tomcat>
* nginx 如何实现反向代理?
<https://blog.csdn.net/bestcxx/article/details/80957711#nginx-如何实现反向代理>
* 容器与宿主机的通信 <https://blog.csdn.net/bestcxx/article/details/80957711#容器与宿主机的通信>
* 终于到修改容器内容的环节了
<https://blog.csdn.net/bestcxx/article/details/80957711#终于到修改容器内容的环节了>
* 方法一:修改容器并生成新的本地镜像
<https://blog.csdn.net/bestcxx/article/details/80957711#方法一修改容器并生成新的本地镜像>
* 安装 vim <https://blog.csdn.net/bestcxx/article/details/80957711#安装-vim>
* 使用该容器生成新镜像
<https://blog.csdn.net/bestcxx/article/details/80957711#使用该容器生成新镜像>
* 使用新镜像运行一个容器即可
<https://blog.csdn.net/bestcxx/article/details/80957711#使用新镜像运行一个容器即可>
* 安装命令后新镜像占用存储空间变大了
<https://blog.csdn.net/bestcxx/article/details/80957711#安装命令后新镜像占用存储空间变大了>
* Docker 的 -v 命令与目录挂载
<https://blog.csdn.net/bestcxx/article/details/80957711#docker-的-v-命令与目录挂载>
* 方案二:在宿主机中管理
<https://blog.csdn.net/bestcxx/article/details/80957711#方案二在宿主机中管理>
* 举个挂载nginx 日志和配置目录的例子
<https://blog.csdn.net/bestcxx/article/details/80957711#举个挂载nginx-日志和配置目录的例子>
* 更新容器的配置 <https://blog.csdn.net/bestcxx/article/details/80957711#更新容器的配置>
* 参考链接 <https://blog.csdn.net/bestcxx/article/details/80957711#参考链接>


前言

上一篇文章(五) Docker 运行 nginx
<https://blog.csdn.net/bestcxx/article/details/80875977>介绍了 Docker 中安装 nginx
的一些操作,但是没有对 nginx 默认的配置进行任何修改,这不符合实际的运用场景,本文将介绍修改容器内容的两种方式。

先了解一下情况

需求:宿主机中的tomcat

现在 Docker 容器所在的宿主机中有一台 tomcat ,访问端口是8080,我们想通过 nginx 容器反向代理对这个 tomcat 服务的访问。

nginx 如何实现反向代理?

如果脱离容器来说,nginx 为 tomcat 配置反向代理是一件很简单的事情。




* 设置 upstream


比如这个tomcat 访问端口是8080,我们设置这个 upstream 的名字为
tomcat8080,(weight表示权重,多个tomcat时会起作用,这里不做详细介绍) upstream tomcat8080{ server
localhost:8080 weight=1; }



* 设置 nginx 服务监听与代理


这里 nginx 监听 80 端口的服务,所有 http://域名1 的 服务会映射到 http://localhost:8080/
<http://localhost:8080/> 上去 server { listen 80; server_name 域名1; location / {
proxy_pass http://tomcat8080; }
容器与宿主机的通信

使用 容器 nginx 反向代理宿主机中的tomcat 就会涉及到容器和宿主机的通信,
如果容器和宿主机处于同一个网段,那么问题就简单了,但是就像虚拟机一样,容器总是有一个自己的内网网段。
Docker 默认的网络配置是桥接模式,即容器通过宿主机与外界进行通信,而容器自身的 ip 是随机的,容器访问宿主机的ip是
容器ip所在网段.1,即比如容器得到的随机ip是 172.18.0.2,那么宿主机的ip就是 172.18.0.1
#容器的ip ,运行后得到 IPAddress docker inspect 容器id #对于容器来说,宿主机ip就是 IPAddress所在网段.1
#或者进入容器,查看容器ip cat /etc/hosts
即可得到容器内容修改为如下即可
upstream tomcat8080{ server 宿主机ip:8080 weight=1; } server { listen 80;
server_name 域名1; location / { proxy_pass http://tomcat8080; }
终于到修改容器内容的环节了

进入容器的命令是 docker exec -it 容器id /bin/bash,但是你会发现无法运行 vi命令,cat
命令虽然可用,但是你无法编辑容器的内容。下面是两种解决方案。

方法一:修改容器并生成新的本地镜像

好在 Docker 允许我们在容器内部安转 vim ,不过,这种安装只是暂时的,当你关闭容器再次进去的时候就会发现,之前安装的命令失效了。
别急,在安装完毕之后,从新打开一个窗口,将该容器生成一个本地镜像,然后再使用这个镜像生成一个容器即可。(
应该注意到,你自己也是可以生成镜像的,在修改完容器的内容后生成新镜像,然后上传到远程仓库,别人就能复用了)
下面看具体操作过程
安装 vim
安装完毕后不要关闭窗口,等生成新镜像之后再关闭
#进入容器 docker exec -it 容器id /bin/bash #安装vim apt-get update apt-get install vim
使用该容器生成新镜像
打开新窗口,自定义新镜像名
#生成新镜像 docker commit 容器id 新镜像名 #查看本地镜像 docker images 使用新镜像运行一个容器即可
如果容器依旧是80端口,则应先关闭之前的容器,然后使用新镜像即可

安装命令后新镜像占用存储空间变大了

我们在容器中安装 vim 命令之后生成的镜像比原先的镜像要占用更多的存储空间,而且这样也不方便,比如我想看nginx的日志,tail
命令也是无法使用,还需要安装一次。

Docker 的 -v 命令与目录挂载

还有 nginx 提供了另外的解决方案,即文件夹挂载,使用 -v 使用 run 命令生成 nginx 容器的时候,以格式docker run -p
80:80 [-v 宿主机目录:容器目录]··· -d nginx
实现宿主机目录文件与容器文件的同步。这样我们就可以在宿主机中直接操作容器内的文件了。容器文件不一定会自动到宿主机,所以应该先把容器中的文件从镜像中拷贝到宿主机中再做目录挂载,命令为
docker cp 镜像名:容器中文件全路径 宿主机文件全路径。
此外,-v 命令可以结合 -ro 和 -rw(默认 -rw) 实现挂载目录内文件的读写权限的控制。

方案二:在宿主机中管理

使用 -v 命令默认会将宿主机文件同步到容器内,所以在命令执行开始需要先将容器被挂载目录内的文件复制到宿主器本地目录,可以借助命令 docker cp
容器名字:容器目录路径 宿主机目录路径
然后在运行的时候使用 -v 命令,之后你可进入容器里面观察到被挂载目录变化情况与宿主机中的一致(文件数目与内容)
比如将日志文件目录进行挂载,在宿主机建立目录结构 /usr/java/docker/nginxlog/log/
docker run -p 80:80 --name 自定义容器名\ -v
/usr/java/docker/nginxlog/log/:/var/log/nginx:rw \ -d 镜像名
在 /usr/java/docker/nginxlog/log/中可以看到
access.log error.log

运行 tail -f access.log,访问 http://域名 就可以看到访问日志了
举个挂载nginx 日志和配置目录的例子
进入容器 whereis nginx 查看有关nginx 的目录,然后以 /etc/nginx/nginx.conf
作为起始文件即可查找相关文件在容器内的路径
#复制容器内的 default.xml 到宿主机 docker cp 镜像名:/etc/nginx/conf.d/default.conf
/usr/java/docker/nginxlog/conf.d/default.conf docker run -p 80:80 --name
nginxlog \ -v /usr/java/docker/nginxlog/log/:/var/log/nginx:rw \ -v
/usr/java/docker/nginxlog/conf.d/:/etc/nginx/conf.d:rw \ -d nginx 更新容器的配置
进入容器后,如果更新了配置文件,运行下面的命令
nginx -s reload
参考链接

[1]. docker容器中安装vim
<https://blog.csdn.net/achilles12345/article/details/47122963>
[2]. 在Docker中安装nginx <https://yuque.com/zhoubang/docker/docker-nginx-install>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信