文章目录
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 单机搭建
环境说明
环境:RockyLinux8.6
网络环境:联网
内网IP:192.168.1.236
资源:10C10G
基础设置
- 关闭防火墙与selinux
- 设置主机名和/etc/hosts解析文件
- 配置时间同步
安装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的注册中心地址后台
【仓库管理】:新建目标
【复制管理】:新建规则(每个选项都有一定的说明,根据实际情况选择即可)
验证一下:
- 上传一个新的镜像到192.168.1.236注册中心
- 登陆236注册中心的后台:【复制管理】–【选择规则】–【复制】
- 查看结果
- 登陆237注册中心查看:符合预期
总结性
- 可以配置专属的复制用户
- 分不同命名空间,不同复制策略(复制模式、镜像过滤、复制触发模式、复制带宽限制等)