【云原生Docker篇】Docker仓库管理Harbor和单机编排Compose

149 阅读13分钟

docker仓库管理

一、什么是镜像仓库Registry

统一保存镜像而且是多个不同镜像版本的地方,叫做镜像仓库

  • Docker hub: docker官方的公共仓库,已经保存了大量的常用镜像,可以方便大家直接使用
  • 阿里云,网易等第三方镜像的公共仓库
  • Image registry: docker 官方提供的私有仓库部署工具,无图形化界面,管理起来较为复杂,目前使用较少
  • Harbor: vmware 提供的自带web界面自带认证功能的镜像私有仓库,目前有很多公司使用

二、Harbor的概述

Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,由VMware开源,其通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源 Docker Distribution。作为一个企业级私有Registry服务器,Harbor 提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有 Registry 中,确保数据和知识产权在公司内部网络中管控,另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

三、Harbor的特性

  • 基于角色控制:用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不同的权限。

  • 基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制(同步)。

  • 支持 LDAP/AD:Harbor 可以集成企业内部已有的 AD/LDAP(类似数据库的一张表),用于对已经存在的用户认证和管理。

  • 镜像删除和垃圾回收:镜像可以被删除,也可以回收镜像占用的空间。

  • 图形化用户界面:用户可以通过浏览器来浏览,搜索镜像仓库以及对项目进行管理。

  • 审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。

  • 支持 RESTful API:RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。

  • Harbor和docker registry的关系:Harbor实质上是对docker registry做了封装,扩展了自己的业务模板。

四、Harbor的结构

Harbor 在架构上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 共6大组件。

image-20240805150407185.png

image-20240806005530089.png

Harbor的六大组件

  • Proxy代理:是一个 nginx 的前端代理,Harbor 的 Registry、UI、Token 服务等组件, 都处在 nginx 反向代理后边。 该代理将来自浏览器、docker clients 的请求转发到后端不同的服务上。

  • Registry仓库:负责储存 Docker 镜像,并处理 Docker push/pull 命令。由于要对用户进行访问控制, 即不同用户对 Docker 镜像 有不同的读写权限,Registry 会指向一个 Token 服务, 强制用户的每次 Docker pull/push 请求都要携带一个合法的 Token, Registry 会通过公钥对 Token 进行解密验证。

  • Core services核心服务:Harbor的核心功能,主要提供以下3个服务:

    • UI图形化界面(harbor-ui):帮助用户管理 Registry 上的镜像(image), 并对用户进行授权。
    • WebHook:为了及时获取Registry 上image 状态变化的情况,在Registry 上配置 Webhook,把状态变化传递给 UI 模块。
    • Token 服务负责根据用户权限给每个 Docker push/pull 命令签发 Token。Docker 客户端向 Registry 服务发起的请求, 如果不包含 Token,会被重定向到 Token 服务,获得 Token 后再重新向 Registry 进行请求。
  • Database(harbor-db)数据库:为core services提供数据库服务,负责储存用户权限、审计日志、Docker 镜像分组信息等数据。

  • Job services: 主要用于镜像复制,本地镜像可以被同步到远程 Harbor 实例上。

  • Log collector(harbor-log): 日志管理。负责收集其他组件的日志到一个地方。

五、安装Harbor

安装Harbor之前必须要安装docker-compose

  • 安装 docker-compose 工具
#关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

#yum安装docker-compose
[root@localhost ~]# yum install epel-release.noarch -y
[root@localhost ~]# yum install docker-compose -y

#二进制安装
[root@localhost ~]# cd /mnt 
[root@localhost mnt]# ls 
docker-compose-Linux-x86_64-1.27.4 harbor-offline-installer-v1.7.6.tgz nginx.tar 
[root@localhost mnt]# cp -a docker-compose-Linux-x86_64-1.27.4 /usr/bin/docker-compose 
[root@localhost mnt]# chmod +x /usr/bin/docker-compose 
[root@localhost mnt]# docker-compose version
docker-compose version 1.27.4, build 40524192
docker-py version: 4.3.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
  • 安装Harbor
#准备Harbor软件
[root@localhost mnt]# tar xf harbor-offline-installer-v1.7.6.tgz
[root@localhost mnt]# cd harbor/
[root@localhost harbor]# ls
common                          docker-compose.clair.yml   docker-compose.yml  harbor.v1.7.6.tar.gz  LICENSE              prepare
docker-compose.chartmuseum.yml  docker-compose.notary.yml  harbor.cfg          install.sh            open_source_license
注意:docker-compose.yml     //文件编排的文本文档,依靠这个文件自动拉取镜像

#修改配置文件
[root@localhost harbor]# vim harbor.cfg
  8 hostname = 192.168.100.20        //主机
 70 harbor_admin_password = 123456   //密码

#检测环境#
[root@localhost harbor]#  ./prepare  //脚本,是用来检测环境的。注意:该脚本必须在当前的harbor目录中运行。因为脚本会调用docker-compose.yml文件

执行安装脚本
[root@localhost harbor]#  ./install.sh 

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

  • web浏览器操作

用户名: admin 密码: 123456

image.png

  • 新建项目

image.png

image.png

  • 命令行登录

注意:默认是通过https协议, 无法登录

[root@localhost harbor]# docker login 192.168.100.20
Username: admin
Password: 123456
Error response from daemon: Get "https://192.168.100.20/v2/": dial tcp 192.168.100.20:443: connect: connection refused

image.png

  • 修改 service 文件
#修改 service 文件
[root@localhost harbor]# vim /usr/lib/systemd/system/docker.service
 13 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.100.20

[root@localhost harbor]# systemctl daemon-reload
[root@localhost harbor]# systemctl restart docker

#再重新执行一遍脚本
[root@localhost harbor]# ./install.sh  

image.png

image.png

image.png

  • 命令行重新登录
[root@localhost harbor]# docker login 192.168.100.20
Username: admin
Password: 123456

image.png

  • 测试上传仓库
 #下载镜像
 [root@localhost harbor]# docker pull nginx:1.18

image.png

  • 打上标签
[root@localhost harbor]# docker tag nginx:1.18 192.168.100.20/lhey/nginx:1.18
[root@localhost harbor]# docker images
REPOSITORY                      TAG             IMAGE ID       CREATED       SIZE
192.168.100.20/lhey/nginx       1.18            c2c45d506085   3 years ago   133MB
nginx                           1.18            c2c45d506085   3 years ago   133MB

image.png

  • 上传
[root@localhost harbor]# docker push 192.168.100.20/lhey/nginx:1.18
The push refers to repository [192.168.100.20/lhey/nginx]
4fa6704c8474: Mounted from test/nginx 
4fe7d87c8e14: Mounted from test/nginx 
6fcbf7acaafd: Mounted from test/nginx 
f3fdf88f1cb7: Mounted from test/nginx 
7e718b9c0c8c: Mounted from test/nginx 
1.18: digest: sha256:9b0fc8e09ae1abb0144ce57018fc1e13d23abd108540f135dc83c0ed661081cf size: 1362

image.png

image.png

image.png

单机编排 Compose

一、Docker Compse 的概述

docker-compose 项目是Docker官方的开源项目,负责实现对Docker 容器集群的快速编排,docker-compose 将所管理的容器分为三层,分别是 工程(project)服务(service) 以及 容器(container)

docker-compose 是一个可以实现在单机上对容器集群编排管理的工具。

它允许用户使用 docker-compose.yml 配置模板文件来定义应用程序的配置,包括容器的数量、容器之间的依赖关系、环境变量、端口映射以及数据卷等设置。

然后,用户使用docker-compose命令根据指定配置模板文件的配置来启动和管理容器集群。

1. 单机编排工具

容器的核心在于编排,也就是批量操作

常见的编排工具有:K8S、compose、openstack(华为用的这个工具的二开)

  • docker-compose 是单机编排
  • k8s 是多机编排

k8s是很好的编排软件,但是构建镜像还是要使用dockerfile,这个没办法使用k8s

2. docker-compose 作用

如果说docker命令就像linux的命令,那么docker-compse就像shell脚本,可以自动的执行容器批量操作,从而实现自动化的容器管理;或者说docker命令相当于ansible命令,那么docker compose文件,就相当于ansible-playbook的yaml文件

docker-compose 作用

  • 调用dockerfile,构建镜像,并且使用该镜像
  • 创建容器
  • 创建多个容器副本
  • 删除镜像

3. YAML 语言

YAML是一种标记语言,可以很直观的展示数据序列化格式,可读性很高。类似于json数据描述语言,语法比json简单很多,关于yaml数据格式

  • YAML数据结构通过缩进来表示字段的层级
  • 连续的项目通过减号来表示
  • 键值对用冒号分隔
  • 数组用中括号 [] 括起来
  • hash 用花括号 {} 括起来

关于yaml的注意事项

  • 大小写敏感
  • 通过缩进表示层级关系
  • 不支持制表符 tab 键缩进,只能使用空格缩进
  • 缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格
  • 用 # 号注释
  • 符号字符后缩进1个空格,如冒号 : 、逗号 , 、横杠 -
  • 如果包含特殊字符用单引号('')引起来会作为普通字符串处理,双引号(""): 特殊字符作为本身想表示的意思

4. docker-compose 命令行工具指令

命令只能在 docker-compose.yaml的目录下执行

注意:这是命令行、终端的指令

命令含义
build构建镜像
up调用docker-compose.yaml文件,来启动容器。 如果想后台启动,就是加-d
down#停止和删除所有容器、网络、镜像和卷
bundle从当前docker compose 文件生成一个以<当前目录>为名称的json格式的Docker Bundle 备份文件
config -q查看当前配置,没有错误不输出任何信息
create创建服务,较少使用
events输出日志。从容器接收实时事件,可以指定json 日志格式,较少使用
exec进入指定容器进行操作
help显示帮助细信息
images显示镜像信息,较少使用
kill强制删除。 强制终止运行中的容器
logs查看容器的日志
pause暂停服务
port查看端口
ps列出容器,较少使用。docker-compose ps 等价于 docker ps -a
pull重新拉取镜像。镜像发生变化后,需要重新拉取镜像,较少使用
push上传镜像
restart重启服务。较少使用
rm删除。 删除已经停止的服务
run运行一次性运行容器
scale设置指定服务运行的容器个数
start启动服务。较少使用
stop停止服务。较少使用
top显示容器运行状态
unpause取消暂定

注意:如果想使用docker-compose指令,那么一定要有docker-compose.yaml文件,并且在当前文件夹下。如果不是默认的docker-compose文件,要用-f命令,就和dockerfile一样

示例

 docker-compose up       #调用docker-compose.yaml文件,来启动容器
 docker-compose up -d    #后台调用docker-compose.yaml文件,来启动容器
 docker-compose down     #停止和删除所有容器、网络、镜像和卷

5. docker-compose 编排工具

与上面指令不同的是:下面这些指令是写在docker-compose.yaml文件里的,是文件里的指令,作用是用来编排容器的。

指令含义演示
build指定构建上下文和可选的Dockerfile用于构建镜像。build: context: /opt/test dockerfile: Dockerfile
dockerfile指定Dockerfile的路径。通常在build部分中使用。dockerfile: Dockerfile.prod
context指定构建上下文的路径,即包含Dockerfile和构建上下文的目录路径context: /opt/test
image指定用于服务/容器的镜像名称。image: myapp:latest
command覆盖由镜像指定的默认命令,类似于dockerfile中的CMDcommand: ["python", "app.py"]
container_name为容器指定自定义名称。container_name: my_container
deploy指定部署选项,如副本和放置deploy: replicas: 3
environment为服务指定环境变量environment: - DEBUG=true
networks指定连接服务的网络networks: - frontend - backend
network_mode指定容器的网络模式network_mode: "host"
ports:将容器端口映射到主机端口ports: - "8080:80" 前面是真机,后面是容器
volumes挂载主机或其他容器的卷volumes: - "nginx-data:/usr/local/nginx/html
volumes_from从另一个服务/容器挂载卷volumes_from: - data-container
hostname:指定主机名hostname: my-container
sysctls为容器设置内核参数sysctls: - net.core.somaxconn=1024
restart重启策略restart: always
depends_on指定该服务依赖的其他服务depends_on: - mysql

注意:上面是列举一个常用的指令,如果想要了解其他的指令,需要查看官方文档。

官方文档: docs.docker.com/compose/ref…

示例

 build
     context: /opt/test
     dockerfile: Dockerfile
     构建镜像

二、安装Docker Compose

Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后再单独安装 Docker Compose

  • 安装 Docker Compose
#关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

#yum安装docker-compose
[root@localhost ~]# yum install epel-release.noarch -y
[root@localhost ~]# yum install docker-compose -y

[root@localhost ~]# cd /opt   //上传安装包
[root@localhost opt]# ls
containerd  docker-compose-Linux-x86_64-1.27.4  rh
[root@localhost opt]# chmod +x docker-compose-Linux-x86_64-1.27.4
[root@localhost opt]# cp -a docker-compose-Linux-x86_64-1.27.4 /usr/bin/docker-compose

[root@localhost opt]# docker-compose version       //查看版本
docker-compose version 1.27.4, build 40524192
docker-py version: 4.3.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

三、docker-compose 实际操作

1. 启动单台容器

[root@localhost opt]# mkdir -p /opt/compose_nginx/nginx
[root@localhost opt]# cd compose_nginx/
[root@localhost compose_nginx]# ls
nginx
  • 准备yml文件
[root@localhost compose_nginx]# vim docker-compose.yml
server-nginx-web:
  image: nginx
  container_name: web1
  expose:
   - 80
   - 443
  ports:
    - "8080:80"
    - "8443:443"
  • 检查语法
[root@localhost compose_nginx]# docker-compose config
services:
  server-nginx-web:
    container_name: web1
    expose:
    - 80
    - 443
    image: nginx
    network_mode: bridge
    ports:
    - 8080:80/tcp
    - 8443:443/tcp
version: '1'


[root@localhost compose_nginx]# docker-compose config -q  //静默模式,不输出在屏幕上
[root@localhost compose_nginx]# echo $?
0
  • 启动
[root@localhost compose_nginx]# docker-compose up     //前台启动
[root@localhost compose_nginx]# docker-compose up -d  //后台启动
[root@localhost compose_nginx]# docker-compose ps     //类似于docker ps -a

[root@localhost compose_nginx]# curl 127.0.0.1:8080   //验证网页
  • 关闭

    • 使用 docker-compose down 会将容器直接删除,镜像也会删除
    • 使用 docker-compose kill 只是退出容器
    • 使用 docker-compose rm 只删除停止的容器
  • 查看事件 docker-compose events

2. 启动多台容器

  • 编辑 docker-compose.yml 文件
[root@localhost compose_nginx]# vim docker-compose.yml
server-nginx-web:
  image: nginx
  container_name: web1
  expose:
   - 80
   - 443
  ports:
    - "8001:80"
    - "8443:443"
server-tomcat:
  image: tomcat
  container_name: tomcat1
  
[root@localhost compose_nginx]# docker-compose config -q  //检查语法格式
[root@localhost compose_nginx]# docker-compose up         //启动
[root@localhost compose_nginx]# docker ps -a              //显示所有容器

3. 调用dockerfile文件 执行编排

  • 编辑 Dockerfile 文件
[root@localhost opt]# cd /opt/compose_nginx/nginx/
[root@localhost nginx]# vim Dockerfile
FROM  centos:centos7.9.2009
LABEL author="zhou cloud"  \
      version="1.0"       \
      description="test"
RUN   rm -rf  /etc/yum.repos.d/
ADD   qh.repo   /etc/yum.repos.d/
RUN   yum -y install gcc gcc-c++ make automake pcre pcre-devel zlib  zlib-devel openssl openssl-devel wget
ADD   nginx-1.18.0.tar.gz   /usr/local/src
RUN   cd  /usr/local/src/nginx-1.18.0  && ./configure  --prefix=/apps/nginx  && make   &&  make install
COPY  index.html    /apps/nginx/html
EXPOSE 80
CMD   ["-g","daemon off;"]
ENTRYPOINT   ["/apps/nginx/sbin/nginx"]

[root@localhost nginx]# echo "compose test page" > index.html
[root@localhost nginx]# cp /data/dockerfile/system/centos/centos7/qh.repo .
[root@localhost nginx]# cp /data/dockerfile/system/centos/centos7/nginx-1.18.0.tar.gz .
[root@localhost nginx]# ls
Dockerfile  index.html  nginx-1.18.0.tar.gz  qh.repo  //准备好上述Dockerfile中所写的文件
  • 编辑 compose 文件
[root@localhost nginx]# cd ..
[root@localhost compose_nginx]# vim docker-compose.yml
services:
  nginx:
    container_name: web1
    hostname: nginx
    build:
      context: /opt/compose_nginx/nginx    //注意路径,Dockerfile文件存放位置
      dockerfile: Dockerfile
    ports:
      - 1216:80
      - 1217:443
    networks:
      mynet:
        ipv4_address: 172.18.0.10
    volumes:
      - ./wwwroot:/apps/nginx/html   //注意路径
networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16
 

#说明
services: 定义了要运行的服务。
nginx: Nginx 服务的配置。
container_name: 指定容器的名称为 web1。
hostname: 指定容器的主机名为 nginx。
build: 指定了构建 Nginx 容器所需的上下文和 Dockerfile。
ports: 将主机端口 1216 映射到容器的 80 端口,将主机端口 1217 映射到容器的 443 端口。
networks: 将服务连接到名为 lnmp 的自定义网络。
volumes: 将主机上的 ./wwwroot 目录挂载到容器中的 /usr/local/nginx/html 目录。

networks: 定义了自定义网络。
lnmp: 自定义网络的配置。
driver: 网络驱动程序为 bridge。
ipam: IP 地址管理配置。
config: 子网配置,指定了 IP 地址范围。       
  • 启动
[root@localhost compose_nginx]# docker-compose config  //检查语法
[root@localhost compose_nginx]# docker-compose build   //构建镜像
[root@localhost compose_nginx]# docker-compose up      //启动镜像