(六) Docker 修改容器的内容并使用commit命令生成新镜像—— 容器 nginx 反向代理宿主机 tomcat

前言

上一篇文章(五) Docker 运行 nginx介绍了 Docker 中安装 nginx 的一些操作,但是没有对 nginx 默认的配置进行任何修改,这不符合实际的运用场景,本文将介绍修改容器内容的两种方式。
对于容器修改之后,如果重新启动容器,则修改会消失,对此,我们可以使用 docker commit 命令生成新镜像,新镜像使我们的修改得以保留。使用 commit 仅是生成镜像的方式之一,另一种是基于 Dockerfile 后面再做介绍。

先了解一下情况
需求:宿主机中的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/ 上去

 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
使用该容器生成新镜像

打开新窗口,自定义新镜像名

#生成新镜像
* 简单命令,生成版本为 latest
docker commit 容器id 新镜像名
* 更完整的命令如下,可以指定 备注、作者、版本
docker commit -m="注释信息" -a="作者名" 容器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 容器名字/id:容器目录路径 宿主机目录路径
然后在运行的时候使用 -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 作为起始文件即可查找相关文件在容器内的路径
docker cp 容器名或id:镜像目录/ 宿主机目录

#复制容器内的 default.xml 到宿主机
docker cp 容器名或id:/etc/nginx/conf.d/default.conf /usr/java/docker/nginxlog/conf.d/default.conf
docker cp 4a45a36a1252:/usr/local/tomcat/webapps/ /本地目录注意结尾/tomcat/webapps

-v 宿主机目录:容器目录 \

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
[2]. 在Docker中安装nginx

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值