云原生架构系列——构建Harbor企业级镜像仓库

主流的构建私有仓库的开源组件有Harbor和Registry,Harbor的功能比较强大,支持web图形化操作,支持权限控制。

1 安装compose组件

首先要重新搭一台服务器或虚拟机,安装docker环境,参见:kubernetes集群环境搭建
建议离线安装安装compose和harbor组件,github下载速度非常慢,在线安装可能会出现一些问题。
compose下载网址:https://github.com/docker/compose/releases。
将下载好的文件上传至/usr/local/bin目录下即可,放在bin目录下不需要配置环境变量,然后给文件授予可执行权限

chmod 755 /usr/local/bin/docker-compose

查看是否安装成功

docker-compose -version

在这里插入图片描述

2 安装harbor

下载地址:https://github.com/goharbor/harbor/releases、
设置新加的机器的hostname为www.harbor.com,并追加到所有机器的hosts文件中。
云原生架构系列——构建Harbor企业级镜像仓库_第1张图片
将下载的安装包解压放到/usr/src目录下
切换目录至/usr/src/harbor/
编辑harbor的配置文件harbor.cfg
云原生架构系列——构建Harbor企业级镜像仓库_第2张图片
修改hostname,将http改为https
开启自定义证书,并创建证书存储目录
云原生架构系列——构建Harbor企业级镜像仓库_第3张图片

mkdir -p /data/cert/

进入/data/cert/目录下
生成证书私钥

openssl genrsa -des3 -out server.key 2048

证书的服务

openssl req -new -key server.key -out server.csr

备份私钥

cp server.key server.key.org

转换为证书

openssl rsa -in server.key.org -out server.key

给证书签名

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

给所有的证书授予执行权限

chmod 755 *

在这里插入图片描述
k8s的所有机器的daemon.json文件里追加以下信息

"insecure-registries": ["https://www.harbor.com"]
www.harbor.com是自定义的安装harbor机器的域名

重新加载daemon.json文件,重启docker服务

systemctl daemon-reload
systemctl restart docker

回到harbor机器,在/usr/src/harbor/目录下执行

./install.sh

云原生架构系列——构建Harbor企业级镜像仓库_第4张图片
在浏览器里访问
https://www.harbor.com
域名需要在Windows的hosts文件里配下与IP的映射
云原生架构系列——构建Harbor企业级镜像仓库_第5张图片
用户名和密码在harbor.cfg文件里
在这里插入图片描述

3 push docker镜像

push格式要符合下面的要求
云原生架构系列——构建Harbor企业级镜像仓库_第6张图片
域名/项目名/镜像名:版本
下面以nginx为例进行演示
在node01节点将nginx镜像名称更改为“域名/项目名/镜像名:版本”

docker tag nginx:v1 www.harbor.com/harbor/nginx:v1

云原生架构系列——构建Harbor企业级镜像仓库_第7张图片
在node01节点登陆harbor

docker login -u admin -p Harbor12345 192.168.75.13:80  
或 docker login https://www.harbor.com

云原生架构系列——构建Harbor企业级镜像仓库_第8张图片
将镜像push到harbor仓库

docker push www.harbor.com/harbor/nginx:v1

云原生架构系列——构建Harbor企业级镜像仓库_第9张图片
云原生架构系列——构建Harbor企业级镜像仓库_第10张图片

4 Dockerfile创建镜像

在实际工作中,一般都是用Dockerfile来构建镜像。Dockerfile提供了脚本的形式来创建镜像,文件里由一系列的命令和参数构成。开发、测试、运维都可以直接用Dockerfile来部署环境,非常的方便。下面会以真实的项目为例进行演示。

4.1 基础环境

部署项目需要有操作系统并安装jdk
拉取CentOS镜像

docker pull centos

更改版本

docker tag centos:latest centos:v1

在oracle官网下载jdk1.8并上传至根目录下
在/usr/local/src/目录下创建Dockerfile文件,文件以Dockerfile命名,在执行创建镜像命令时不需要指定文件

vi Dockerfile
##########################
#依赖镜像,此处需要操作系统
FROM centos:v1
#镜像创建者信息
MAINTAINER Harbor
#切换到jdk包所在目录
WORKDIR /
#自动解压并添加到容器中
ADD jdk-8u261-linux-x64.tar.gz /usr/local/java
#以下是配置jdk的环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_261
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

执行下面命令创建镜像

docker build -t jdk1.8:v1 .
 .表示当前目录

云原生架构系列——构建Harbor企业级镜像仓库_第11张图片
jdk镜像创建成功
运行jdk容器

docker run -di --name=jdk jdk1.8:v1 /bin/bash
停止容器:docker stop 进程id

查看进程

docker ps

云原生架构系列——构建Harbor企业级镜像仓库_第12张图片
把jdk镜像push到harbor仓库
在这里插入图片描述

4.2 部署项目

创建一个SpringBoot项目,定义一个接口
云原生架构系列——构建Harbor企业级镜像仓库_第13张图片
将项目打成jar包,上传至/usr/local/src目录下
在这里插入图片描述
创建Dockerfile文件
在这里插入图片描述

#依赖镜像,jdk镜像。可以把jdk镜像push到harbor仓库,这里就可以直接从仓库拉取
FROM www.harbor.com/harbor/jdk1.8:v1
#挂载临时数据卷
VOLUME /tmp
#添加到容器中
ADD hello.jar /usr/local/
#java -jar 启动项目。如果遇到镜像创建不了或者容器启动不了,可能是编码问题导致的。笔者就遇到“-”编码的问题,导致容器启动不了,删除后重新手动输入一下就好了
ENTRYPOINT ["java","‐jar","/usr/local/hello.jar"]

构建容器

docker build -f Dockerfile-hello -t hello:v1 .
此处需要指定文件Dockerfile-hello,因为不是以Dockerfile命名

云原生架构系列——构建Harbor企业级镜像仓库_第14张图片
启动容器

docker run -di --name=hello -p 80:8080 hello:v1 /bin/bash
-p指定端口映射,80是对外暴露的端口,8080是服务的端口

云原生架构系列——构建Harbor企业级镜像仓库_第15张图片
在浏览器中访问/hello接口
云原生架构系列——构建Harbor企业级镜像仓库_第16张图片

附 Dockerfile常用命令

命令 作用
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者
ENV key value 设置环境变量 (可以写多条)
RUN command 是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,
将会在复制后自动解压
COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录
EXPOSE port1 prot2 用来指定端口,使容器内的应用可以通过端口和外界交
CMD argument 在构建容器时使用,会被docker run 后的argument覆
ENTRYPOINT argument 和CMD相似,但是并不会被docker run指定的参数覆盖
VOLUME 将本地文件夹或者其他容器的文件挂载到容器中

你可能感兴趣的:(云原生,docker)