文章目录
harbor 安装使用(单机)
harbor 简介
harbor 官方github地址:goharbor/harbor )
harbor 官方网站:Harbor (goharbor.io)
harbor 官方文档:https://goharbor.io/docs/
Harbor 是一个是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,由 VMware 开源,其通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源 Docker Distribution。作为一个企业级私有 Registry服务器,Harbor 提供了更好的性能和安全。提升用户使用 Registry 构建和运行环境传输镜像的效率。Harbor支持安装在多个 Registry节点的镜像资源复制,镜像全部保存在私有 Registry 中,确保数据和知识产权在公司内部网络中管控,另外, Harbor 也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等
准备
Ubuntu 20 主机两台
主机名 | IP | 角色 | 安装服务 |
---|---|---|---|
harbor | 192.168.111.171 | harbor | Docker engine、Docker Compose、harbor |
docker | 192.168.111.188 | docker | Docker engine |
安装前检查
harbor 依赖于 Docker engine 和 Docker Compose,需要先安装这两个组件(安装过程省略)
安装条件详见:Harbor docs | Harbor Installation Prerequisites (goharbor.io)
证书准备
harbor 证书相关配置:Harbor docs | Configure HTTPS Access to Harbor (goharbor.io)
创建 CA 证书
创建CA私钥
root@harbor:~# mkdir -p /etc/pki/tls/
root@harbor:~# openssl genrsa -out /etc/pki/tls/ca.key 4096
创建CA证书
root@harbor:~# openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Shanghai/L=Shanghai/O=KMUST/OU=Personal/CN=skynemo.cn" \
-key /etc/pki/tls/ca.key \
-out /etc/pki/tls/ca.crt
创建 Harbor密钥证书
创建私钥
root@harbor:~# mkdir -p /etc/harbor/certs
root@harbor:~# openssl genrsa -out /etc/harbor/certs/harbor.skynemo.cn.key 4096
创建证书请求(CSR)
root@harbor:~# openssl req -sha512 -new \
-subj "/C=CN/ST=Shanghai/L=Shanghai/O=KMUST/OU=Personal/CN=harbor.skynemo.cn" \
-key /etc/harbor/certs/harbor.skynemo.cn.key \
-out /etc/harbor/certs/harbor.skynemo.cn.csr
创建 x509 v3 扩展文件
root@harbor:~# cat > /etc/harbor/certs/v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=*.skynemo.cn
IP.1=192.168.111.171
EOF
基于扩展文件验证证书
root@harbor:~# openssl x509 -req -sha512 -days 3650 \
-extfile /etc/harbor/certs/v3.ext \
-CA /etc/pki/tls/ca.crt \
-CAkey /etc/pki/tls/ca.key \
-CAcreateserial \
-in /etc/harbor/certs/harbor.skynemo.cn.csr \
-out /etc/harbor/certs/harbor.skynemo.cn.crt
转换证书后缀
# docker daemon 会把 .crt 结尾的证书认为是 CA 的证书,把 .cert 结尾的证书认为是客户端证书
root@harbor:~# openssl x509 -inform PEM -in /etc/harbor/certs/harbor.skynemo.cn.crt -out /etc/harbor/certs/harbor.skynemo.cn.cert
查看生成的证书
[root@harbor ~]# ll /etc/harbor/certs/
total 20
-rw-r--r--. 1 root root 2074 Dec 2 22:13 harbor.skynemo.cn.cert
-rw-r--r--. 1 root root 2074 Dec 2 22:12 harbor.skynemo.cn.crt
-rw-r--r--. 1 root root 1712 Dec 2 22:10 harbor.skynemo.cn.csr
-rw-r--r--. 1 root root 3243 Dec 2 22:10 harbor.skynemo.cn.key
-rw-r--r--. 1 root root 252 Dec 2 22:12 v3.ext
安装
官方安装包下载地址:Releases · goharbor/harbor · GitHub
下载解压安装包
# 下载离线安装包
root@harbor:~# wget https://github.com/goharbor/harbor/releases/download/v2.6.2/harbor-offline-installer-v2.6.2.tgz
# 解压
root@harbor:~# mkdir -p /apps
root@harbor:~# tar -xf harbor-offline-installer-v2.6.2.tgz -C /apps
配置安装
配置
# 创建数据存放目录
root@harbor:~# mkdir -p /data/harbor
root@harbor:~# cd /apps/harbor/
# 修改配置
root@harbor:~/harbor# cp harbor.yml.tmpl harbor.yml
root@harbor:~/harbor# vim harbor.yml
# 修改域名为当前主机或当前主机 IP,需要与颁发证书时设置的一致
hostname: harbor.skynemo.cn
# 指定 harbor 登录 admin 用户的密码
harbor_admin_password: Harbor12345
# 若无证书则需要注释 https 相关配置
# 配置 https 证书
https:
port: 443
certificate: /etc/harbor/certs/harbor.skynemo.cn.cert
private_key: /etc/harbor/certs/harbor.skynemo.cn.key
# 数据存放目录
data_volume: /data/harbor
安装
# 运行 harbor 安装脚本
root@harbor:~/harbor# ./install.sh
....
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating harbor-portal ... done
Creating registryctl ... done
Creating harbor-db ... done
Creating redis ... done
Creating registry ... done
Creating harbor-core ... done
Creating nginx ... done
Creating harbor-jobservice ... done
✔ ----Harbor has been installed and started successfully.----
# 安装并开启 Chartmuseum 功能(Helm 仓库)
./install.sh --with-chartmuseum
# 安装成功后,会在 /apps/harbor 目录下生成 docker-compose.yml 配置文件,并自动启动 harbor
# 可以用 docker-compose 命令开启、关闭 harbor
docker-compose -f ./docker-compose.yml up -d
docker-compose -f ./docker-compose.yml down
配置开机自启动
由于 harbor 使用 docker-compose 编排,所以可以通过 docker-compose 设置 harbor 的开机自启动
root@harbor:~# vim /usr/lib/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-resolved.service
Requires=docker.service
Documentation=https://goharbor.io/
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/docker-compose -f /apps/harbor/docker-compose.yml up -d
ExecStop=/usr/bin/docker-compose -f /apps/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
root@harbor:~# systemctl daemon-reload
root@harbor:~# systemctl enable harbor
查看运行状态
root@harbor:/apps/harbor# docker-compose ls
NAME STATUS CONFIG FILES
harbor running(9) /apps/harbor/docker-compose.yml
root@harbor:/apps/harbor# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1d4221d82d3a goharbor/harbor-jobservice:v2.6.2 "/harbor/entrypoint.…" 52 seconds ago Up 49 seconds (healthy) harbor-jobservice
42c7fed676f0 goharbor/nginx-photon:v2.6.2 "nginx -g 'daemon of…" 52 seconds ago Up 49 seconds (healthy) 0.0.0.0:80->8080/tcp, :::80->8080/tcp, 0.0.0.0:443->8443/tcp, :::443->8443/tcp nginx
d0eb2127e420 goharbor/harbor-core:v2.6.2 "/harbor/entrypoint.…" 52 seconds ago Up 50 seconds (healthy) harbor-core
c3fd31e3977f goharbor/registry-photon:v2.6.2 "/home/harbor/entryp…" 52 seconds ago Up 50 seconds (healthy) registry
d871a6d5b2db goharbor/harbor-registryctl:v2.6.2 "/home/harbor/start.…" 52 seconds ago Up 50 seconds (healthy) registryctl
9929a195a08a goharbor/harbor-db:v2.6.2 "/docker-entrypoint.…" 52 seconds ago Up 50 seconds (healthy) harbor-db
96bd39a0d9f1 goharbor/harbor-portal:v2.6.2 "nginx -g 'daemon of…" 52 seconds ago Up 50 seconds (healthy) harbor-portal
7bd614dc5961 goharbor/redis-photon:v2.6.2 "redis-server /etc/r…" 52 seconds ago Up 50 seconds (healthy) redis
3ec52d5871f4 goharbor/harbor-log:v2.6.2 "/bin/sh -c /usr/loc…" 52 seconds ago Up 51 seconds (healthy) 127.0.0.1:1514->10514/tcp
修改配置
可以使用 prepare
脚本修改配置,脚本运行时会自动应用 harbor.yml
配置文件中的修改,生成 docker-compose.yml
文件,而后重启即可
root@harbor:/apps/harbor# ./prepare
docker-compose -f ./docker-compose.yml down -v
docker-compose -f ./docker-compose.yml up -d
使用 harbor
登录 web 页面
用户名为 admin
,密码默认为 harbor.yml
中配置的密码
创建项目
harbor上必须先创建项目,才能够上传镜像
docker 客户端登录
客户端登录只需要一个文件:CA证书(ca.crt)或域名证书(域名.crt)
但如果路径下存在私钥,则至少需要三个文件:
- CA证书(ca.crt)或域名证书(域名.crt)
- 证书:xx.cert
- 证书对应的私钥:xx.key
复制证书文件
# 创建证书存放目录< /etc/docker/certs.d/域名:端口 >端口为 443 时(默认)可以省略
root@docker:~# mkdir -p /etc/docker/certs.d/harbor.skynemo.cn
# 拷贝CA证书
root@docker:~# scp 192.168.111.171:/etc/pki/tls/ca.crt /etc/docker/certs.d/harbor.skynemo.cn/ca.crt
# 或者 拷贝harbor服务证书
root@docker:~# scp 192.168.111.171:/etc/harbor/certs/harbor.skynemo.cn.crt /etc/docker/certs.d/harbor.skynemo.cn/harbor.skynemo.cn.crt
root@docker:~# scp 192.168.111.171:/etc/harbor/certs/harbor.skynemo.cn.cert /etc/docker/certs.d/harbor.skynemo.cn/
root@docker:~# scp 192.168.111.171:/etc/harbor/certs/harbor.skynemo.cn.key /etc/docker/certs.d/harbor.skynemo.cn/
[root@docker ~]# ll /etc/docker/certs.d/harbor.skynemo.cn/
total 12
-rw-r--r--. 1 root root 2025 Dec 2 23:41 ca.crt
-rw-r--r--. 1 root root 2074 Dec 2 23:52 harbor.skynemo.cn.cert
-rw-r--r--. 1 root root 3243 Dec 2 23:50 harbor.skynemo.cn.key
# 添加域名解析
root@docker:~# echo "192.168.111.171 harbor.skynemo.cn" >> /etc/hosts
# 登录
root@docker:~# docker login -u admin harbor.skynemo.cn
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
镜像打标签并上传
root@docker:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest c059bfaa849c 2 months ago 5.59MB
# 打标签
root@docker:~# docker tag alpine:latest harbor.nemo.cn/example/my-alpine:v1.0
root@docker:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest c059bfaa849c 2 months ago 5.59MB
harbor.nemo.cn/example/my-alpine v1.0 c059bfaa849c 2 months ago 5.59MB
# 上传镜像
root@docker:~# docker push harbor.nemo.cn/example/my-alpine:v1.0
The push refers to repository [harbor.nemo.cn/example/my-alpine]
8d3ac3489996: Pushed
v1.0: digest: sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3 size: 528
web页面查看镜像
拉取镜像并启动容器
root@docker:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# 拉取镜像
root@docker:~# docker pull harbor.nemo.cn/example/my-alpine:v1.0
v1.0: Pulling from example/my-alpine
59bf1c3509f3: Pull complete
Digest: sha256:e7d88de73db3d3fd9b2d63aa7f447a10fd0220b7cbf39803c803f2af9ba256b3
Status: Downloaded newer image for harbor.nemo.cn/example/my-alpine:v1.0
harbor.nemo.cn/example/my-alpine:v1.0
root@docker:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
harbor.nemo.cn/example/my-alpine v1.0 c059bfaa849c 2 months ago 5.59MB
# 运行容器
root@docker:~# docker run -it --rm harbor.nemo.cn/example/my-alpine:v1.0 sh
/ #
Docker 网络
docker 在安装完成后,会在宿主机生成一个名为 docker0 的网络接口,IP 地址默认是 172.17.0.1/16。可以通过 daemon.json
修改。docker0 网络接口实际上是一个网桥,为 docker 容器提供桥接模式网络,可以通过命令 brctl show
查看所有网桥
docker 默认支持三种网络模式,可以用 docker network ls
查看
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
812830412e0a bridge bridge local
8917f8591ed1 host host local
4ecb8dd76720 none null local
除此之外,还有一种特别的网络模式:container
bridge
默认模式,,docker 会为容器分配一个网络接口并设置 IP,并将该网络接口桥接至 docker0 。
该模式下,docker proxy 会创建一对对等虚拟设备接口 veth pair
,将其中一个接口设置为容器的 eth0
接口(容器的网络接口),另一个接口放置在宿主机的命名空间中,以类似 vethxxx
这样的名字命名。
同时,守护进程还会从网桥 docker0
的私有地址空间中分配一个 IP 地址和子网给该容器,并设置 docker0 的 IP 地址为容器的默认网关。可以安装 bridge-utils
后,通过 brctl show
命令查看网桥信息
命令
默认即为 bridge 模式,也可以用以下方式指定
docker run --network bridge ...
# 或
docker run --net bridge ...
网络结构图
示例
允许一个容器,默认即是 bridge 模式
[root@docker ~]# docker run -it --name busybox busybox:latest
查看容器内网络接口情况
查看宿主机网络接口情况
host
那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,而是使用宿主机的 IP 和端口
命令
docker run --network host ...
# 或
docker run --net host ...
示例
host 模式时,在容器中看到的是宿主机的网络接口
[root@docker ~]# docker run -it --network host --name busybox --rm busybox:latest
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:c9:5a:db brd ff:ff:ff:ff:ff:ff
inet 192.168.111.171/24 brd 192.168.111.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fec9:5adb/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue
link/ether 02:42:7c:0f:45:e5 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:7cff:fe0f:45e5/64 scope link
valid_lft forever preferred_lft forever
优缺点
优点:减少网络转发次数,网络效率比 bridge 模式更好
缺点:IP 和端口都是使用宿主机,没有隔离性
none
none 模式的容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个容器只有 lo 回环网络,没有其他网络接口、IP、路由等信息。也因此,可以很好地保证容器安全性
命令
docker run --network none ...
# 或
docker run --net none ...
示例
[root@docker ~]# docker run -it --network none --name busybox --rm busybox:latest
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
查看 namespace,可以看到有 net,说明有 none 也有自己的命名空间
[root@docker ~]# ls -l /proc/$(docker inspect -f '{{.State.Pid}}' fb2c9f00c7b0)/ns
total 0
lrwxrwxrwx. 1 root root 0 Dec 3 13:38 ipc -> ipc:[4026532498]
lrwxrwxrwx. 1 root root 0 Dec 3 13:38 mnt -> mnt:[4026532496]
lrwxrwxrwx. 1 root root 0 Dec 3 13:37 net -> net:[4026532501]
lrwxrwxrwx. 1 root root 0 Dec 3 13:38 pid -> pid:[4026532499]
lrwxrwxrwx. 1 root root 0 Dec 3 13:38 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 Dec 3 13:38 uts -> uts:[4026532497]
container
container 模式创建的容器不会有自己的网络接口,而是和已存在的一个容器共享 Network Namespace
新创建的容器不会创建自已的网卡,配置自已的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信
命令
docker run --network=container:{容器 ID 或容器 Name} ...
# 或
docker run --net=container:{容器 ID 或容器 Name} ...
示例
创建第一个容器,使用默认的 bridge 网络模式
[root@docker ~]# docker run -it --name busybox1 --rm busybox:latest
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
60: eth0@if61: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
创建第二个容器,指定模式为 container,与第一个容器共享网络
[root@docker ~]# docker run -it --name busybox2 --network=container:252f6e77a8f4 --rm busybox:latest
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
60: eth0@if61: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
可以看到两个容器的网络是一致的
查看两个容器的 Network Namespace
[root@docker ~]# ls -l /proc/$(docker inspect -f '{{.State.Pid}}' ed7280079076)/ns
total 0
lrwxrwxrwx. 1 root root 0 Dec 3 13:54 ipc -> ipc:[4026532567]
lrwxrwxrwx. 1 root root 0 Dec 3 13:54 mnt -> mnt:[4026532565]
lrwxrwxrwx. 1 root root 0 Dec 3 13:54 net -> net:[4026532503]
lrwxrwxrwx. 1 root root 0 Dec 3 13:54 pid -> pid:[4026532568]
lrwxrwxrwx. 1 root root 0 Dec 3 13:54 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 Dec 3 13:54 uts -> uts:[4026532566]
[root@docker ~]#
[root@docker ~]# ls -l /proc/$(docker inspect -f '{{.State.Pid}}' 252f6e77a8f4)/ns
total 0
lrwxrwxrwx. 1 root root 0 Dec 3 13:54 ipc -> ipc:[4026532500]
lrwxrwxrwx. 1 root root 0 Dec 3 13:54 mnt -> mnt:[4026532498]
lrwxrwxrwx. 1 root root 0 Dec 3 13:51 net -> net:[4026532503]
lrwxrwxrwx. 1 root root 0 Dec 3 13:54 pid -> pid:[4026532501]
lrwxrwxrwx. 1 root root 0 Dec 3 13:54 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 Dec 3 13:54 uts -> uts:[4026532499]
可以看出,两个容器其余 Namespace 都是独有,但 Network Namespace 是同一个
总结
网络模式 | 特点 | 使用命令 |
---|---|---|
bridge | 默认模式,为每一个容器设置网络接口,分配 IP,并桥接到 docker0 | docker run --net bridge ... |
host | 容器直接使用宿主机 IP 和端口 | docker run --net host ... |
none | 直接禁用容器的网络功能 | docker run --net none ... |
container | 容器与另一个指定的容器共享 IP 和端口 | docker run --net=container:{容器 ID 或容器 Name} ... |
Docker Compose 编排示例
总体结构设计
总共三个容器,Nginx、Halo、DB
- Nginx 作为反向代理使用
- Halo 是一个开源的 Java 博客
- DB 使用的是 postgresql
分为两个网络区域
- DB 所在的区域为后端私有区域,不对外开放
- Nginx 所在的区域为前端区域,对外开放
- Halo 需要连接数据库,同时需要接受 Nginx 转发的数据,所以两个网络区域均有接口
创建 yaml
创建目录
[root@docker ~]# mkdir -p /data/docker-compose/halo
编写 yaml文件
[root@docker ~]# vim /data/docker-compose/halo/docker-compose.yaml
version: "3"
services:
nginx:
image: nginx:1.22.1
container_name: nginx
restart: on-failure:3
depends_on:
halo:
condition: service_started
networks:
halo_net_frontend:
volumes:
- ./etc/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./etc/nginx/conf.d:/etc/nginx/conf.d
ports:
- "80:80"
- "443:443"
halo:
image: halohub/halo:2.0.0
container_name: halo
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_net_frontend:
halo_net_backend:
volumes:
- ./halo2:/root/.halo2
# ports:
# - "8090:8090"
environment:
- SPRING_R2DBC_URL=r2dbc:pool:postgresql://halodb/halo
- SPRING_R2DBC_USERNAME=halo
# PostgreSQL 的密码,保证与下方 POSTGRES_PASSWORD 的变量值一致。
- SPRING_R2DBC_PASSWORD=openpostgresql
- SPRING_SQL_INIT_PLATFORM=postgresql
# 外部访问地址,请根据实际需要修改
- HALO_EXTERNAL_URL=http://localhost:8090/
# 初始化的超级管理员用户名
- HALO_SECURITY_INITIALIZER_SUPERADMINUSERNAME=admin
# 初始化的超级管理员密码
- HALO_SECURITY_INITIALIZER_SUPERADMINPASSWORD=P@88w0rd
halodb:
image: postgres:15.1-bullseye
container_name: halodb
restart: on-failure:3
networks:
halo_net_backend:
volumes:
- ./db:/var/lib/postgresql/data
healthcheck:
test: [ "CMD", "pg_isready", "-U", "halo" ]
interval: 10s
timeout: 5s
retries: 5
environment:
- POSTGRES_PASSWORD=openpostgresql
- POSTGRES_USER=halo
- POSTGRES_DB=halo
networks:
halo_net_frontend:
driver: bridge
ipam:
driver: default
halo_net_backend:
driver: bridge
internal: true
ipam:
driver: default
nginx 主要配置
[root@docker halo]# cat ./etc/nginx/conf.d/halo/halo.conf
upstream halo-servers {
server halo:8090;
}
server {
listen 80;
listen [::]:80;
client_max_body_size 1024m;
location / {
proxy_pass http://halo-servers;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
启动与检查
后台启动
[root@docker halo]# cd /data/docker-compose/halo && docker compose up -d
[+] Running 3/3
⠿ Container halodb Healthy 10.7s
⠿ Container halo Started 11.0s
⠿ Container nginx Started 11.4s
检查
# 检查容器运行情况
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e662ae91a1c3 nginx:1.22.1 "/docker-entrypoint.…" 13 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp nginx
1773a6108f13 halohub/halo:2.0.0 "/bin/sh -c 'java ${…" 19 minutes ago Up 7 minutes halo
1db20230b872 postgres:15.1-bullseye "docker-entrypoint.s…" 19 minutes ago Up 7 minutes (healthy) 5432/tcp halodb
# 接口访问检查
[root@docker halo]# curl --location --request GET 'http://192.168.111.171/console/#/login' -I
HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Sun, 04 Dec 2022 05:22:25 GMT
Content-Type: text/html
Content-Length: 2462
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Last-Modified: Thu, 01 Dec 2022 01:34:28 GMT
Accept-Ranges: bytes
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 0
Referrer-Policy: no-referrer