主流的构建私有仓库的开源组件有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文件中。
将下载的安装包解压放到/usr/src目录下
切换目录至/usr/src/harbor/
编辑harbor的配置文件harbor.cfg
修改hostname,将http改为https
开启自定义证书,并创建证书存储目录
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
在浏览器里访问
https://www.harbor.com
域名需要在Windows的hosts文件里配下与IP的映射
用户名和密码在harbor.cfg文件里
3 push docker镜像
push格式要符合下面的要求
域名/项目名/镜像名:版本
下面以nginx为例进行演示
在node01节点将nginx镜像名称更改为“域名/项目名/镜像名:版本”
docker tag nginx:v1 www.harbor.com/harbor/nginx:v1
在node01节点登陆harbor
docker login -u admin -p Harbor12345 192.168.75.13:80
或 docker login https://www.harbor.com
将镜像push到harbor仓库
docker push www.harbor.com/harbor/nginx:v1
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 .
.表示当前目录
jdk镜像创建成功
运行jdk容器
docker run -di --name=jdk jdk1.8:v1 /bin/bash
停止容器:docker stop 进程id
查看进程
docker ps
把jdk镜像push到harbor仓库
4.2 部署项目
创建一个SpringBoot项目,定义一个接口
将项目打成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命名
启动容器
docker run -di --name=hello -p 80:8080 hello:v1 /bin/bash
-p指定端口映射,80是对外暴露的端口,8080是服务的端口
在浏览器中访问/hello接口
附 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 | 将本地文件夹或者其他容器的文件挂载到容器中 |