云原生预习-Docker-2

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角色安装服务
harbor192.168.111.171harborDocker engine、Docker Compose、harbor
docker192.168.111.188dockerDocker 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,并桥接到 docker0docker 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值