Docker 私有仓库部署和管理
技能目标:
理解Docker 网络原理
- 掌握Compose 的安装及YAML 文件详解
- 掌握Docker 服务自动注册和更新
- 理解Harbor 工作原理
- 掌握Harbor 安装部署
- 掌握Harbor 日常操作管理
案例一 概述

什么是 Docker Compose
Docker Compose 的前身是 Fig,它是一个定义及运行多个 Docker 容器的工具。使用Docker Compose 时,只需要在一个配置文件中定义多个 Docker 容器,然后使用一条命令启动这些容器。Docker Compose 会通过解析容器间的依赖关系按先后顺序启动所定义的容器。

什么是 Consul
Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案不同,与 Airbnb 的 SmartStack 等相比,Consul 的方案更“一站式”,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具(例如 ZooKeeper 等),使用起来也较为简单。Consul 是基于 Golang 语言开发实现的,因此具有天然可移植性(支持 Linux、windows 和 Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。

案例一:使用 docker-compose 搭建 consul 集群环境
案例实验环境和需求:

安装Docker Compose
因为Docker Compose依赖Docker 所以安装之前要先安装Docker
安装Docker
这里我直接用curl的安装方式
[root@localhost ~]# curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
[root@localhost ~]# docker version
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
安装Docker Compose
方法1:
上传docker-compose文件到服务器中

[root@localhost ~]# mv docker-compose /usr/local/bin/

方法2:
直接使用curl的安装方法

[root@localhost ~]# chmod +x /usr/local/bin/docker-compose
[root@localhost ~]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
[root@localhost ~]# docker-compose --version
案例一 实施:

Docker 网络通信
Docker 提供了映射容器端口到宿主机和容器互联两种机制来为容器提供网络服务。
1.端口映射
在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务。端口映射机制将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。

这个是提供给外部网络访问容器中的服务的,在Docker基本管理的文章中中已经演示过了
2.容器互联
容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。
如果不建立容器互联的,容器和容器之前只能用IP来进行通信,但容器如果重启后它的IP也会更新,这样就非常麻烦了
在运行 docker run 命令时使用–link 选项实现容器之间的互联通信。
格式:
–link [源容器名]:别名
其中 name 是要连接的容器名称,alias 是该连接的别名。
注意:容器互联是通过容器的名称来执行的,–name 选项可以给容器创建一个友好的名称,这个名称是唯一的。
-
首先下载基础镜像
[root@localhost ~]# docker pull centos

-
创建启动源容器centos1
使用 docker run 命令建立源容器 ,使用–name 指定容器名称为centos1。
[root@localhost ~]# docker run -itd --name centos1 -P centos:latest -
创建接收容器
使用 docker run 命令建立接收容器,–name 指定名称为centos2,–link 指定连接容器以实现容器互联。
[root@localhost ~]# docker run -itd --name centos2 --link centos1:centos1 -P centos:latest -
测试容器互联
最简单的检测方法是进入容器,使用 ping 命令查看容器是否相互连通。
注意:我们ping的是源容器的别名

此时,可以看到容器 centos2 与容器 centos1 已经建立互联关系。这时 Docker 在两个互联的容器之间创建了一条安全隧道,而且不用映射它们的端口到宿主机上,从而避免暴露端口到外部网络。
这时容器中的host文件中也添加了一条为 centos1 的解析
注意:如果创建源容器时没有用 --link 指定接受容器时,源容器是无法和接收容器通信的
注意:若 httpd 镜像基于 Debian 系统制作,则不存在 ping 命令,需执行如下命令进行安装。
apt-get update && apt install iputils-ping
Docker Compose 容器编排
Compose 是 Docker 的服务编排工具,主要用来构建基于 Docker 的复杂应用 Compose通过一个配置文件管理多个 Docker 容器,非常适合组合使用多个容器进行开发的场景。
文件格式及编写注意事项
YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 XML数据描述语言,语法比 XML 简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [] 括起来, hash 用花括号 {} 括起来。
使用 YAML 时需要注意下面事项:
(1)不支持制表符 tab 键缩进,需要使用空格缩进。
(2)通常开头缩进两个空格。
(3)字符后缩进一个空格,如冒号、逗号、横杆。
(4)用#号注释。
(5)如果包含特殊字符,要使用单引号(’’)引起来。
(6)布尔值(true、 false、 yes、 no、 on、 off)必须用引号("")括起来,这样分析器会将它们解释为字符串。

配置常用字段描述

Docker Compose 常用命令

Docker Compose 文件结构

Docker-compose部署示例
其实就是一次创建启动多个容器
[root@localhost ~]# mkdir compose
[root@localhost ~]# cd compose/
[root@localhost compose]# vim docker-compose.yml

[root@localhost compose]# mkdir nginx
[root@localhost compose]# cd nginx/
[root@localhost nginx]# vim Dockerfile

[root@localhost compose]# mkdir mysql
[root@localhost compose]# cd mysql/
[root@localhost mysql]# vim Dockerfile

[root@localhost compose]# vim mysql.env
这个是登录mysql的账号密码文件

查看的是compose的目录结构

启动 docker-compose 构建启动服务
- 前台运行
[root@localhost compose]# docker-compose up - 后台运行
[root@localhost compose]# docker-compose docker-compose.yml up -d
当然也可不用跟docker-compose.yml文件直接 -d 启动
可以再开一个终端使用下面的命令动态一直查看
[root@consul compose]# watch docker-compose ps

查看生成的镜像和容器

Docker-compose分离部署lnmp
其实就是创建多个容器服务的同时又以让容器中的服务和其他容器中的服务之间相互通信
因为之前已经部署了mysql容器和nginx容器,为了避免一些冲突,所以在部署前要一个干净的服务器环境。
创建compose-lnmp目录并创建docker-compose.yml 文件
[root@localhost ~]# mkdir compose-lnmp
[root@localhost ~]# cd compose-lnmp/
[root@localhost compose-lnmp]# vim docker-compose.yml

创建mysql目录并创建Dockerfile文件
[root@localhost compose-lnmp]# mkdir mysql
[root@localhost compose-lnmp]# cd mysql/
[root@localhost mysql]# vim Dockerfile

配置mysql数据库的账号密码
[root@localhost mysql]# vim mysql.env

创建php目录并创建php的Dockerfile文件
[root@localhost compose-lnmp]# mkdir php
[root@localhost compose-lnmp]# cd php/
[root@localhost php]# vim Dockerfile

创建php的网页文件
[root@localhost php]# vim index.php

创建php的配置文件
[root@localhost php]# vim www.conf

创建nginx目录并创建关于nginx的Dockerfile文件
[root@localhost compose-lnmp]# mkdir nginx
[root@localhost compose-lnmp]# cd nginx/
[root@localhost nginx]# vim Dockerfile

创建nginx.conf 的配置文件
[root@localhost nginx]# vim nginx.conf


后台启动docker-compose.yml 文件
[root@localhost compose-lnmp]# docker-compose up -d

动态一直查看创建容器状态
[root@localhost compose-lnmp]# watch docker-compose ps

客户端使用浏览器访问192.168.10.101/index.php 验证 docker-compose 创建的 LNMP 环境

如果访问192.168.10.101:80 的nginx的网页的话是能访问到nginx但会出现403错误,这是因为我们能访问到nginx只是网页没有正常显示。

基于 Nginx 和 Consul 构建自动发现的 Docker 服务架构
服务器配置
| 操作系统 | 主机名 | 配置 | IP | 数量 | 服务 |
|---|---|---|---|---|---|
| Centos7.9 | consul | 2C/4G | 192.168.10.101 | 1 | docker、docker-compose、consul、Consul-Template |
| Centos7.9 | registrator | 2C/4G | 192.168.10.102 | 1 | docker、registrator |
建立 Consul 服务
要想利用 Consul 提供的服务实现服务的注册与发现,需要建立 Consul 服务。在 Consul方案中,每个提供服务的节点上都要部署和运行 Consul 的 Agent,所有运行 Consul Agent 节点的集合构成 Consul Cluster。Consul Agent 有两种运行模式:Server 和 Client。这里的Server 和 Client 只是 Consul 集群层面的区分,与搭建在 Cluster 之上的应用服务无关。以Server 模式运行的 Consul Agent 节点用于维护 Consul 集群的状态,官方建议每个 Consul Cluster 至少有 3 个或以上的运行在 Server mode 的 Agent,Client 节点不限。
安装Consul
方法1:
关闭防火墙
[root@registrator ~]# systemctl stop firewalld
[root@registrator ~]# systemctl disable firewalld
修改主机名
[root@localhost ~]# hostname consul
[root@localhost ~]# bash
[root@consul ~]#
先上传Consul安装包到服务器Consul上面
[root@consul ~]# mkdir consul
[root@consul ~]# cd consul/
上传consul_1.9.4_linux_amd64.zip压缩包到/root/consul目录下

创建存放数据的目录
[root@consul ~]# mkdir -p /data/consul
启动consul

其中的命令参数:
- -bootstrap:用来控制一个 server 是否在 bootstrap 模式,在一个 datacenter 中只能有一个server 处于 bootstrap 模式,当一个 server 处于 bootstrap 模式时,可以自己选举为 raftleader。
- -data-dir 参数指定数据存储目录
- -bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0。
- -ui 参数指定开启 UI 界面,这样可以通过 http://localhost:8500/ui 这样的地址访问 consul 自带的 web UI 界面。
- -client consul 绑定在哪个 client 地址上,这个地址提供 HTTP、DNS、RPC 等服务, 默认是 127.0.0.1。
- -node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。
方法2:
[root@consul ~]# mkdir consul
[root@consul ~]# mkdir -p /data/consul
[root@consul ~]# cd consul
[root@consul ~]# wget https://releases.hashicorp.com/consul/1.9.4/consul_1.9.4_linux_amd64.zip
[root@consul ~]# mv consul /usr/bin/

安装 consul 是用于服务注册,也就是容器本身的一些信息注册到 consul 里面,其他程序可以通过 consul 获取注册的相关服务信息,这就是服务注册与发现
consul常用命令
- consul members //查看群集信息
- curl 127.0.0.1:8500/v1/status/peers //查看集群 server 成员
- curl 127.0.0.1:8500/v1/status/leader // 集 群 Raf leader
- curl 127.0.0.1:8500/v1/catalog/services //注册的所有服务
- curl 127.0.0.1:8500/v1/catalog/nginx //查看nginx 服务信息
- curl 127.0.0.1:8500/v1/catalog/nodes //集群节点详细信息
容器服务自动加入 Nginx 集群
修改主机名
[root@localhost ~]# hostname registrator
[root@localhost ~]# bash
[root@registrator ~]#
关闭防火墙
[root@registrator ~]# systemctl stop firewalld
[root@registrator ~]# systemctl disable firewalld
安装 Gliderlabs/Registrator在registrator主机上
Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。目前支持 Consul、Etcd 和 SkyDNS2


测试服务发现功能是否正常
[root@registrator ~]# docker run -itd -p:83:80 --name test-01 -h test01 nginx
[root@registrator ~]# docker run -itd -p:84:80 --name test-02 -h test02 nginx
[root@registrator ~]# docker run -itd -p:88:80 --name test-03 -h test03 httpd
[root@registrator ~]# docker run -itd -p:89:80 --name test-04 -h test04 httpd

验证 http 和 nginx 服务是否注册到 consul方法1:

验证 http 和 nginx 服务是否注册到 consul方法2:
浏览器中,输入 http://192.168.10.101:8500,在 Web 页面中“单击 NODES”,然后单击“consurl-server01”,会出现 5 个服务,如下图

从结果看,httpd 和 nginx 服务已经注册到 consul 里面,说明服务正常。
安装 consul-template,在consul主机操作
Consul-Template 是基于 Consul 的自动替换配置文件的应用。在 Consul-Template 没出现之前,构建服务大多采用的与 Zookeeper、Etcd+Confd 类似的系统。
Consul-Template 是一个守护进程,用于实时查询 Consul 集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx。
Consul-Template 可以查询 Consul 中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers 、 Haproxy Backends 、 Varnish Servers 、 Application、 Configurations 等。
准备 template nginx 模板文件
[root@consul ~]# vim /root/consul/nginx.ctmpl
配置文件中画红线的部分指定的/var/log/nginx/目录是没有的需要我们手动创建的,而后面的kgc.cn-access.log; 文件是启动template后自动创建的。
[root@consul sbin]# mkdir /var/log/nginx
如果不创建的话启动nginx时就会报错,提示没有/var/log/ngixn/目录需要手动创建。

编译安装 nginx
[root@consul ~]# wget http://nginx.org/download/nginx-1.15.2.tar.gz
[root@consul ~]# tar zxvf nginx-1.15.2.tar.gz
[root@consul ~]# cd nginx-1.15.2
[root@consul ~]# yum -y install gcc make pcre-devel zlib-devel tar zlib
[root@consul ~]# ./configure --prefix=/usr/local/nginx && make && make install
配置 nginx
在配置文件中指定存放虚拟主机文件的路径和定义虚拟主机文件的后缀
[root@consul ~]# vim /usr/local/nginx/conf/nginx.conf
//在 http 段里面添加虚拟主机目录,注释原来的include
创建虚拟主机存放的目录vhost
[root@consul ~]# mkdir /usr/local/nginx/conf/vhost/
[root@consul ~]# /usr/local/nginx/sbin/nginx
重载nginx
[root@consul ~]# /usr/local/nginx/sbin/nginx -s reload
如果不重载的话 启动会报错,提示让重载nginx。

配置并启动 template
方法1:
上传下载好的consul-template_0.19.3_linux_amd64.zip压缩文件

解压consul-template_0.19.3_linux_amd64.zip压缩包并移动到/usr/bin/
[root@consul ~]# unzip consul-template_0.19.3_linux_amd64.zip
[root@consul ~]# mv consul-template /usr/bin/
启动consul-template
注意:如果在前台启动 template 服务,启动后不要按 ctrl+c 中止。
此时查看/usr/local/nginx/conf/vhost目录发现已经生成kgc.conf了,可以通过192.168.10.101:83访问nginx


方法2:
直接联网下载
[root@consul ~]# wget https://releases.hashicorp.com/consul-template/0.19.3/consul-template_0.19.3_linux_amd64.zip
[root@consul ~]# unzip consul-template_0.19.3_linux_amd64.zip
[root@consul ~]# mv consul-template /usr/bin/
启动consul-template

此时查看/usr/local/nginx/conf/vhost目录发现已经生成kgc.conf了,可以通过192.168.10.101:83访问nginx


增加一个 nginx 容器节点,在registrator节点操作
[root@registrator ~]# docker run -itd -p:90:80 --name test05 -h test05 nginx
观察consul节点的 template 服务,会从模板更新/usr/local/nginx/conf/vhost/kgc.conf 文件内容,并且 重载 nginx 服务。
[root@consul ~]# cat /usr/local/nginx/conf/vhost/kgc.conf

案例二 概述
最近创鑫公司提出了一个新需求,将项目全部打包成镜像部署私有仓库服务,经过几轮商讨,最终选择 Docker Harbor。Docker Harbor 有可视化的 Web 管理界面,可以方便管理Docker 镜像,又提供了多个项目的镜像权限管理控制功能等。
案例二 前置知识点
Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。它以 Docker 公司开源的 Registry 为基础,提供了管理 UI、基于角色的访问控制(Role Based AccessControl)、AD/LDAP 集成、以及审计日志(Auditlogging) 等企业用户需求的功能。通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源 Docker Distribution。作为一个企业级私有 Registry 服务器, Harbor提供了更好的性能和安全,以提升用户使用 Registry 构建和运行环境传输镜像的效率。
Harbor 的优势
Harbor 具有如下优势:
- 基于角色控制:用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不 同的权限。
- 基于镜像的复制策略: 镜像可以在多个 Harbor 实例之间进行复制(同步),适用于负载平衡、高可用性、多数据中心、混合和多云场景。
- 支持 LDAP/AD:Harbor 与现有的企业 LDAP/AD 集成,用于用户认证和管理。
- 删除图像和收集垃圾:镜像可以被删除,也可以回收镜像占用的空间。
- 图形 UI:用户可以轻松浏览、搜索镜像仓库以及对项目进行管理。
- 审计:对存储库的所有操作都进行记录。
- RESTful API:用于大多数管理操作的 RESTful API,易于与外部系统集成。
Harbor 的构成
Harbor 在架构上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)五个组件:
(1)Proxy
Harbor 的 Registry 、 UI 、Token 等服务 通过一个前 置的反向代 理统一接收 浏览器和Docker 客户端的请求,并将请求转发给后端不同的服务。
(2)Registry
负责储存 Docker 镜像,并处理 Docker push/pull 命令。由于要对用户进行访问控制,即不同用户对 Docker image 有不同的读写权限,Registry 会指向一个 Token 服务,强制用户的每次 Docker pull/push 请求都要携带一个合法的 Token,Registry 会通过公钥对 Token 进行解密验证。
(3)Core services
这是 Harbor 的核心功能,主要提供以下服务:
- UI(Harbor-ui):提供图形化界面,帮助用户管理 Registry 上的镜像(image), 并对用户进行授权。
- Webhook: 为 了 及 时 获 取 Registry 上 image 状 态 变 化 的 情 况 , 在 Registry 上 配 置Webhook, 把状态变化传递给 UI 模块。
- Token 服务:负责根据用户权限给每个 Docker push/pull 命令签发 Token。Docker 客户端向 Registry 服务发起的请求,如果不包含 Token,会被重定向,获得 Token 后再重新向 Registry 进行请求。
(4)Database(Harbor-db)
为 coreservices 提供数据库服务,负责储存用户权限、审计日志、Docker image 分组信
息等数据。
(5)Log collector(Harbor-log)
为了帮助监控 Harbor 运行,负责收集其他组件的log,供日后进行分析

Harbor 的每个组件都是以 Docker 容器的形式构建的,因此,使用 Docker Compose 来对它进行部署
案例二:Harbor 构建 Docker 私有仓库
本案例环境和需求

案例实现思路
下面是本案例的实现思路:
(1)部署 Docker Compose。
(2)部署 Harbor 服务。
(3)通过 Harbor 管理上传的私有镜像。
(4)维护 Harbor。
案例二 实施
部署 Docker-Compose 服务
部署 Harbor 是需要 Docker-Compose 服务做支撑的,所以要先部署该服务
部署Docker-Compose前面已经安装过了,这里就省略了
部署 Harbor 服务
Harbor 被部署为多个 Docker 容器,因此可以部署在任何支持 Docker 的 Linux 发行版上。服务端主机需要安装 Python、Docker 和 Docker Compose。
consul节点操作
这里我是提前下载好的,上传到服务器然后查看解压
[root@consul consul]# ls
harbor-offline-installer-v2.2.1.tgz
解压到/usr/local/目录下
[root@consul ~]# tar zxvf harbor-offline-installer-v2.2.1.tgz -C /usr/local
修改配置文件
[root@consul ~]# cp /usr/local/harbor/harbor.yml.tmpl /usr/local/harbor/harbor.yml
[root@consul ~]# vim /usr/local/harbor/harbor.yml
修改hostname,修改为自己的IP
hostname: 192.168.10.101
将https端的全部注释,这里不使用https访问
也就是把画圈的地方都给注释掉,因为咱们没有证书服务

启动
210



被折叠的 条评论
为什么被折叠?



