前言
由于有些工作环境云内属于内网,所以docker操作起来并不会很方便,具体可以提现在其中一个方面就是镜像拉取。本文以Nginx为例, 由于系统的Nginx1.18版本存在漏洞。
漏洞描述:
Nginx存在漏洞,该漏洞允许攻击者从DNS服务器伪造UDP数据包造成1-byte的内存覆盖,导致工作进程崩溃或潜在的其他影响。(需要升级到Nginx1.20版本及以上)
Nginx 中的ngx_http_mp4_module模块存在内存越界写入漏洞,当在配置中使用 mp4 directive时,攻击者可利用此漏洞使用使用ngx_http_mp4_module模块处理特制的音频或视频文件时导致损坏Nginx worker 内存,进而导致 Nginx 工作进程终止或内存泄露。(需要升级到Nginx1.22版本及以上)
笔者这里采用Nginx1.23.1版本做演示,有其他版本需要你完全可以自定义。那如果同样再采用Nginx二进制包的方式重装一遍Nginx新版本,不可避免会导致系统的存储情况变得臃肿且混乱,那么使用docker容器就可以很好的解决这个问题。
这里我们需要在互联网区域准备一台虚拟机用于拉取镜像,用windows安装一台CentOS虚拟机即可,用类似腾讯云主机也同样能行。
# 第一步,安装docker
yum install docker -y
由于国内docker镜像被封禁得差不多,很难直接直接使用docker pull拉下来镜像使用,这里可以尝试替换镜像源。根据帖子发出的时间来确定是否可用,目前是24年7月份 以下镜像有效。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://dockerpull.com",
"https://docker.1panel.live",
"https://dockerproxy.cn",
"https://docker.hpcloud.cloud"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
或者在该网站也能获取Nginx镜像:docker.aityp.com
具体操作
# 拉取镜像
docker pull nginx:1.23.1
#检查镜像是否成功拉取,执行后能看到镜像说明成功
docker images
#打包镜像
#docker save -o <要保存的文件名.tar> <要保存的源镜像id> 假设这里的源镜像id为 b6g7b042a1ee
docker save -o nginx123.tar.gz b6g7b042a1ee
#在的当前目录下会生成一个 nginx123.tar.gz 文件
然后,将镜像文件导入到内网环境虚拟机当中,再用docker导入镜像文件
#导入镜像
docker load < nginx123.tar.gz
#查看是否导入成功
[root]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.23.1 51086ed63d8c 21 months ago 142MB
导入成功后,需要创建容器
#前提确保你本地映射路径是有效的,比如确保 Nginx123.conf 是否在本地已经创建出来了
docker run --name nginx123 \
-v /usr/local/docker-config/nginx/conf.d/Nginx123.conf:/etc/nginx/nginx.conf \
-v /usr/local/docker-config/nginx/html:/usr/share/nginx/html \
-v /usr/local/nginx/logs:/var/log/nginx \
-v /usr/local/nginx/certs:/usr/share/nginx/certs \
-d -p 80:80 -p 443:443 nginx:1.23.1
-v
表示将本地的路径映射到docker容器内的某个路径。 -v [本地路径] : [容器内路径]
-v /usr/local/docker-config/nginx/conf.d/Nginx123.conf:/etc/nginx/nginx.conf
,这一行我们可知将Nginx121.conf映射到容器内,为什么要这么做呢?因为你创建容器后再去使用 docker exec -it nginx123 /bin/bash
去容器内修改配置文件,可能你在使用vim
就会提示 :command not found,而通常用yum去安装可能连yum命令都没有。所以采用映射文件是一个比较好的处理方式。
-v /usr/local/docker-config/nginx/html:/usr/share/nginx/html
用于映射存放挂载在Nginx上的前端包,这里需要强调的一点是,/etc/nginx/nginx.conf 内指向的前端包路径也必须是 /usr/share/nginx/html 而不是 /usr/local/docker-config/nginx/html。切记!
-v /usr/local/nginx/logs:/var/log/nginx
输出日志
-v /usr/local/nginx/certs:/usr/share/nginx/certs
有域名证书的需要添加上,后续在Nginx配置文件中也需要注意路径问题。这里注意一点,有域名一般意味着你开通了HTTPS,那么你就需要创建容器的时候去打开443端口,切记!
-d -p 80:80 -p 443:443 nginx:1.23.1
表示指定本地端口 映射到容器内的端口 nginx:1.23.1 是镜像的名称和版本号(版本号根据你docker images显示出来的结果去匹配就可以了)。
查看容器是否创建成功
[root]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd82cb501903 nginx:1.23.1 "/docker-entrypoint.…" 1 hours ago Up 4 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx123
STATUS对应的是UP * seconds 而不是Exited就说明容器运行成功,不成功的查看一下容器日志。
最后,再去对应的路径,配置好Nginx配置文件即可。
其他参考指令,以容器名为nginx为例子。
#启动容器
docker start nginx
#停止和删除容器
docker stop nginx
docker rm nginx
# 进入容器内部
docker exec -it nginx /bin/bash
#查看容器日志
docker logs nginx
#查看容器最近三十分钟的日志
docker logs --since 30m nginx
总结
1、通过容器化方式解耦,使得中间件等更新版本不再需要繁杂的操作,减少导致服务器臃肿情况产生。
2、内网安装镜像的另一种新思路。
3、通过Nginx配置文件的路径指向和容器内部无法使用外部的vim指令可以看出,容器内外环境是独立的。但是通过文件映射可以解决编辑问题。