docker 镜像管理

发布时间:2024年01月24日

docker 镜像管理

镜像基础操作

镜像概念

Image

IT 领域,镜像通常是指一系列文件或一个磁盘驱动器的精确副本,和 ZIP 压缩文件类似

  • Ghost 镜像:以前经常装 PC 电脑上用的经典软件,虽然我重来不用,我更喜欢用微软原生的那种镜像
  • 在云环境下,一些企业大大小小都有自己的硬件服务器(这里说的是实体物理机),我们在物理上面一般会做虚拟化操作,这时候的镜像其实就是一个虚拟机模块,我们在虚拟化平台上通过镜像来安装虚拟机
  • 与之类似的,Docker 镜像就是用来创建 Docker 容器的只读模板,它是一个特殊的文件系统,不包含任何动态数据,其内容在构建之后再也不会改变,是创建容器的基础

认识镜像

docker images 列出当前 Docker 主机所拥有的镜像列表

在这里插入图片描述

  • 镜像的名称(REPOSITORY+TAG):镜像 ID 能够保证镜像的唯一性,但是不便于记忆,可以使用镜像名称进行操作
  • 镜像的摘要信息(REPOSITORY@摘要值)

在这里插入图片描述

Dockerfile

Dockerfile

默认使用 Dockerfile 文件来描述镜像,Docker 引擎通过读取文件中的指令自动构建镜像

官方示例:

FROM scratch		# 定义基础镜像
COPY hello /		# 将本机目录所在的文件复制到镜像文件系统的根目录
CMD ["/hello"]		# 通过镜像来启动容器时执行的命令

基础镜像与父镜像

  • 父镜像(parent image) 镜像的 Dockerfile 文件中 FROM 指令指定的镜像
  • 基础镜像(base image)镜像的 Dockerfile 文件中没有 FROM 指令或 FROM 指令的值是 scratch (空白镜像) 所构成的镜像
  • 大多数镜像都是从父镜像开始构建

分层结构

传统镜像分层

  • 通过联合文件系统,将处于不同层的1、2、3文件叠加在一起,呈现一个完整的文件系统
  • 便于修改,哪层有问题,不需要修改整个镜像,只需要修改该层的镜像
  • 共享同一个底层镜像,内存也只加载同一个底层镜像,不同镜像的相同部分作为一个独立的镜像层,节省磁盘空间
  • AUFS 是联合文件系统的经典实现,采用了文件的 【写时拷贝】技术
  • 也有一些缺点:
    • 镜像的层数会越来越多?联合文件系统的层数是有一定的限制
    • 许多上层的应用基于相同的底层镜像,如果底层镜像需要修改,维护工作量较大
    • 无法对镜像进行审计,不知道如何创建出来,谁创建的

基于Dockerfile的镜像分层

  • 每一层由镜像的 Dockerfile 指令决定的
  • 除了最后一层,每一层都是只读的

在这里插入图片描述

镜像基本操作

拉取镜像

docker pull <镜像>

  • 本地拉取一个不存在的镜像的时候,会自动去根据镜像名称下载这个镜像,如果不带镜像地址,默认就会从官方的注册中心拉取
  • 如果没有镜像地址,默认拉取官方镜像仓库地址:docker.io(镜像地址)+library(命名空间)+busybox(镜像名称)+镜像标签

在这里插入图片描述

显示镜像列表

命令说明
docker image ls显示本地镜像列表
docker images显示本地镜像列表
docker images -a显示所有镜像
docker images --no-trunc显示完整的镜像信息
docker images -q只显示镜像的ID
docker images --digests显示镜像的摘要值等信息
docker images centos基于具体的镜像标识来显示镜像信息
docker images -f dangling=true显示没有TAG的镜像信息

设置镜像标签

docker tag 源镜像的标识 目标镜像的标识:也就是个镜像重命名一下,不影响原来的镜像

命令说明
docker tag busybox:latest demo:v1给镜像重新打上标签
docker tag df8662dadd4f demo:v2通过镜像ID重新打上标签

查看镜像详情

docker inspect <镜像标识>

命令说明
docker inspect 9211bbaa0dbd通过镜像ID查看镜像的详细信息
docker inspect centos:7通过镜像名称查看镜像的详细信息
docker inspect --format=‘{{.Architecture}}’ 9211bbaa0dbd可以指定格式显示(感觉不好用)

查看镜像构建历史

docker history <镜像标识>

命令说明
docker history centos:7查看镜像构建历史
docker history centos:7 --no-trunc查看镜像构建历史饼显示完整的操作命令(显示不够友好)
docker history centos:7 -H=false镜像大小和构建时间格式输出,更具体

在这里插入图片描述

查找搜索镜像

docker search <镜像标识>:可以搜索DockerHub中的镜像

  • --limit 可以限制搜索条数,默认好像是25个
显示信息说明
NAME镜像仓库源的名称
DESCRIPTION镜像描述
STARS星星数,有点像github那种
OFFICIAL是否官方发布,【OK】表示官方发布的
AUTOMATED是否自动构建,【OK】表示自动构建

删除本地镜像

命令说明
docker rmi <镜像标识1> <镜像标识2> <镜像标识3>删除镜像1、镜像2、镜像3
docker rmi -f <镜像标识1> <镜像标识2> <镜像标识3>强制删除
docker image prune清理未使用过的镜像(只包括虚悬镜像:就是没有TAG且没被其他引用的镜像)
docker images prune -a清理未使用的镜像,虚悬镜像+没有被容器使用的镜像

镜像的导入导出

命令说明
docker save -o <导出镜像文件的名称> <需要导出的本地镜像标识>将本地存在的镜像导出一个特定的文件里面
docker save <需要导出的本地镜像标识> > <导出镜像文件的名称>同上,只是取消了-o选项,使用重定向方式到文件里面
docker load -i <导出镜像文件的名称>将上述导出的镜像进行导入操作

镜像注册中心

  • 注册中心:Registry,注册中心或注册服务器,存放镜像仓库的地方,一个注册中心往往有很多仓库
  • 仓库:Repostitory,仓库或镜像仓库,集中存放某一类镜像,一般包括多个镜像文件,REPOSITORY:TAG 来标识特定版本的镜像
    • 镜像仓库经常以两段形式出现,需要注意一下

在这里插入图片描述

典型的注册中心

  • Docker Hub(貌似被墙了)
  • 阿里云的镜像服务
  • 私有注册中心(Docker Registry、Harbor)

镜像仓库

可以根据镜像的公开程度

  • 公有仓库
  • 私有仓库

harbor 管理

harbor 是什么

  • 一个开源的注册中心
  • 使用策略和基于角色的访问控制来工作
  • 可以扫描容器镜像漏洞
  • CNCF 毕业项目

在这里插入图片描述

harbor 官网链接

Harbor安装与配置

Harbor 社区

Harbor 安装先决条件

harbor 单机搭建

环境说明

环境:RockyLinux8.6

网络环境:联网

内网IP:192.168.1.236

资源:10C10G

基础设置

  1. 关闭防火墙与selinux
  2. 设置主机名和/etc/hosts解析文件
  3. 配置时间同步

在这里插入图片描述

安装docker

下载二进制包

mkdir /opt/software ; cd /opt/software

curl -o docker-24.0.7.tgz \
	https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz

在这里插入图片描述

解压安装

tar xzvf docker-24.0.7.tgz
cp docker/* /usr/bin/
useradd -s /usr/sbin/nologin -M docker

在这里插入图片描述

生成启动文件

### 1
cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
Requires=docker.socket 
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
OOMScoreAdjust=-500
[Install]
WantedBy=multi-user.target
EOF

### 2
cat > /usr/lib/systemd/system/docker.socket << EOF
[Unit]
Description=Docker Socket for the API
[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=docker
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF

启动验证

systemctl daemon-reload
systemctl enable docker --now
docker run hello-world

在这里插入图片描述

安装 docker-compose

cd /opt/software

wget https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-linux-x86_64

mv docker-compose-linux-x86_64   /usr/local/bin/docker-compose

chmod +x   /usr/local/bin/docker-compose

docker-compose -v

在这里插入图片描述

安装 cfssl 证书工具

  • 签发 harbor 证书文件
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl_1.6.0_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssljson_1.6.0_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl-certinfo_1.6.0_linux_amd64

mv cfssl_1.6.0_linux_amd64 /usr/local/bin/cfssl
mv cfssljson_1.6.0_linux_amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_1.6.0_linux_amd64 /usr/local/bin/cfssl-certinfo

chmod +x  /usr/local/bin/cfssl*

cfssl version

在这里插入图片描述

颁发证书

生成 CA 证书机构

mkdir -p  /opt/software/harbor/ssl/
cfssl print-defaults  config > /opt/software/harbor/ssl/ca-config.json

cat >/opt/software/harbor/ssl/ca-config.json <<EOF
{
    "signing": {
        "default": {
            "expiry": "87600h"  
        },
        "profiles": {
            "harbor": {
                "expiry": "87600h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}
EOF

生成并修改默认请求文件

cfssl  print-defaults csr  >/opt/software/harbor/ssl/ca-csr.json

cat >/opt/software/harbor/ssl/ca-csr.json <<EOF
{
    "CN": "harbor",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "Chengdu",
            "L": "chengdu"
        }
    ]
}
EOF

初始化 CA 证书

cfssl gencert -initca /opt/software/harbor/ssl/ca-csr.json | cfssljson -bare /opt/software/harbor/ssl/ca 

在这里插入图片描述

创建修改 Harbor 证书请求文件

cfssl print-defaults csr >/opt/software/harbor/ssl/harbor-csr.json

### 注意修改IP地址
cat >/opt/software/harbor/ssl/harbor-csr.json <<EOF
{
    "CN": "harbor",
    "hosts": [
        "127.0.0.1",
        "192.168.1.236"
    ],  
    "key": {
        "algo": "rsa",
        "size": 2048
    },  
    "names": [
        {   
            "C": "CN",
            "ST": "Chengdu",
            "L": "Chengdu"
        }   
    ]   
}
EOF

CA 向 Harbor 颁发证书

cfssl gencert -ca=/opt/software/harbor/ssl/ca.pem \
	-ca-key=/opt/software/harbor/ssl/ca-key.pem \
	-config=/opt/software/harbor/ssl/ca-config.json \
	-profile=harbor  /opt/software/harbor/ssl/harbor-csr.json \
	| cfssljson -bare  /opt/software/harbor/ssl/harbor 

在这里插入图片描述

安装 harbor

下载离线安装包

cd /opt/software
wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-offline-installer-v2.9.0.tgz

### 解压
tar -xf harbor-offline-installer-v2.9.0.tgz

在这里插入图片描述

导入镜像

docker load -i harbor.v2.9.0.tar.gz

在这里插入图片描述

修改配置文件

cp harbor.yml.tmpl harbor.yml

### 修改配置文件
hostname: 192.168.1.236
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /opt/software/harbor/ssl/harbor.pem		### 证书路径
  private_key: /opt/software/harbor/ssl/harbor-key.pem			### 证书路径
  
data_volume: /opt/software/harbor/data 							### 数据目录
metric:										### 打开监控
   enabled: true
   port: 9090
   path: /metrics

加载配置

### 注意目录
./prepare

在这里插入图片描述

安装启动

./install.sh  --with-trivy

在这里插入图片描述

在这里插入图片描述

检查服务状态

docker-compose ps

在这里插入图片描述

访问验证:默认密码Harbor12345

在这里插入图片描述

harbor 基本操作

配置注册中心到docker

### cat /etc/docker/daemon.json 新增即可
{
  "registry-mirrors": ["https://xpd691zc.mirror.aliyuncs.com"],
  "insecure-registries":["https://192.168.1.236"]
}



### 还需要复制注册中心的证书到docker
mkdir -p /etc/docker/certs.d/192.168.1.236
cd  /etc/docker/certs.d/192.168.1.236
cp /opt/software/harbor/ssl/harbor* ./


### 重启即可
systemctl daemon-reload
systemctl restart docker

在这里插入图片描述

启停服务

解压后的目录–》docker-compose down–》docker-compose up -d

在这里插入图片描述

数据监控

浏览器访问9090的/metrics路径

  • 需要对接其他数据展示

在这里插入图片描述

推送镜像到注册中心的公共仓库

### 登陆注册中心
docker login 192.168.1.236

### tag一下后推送
docker tag mysql 192.168.1.236/library/mysql:v1
docker push 192.168.1.236/library/mysql:v1

在这里插入图片描述

前端查看

在这里插入图片描述

扫描一下

在这里插入图片描述

在这里插入图片描述

![外链图片转

harbor 镜像复制

harbor实例复制到另一个 harbor 实例的过程

部署另一套 harbor

在这里插入图片描述

配置镜像复制

浏览器访问 192.168.1.236的注册中心地址后台

【仓库管理】:新建目标

在这里插入图片描述

在这里插入图片描述

【复制管理】:新建规则(每个选项都有一定的说明,根据实际情况选择即可)

在这里插入图片描述

验证一下:

  1. 上传一个新的镜像到192.168.1.236注册中心

在这里插入图片描述

  1. 登陆236注册中心的后台:【复制管理】–【选择规则】–【复制】

在这里插入图片描述

  1. 查看结果

在这里插入图片描述

  1. 登陆237注册中心查看:符合预期

在这里插入图片描述

总结性

  • 可以配置专属的复制用户
  • 分不同命名空间,不同复制策略(复制模式、镜像过滤、复制触发模式、复制带宽限制等)

?

文章来源:https://blog.csdn.net/whale0306/article/details/135819800
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。