1 Docker 仓库管理
Docker仓库, 类似于yum仓库, 是用来保存镜像的仓库. 为了方便管理和使用Docker镜像, 可以将镜像集中保存至Docker仓库中, 将制作好的镜像推送(push)到仓库之中保存, 在需要镜像时, 从仓库中拉取(pull)镜像即可.
Docker仓库分为公有云仓库和私有云仓库:
公有云仓库: 由互联网公司对外公开的仓库
官方Docker hub
阿里云等第三方仓库
私有云仓库: 在组织内部搭建的仓库, 一般只为组织内部使用, 常使用如下软件搭建仓库
docker registry
docker harbor
2 官方Docker仓库
将自制的镜像上传至docker仓库: https://hub.docker.com
2.1 用户登录
上传镜像前, 需要执行docker login命令登录, 登录后生成~/.docker/config.json
文件保存验证信息
命令格式:
docker log [OPTIONS] [SERVER]
选项:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
案例:
root@ubuntu-1804-100:~# docker login -u USERNAME -p PASSWORD docker.io
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
2.2 给本地镜像打标签
- 上传镜像前, 要先在本地给镜像打标签
- 标签格式:
docker.io/DockerHub用户名/镜像名:TAG
- 其中
docker.io/
前缀可以省略 -
DockerHub用户名/镜像名
为标准格式:DockerHub用户名
用来指定向哪个用户的DockerHub账号上传镜像.
给拉取的busybox镜像, 重新打标签, 上传到自己的Docker Hub Repo, 仅做演示
分别给busybox打两个tag, 一个上传到本身已经存在的仓库, 一个上传到不存在的仓库, 不存在的仓库在上传过程会自动创建
root@Ubuntu-1804-1:~# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
4c892f00285e: Pull complete
Digest: sha256:e1488cb900233d035575f0a7787448cb1fa93bed0ccc0d4efc1963d7d72a8f17
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
root@Ubuntu-1804-1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 22667f53682a 6 days ago 1.23MB
root@Ubuntu-1804-1:~# docker tag busybox:latest docker.io/chickenwinner2020/test-box:v2.0 # 新的repo, chickenwinner2020/test-box, 会自动创建
root@Ubuntu-1804-1:~# docker tag busybox:latest chickenwinner2020/docker-images:v3.0 # 已有仓库, chickenwinner2020/docker-images
root@Ubuntu-1804-1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 22667f53682a 6 days ago 1.23MB
chickenwinner2020/docker-images v3.0 22667f53682a 6 days ago 1.23MB
chickenwinner2020/test-box v2.0 22667f53682a 6 days ago 1.23MB
这里仅为了演示把本地制作的busybox镜像上传到已经存在和未存在的仓库, 所以才把仓库名称命名为chickenwinner2020/test-box和chickenwinner/docker-images
工作中, 一般把仓库repo命名为用户名/镜像名, 见名知意
比如nginx仓库命名为: 用户名/nginx
2.3 上传镜像到Docker Hub
docker push REPO:TAG
REPO: 用户名/镜像名
如果TAG省略, 那么会把本地属于同一个REPO的所有镜像版本都上传
案例: 推送到已有仓库
root@Ubuntu-1804-1:~# docker push chickenwinner2019/docker-images
# chickenwinner2020/docker-images是本地镜像的REPO名称, 因为做tag时, REPO格式为用户名/镜像名
The push refers to repository [docker.io/chickenwinner2020/docker-images]
6b245f040973: Pushed
v3.0: digest: sha256:56853b711255f4a0bc7c44d2158167f03f64ef75a22a0249a9fae4703ec10f61 size: 527
案例: 推送到不存在的仓库
root@Ubuntu-1804-1:~# docker push chickenwinner2020/test-box:v2.0
The push refers to repository [docker.io/chickenwinner2020/test-box]
0b16ab2571f4: Mounted from chickenwinner2020/docker-images # 都是用的busybox镜像, 只是打了不同的tag, 所以再次上传镜像时不会真的重新上传一遍
v2.0: digest: sha256:7bd0c945d7e4cc2ce5c21d449ba07eb89c8e6c28085edbcf6f5fa4bf90e7eedc size: 527
案例: 实际工作中的镜像命名和推送
docker pull alpine
docker pull httpd
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest fe8735c23ec5 19 hours ago 145MB
alpine latest 9c6f07244728 2 months ago 5.54MB
docker tag alpine:latest chickenwinner2020/alpine:v1.0
docker tag alpine:latest chickenwinner2020/alpine:v2.0
docker tag httpd:latest chickenwinner2020/httpd:v2.0
docker tag httpd:latest chickenwinner2020/httpd:v1.0
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest fe8735c23ec5 19 hours ago 145MB
chickenwinner2020/httpd v1.0 fe8735c23ec5 19 hours ago 145MB
chickenwinner2020/httpd v2.0 fe8735c23ec5 19 hours ago 145MB
alpine latest 9c6f07244728 2 months ago 5.54MB
chickenwinner2020/alpine v1.0 9c6f07244728 2 months ago 5.54MB
chickenwinner2020/alpine v2.0 9c6f07244728 2 months ago 5.54MB
docker push chickenwinner2020/alpine
The push refers to repository [docker.io/chickenwinner2020/alpine]
994393dc58e7: Mounted from library/alpine
v1.0: digest: sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870 size: 528
994393dc58e7: Layer already exists
v2.0: digest: sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870 size: 528
docker push chickenwinner2020/httpd
The push refers to repository [docker.io/chickenwinner2020/httpd] # 在本地打tag时, 要加上DockerHub的用户名, 这样上传的时候, 才知道向哪个用户的Hub上传镜像
1617cfaff5dd: Mounted from library/httpd
36de10a434ef: Mounted from library/httpd
6437b1170b0b: Mounted from library/httpd
13fb8799144c: Mounted from library/httpd
a12586ed027f: Mounted from library/httpd
v1.0: digest: sha256:8c353fea0ce30e79d03e487d31f3a37eb5aae5127bde9580387e74e77c5952a2 size: 1366
1617cfaff5dd: Layer already exists
36de10a434ef: Layer already exists
6437b1170b0b: Layer already exists
13fb8799144c: Layer already exists
a12586ed027f: Layer already exists
v2.0: digest: sha256:8c353fea0ce30e79d03e487d31f3a37eb5aae5127bde9580387e74e77c5952a2 size: 1366
3 Docker仓库-Harbor
3.1 Harbor功能
基于角色访问的控制: 用户与Docker镜像仓库通过"项目"进行组织管理, 一个用户可以对多个镜像仓库在同一个命名空间(project)里有不同的权限
镜像复制: 镜像可以在多个Registry实例中复制(同步), 尤其适合于负载均衡, 高可用, 混合云和多云的场景
图形化用户界面: 用户可以通过浏览器来浏览, 检索当前Docker镜像仓库, 管理项目和命令空间
AD/LDAP: Harbor可以集成企业内部已有的AD/LDAP, 用于权限认证管理
审计管理: 所有针对镜像仓库的操作都可以被记录追溯, 用于审计管理
RESTful API: 提供给管理员对于Harbor更多的操控, 使得与其他管理软件集成变得更容易
3.2 Harbor组成
Harbor内部由多个容器组成, 基于docker-compose完成内部容器的编排, 因此, 安装Harbor, 还要先部署docker-compose
Harbor内置已经写好了docker-compose的yml文件, 因此, 部署Harbor无需手动编写yml文件, 直接执行即可
3.3 Harbor的安装
Harbor依赖于docker-compose, 而docker-compose又是依赖于docker, 因此, 需要先装docker, 再装docker-compose, 再装harbor
环境准备:
四台主机: 都需要安装Docker
10.0.0.19: Harbor-1
10.0.0.29: Harbor-2
10.0.0.39: 用于上传和下载镜像
10.0.0.49: 用于上传和下载镜像
3.3.1 安装Docker
5:19.03.12~3-0~ubuntu-bionic
#!/bin/bash
apt update && apt -y install ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
VERSION_STRING=5:19.03.12~3-0~ubuntu-bionic
apt -y install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-compose-plugin
docker version && echo "Install Successfully!!!!!!!!!!!!!!!!!" || echo "Install Failure!!!!!!!!!!!!!!!!!"
3.3.2 安装docker-compose
v1.26.2
harbor-1
上传docker-compose程序到/usr/sbin目录下, 因为该文件本身就是个执行程序.
直接改名为docker-compose并且加上执行权限
root@harbor-1:~# cd /usr/sbin
root@harbor-1:/usr/sbin# mv docker-compose-Linux-x86_64 docker-compose
root@harbor-1:/usr/sbin# chmod +x docker-compose
root@harbor-1:~# docker-compose version
docker-compose version 1.26.2, build eefe0d31
docker-py version: 4.2.2
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
harbor-2
同样操作
[root@harbor-2:~]# docker-compose version
docker-compose version 1.26.2, build eefe0d31
docker-py version: 4.2.2
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
3.3.3 安装Harbor
v1.7.6
3.3.3.1 解压包
harbor-1
root@harbor-1:~# mkdir /apps
root@harbor-1:~# tar xf harbor-offline-installer-v1.7.6.tgz -C /apps/
root@harbor-1:~# cd /apps
root@harbor-1:/apps# ls
harbor
harbor-2
同样操作
root@harbor-1:/apps/harbor# ls
docker-compose.yml # yml文件定义了harbor内的容器是如何启动的
3.3.3.2 编辑配置文件harbor.cfg
仅修改hostname为harbor服务器的ip地址
harbor-1
root@harbor-1:/apps/harbor# grep '^[a-zA-Z]' harbor.cfg
hostname = 10.0.0.19 # harbor的地址, 支持ip和FQDN
ui_url_protocol = http # 基于http还是https
ssl_cert = /data/cert/server.crt # https服务器证书路径
ssl_cert_key = /data/cert/server.key # https服务私钥
secretkey_path = /data # 存放私钥文件路径
harbor_admin_password = Harbor12345 # harbor的密码. 默认是admin/Harbor12345, 用户名admin是固定的
harbor-2
除了hostname要修改, 其余保持一致即可
3.3.3.3 Python环境安装
docker-compose依赖Python
Note: Docker Compose requires Python 3.6 or later.
两台harbor分别安装
apt -y install python3
# Ubuntu1804自带了Python3.6.9, 所以无需安装
3.3.3.4 运行harbor安装脚本
两台harbor都要安装
/apps/harbor/install.sh
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at http://10.0.0.19 .
For more details, please visit https://github.com/goharbor/harbor .
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at http://10.0.0.29 .
For more details, please visit https://github.com/goharbor/harbor .
安装好后, 会启动大量的容器
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
336de5b13532 goharbor/nginx-photon:v1.7.6 "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp nginx
94316ba5a853 goharbor/harbor-portal:v1.7.6 "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes (healthy) 80/tcp harbor-portal
77ae1f3b7f1a goharbor/harbor-jobservice:v1.7.6 "/harbor/start.sh" 4 minutes ago Up 4 minutes harbor-jobservice
c203e46882ec goharbor/harbor-core:v1.7.6 "/harbor/start.sh" 4 minutes ago Up 4 minutes (healthy) harbor-core
9639e05f750e goharbor/redis-photon:v1.7.6 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 6379/tcp redis
f0f268e6b85a goharbor/registry-photon:v2.6.2-v1.7.6 "/entrypoint.sh /etc…" 4 minutes ago Up 4 minutes (healthy) 5000/tcp registry
0706a3a86528 goharbor/harbor-db:v1.7.6 "/entrypoint.sh post…" 4 minutes ago Up 4 minutes (healthy) 5432/tcp harbor-db
30f0c4015882 goharbor/harbor-adminserver:v1.7.6 "/harbor/start.sh" 4 minutes ago Up 4 minutes (healthy) harbor-adminserver
aa02b7a9a26f goharbor/harbor-registryctl:v1.7.6 "/harbor/start.sh" 4 minutes ago Up 4 minutes (healthy) registryctl
f65e95879132 goharb
3.3.4 登录Harbor
- 10.0.0.19
- 10.0.0.29
3.4 Harbor使用
3.4.1 用户创建
- 10.0.0.19
创建的账号默认没有管理员权限, 可以手动修改为管理员, 不是管理员是无法上传镜像的
3.4.2 创建项目
在Docker Hub中, 镜像是存在Repository中, 根据tag区分
而Harbor中, 镜像是存在Project中, 根据tag区分
DockerHub格式: docker.io/chickenwinner2019/busybox:v1.0
harbor格式: 10.0.0.19/harbor-test(项目名称)/IMAGE[:TAG]
- 10.0.0.19 上创建一个项目
项目设为公开, 上传镜像需要账号密码, 下载是公开的
注意: 刚搭好的harbor是无法直接从客户端去推送镜像的, 一是因为客户端需要登录harbor, 二是harbor默认基于https, 需要配置https
不过, 由于harbor一般都是内网, 而且https会影响效率, 因此, 如果能确保网络没有安全隐患, 可以不用https
3.4.3 在本地登录Harbor
- 先修改客户端的docker service文件, 将harbor的ip地址添加到信任站点, 允许以http方式访问harbor
- 这里的客户端指的是用于上传镜像的设备
10.0.0.39-user1
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 10.0.0.19 --insecure-registry 10.0.0.29
systemctl daemon-reload
systemctl restart docker
10.0.0.49-user2
执行相同操作
- 客户端登录harbor
root@user1:~# docker login 10.0.0.19
Username: admin19
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
同一个账号可以在多个客户端登录, 需要客户端安装了docker服务, 并且把harbor的ip地址添加到信任站点
root@user2:~# docker login 10.0.0.19
Username: admin19
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
3.4.4 客户端推送镜像
root@user1:~# docker pull busybox
root@user1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest ff4a8eb070e1 3 weeks ago 1.24MB
root@user1:~# docker tag busybox:latest 10.0.0.19/harbor-test/busybox:v1.0
root@user1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.19/harbor-test/busybox v1.0 b97242f89c8a 3 weeks ago 1.23MB
busybox latest b97242f89c8a 3 weeks ago 1.23MB
root@user1:~# docker push 10.0.0.19/harbor-test/busybox:v1.0
The push refers to repository [10.0.0.19/harbor-test/busybox]
0064d0478d00: Pushed
v1.0: digest: sha256:0415f56ccc05526f2af5a7ae8654baec97d4a614f24736e8eef41a4591f08019 size: 527
3.4.5 测试另一台客户端拉取镜像
由于之前已经在10.0.0.49配置了信任harbor站点, 因此, 直接基于http就可拉取
root@user2:~# docker pull 10.0.0.19/harbor-test/busybox:v1.0
v1.0: Pulling from harbor-test/busybox
e5d9363303dd: Pull complete
Digest: sha256:0415f56ccc05526f2af5a7ae8654baec97d4a614f24736e8eef41a4591f08019
Status: Downloaded newer image for 10.0.0.19/harbor-test/busybox:v1.0
10.0.0.19/harbor-test/busybox:v1.0
3.4.6 Harbor配置文件的修改
先用docker-compose关闭harbor
cd /apps/harbor
docker-compose stop
stop后所有的容器都会处于Exited状态, 之后修改harbor.cfg文件
修改后, 执行/apps/harbor/prepare来更新配置
最后重新启动harbor即可
docker-compose start
3.5 Harbor的高可用
环境准备
在10.0.0.29上, 创建另一个管理员用户admin29
在10.0.0.29上, 创建项目ha-test 注意: 在docker harbor中, 项目必须是手动在前端创建的
在ha-test中, 上传一个ha-test/busybox:v2.0
root@user2:~# docker tag busybox:latest 10.0.0.29/ha-test/busybox:v2.0
root@user2:~# docker push 10.0.0.29/ha-test/busybox:v2.0
3.5.1 共享存储
- 利用共享存储, 将共享存储的目录, 挂载到Harbor保存数据的目录, 实现多个Harbor服务器共享资源
需要共享的目录:
/data: Harbor中的镜像都是存在/data目录
/var/log: 存放Harbor日志
Dockerfile文件
k8s的yml文件
...
3.5.2 镜像复制
Harbor支持基于策略的Docker镜像复制功能, 其可以实现不同的数据中心, 不同的运行环境之间同步镜像, 并可以基于界面管理.
Harbor的复制是双向复制, 多个Harbor之间要把自己的镜像复制到其余Harbor
Harbor的复制是基于项目复制, 把一个Harbor的项目, 复制到其余Harbor上
不同的Harbor用户信息是不会被复制的, 不过一般Harbor的管理员信息在多个Harbor都是相同的
3.5.2.1 当前两个Harbor的镜像情况
10.0.0.19上有项目harbor-test, 放有busybox:v1.0镜像
10.0.0.29上有项目ha-test, 放有busybox:v2.0镜像
- 10.0.0.19
- 10.0.0.29
3.5.2.2 以10.0.0.29为基准, 向10.0.0.19同步镜像
- 登录10.0.0.29, 配置仓库管理
10.0.0.29上有项目ha-test, 因此, 要把ha-test复制到10.0.0.19上
先在10.0.0.29上建立一个复制目标, 表明要往这个目标复制镜像
-
在10.0.0.29上, 配置复制管理, 指定将ha-test项目复制到10.0.0.19
- 在10.0.0.19上验证ha-test项目被复制到了本地
此时, 如果不小心把刚同步到10.0.0.19上的ha-test项目删除了, 那么就去10.0.0.29上, 选择修改规则, 立刻执行一次同步即可
每次同步都会产生日志
一旦镜像被同步到了10.0.0.19, 那么10.0.0.19上的管理员账号就可以管理该项目了
所以, 不同harbor上的管理员用户, 只能上传镜像到自己有权限的harbor
- 在10.0.0.49上, 再给busybox打个标签v3.0, 推送到10.0.0.29的ha-test项目, 查看是否会被同步到10.0.0.19
root@user2:~# docker tag busybox:latest 10.0.0.29/ha-test/busybox:v3.0
root@user2:~# docker push 10.0.0.29/ha-test/busybox:v3.0
The push refers to repository [10.0.0.29/ha-test/busybox]
0064d0478d00: Layer already exists
v3.0: digest: sha256:0415f56ccc05526f2af5a7ae8654baec97d4a614f24736e8eef41a4591f08019 size: 527
- 10.0.0.29上v3.0推送成功
- 10.0.0.19也同步了v3.0
- 在10.0.0.29上, 再创建一个项目alpine-test, 从10.0.0.49给镜像打标签并推送到10.0.0.29, 验证是否会被推送的10.0.0.19
- 同步的仓库之前已经配好了, 直接配置复制管理即可
注意: Harbor推送镜像, 项目必须是已经存在的, 否则无法推送
- 在10.0.0.49拉取alpine镜像, 打标签, 推送到10.0.0.29上
root@user2:~# docker pull alpine
root@user2:~# docker tag alpine:latest 10.0.0.29/alpine-test/alpine:v1.0
root@user2:~# docker push 10.0.0.29/alpine-test/alpine:v1.0
The push refers to repository [10.0.0.29/alpine-test/alpine]
c04d1437198b: Layer already exists
v1.0: digest: sha256:d0710affa17fad5f466a70159cc458227bd25d4afb39514ef662ead3e6c99515 size: 528
- 10.0.0.29上推送成功
- 10.0.0.19上同步成功
3.5.2.3 以10.0.0.19为基准, 向10.0.0.29同步镜像, 实现双向同步
- 创建仓库管理项目
- 创建复制管理
10.0.0.29的项目
10.0.0.19的项目
- 因此, 需要将harbor-test同步到10.0.0.29上
- 验证10.0.0.29上同步到了harbor-test项目
镜像复制是单向复制, 在Harbor-1上配置将项目A复制到Harbor-2, 那么只有Harbor-1上的A项目发生变化, 才会同步给Harbor-2, 而如果在Harbor-2上的项目A做修改, 是不会同步给Harbor-1的. 因此, 同一个项目, 需要在两个Harbor上配置双向复制, 或者使用共享存储
案例: 测试镜像的双向同步
- 先在两台harbor上, 创建相同的复制规则
- 在10.0.0.39上, 拉取
10.0.0.19/alpine-test/alpine:v1.0
, 然后重新打标签v2.0
, 之后上传到10.0.0.19
root@user1:~# docker pull 10.0.0.19/alpine-test/alpine:v1.0
root@user1:~# docker tag 10.0.0.19/alpine-test/alpine:v1.0 10.0.0.19/alpine-test/alpine:v2.0
root@user1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.19/harbor-test/busybox v1.0 ff4a8eb070e1 3 weeks ago 1.24MB
busybox latest ff4a8eb070e1 3 weeks ago 1.24MB
10.0.0.19/alpine-test/alpine v1.0 9c6f07244728 2 months ago 5.54MB
10.0.0.19/alpine-test/alpine v2.0 9c6f07244728 2 months ago 5.54MB
root@user1:~# docker push 10.0.0.19/alpine-test/alpine:v2.0
- 验证10.0.0.19上v2.0上传成功, 10.0.0.29上同步了v2.0
- 在10.0.0.49上, 拉取
10.0.0.29/alpine-test/alpine:v2.0
, 然后重新打标签v3.0, 之后上传到10.0.0.29
root@user2:~# docker pull 10.0.0.19/alpine-test/alpine:v2.0
root@user2:~# docker tag 10.0.0.29/alpine-test/alpine:v2.0 10.0.0.29/alpine-test/alpine:v3.0
root@user2:~# docker push 10.0.0.29/alpine-test/alpine:v3.0
- 验证10.0.0.29上v3.0上传成功, 10.0.0.19上同步了v3.0
3.5.3 删除镜像
Harbor上做删除操作时, 如果项目内有镜像或者有复制策略是不能直接删除项目的
需要先基于镜像删除, 然后删除复制策略
3.6 实现Harbor开机启动
Harbor在服务器重启后, 有些内部容器不会启动, 因此可以利用service文件来实现Harbor开机自启, 或者将命令写到rc.local
- 方法1:
[root@Ubuntu-1804-2:/apps/harbor]# cat /etc/rc.local
#!/bin/bash
cd /apps/harbor
/usr/sbin/docker-compose up -d
- 方法2:
[root@Ubuntu-1804-2:/apps/harbor]# vim /lib/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/sbin/docker-compose -f /apps/harbor/docker-compose.yml up
ExecStop=/usr/sbin/docker-compose -f /apps/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target