2024-10-29 08:35:12 +08:00

254 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 一.从平安电器下拉取并上传服务器想要的docker镜像
```
docker images //查询所有的docker 镜像
docker docker save -o gitea.tar gitea/gitea:1.22.1//gitea.tar为拉取后的压缩文件名称gitea/gitea:1.22.1为docker的镜像名加版本号。
```
![alt text](Mirror.jpg)
```docker load -i gitea.tar //导入所需要的镜像压缩包gitea.tar为要导入的镜像压缩包导入后可使用docker images```
## 二.创建docker容器
先查看docker里面有无我们需要存在的镜像然后运行docker语句
### 1.nginx
例子docker run --name nginx -p 80:80 -p 443:443 -v /workspace/www:/usr/share/nginx/html:rw -v /workspace/nginx/conf.d:/etc/nginx/conf.d:rw -v /workspace/nginx/logs:/var/log/nginx -v /workspace/nginx/nginx.conf:/etc/nginx/nginx.conf:rw --restart=always -d nginx:stable-alpine
介绍:
  docker run: 用于在Docker中运行一个容器。
  --name nginx: 指定容器的名称为"nginx"。
  -p 80:80 -p 443:443: 将容器内部的端口映射到主机的端口其中80和443分别映射到主机的80和443端口。
  -v /workspace/www:/usr/share/nginx/html:rw: 将主机上的/workspace/www目录挂载到容器内的/usr/share/nginx/html目录并设置读写权限。
  -v /workspace/nginx/conf.d:/etc/nginx/conf.d:rw: 将主机上的/workspace/nginx/conf.d目录挂载到容器内的/etc/nginx/conf.d目录并设置读写权限。
  -v /workspace/nginx/logs:/var/log/nginx: 将主机上的/workspace/nginx/logs目录挂载到容器内的/var/log/nginx目录。
  -v /workspace/nginx/nginx.conf:/etc/nginx/nginx.conf:rw: 将主机上的/workspace/nginx/nginx.conf文件挂载到容器内的/etc/nginx/nginx.conf文件并设置读写权限。
  --restart=always: 设置容器在退出时自动重启。
  -d: 以后台模式运行容器。```
### 2.pgsql
例子docker run -d --name postgres -p 5432:5432 -v /workspace/data/postgresql/data:/var/lib/postgresql/data -v /workspace/data/postgresql/postgres.conf:/etc/postgresql/postgresql.conf -e POSTGRES_PASSWORD=Pingan@ecs --restart=always postgres:16.2 -c 'config_file=/etc/postgresql/postgresql.conf'
介绍:
  docker run: 用于在Docker中运行一个容器。
  -d: 以后台模式运行容器。
  --name postgres: 指定容器的名称为"postgres"。
  -p 5432:5432: 将容器内部的端口映射到主机的端口其中5432映射到主机的5432端口。
  -v /workspace/data/postgresql/data:/var/lib/postgresql/data: 将主机上的/  workspace/data/postgresql/data目录挂载到容器内的/var/lib/postgresql/data目录。
  -v /workspace/data/postgresql/postgres.conf:/etc/postgresql/postgresql.conf: 将主机上的/workspace/data/postgresql/postgres.conf文件挂载到容器内的/etc/postgresql/postgresql.conf文件。
  -e POSTGRES_PASSWORD=Pingan@ecs: 设置环境变量POSTGRES_PASSWORD为"Pingan@ecs"。
  --restart=always: 设置容器在退出时自动重启。
  postgres:15.4-bullseye: 使用的镜像名称为"postgres",版本为"16.2"。
  -c 'config_file=/etc/postgresql/postgresql.conf': 指定容器启动时要执行的命令,这里设置了配置文件路径为/etc/postgresql/postgresql.conf。
### 3.redis:
例子docker run --name redis -p 6379:6379 -v /workspace/redis/conf:/usr/local/etc/redis -v /workspace/redis/data:/data -d redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes
介绍:
  docker run: 用于在Docker中运行一个容器。
  --name redis: 指定容器的名称为"redis"。
  -p 6379:6379: 将容器内部的端口映射到主机的端口其中6379映射到主机的6379端口。
  -v /workspace/redis/conf:/usr/local/etc/redis: 将主机上的/workspace/redis/conf目录挂载到容器内的/usr/local/etc/redis目录。
  -v /workspace/redis/data:/data: 将主机上的/workspace/redis/data目录挂载到容器内的/data目录。
  -d: 以后台模式运行容器。
  redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes: 指定容器启动时要执行的命令这里使用了Redis服务器的配置文件路径为/usr/local/etc/redis/redis.conf并设置了持久化选项为"yes"。
### 4.RabbitMQ:
例子docker run -d --hostname rabbit --name rabbitmq -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=paiot rabbitmq:3.11.5-management
介绍:
  docker run: 用于在Docker中运行一个容器。
  -d: 以后台模式运行容器。
  --hostname rabbit: 指定容器的主机名为"rabbit"。
  --name rabbitmq: 指定容器的名称为"rabbitmq"。
  -p 15672:15672 -p 5672:5672: 将容器内部的端口映射到主机的端口其中15672映射到主机的15672端口5672映射到主机的5672端口。
  -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=paiot: 设置环境变量RABBITMQ_DEFAULT_USER为"root"RABBITMQ_DEFAULT_PASS为"paiot"。
  rabbitmq:3.11.5-management: 使用的镜像名称为"rabbitmq",版本为"3.11.5-management"。
### 5.iot-api(平安的项目接口):
例子docker run -it --name iot-api -v /workspace/www/api:/app -p 8081:80 -p 1883:1883 --restart=always -d mickxu/aspnet:8.0 PAIoT.dll
介绍:
  docker run: 用于在Docker中运行一个容器。
  -it: 以交互式模式运行容器,并分配一个伪终端。
  --name iot-api: 指定容器的名称为"iot-api"。
  -v /workspace/www/api:/app: 将主机上的/workspace/www/api目录挂载到容器内的/app目录。
  -p 8081:80 -p 1883:1883: 将容器内部的端口映射到主机的端口其中8081映射到主机的80端口1883映射到主机的1883端口。
  --restart=always: 设置容器在退出时自动重启。
  -d mickxu/aspnet:8.0.: 使用的镜像名称为"mickxu/aspnet",版本为"8.0"。
  PAIoT.dll: 容器启动时要执行的命令这里使用了ASP.NET Core应用程序的入口点文件"PAIoT.dll"。
### 6.mqtt(平安mqtt接口):
例子docker run -it --name mqtt -v /workspace/www/mqtt:/app -p 1883:1883 --restart=always -d mickxu/aspnet:8.0 PAIoT.MQTT.dll
介绍:
  docker run: 用于在Docker中运行一个容器。
  -it: 以交互式模式运行容器,并分配一个伪终端。
  --name mqtt: 指定容器的名称为"mqtt"。
  -v /workspace/www/mqtt:/app: 将主机上的/workspace/www/mqtt目录挂载到容器内的/app目录。
  -p 1883:1883: 将容器内部的端口映射到主机的端口其中1883映射到主机的1883端口。
  --restart=always: 设置容器在退出时自动重启。
  -d mickxu/aspnet:8.0: 使用的镜像名称为"mickxu/aspnet",版本为"8.0"。
PAIoT.MQTT.dll: 容器启动时要执行的命令这里使用了ASP.NET Core应用程序的入口点文件"PAIoT.MQTT.dll"。
### 7.mqtt(平安定时任务接口):
例子docker run -it --name jobs -v /workspace/www/jobs:/app -p 80818080 --restart=always -d mickxu/aspnet:8.0 PAIoT.Jobs.dll//注意此处的8081端口号和上面iot-api冲突
介绍:
  docker run: 用于在Docker中运行一个容器。
  -it: 以交互式模式运行容器,并分配一个伪终端。
  --name jobs: 指定容器的名称为"jobs"。
  -v /workspace/www/jobs:/app: 将主机上的/workspace/www/jobs目录挂载到容器内的/app目录。
  -p 8081:8080: 将容器内部的端口映射到主机的端口其中8081映射到主机的8080端口。
  --restart=always: 设置容器在退出时自动重启。
  -d mickxu/aspnet:8.0: 使用的镜像名称为"mickxu/aspnet",版本为"8.0"。
  PAIoT.Jobs.dll: 容器启动时要执行的命令这里使用了ASP.NET Core应用程序的入口点文件"PAIoT.Jobs.dll"。
### 8.mqtt(平安定时任务接口):
例子docker run -it --name datasync -v /workspace/www/datasync:/app -p 18831883 --restart=always -d mickxu/aspnet:8.0 PAIoT.datasync.dll//注意此处的1883端口号和上面iot-api冲突
介绍:
  docker run: 用于在Docker中运行一个容器。
  -it: 以交互式模式运行容器,并分配一个伪终端。
  --name datasync: 指定容器的名称为"datasync"。
  -v /workspace/www/datasync:/app: 将主机上的/workspace/www/datasync目录挂载到容器内的/app目录。
  -p 8081:8080: 将容器内部的端口映射到主机的端口其中8081映射到主机的8080端口。
  --restart=always: 设置容器在退出时自动重启。
  -d mickxu/aspnet:8.0: 使用的镜像名称为"mickxu/aspnet",版本为"8.0"。
  PAIoT.datasync.dll: 容器启动时要执行的命令这里使用了ASP.NET Core应用程序的入口点文件"PAIoT.datasync.dll"。
#### 部署完成后可以使用```docker logs [docker名称] -t ```查看各个端口有没有报错
### 三.守护线程
&ensp;&ensp;守护线程可以参考csdn的一篇文章<https://blog.csdn.net/xjxy52o/article/details/132178791>
&ensp;&ensp;**以下为个人总结注意系统为centos 8.0**
&ensp;&ensp;centos配置yum源
```
备份原有的YUM源配置文件:sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
编辑YUM源配置文件:sudo vi /etc/yum.repos.d/CentOS-Base.repo
在文件中添加新的YUM源例如阿里云的YUM源
[base]
name=CentOS-$releasever - Base
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-$releasever - Updates
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-$releasever - Extras
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
清除YUM缓存并更新软件包列表
sudo yum clean all
sudo yum makecache
```
&ensp;&ensp;安装supervisor
```
yum install -y epel-release
yum -y install supervisor
1.安装完成后,会在 /usr/bin 下加入三个命令:
[root@lqz bin]# ls /usr/bin/|grep super
echo_supervisord_conf # 生成一个配置文件示例
supervisorctl # 客户端
supervisord # 服务端
2.安装完成后,会在 /etc 下创建一个 supervisord.d 目录用于存放supervisor的子配置文件,还有一个supervisord.conf配置文件如果没有使用命令 echo_supervisord_conf > /etc/supervisord.conf 生成)
[root@lqz etc]# ls /etc|grep super
supervisord.conf
supervisord.d
3.启动Supervisor服务后面会说system的启动方式
/usr/bin/supervisord -c /etc/supervisord.conf
```
&ensp;&ensp;配置supervisor
```
主配置文件:/etc/supervisord.conf:
[unix_http_server]
file=/var/run/supervisor/supervisor.sock ; UNIX socket 文件supervisorctl 会使用
;chmod=0700 ; socket 文件的 mode默认是 0700
;chown=nobody:nogroup ; socket 文件的 owner格式 uid:gid
;[inet_http_server] ; HTTP 服务器,提供 web 管理界面
;port=127.0.0.1:9001 ; Web 管理后台运行的 IP 和端口,如果开放到公网,需要注意安全性
;username=user ; 登录管理后台的用户名
;password=123 ; 登录管理后台的密码
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; 日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB ; 日志文件大小,超出会 rotate默认 50MB
logfile_backups=10 ; 日志文件保留备份数量默认 10
loglevel=info ; 日志级别,默认 info其它: debug,warn,trace
pidfile=/var/run/supervisord.pid ; pid 文件
nodaemon=false ; 是否在前台启动,默认是 false即以 daemon 的方式启动
minfds=1024 ; 可以打开的文件描述符的最小值,默认 1024
minprocs=200 ; 可以打开的进程数的最小值,默认 200
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor/supervisor.sock ; 通过 UNIX socket 连接 supervisord路径与 unix_http_server 部分的 file 一致
;serverurl=http://127.0.0.1:9001 ; 通过 HTTP 的方式连接 supervisord
; 包含其他的配置文件
[include]
files = supervisord.d/*.ini ; 可以是 *.conf 或 *.ini
子进程配置文件路径:/etc/supervisord.d/*.ini或conf
以下为ini配置
[program:theprogramname] ;程序在守护进程里的id
command=/bin/cat ; 程序运行命令,建议使用绝对路径。
process_name=%(program_name)s ; 程序名称,可用的变量有 `group_name`, `host_node_name`, `process_num`, `program_name`, `here`(配置文件目录)。 一般程序需要运行多个副本的情况会使用。后面会有例子。
numprocs=1 ; 程序运行的副本个数默认为1如果值大于1则`process_name` 必须包含 `%(process_num)s`
numprocs_start=0 ; `%(process_num)s`起始数字默认为0
00=/tmp ; 程序运行的所在目录相当于先cd到指定目录然后运行程序。
umask=022 ; umask for process (default None)
priority=999 ; 程序操作的的优先级例如在start all/stop all,高优先级的程序会先关闭和重启。
autostart=true ; 在supervisord启动时自动启动默认为true
startsecs=1 ; 程序启动前等待时间等待时间。默认为1。
startretries=3 ; 尝试重启最大次数。默认为3。
autorestart=unexpected ; 是否自动重启,可选参数为 false, unexpected, true。如果为false则不自动重启如果为unexpected表示如果程序退出信号不在 `exitcodes` 中则自动重启。默认为unexpected
exitcodes=0,2 ; 程序退出码。配合`autorestart`使用。默认为 0,2
stopsignal=QUIT ; 杀死进程时发送的信号默认为TREM。
stopwaitsecs=10 ; 发送SIGKILL信号前最大等待时间。默认为10。
user=dev ; 以指定用户身份启动程序。默认为当前用户。
stopasgroup=false ; 是否向子进程发送停止信号这对于Flask的debug模式很有用处如果设置为true则不向子进程发送停止信号。默认为false
killasgroup=false ; 是否向子进程发送kill信号默认为false
redirect_stderr=false ; 将错误输出定向到标准输出默认为false
stdout_logfile=/a/path ; 标准输出日志路径,可选参数为 `自定义` `AUTO` `NONE``自定义`将日志写到自定义路径,可用的变量有`group_name`, `host_node_name`, `process_num`, `program_name`, `here`(配置文件目录);`NONE`不创建日志;`AUTO` 又supervisord自动选择路径并且当supervisord服务重新启动时原来自动创建的日志以及日志的备份文件会被删除。默认为AUTO
stdout_logfile_maxbytes=1MB ; 标准输出日志单个文件最大大小,如果超过指定大小会将日志文件备份,可用的单位 KB MB GB。如果设置为0则表示不限制文件大小。默认为50MB
stdout_logfile_backups=10 ; 标准输出日志文件最大备份数。默认为10
stdout_capture_maxbytes=1MB ; 当进程处于“stdout capture mode”模式下写入到FIFO队列最大字节数可用单位 KB MB GB。默认为0详细说明见[capture-mode](http://supervisord.org/logging.html#capture-mode)
stdout_events_enabled=false ;
;以下配置项配置错误输出的日志参数。和上面标准输出配置相同。
stderr_logfile=/a/path ;
stderr_logfile_maxbytes=1MB ;
stderr_logfile_backups=10 ;
stderr_capture_maxbytes=1MB ;
stderr_events_enabled=false ;
environment=A="1",B="2" ; 环境变量设置,可用的变量有 `group_name`, `host_node_name`, `process_num`, `program_name`, `here`。 默认为空。
serverurl=AUTO ; override serverurl computation (childutils)
以下为.conf配置
[program:flutter_app.api] ;程序在守护进程里的id
command=dotnet flutter_app.api.dll ;程序的运行指令和程序
directory=/var/www/flutter_app/api ;程序存放的地址
environment=ASPNETCORE__ENVIRONMENT=Production ;环境变量
user=www-data ;程序以什么用户运行
stopsignal=INT ;这是当 Supervisor 需要停止程序时发送的信号。
autostart=true ;这意味着当 Supervisor启动时它会自启动这个程序。
autorestart=true ;这意味着如果程序意外退出Supervisor会自动重启它。
startsecs=1 ;这指定了程序启动后多少秒被认为是成功启动。
stderr_logfile=/var/log/supervisor/flutter_app.err.log ;错误输出的日志
stdout_logfile=/var/log/supervisor/flutter_app.out.log ;准输出的日志文件
进程管理命令:
# 查看supervisord当前管理的所有进程的状态
supervisorctl status
# 启动进程
supervisorctl start usercenter #启动单个进程
supervisorctl start all #启动所有进程
# 停止进程
supervisorctl stop usercenter
supervisorctl stop all
# 重启进程
supervisorctl restart usercenter #或者使用supervisorctl reload: 重启
supervisorctl restart all
# 读取有更新(增加)的配置文件,不会启动新添加的程序
supervisorctl reread
# 将配置文件里新增的子进程加入进程组如果设置了autostart=true则会启动新新增的子进程
supervisorctl update
```