之前有个项目的程序统一在docker中运行,最近在做安全检查时,发现docker的部分image因为版本没有更新到最新而出现安全漏洞问题。
本贴记录linux环境中,升级docker中某个镜像的步骤,详情如下:
一、生成镜像的步骤(以etcd为例):
1.创建dockersfile $ touch Dockerfile
2.$ vim Dockerfile编辑Dockerfile文件,写入内容如下【需根据实际情况修改,以下仅为示例】:
FROM alpine:latest
ADD etcd /usr/local/bin/
ADD etcdctl /usr/local/bin/
RUN mkdir -p /var/etcd/
RUN mkdir -p /var/lib/etcd/
# Alpine Linux doesn't use pam, which means that there is no /etc/nsswitch.conf,
# but Golang relies on /etc/nsswitch.conf to check the order of DNS resolving
# (see https://github.com/golang/go/commit/9dee7771f561cf6aee081c0af6658cc81fac3918)
# To fix this we just create /etc/nsswitch.conf and add the following line:
RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
EXPOSE 2379 2380
# Define default command.
CMD ["/usr/local/bin/etcd"]
3.下载etcd Releases $ wget https://github.com/etcd-io/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz
4.解压文件:$ tar -zxvf etcd-v3.3.10-linux-amd64.tar.gz
5.将etcd和etcdctl移动到和dockerfile同级目录:$ mv etcd-v3.3.10-linux-amd64/etcd etcd-v3.3.10-linux-amd64/etcdctl -t ./
6.构建etcd镜像docker build -t etcd .
7.查看构建好的镜像docker images
8. 导入镜像docker save 【镜像ID】 > 【镜像名】.tar
二、更新容器的镜像
- 首先通过docker load -i 镜像名,导入镜像(docker tag 【镜像ID】【镜像名称】:【tag版本信息】)
- docker images 查看镜像
- 修改docker-compose.yml涉及的服务中使用的镜像名称
- docker-compose up -d 服务名(docker-compose up -d
作用是创建与启动容器,会重建有变化的服务器(删掉以前建立的容器))
【补充说明】可以直接在可以联网的机器中使用docker pull etcd,下载好之后将etcd的镜像导出,在导入到非联网的机器中使用。
其他:
用语句启动nginx docker
docker run --name my_nginx -d -p 80:80 -v /docker_volumes/nginx/html:/usr/share/nginx/html -v /docker_volumes/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -v /docker_volumes/nginx/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf:ro --restart=always nginx_1.24.0:latest