前言

最近几天心血来潮想给网站更换一下部署架构,之前的项目一般都是直接写入Linux中配置,项目杂乱还不好管理,近期网上学习docker,和一直使用的宝塔面板,总结一下如何使用宝塔中的docker容器化部署项目

购买服务器

熟悉肯定要购买服务器,我使用的是腾讯云轻量云 镜像可以预装宝塔面板 然后根据提示配置账号密码 开放安全组

728_90

安装Docker

进入之后点击左边的docker进行安装,安装好后就是这个界面

image-20240720135541780

需要注意的是docker中央仓库是在国外,我们安装好之后记得设置一下仓库源

image-20240720135957209

宝塔官方预装了几种,这里选择的是腾讯云加速镜像

==部署Alist必须看,后面几个可以跳着看==

部署AList(必看)

先看Alist官方文档了解了解:https://alist.nn.ci/zh/guide/install/docker.html

切换到编排模版,增加一个编排模版

image-20240720140335313

编排的内容为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3.3'
services:
alist:
image: 'xhofe/alist:latest'
container_name: alist
volumes:
- '/etc/alist:/opt/alist/data'
ports:
- '5244:5244'
environment:
- PUID=0
- PGID=0
- UMASK=022
restart: unless-stopped`

细心可以发现这个编排和docker-compose是等价,这里就相当于给docker编辑配置。

注意下面两个 : 为分割 前面是宿主主机配置 后面是容器内部主机配置

文件映射 volumes:- ‘/etc/alist:/opt/alist/data’
端口映射 ports: - ‘5244:5244’

image-20240720141040849

编排好后可以点击容器编排或者容器-创建容器 -选择刚刚的容器编排 点击创建一个项目就部署完成 简单粗暴,其实内部宝塔做了大量工作

宝塔主要根据你写的编排文件,去使用docker拉取alist镜像,然后配置创建并且启动容器

image-20240720141600838

从本地镜像可以看到目前的镜像和哪个容器在使用

image-20240720141944371

点击容器详情可以看到本地的挂载数据配置,每次启动,容器都会去获取宿主主机的资源加载到容器里面,所以我们对alist进行配置的时候需要对宿主主机设置。

进入前台会发现我们没有密码 这个时候参考官网教程

image-20240720144846547

1
2
3
4
# 随机生成一个密码
docker exec -it alist ./alist admin random
# 手动设置一个密码,`NEW_PASSWORD`是指你需要设置的密码
docker exec -it alist ./alist admin set NEW_PASSWORD

image-20240720145002663

进入终端输入指令获取账号和密码,最后进入主页面就可以愉快玩耍啦

image-20240720145121264

alist设置mysql储存(可选)

需要去宿主主机目录里面的config.json设置为mysql,以及配置mysql的信息,这个alist官方有教程,就不细将了

image-20240720142205600

部署twikoo

先看官方文档:https://twikoo.js.org/backend.html#%E7%A7%81%E6%9C%89%E9%83%A8%E7%BD%B2-docker

官方提供编排

Docker Compose

1
2
3
4
5
6
7
8
9
10
11
12
version: '3'
services:
twikoo:
image: imaegoo/twikoo
container_name: twikoo
restart: unless-stopped
ports:
- 8080:8080
environment:
TWIKOO_THROTTLE: 1000
volumes:
- ./data:/app/data

使用宝塔进行编排,然后在容器找到编排文件直接启动就行(参考alist部署方式),

细心可以发现这个编排和docker-compose是等价,这里就相当于给docker编辑配置。

注意下面两个 : 为分割 前面是宿主主机配置 后面是容器内部主机配置

文件映射 volumes:- ‘./data:/app/data’
端口映射 ports: - ‘8080:8080’

这个建议换个地址好一点,因为twikoo的数据是默认本地储存,需要设置一个不容易忘了的地址

增加一个环境配置 切换数据库为monggoDB

1
2
MONGODB_URI=mongodb://twikoo:password@127.0.0.1:27017/twikoo
MONGO_URL=mongodb://twikoo:password@127.0.0.1:27017/twikoo

第二种部署方式

image-20240720143228064

这里输入以下代码拉取镜像

1
docker pull imaegoo/twikoo:latest

然后名称自己随便起,镜像选择刚刚拉取的镜像,主机端口我修改为8082 内部仍然是默认的8080, 挂载映射目录宿主和容器对应映射

image-20240720144217857

点击创建

image-20240720144552652

设置之后查看挂载目录

image-20240720144441920

很自然的挂载上去,具体设置可以按照宿主主机文件配置

image-20240720145257596

部署Java项目(jar包)

java部署需要自己创建镜像包,因为docker的官方仓库没有这个存在,那么如何创建镜像包呢,首先我们需要先创建一个Dockerfile文件名,里面编写配置

1
2
3
4
5
6
7
8
9
10
11
# 使用基础镜像,这个会自动拉取官方仓库
FROM openjdk:8-jdk

# 设置工作目录
WORKDIR /app

# 复制 JAR 文件到容器中
COPY fiction-0.0.1-SNAPSHOT.jar /app/fiction-0.0.1-SNAPSHOT.jar

# 运行 JAR 文件
CMD ["java", "-jar", "fiction-0.0.1-SNAPSHOT.jar"]

目录结构是这样的,必须保证配置文件和jar放在一块,因为上面的配置信息就是这样写的(也可以自己修改调整的)

==java项目如何打包jar包请自行百度。。。。==

image-20240720145848664

然后我们点击构建镜像,表情为镜像名 选择路径,并且选择刚刚的Dockerfile文件

image-20240720150136272

构建好镜像之后我们点击容器,将镜像输入配置文件信息之后启动 端口为java项目端口 外部是主机端口

每次将jar包上传之后,都需要重新打包镜像,再重启容器。

后续可能也会使用新的部署方法,大家可以到原文去查看更新,或者留言告诉一下博主,同类对比应该是宝塔自身的java项目部署更方便

image-20240720150639140

创建之后运行项目 启动成功

image-20240720151331455

部署Redis集群

部署Redis集群主要是自己写编排文件,最低的redis集群是6个,三主三从

我部署在三台服务器上面,每个服务器创建两个实例(也就是两个容器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 绑定到所有网络接口
bind 0.0.0.0

# 设置 Redis 密码
requirepass password
masterauth password

# 启用 Redis 持久化(追加文件)
appendonly yes

# 配置集群设置
cluster-enabled yes
cluster-config-file /data/nodes.conf
cluster-node-timeout 5000

# 其他可选设置
# logfile /var/log/redis/redis-server.log
# dir /data

image-20240720151712256

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: '3.8'

services:
redis-1:
image: redis:latest
container_name: redis-1
ports:
- "6379:6379" # 映射容器的6379端口到主机的6379端口
- "16379:16379" # 映射容器的16379端口到主机的16379端口
volumes:
- /www/wwwroot/redis/redis.conf:/usr/local/etc/redis/redis.conf
- redis-data-1:/data
command: redis-server /usr/local/etc/redis/redis.conf
# 启动 Redis 服务器,使用指定的配置文件

redis-2:
image: redis:latest
container_name: redis-2
ports:
- "6380:6379" # 映射容器的6379端口到主机的6380端口
- "16380:16379" # 映射容器的16379端口到主机的16380端口
volumes:
- /www/wwwroot/redis/redis.conf:/usr/local/etc/redis/redis.conf
- redis-data-2:/data
command: redis-server /usr/local/etc/redis/redis.conf
# 启动 Redis 服务器,使用指定的配置文件

volumes:
redis-data-1:
redis-data-2:

细心可以发现这个编排和docker-compose是等价,这里就相当于给docker编辑配置。

注意下面两个 : 为分割 前面是宿主主机配置 后面是容器内部主机配置

文件映射 volumes: - redis-data-2:/data
端口映射 ports: - ‘6379:6379’ - “16379:16379”

点击容器,创建容器,使用编排创建 启动之后会有两个容器

image-20240720151854393

为什么要设置16379和16380呢,这里是因为集群需要有集群总端口

每个 Redis Cluster 节点都需要 2TCP 连接打开,正常的 Redis TCP 端口被服务于客户端,例如:6379,加上通过增加 10000 到数据端口获取的端口,例如:16379

第二个高端口被用来 Redis Cluster Bus,也就是使用二进制协议的一个节点到节点的通信信道。Redis Cluster Bus 被节点用于故障检测,配置更新,故障转移授权等等。客户端不应该尝试与 Redis Cluster Bus 端口进行通信,而是始终使用正常的 Redis 命令端口,然而要确保在防火墙中打开两个端口,否则 Redis Cluster 节点将无法通信。

命令端口和 Redis Cluster Bus 端口偏移是固定的,始终为 10000

注意,为了使 Redis Cluster 正常工作,你需要为每个节点:

  • 用于客户端进行通信的普通客户端通信端口(通常使用 6379)对所有需要到达集群的客户端,以及所有其它集群节点(使用客户端端口进行密钥迁移)都是开放的
  • Redis Cluster Bus 端口(客户端端口 +10000)必须可从所有其它集群节点访问

如果不打开两个 TCP 端口,集群将无法按预期工作

Redis Cluster Bus 使用不同的二进制协议进行节占到节点的数据交换,这更适合于使用少量的带宽和处理时间交换节点之间的信息

==腾讯云安全组也需要开放这些端口==

然后我们随便进入一个redis实例的终端进行编辑集群

image-20240720152159529

1
redis-cli --cluster create 127.0.0.1:6379 127.0.0.2:6379 127.0.0.3:6379 127.0.0.1:6380 127.0.0.2:6380 127.0.0.3:6380 --cluster-replicas 1 -a 'password'

–cluster-replicas 1 这个代表每个节点都必须有一个从节点,然后redis自由去组合

image-20240720152537506

输入yes

image-20240720152619671

出现OK则代表配置成功。

下面是查看集群的命令

1
2
3
redis-cli -c -a password cluster nodes 

redis-cli -c -a password cluster info

部署MongoDB

参考上面步骤举一反三
安装教程:https://www.runoob.com/docker/docker-install-mongodb.html

docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: "3.5"

services:
mongodb:
image: mongo
container_name: mongodb
restart: on-failure
ports:
- 27017:27017
environment:
TZ: Asia/Shanghai
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: 123456
volumes:
- ./mongoDB:/data/db
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"

链接进入创建用户和密码

1
2
3
4
5
6
新建一个twikoo数据库
db.createUser({
user: "twikoo",
pwd: "pwd",
roles: [ { role: "readWrite", db: "twikoo" } ]
})`

docker清理

一天的时间,docker日志写了30个GB,太夸张了,像个人博主的网站没必要有日志,直接全局设置,每个容器10MB日志

1
2
3
4
5
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}

image-20240723200612630

再清理之前写入的日志

1
/var/lib/docker/containers/history_logs

后续

以上就是最近使用docker的心得,先希望大家可以指正,最主要的是看完可以举一反三,也能够明白docker命令的含义。