安装Docker
使用官方安装脚本自动安装docker
安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
安装docker-compose
Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases
运行以下命令以下载 Docker Compose 的当前稳定版本:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
创建软链:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
docker-compose --version
启动docker
systemctl start docker #启动docker
systemctl enable docker #设置docker开机自动启动
Harbor
下载 harbor
前往git页面下载最新harbor安装包,然后放到linux服务器上
git地址:https://github.com/goharbor/harbor/releases
解压
tar -zxvf harbor-offline-installer-v2.3.2.tgz -C /usr/local/
修改配置文件
hostname设置为要使用的域名
如果没有使用https协议的话,需要将配置文件中有关https的部分注释掉
cd /usr/local/harbor/ #进入harbor安装目录
vim harbor.yml.tmpl #打开harbor配置文件模板
cp harbor.yml.tmpl harbor.yml #复制修改后的配置文件模板
安装
./install.sh
安装完成后,即可通过浏览器访问Harbor
配置HTTPS访问(生产环境必须使用Https)
-
生成一个CA证书的私钥
openssl genrsa -out ca.key 4096
-
生成CA证书
调整
-subj
选项中的值以反映你的组织。如果你使用FQDN(全限定域名:同时带有主机名和域名的名称)来连接你的Harbor主机,你必须把它指定为通用名称(CN)属性openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \ -key ca.key \ -out ca.crt
生成一个服务器证书
证书通常包含一个.crt
文件和一个.key
文件,例如,yourdomain.com.crt
和yourdomain.com.key
-
生成一个私钥.
openssl genrsa -out yourdomain.com.key 4096
-
生成一个证书签署请求(CSR)
调整
-subj
选项中的值以反映您的组织。如果你使用FQDN(全限定域名:同时带有主机名和域名的名称)来连接你的Harbor主机,你必须把它指定为公共名称(CN)属性,并在密钥和CSR文件名中使用它openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \ -key yourdomain.com.key \ -out yourdomain.com.csr
-
生成一个x509 v3扩展文件
无论你是使用 FQDN 还是使用 IP 地址来连接你的 Harbor 主机,你都必须创建此文件,以便为你的 Harbor 主机生成符合主题替代名称(SAN)和 x509 v3 扩展要求的证书。替换 DNS 条目为你自己的域名
cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1=yourdomain.com DNS.2=yourdomain DNS.3=hostname EOF
如果使用的是ip进行访问,那么进行如下配置
cat > v3.ext <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = IP:yourdomain.com EOF
-
使用
v3.ext
文件为您的 Harbor 主机生成一个证书。将 CRS 和 CRT 文件名称中的
yourdomain.com
替换为 Harbor 主机名称。openssl x509 -req -sha512 -days 3650 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in yourdomain.com.csr \ -out yourdomain.com.crt
向Harbor和Docker提供证书
在生成ca.crt
、yourdomain.com.crt
和yourdomain.com.key
文件后,你必须将它们提供给Harbor和Docker,并重新配置Harbor以使用它们
-
将服务器证书和密钥复制到你的Harbor主机上的certficates文件夹(必须先创建相应的文件夹)
mkdir -p /data/certcp yourdomain.com.crt /data/cert/cp yourdomain.com.key /data/cert/
-
将
yourdomain.com.crt
转换成yourdomain.com.cert
,供Docker使用。Docker守护进程将
.crt
文件解释为CA证书,将.cert
文件解释为客户端证书openssl x509 -inform PEM -in yourdomain.com.crt -out yourdomain.com.cert
-
将服务器证书、密钥和CA文件复制到Harbor主机上的Docker证书文件夹(必须先创建相应的文件夹)
mkdir -p /etc/docker/certs.d/yourdomain.comcp yourdomain.com.cert /etc/docker/certs.d/yourdomain.com/cp yourdomain.com.key /etc/docker/certs.d/yourdomain.com/cp ca.crt /etc/docker/certs.d/yourdomain.com/
如果你将nginx的默认端口443映射到一个不同的端口,你需要运行下面的命令创建一个新的文件夹
/etc/docker/certs.d/yourdomain.com:port
, or/etc/docker/certs.d/harbor_IP:port
. -
重新启动Docker
systemctl restart docker
(可选)如果你使用来自证书颁发者的中间证书,请将中间证书与你自己的证书合并以创建一个证书包
cat intermediate-certificate.pem >> yourdomain.com.crt
(可选)当Docker守护进程在某些操作系统上运行时,你可能需要在操作系统层面上信任证书
-
Ubuntu:
cp yourdomain.com.crt /usr/local/share/ca-certificates/yourdomain.com.crt update-ca-certificates
-
Red Hat (CentOS etc):
cp yourdomain.com.crt /etc/pki/ca-trust/source/anchors/yourdomain.com.crtupdate-ca-trust
可以使用下面的命令,查看证书的目录结构
ls /etc/docker/certs.d/yourdomain.com/
部署、配置Harbor
修改Harbor配置文件中的https部分:
vi /usr/local/harbor/harbor.yml
配置文件内容
#...
https: port: 443 certificate: /data/cert/yourdomain.com.crt private_key: /data/cert/yourdomain.com.key
#...
-
运行
prepare
脚本以启用HTTPSHarbor使用一个
nginx
实例作为所有服务的反向代理。你使用prepare
脚本来配置nginx使用HTTPS。prepare
在Harbor安装包中,与install.sh
脚本处于同一级别。./prepare
-
如果 Harbor 正在运行,请停止并删除现有实例。
镜像数据仍在文件系统中,所以不会丢失数据
docker-compose down -v
-
重启Harbor
docker-compose up -d
验证HTTPS连接
-
打开一个浏览器并输入https://yourdomain.com。它应该显示Harbor界面。
一些浏览器可能会显示一个警告,说明证书颁发机构(CA)是未知的。这发生在使用不是来自可信的第三方CA的自签名CA时。你可以将该CA导入浏览器以消除该警告。
-
在运行Docker守护进程的机器上,检查
/etc/docker/daemon.json
文件,确保-insecure-registry
选项没有被设置为https://yourdomain.com。 -
从Docker客户端登录Harbor
docker login -u admin -p Harbor12345 yourdomain.com
如果你将nginx 443端口映射到一个不同的端口,请在登录命令中添加该端口
docker login yourdomain.com:port
如果docker login返回错误:x509: certificate signed by unknown authority,尝试一下方法:
- 方法一:配置Insecure Registry,编辑
/etc/docker/daemon.json
,增加insecure-registries
的配置,windows的话直接在设置里面进行配置
touch /etc/docker/daemon.json
vi /etc/docker//daemon.json
配置文件内容:
{ "registry-mirrors": ["https://registry.docker-cn.com"], "insecure-registries": ["yourdomain.com"]}
配置结束后重启docker
sudo systemctl daemon-reloadsudo systemctl restart docker
- 方法二:将harbor证书复制到本地服务器目录,然后重启本地服务器的docker
Linux:
mkdir -p /etc/docker/certs.d/<your_registry_host_name>:<your_registry_host_port>
scp <your_registry_host_name>:/opt/registry/certs/domain.crt /etc/docker/certs.d/<your_registry_host_name>:<your_registry_host_port>/ca.crt
Windows:
直接复制到目录C:\ProgramData\docker\certs.d\ca.crt
下 ,然后安装证书,重启docker
上传及下载镜像到Harbor
如果是域名部署的话,这里有个大坑:部署的域名不能包含下划线_
,否则push镜像的时候会出错
#1.标记镜像docker tag {镜像名}:{tag} {Harbor地址}:{端口}/{Harbor项目名}/{自定义镜像名}:{自定义tag}#eg:docker tag webapi_test yourdomain.com/webapi_test/demo:v0.1#2.push 到Harbordocker push {Harbor地址}:{端口}/{自定义镜像名}:{自定义tag}#eg:docker push yourdomain.com/webapi_test/demo:v0.13.pull 到本地docker pull yourdomain.com/webapi_test/demo:v0.1