docker 镜像管理

文章目录

  • docker 镜像管理
    • 镜像基础操作
      • 镜像概念
      • 认识镜像
      • Dockerfile
      • 分层结构
    • 镜像基本操作
      • 拉取镜像
      • 显示镜像列表
      • 设置镜像标签
      • 查看镜像详情
      • 查看镜像构建历史
      • 查找搜索镜像
      • 删除本地镜像
      • 镜像的导入导出
    • 镜像注册中心
      • 典型的注册中心
      • 镜像仓库
    • harbor 管理
      • harbor 是什么
      • harbor 官网链接
      • harbor 单机搭建
      • harbor 基本操作
      • harbor 镜像复制

docker 镜像管理

镜像基础操作

镜像概念

Image

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

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

认识镜像

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

docker 镜像管理_第1张图片

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

docker 镜像管理_第2张图片

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 镜像管理_第3张图片

镜像基本操作

拉取镜像

docker pull <镜像>

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

docker 镜像管理_第4张图片

显示镜像列表

命令 说明
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 镜像管理_第5张图片

查找搜索镜像

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 镜像管理_第6张图片

典型的注册中心

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

镜像仓库

可以根据镜像的公开程度

  • 公有仓库
  • 私有仓库

harbor 管理

harbor 是什么

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

docker 镜像管理_第7张图片

harbor 官网链接

Harbor安装与配置

Harbor 社区

Harbor 安装先决条件

harbor 单机搭建

环境说明

环境:RockyLinux8.6

网络环境:联网

内网IP:192.168.1.236

资源:10C10G

基础设置

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

docker 镜像管理_第8张图片

安装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

docker 镜像管理_第9张图片

解压安装

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

docker 镜像管理_第10张图片

生成启动文件

### 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 镜像管理_第11张图片

安装 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

docker 镜像管理_第12张图片

安装 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

docker 镜像管理_第13张图片

颁发证书

生成 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 

docker 镜像管理_第14张图片

创建修改 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 

docker 镜像管理_第15张图片

安装 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 镜像管理_第16张图片

导入镜像

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

docker 镜像管理_第17张图片

修改配置文件

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

docker 镜像管理_第18张图片

安装启动

./install.sh  --with-trivy

docker 镜像管理_第19张图片

docker 镜像管理_第20张图片

检查服务状态

docker-compose ps

docker 镜像管理_第21张图片

访问验证:默认密码Harbor12345

docker 镜像管理_第22张图片

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 镜像管理_第23张图片

启停服务

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

docker 镜像管理_第24张图片

数据监控

浏览器访问9090的/metrics路径

  • 需要对接其他数据展示

docker 镜像管理_第25张图片

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

### 登陆注册中心
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

docker 镜像管理_第26张图片

前端查看

docker 镜像管理_第27张图片

扫描一下

docker 镜像管理_第28张图片

docker 镜像管理_第29张图片

docker 镜像管理_第30张图片

harbor 镜像复制

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

部署另一套 harbor

docker 镜像管理_第31张图片

配置镜像复制

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

【仓库管理】:新建目标

docker 镜像管理_第32张图片

docker 镜像管理_第33张图片

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

docker 镜像管理_第34张图片

验证一下:

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

在这里插入图片描述

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

docker 镜像管理_第35张图片

  1. 查看结果

docker 镜像管理_第36张图片

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

docker 镜像管理_第37张图片

总结性

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

你可能感兴趣的:(Kubernetes笔记,docker,容器,运维,笔记)