Docker作为一个开源容器引擎,可以极大的简化软件的部署安装。容器可以打包应用、软件、操作系统成为镜像,发布的镜像可以在各种环境中部署,启动即可直接运行,无需复杂安装。其采用沙箱机制提供虚拟化环境,各容器相互隔离,对宿主环境的侵入性极小。
Docker官网:https://www.docker.com
1.安装docker
官方脚本安装:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2.启动docker服务
service docker start
或
systemctl start docker
3.配置镜像加速
- 网易:https://hub-mirror.c.163.com/
- 阿里云:https://<你的ID>.mirror.aliyuncs.com
- 七牛云加速器:https://reg-mirror.qiniu.com
阿里云获取镜像地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
在/etc/docker/daemon.json中加入加速器服务,docker启动会自动生成/etc/docker文件夹,如果没有daemon.json文件,需要自己创建。
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://doublezonline.cloud",
"https://dislabaiot.xyz",
"https://docker.fxxk.dedyn.io",
"https://dockerpull.org",
"https://docker.unsee.tech",
"https://hub.rat.dev",
"https://docker.1panel.live",
"https://docker.nastool.de",
"https://docker.zhai.cm",
"https://docker.5z5f.com",
"https://a.ussh.net",
"https://docker.udayun.com",
"https://hub.geekery.cn"
]
}
其他源(可能更快一些)
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://dockerhub.azk8s.cn",
"https://mirror.ccs.tencentyun.com",
"https://registry.cn-hangzhou.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.m.daocloud.io",
"https://noohub.ru",
"https://huecker.io",
"https://dockerhub.timeweb.cloud"
]
}
默认情况下,docker会绕过firewalld防火墙,直接操作iptables,将容器的对外端口暴露到外网。如果不想docker自动暴露端口,可以在daemon.json
文件中加入以下配置,再重启docker服务。注意,这会导致域名无法解析,请谨慎使用。
{
"iptables": false
}
重启服务
systemctl daemon-reload
systemctl restart docker
4.docker使用
4.1查找镜像
Docker Hub 网站来搜索镜像:https://hub.docker.com/
也可以用docker命令搜索
docker search mysql
4.2获取镜像
docker pull mysql
4.3运行容器
本地镜像不存在时,会联网进行下载
//启动ubuntu系统,使用/bin/bash作为交互式shell
docker run -it ubuntu /bin/bash
//启动mysql容器,并设置root密码为123456,时区设置为上海
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai --name mysql_container mysql
//启动mariadb容器,并设置root密码为123456
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mariadb_container mariadb
参数:
i:交互式操作
t:终端
d:后台运行
p:对外端口与容器内端口
name:容器名
e:设置环境变量
–restart=always:服务重启后会自动重启容器
–restart=on-failure:5:服务重启后,容器最大重启5次,值为0不重启。
4.4进入容器命令行环境
docker exec -it <容器ID或容器名> /bin/bash
4.5查看所有容器
docker ps -a
4.6查看本地所有镜像
docker images
4.7启动容器(容器已存在,且未运行)
docker start <容器ID或容器名>
4.8停止容器
docker stop <容器ID或容器名>
4.9删除容器
docker rm <容器ID或容器名>
4.10删除镜像
docker rmi <镜像ID>
4.11查看容器日志
docker logs <容器ID或容器名>
参数:
-f:实时滚动日志,相当于tailf
4.12复制文件
复制宿主机aa目录到容器并重命名为bb
docker cp /opt/aa <容器ID>:/opt/bb
复制宿主机aa目录到容器aa目录下
docker cp /opt/aa <容器ID>:/opt/aa/
复制容器aa目录下的内容到宿主机aa目录下
docker cp <容器ID>:/opt/aa/ /opt/aa/
4.13导出镜像
docker save <镜像ID> > /opt/docker/oracle_image.tar
4.14加载镜像
docker load < /opt/docker/oracle_image.tar
4.15修改镜像标签
docker tag <镜像ID> oracle:11g
4.16查询docker内空间占用情况
docker system df
加-v查看空间占用细节
4.17清理docker空间
docker system prune
- 删除已停止容器。
- 删除未被容器使用的卷。
- 删除未被容器关联的网络。
- 删除没有标签的镜像,如果要删除未被使用的镜像,加-a参数。
4.18查看容器挂载目录
docker inspect <镜像ID> | grep Mounts -A 20
4.19推送镜像
推之前需要登陆
#推送到dockerhub
docker login
#推送到私有仓库
docker login http://xxx.com
如果是私有仓库,也可以将镜像名改为:xxx.com/镜像名
再在/etc/docker/daemon.json中加入如下配置片段
"insecure-registries" : ["xxx.com"]
推送之前,需要先修改镜像标签,前面加上你的dockerhub用户名。比如原始镜像名是imgName:latest
,需要修改成yourID/imgName:latest
,否则会出现denied: requested access to the resource is denied
错误。
修改镜像名
docker tag <镜像名>:<TAG> <用户名>/<镜像名>:<TAG>
推送
docker push <用户名>/<镜像名>:<TAG>
–disable-content-trust :忽略镜像的校验,默认开启
4.20查看docker容器详细配置
如网络、文件系统、硬件等。
docker inspect <镜像ID>
查询容器目录映射
docker inspect <镜像ID>|grep Mounts -A 20
4.21删除远程私有仓库镜像
查询镜像
curl <仓库地址>/v2/_catalog
查询镜像tag(版本)
curl <仓库地址>/v2/<镜像名>/tags/list
查询镜像digest_hash
curl --header "Accept:application/vnd.docker.distribution.manifest.v2+json" -I -XGET <仓库地址>/v2/<镜像名>/manifests/<tag>
删除镜像API
curl -I -X DELETE "<仓库地址>/v2/<镜像名>/manifests/<镜像digest_hash>"
4.22安装docker-compose
Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
pip安装
yum -y install python-pip
pip install docker-compose
树莓派pip安装
sudo apt-get install -y python3 python3-pip
sudo pip install docker-compose
官方方式安装
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
也可以直接到github下载相应版本的docker-compose文件到/usr/local/bin下,重命名为docker-compose,授予可执行权限,再创建软连接。
github地址:https://github.com/docker/compose/releases
检查docker-compose是否安装成功
docker-compose --version
给已启动的容器增加端口映射
容器的配置文件/var/lib/docker/containers/[containerId]
目录下,hostconfig.json
和config.v2.json
修改好之后,重启容器服务。
4.23创建网络
创建网络后,可以将多个容器指定为同一个网络,使容器间可以通信
docker network create elastic
创建网络时指定子网
docker network create --subnet=172.18.0.0/16 elastic
创建容器时指定网络
docker run --name es-node01 --net elastic -p 9200:9200 -p 9300:9300 -t docker.elastic.co/elasticsearch/elasticsearch:8.2.3
查看指定网络
docker inspect elastic
4.24删除无tag且未被容器引用的镜像
一般是拉取最新镜像后产生的旧镜像。
docker image prune
- 添加-a删除有tag但未被容器引用的镜像
4.25查看无tag且未被容器引用的镜像
docker images -f "dangling=true"
5.问题
错误1:docker0: iptables: No chain/target/match by that name.
原因:firewalld服务在docker服务启动之后打开,启动容器时就会报该错误。
解决办法:删掉容器,重启docker服务,重新运行镜像生成容器。
错误2:Database is uninitialized and password option is not specified You need to specify one of MYSQL_ROOT_PASSWORD,MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
原因:mysql没有初始化密码,运行镜像开启容器时没有设置参数,无法启动。
解决方法:docker run时加上-e MYSQL_ROOT_PASSWORD=123456参数,设置密码。参数不能设置在容器名后,否则参数无效。
6.案例
直接安装,或先pull都可以
6.1 安装oracle11g
需要自己先把oracle安装包放到/install目录下,并解压。
需要150M以上的swap内存,开启swap的方法见:内存不足导致的应用进程被杀
docker run -d --privileged --name my_oracle -p 1521:1521 --shm-size=1g -v /install:/install jaspeen/oracle-11g
- –privileged:给容器root权限
- -v /install:/install:将install文件夹挂载到容器中
启动后,自带的脚本会自动开始安装,可以通过容器日志查看安装进展,当日志中出现100% complete,基本就安装完成。
sys用户默认密码:change_on_install
system用户默认密码:manager
修改登录密码
alter user sys identified by "dd123456";
6.2 安装oracle10g
1.下载运行镜像
docker run -d -p 1521:1521 -v /data/oracle10g:/data/oracle --name my_oracle10g klwang/oracle10g
2.进入容器
docker exec -it my_oracle10g bash
3.进入oracle用户,并连接oracle
su - oracle
sqlplus / as sysdba
conn / as sysdba
4.查询初始密码
show parameter password;
5.查看用户
select * from v$pwfile_users;
6.授权
grant sysdba to sys;
7.创建用户
create user dd identified by 123456;
grant connect,resource,dba to dd;
8.密码策略设置为永不过期
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
6.3 官方dockerfile安装oracle 19c(进行到5失败,待修正)
1.clone官方镜像
官方镜像支持以下版本的安装:11.2.0.2 12.1.0.2 12.2.0.1 18.3.0 18.4.0 19.3.0
git clone https://github.com/oracle/docker-images.git
2.需要提前准备好oracle安装包,放入指定目录下。
安装包:LINUX.X64_193000_db_home.zip
目录:docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0/
安装包可以从官网下载,Linux x86-64版本
地址:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html
3.执行buildDockerImage.sh脚本,开始制作镜像。
脚本在docker-images/OracleDatabase/SingleInstance/dockerfiles/下
./buildDockerImage.sh -v 19.3.0 -e
-v:oracle版本号
-e:企业版
出现以下提示,表示镜像制作完成。
Successfully built 128af23f763f
Successfully tagged oracle/database:19.3.0-ee
Oracle Database Docker Image for 'ee' version 19.3.0 is ready to be extended:
--> oracle/database:19.3.0-ee
Build completed in 900 seconds.
4.创建所需组、用户、文件夹并授权
- 创建用户组
groupadd -g 1000 oinstall
groupadd -g 1300 dba
groupadd -g 1301 oper
- 创建用户
useradd -u 54321 -g oinstall -G dba,oper -d /home/oracle -s /bin/bash -c "Oracle Software Owner" oracle
echo "oracle" | passwd --stdin oracle
-u:指定用户uid
-c:注释
第二个命令:将echo打印的输入流写入为用户密码,此种方案不安全,history可以看到密码,实际使用需要用passwd命令改密码。
- 文件夹授权
chown oracle:oinstall /oracle/oradata
5.启动容器,安装数据库
docker run --name oracle-19c \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_SID=orcl \
-e ORACLE_PDB=orclpdb \
-e ORACLE_PWD=123456 \
-v /oracle/oradata:/opt/oracle/oradata \
oracle/database:19.3.0-ee
-p:第一个是oracle监听器端口,第二个是OEM程序端口。OEM是oracle图形化管理工具集。
/oracle/oradata:oracle数据文件夹在宿主机的挂载点,/opt/oracle/oradata为容器内数据文件夹路径,容器内的oracle用户(uid:54321)必须有写权限。如果省略该项,则不会创建持久化数据库。
6.4 安装postgreSQL
拉取镜像(最新版本)
docker pull postgres
启动容器
docker run --name postgres -e POSTGRES_PASSWORD=123456 -p 5432:5432 -d postgres
6.5 安装Elasticsearch+kibana
拉取Elasticsearch镜像(7.13.1)
docker pull elasticsearch:7.13.1
创建网络
docker network create elastic
启动Elasticsearch容器
docker run -d --name es7 --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.13.1
拉取kibana镜像(7.13.1)
docker pull docker.elastic.co/kibana/kibana:7.13.1
启动kibana容器
docker run -d --name kib-01 --net elastic -e ELASTICSEARCH_HOSTS=http://es7:9200 -p 5601:5601 docker.elastic.co/kibana/kibana:7.13.1
问题
内存不足问题
日志包含如下错误,此错误为内存不足,jvm内存超出了宿主机实际可用内存。
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 4102029312 bytes for committing reserved memory.
# An error report file with more information is saved as:
# logs/hs_err_pid164.log
error:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000006cb800000, 4102029312, 0) failed; error='Not enough space' (errno=12)
at org.elasticsearch.tools.launchers.JvmOption.flagsFinal(JvmOption.java:119)
at org.elasticsearch.tools.launchers.JvmOption.findFinalOptions(JvmOption.java:81)
at org.elasticsearch.tools.launchers.JvmErgonomics.choose(JvmErgonomics.java:38)
at org.elasticsearch.tools.launchers.JvmOptionsParser.jvmOptions(JvmOptionsParser.java:135)
at org.elasticsearch.tools.launchers.JvmOptionsParser.main(JvmOptionsParser.java:86)
解决方案1:
1.查找jvm.options文件
find /var/lib/docker/ -name jvm.options
2.找到diff目录下的文件
/var/lib/docker/overlay2/b1e872c3c573bce9dbc12063728ffab4b5481fd5e2131329bab5755f5c3fa263/diff/usr/share/elasticsearch/config/jvm.options
3.默认jvm为4g内存,修改为合适的内存,此处修改为2g
-Xms2g
-Xmx2g
解决方案2:
创建容器时加上jvm参数
docker run -d --name elasticsearch7_1_1 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms2g -Xmx2g" elasticsearch:7.11.1
4.重启容器(解决方案2无需重启容器)
docker restart elasticsearch7_1_1
6.6 安装db2
拉取并运行镜像
docker run -itd --name mydb2 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=12345678 -e DBNAME=testdb -v /data/docker/db2:/database ibmcom/db2
创建用户
进入容器操作
# 添加用户组
groupadd dd
# 添加用户
useradd -m -g dd -d /home/dd dd
# 修改用户密码
passwd dd
创建数据库
su - db2inst1
db2 create db test
授权
# 连接数据库
db2 connect to test
#授权
db2 GRANT DBADM,CREATETAB,BINDADD,CONNECT,CREATE_NOT_FENCED_ROUTINE,IMPLICIT_SCHEMA,LOAD,CREATE_EXTERNAL_ROUTINE,QUIESCE_CONNECT ON DATABASE TO USER dd;
删除数据库
db2 drop database test
6.7 安装ceph
创建网络
docker network create --driver bridge --subnet 172.20.0.0/16 ceph-network
拉取镜像
docker pull ceph/daemon:latest-luminous
搭建mon节点
docker run -d --name ceph-mon --network ceph-network --ip 172.20.0.10 -e CLUSTER=ceph -e WEIGHT=1.0 -e MON_IP=172.20.0.10 -e MON_NAME=ceph-mon -e CEPH_PUBLIC_NETWORK=172.20.0.0/16 -v /etc/ceph:/etc/ceph -v /var/lib/ceph/:/var/lib/ceph/ -v /var/log/ceph/:/var/log/ceph/ ceph/daemon:latest-luminous mon
搭建osd节点
docker exec ceph-mon ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
修改/etc/ceph/ceph.conf
配置文件以兼容ext4盘,在文件最后加入以下内容:
osd max object name len = 256
osd max object namespace len = 64
启动三个容器模拟集群
docker run -d --privileged=true --name ceph-osd-1 --network ceph-network --ip 172.20.0.11 -e CLUSTER=ceph -e WEIGHT=1.0 -e MON_NAME=ceph-mon -e MON_IP=172.20.0.10 -e OSD_TYPE=directory -v /etc/ceph:/etc/ceph -v /var/lib/ceph/:/var/lib/ceph/ -v /var/lib/ceph/osd/1:/var/lib/ceph/osd -v /etc/localtime:/etc/localtime:ro ceph/daemon:latest-luminous osd
docker run -d --privileged=true --name ceph-osd-2 --network ceph-network --ip 172.20.0.12 -e CLUSTER=ceph -e WEIGHT=1.0 -e MON_NAME=ceph-mon -e MON_IP=172.20.0.10 -e OSD_TYPE=directory -v /etc/ceph:/etc/ceph -v /var/lib/ceph/:/var/lib/ceph/ -v /var/lib/ceph/osd/2:/var/lib/ceph/osd -v /etc/localtime:/etc/localtime:ro ceph/daemon:latest-luminous osd
docker run -d --privileged=true --name ceph-osd-3 --network ceph-network --ip 172.20.0.13 -e CLUSTER=ceph -e WEIGHT=1.0 -e MON_NAME=ceph-mon -e MON_IP=172.20.0.10 -e OSD_TYPE=directory -v /etc/ceph:/etc/ceph -v /var/lib/ceph/:/var/lib/ceph/ -v /var/lib/ceph/osd/3:/var/lib/ceph/osd -v /etc/localtime:/etc/localtime:ro ceph/daemon:latest-luminous osd
搭建mgr节点
docker run -d --privileged=true --name ceph-mgr --network ceph-network --ip 172.20.0.14 -e CLUSTER=ceph -p 7000:7000 --pid=container:ceph-mon -v /etc/ceph:/etc/ceph -v /var/lib/ceph/:/var/lib/ceph/ ceph/daemon:latest-luminous mgr
开启管理界面
docker exec ceph-mgr ceph mgr module enable dashboard
搭建rgw节点
docker exec ceph-mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
docker run -d --privileged=true --name ceph-rgw --network ceph-network --ip 172.20.0.15 -e CLUSTER=ceph -e RGW_NAME=ceph-rgw -p 7480:7480 -v /var/lib/ceph/:/var/lib/ceph/ -v /etc/ceph:/etc/ceph -v /etc/localtime:/etc/localtime:ro ceph/daemon:latest-luminous rgw
检查ceph状态
docker exec ceph-mon ceph -s
添加rgw用户
实际连接时,使用uid中的用户名
docker exec ceph-rgw radosgw-admin user create --uid="dd" --display-name="dd"
连接时使用rgw端口
6.8 RocketChat搭建
安装docker和docker-compose
用官方安装命令,自带docker-compose,docker-compose要求V2版本以上
curl -L https://get.docker.com | sh
获取compose文件
该网址需要翻墙才能下载,建议手动创建,粘贴配置
curl -L https://raw.githubusercontent.com/RocketChat/Docker.Official.Image/master/compose.yml
compose.yml
volumes:
mongodb_data: { driver: local }
services:
rocketchat:
image: registry.rocket.chat/rocketchat/rocket.chat:${RELEASE:-latest}
restart: on-failure
labels:
traefik.enable: "true"
traefik.http.routers.rocketchat.rule: Host(`${DOMAIN}`)
traefik.http.routers.rocketchat.tls: "true"
traefik.http.routers.rocketchat.entrypoints: https
traefik.http.routers.rocketchat.tls.certresolver: le
environment:
MONGO_URL: "${MONGO_URL:-\
mongodb://${MONGODB_ADVERTISED_HOSTNAME:-mongodb}:${MONGODB_INITIAL_PRIMARY_PORT_NUMBER:-27017}/\
${MONGODB_DATABASE:-rocketchat}?replicaSet=${MONGODB_REPLICA_SET_NAME:-rs0}}"
MONGO_OPLOG_URL: "${MONGO_OPLOG_URL:\
-mongodb://${MONGODB_ADVERTISED_HOSTNAME:-mongodb}:${MONGODB_INITIAL_PRIMARY_PORT_NUMBER:-27017}/\
local?replicaSet=${MONGODB_REPLICA_SET_NAME:-rs0}}"
ROOT_URL: ${ROOT_URL:-http://localhost:${HOST_PORT:-3000}}
PORT: ${PORT:-3000}
DEPLOY_METHOD: docker
DEPLOY_PLATFORM: ${DEPLOY_PLATFORM}
depends_on:
- mongodb
expose:
- ${PORT:-3000}
ports:
- "${BIND_IP:-0.0.0.0}:${HOST_PORT:-3000}:${PORT:-3000}"
mongodb:
image: docker.io/bitnami/mongodb:${MONGODB_VERSION:-4.4}
restart: on-failure
volumes:
- mongodb_data:/bitnami/mongodb
environment:
MONGODB_REPLICA_SET_MODE: primary
MONGODB_REPLICA_SET_NAME: ${MONGODB_REPLICA_SET_NAME:-rs0}
MONGODB_PORT_NUMBER: ${MONGODB_PORT_NUMBER:-27017}
MONGODB_INITIAL_PRIMARY_HOST: ${MONGODB_INITIAL_PRIMARY_HOST:-mongodb}
MONGODB_INITIAL_PRIMARY_PORT_NUMBER: ${MONGODB_INITIAL_PRIMARY_PORT_NUMBER:-27017}
MONGODB_ADVERTISED_HOSTNAME: ${MONGODB_ADVERTISED_HOSTNAME:-mongodb}
MONGODB_ENABLE_JOURNAL: ${MONGODB_ENABLE_JOURNAL:-true}
ALLOW_EMPTY_PASSWORD: ${ALLOW_EMPTY_PASSWORD:-yes}
ROOT_URL
修改为虚机的IP
编排部署
旧版docker没有此命令,需要安装新版docker
docker compose up -d
访问地址
http://IP:3000
6.9 docker compose部署mysql
简单部署
docker-compose.yml
services:
mysql:
image: mysql
container_name: mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
- TZ=Asia/Shanghai
ports:
- '3306:3306'
###将数据文件和配置文件挂载到外部(数据更安全)
1.创建docker-compose.yml。
docker-compose.yml
services:
mysql:
image: mysql
container_name: mysql
restart: unless-stopped # 总是重启容器,除非手动停止
environment:
MYSQL_ROOT_PASSWORD: your_strong_password # 请修改!
MYSQL_DATABASE: my_app_db # 可选
MYSQL_USER: my_user # 可选
MYSQL_PASSWORD: user_password # 可选
TZ: Asia/Shanghai #设置容器内的系统时区为东八区
ports:
- "3306:3306"
volumes:
- ./data:/var/lib/mysql # 相对路径挂载数据
- ./conf:/etc/mysql/conf.d # 相对路径挂载配置
- TZ设置的是容器内的系统时区,不是mysql时区,但mysql默认会随系统时区。保险起见还是建议在配置文件中配置时区。
2.创建conf
目录并创建custom.cnf
配置文件,此处以时区和字符集配置为例。
[mysqld]
default-time-zone = '+08:00'
character-set-server = utf8mb4
[client]
default-character-set = utf8mb4
- 此处,配置文件的名称可以是任意名称。因为挂载的是
/etc/mysql/conf.d
目录,此目录下存放的是扩展配置,避免覆盖镜像原有的my.cnf
配置。扩展的配置会追加到mysql中,且追加的重复配置项会覆盖已有配置。 - conf目录可以不用手动创建,甚至不用挂载。但如果需要自定义cnf配置文件,就需要先创建。
如果时区不想配置在配置文件中,还可以在docker-compose中增加启动命令来设置时区(因为每次启动都会执行,所以永久生效)。但最佳实践还是使用配置文件。
services:
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: password
TZ: Asia/Shanghai
command: --default-time-zone='+08:00' # 添加命令行参数来设置时区
如果出现容器启动失败,出现权限错误。可以尝试将data目录授予999权限。
chown 999:999 data
- 因为容器内使用mysql用户(UID=999)对data目录进行读写,如果依赖docker compose自动创建data目录(挂载了就会自动创建),目录权限是默认root,mysql启动时有可能会报权限错误。
7.镜像收藏
7.1 fish/peerflix-server (边下边播,支持磁力,种子)
地址:https://hub.docker.com/r/fish/peerflix-server
docker run -d -p 9000:9000 fish/peerflix-server
7.2 forsaken-mail(临时邮箱)
地址https://hub.docker.com/r/rockmaity/forsaken-mail/
docker命令方式
docker run --name forsaken-mail -itd -p 25:25 -p 3000:3000 denghongcai/forsaken-mail
docker compose方式
version: '3'
services:
forsaken-mail:
image: denghongcai/forsaken-mail
container_name: forsaken-mail
restart: always
ports:
- "25:25"
- "3000:3000"
web访问地址:http://ip:3000/
邮箱必须要有域名才能使用
域名解析设置,如域名为aa.com,web访问地址为mail.aa.com:
- MX,主机记录为@aa.com,记录值设置为子域名,如mail.aa.com
- A,主机记录为mail.aa.com,记录值设置为ip
7.3 alexwhen/docker-2048(游戏2048)
地址:https://hub.docker.com/r/alexwhen/docker-2048/
docker run -d -p 80:80 alexwhen/docker-2048
7.4 docker-pan(网盘+离线下载工具)
根目录为Filerun网盘,/dweb为AriaNg离线下载工具,使用aria2 web界面
docker run --name=pan -d -p 8081:80 -p 6800:6800 jaegerdocker/pan
如果需要开启ImageMagick支持和FFmpeg支持,需要进入容器(Ubuntu系统)安装。
apt install imagemagick ffmpeg
7.5 dos-web小游戏
docker run -d --name dosgame -p 666:262 -v /opt/data/game/dosgame:/app/static/games oldiy/dosgame-web-docker:latest
- 如果不需要新增游戏,可以不挂载文件路径
新增游戏:
从https://github.com/rwv/chinese-dos-games
下载游戏
将下载下来的新游戏zip包放进bin目录,然后添加下json配置,再重启下docker容器就OK了
7.6 反向代理工具 nginx-proxy-manager(NPM)
很实用的反向代理工具,81为web端口。
以下为docker-compose.yml的内容
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 冒号左边可以改成自己服务器未被占用的端口
- '81:81' # 冒号左边可以改成自己服务器未被占用的端口
- '443:443' # 冒号左边可以改成自己服务器未被占用的端口
volumes:
- ./data:/data # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 data 文件夹中
- ./letsencrypt:/etc/letsencrypt # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 letsencrypt 文件夹中
创建好后执行以下命令启动
docker compose up -d
初始账号密码
admin@example.com
changeme
7.7 poste邮箱
搭建自己的邮箱,需要域名才能正常使用
version: '2.1'
services:
mailserver:
image: analogic/poste.io
container_name: mailserver
hostname: mail.ddgjl.fun
environment:
- TZ=Asia/Shanghai
- HTTPS=OFF
volumes:
- ./data:/data
ports:
- 8080:80 #http
- 10025:25 #SMTP
- 110:110 #POP3
- 143:143 #IMAP
- 8081:443 #HTTPS
- 465:465 #SMTPS
- 587:587 #MSA
- 993:993 #IMAPS
- 995:995 #POP3S
- 4190:4190 #Sieve
restart: always
7.8 wikijs
搭建自己的wiki
version: "2.1"
services:
wikijs:
image: linuxserver/wikijs
container_name: wikijs
environment:
- PUID=1000 # 如何查看当前用户的PUID和PGID,直接命令行输入id就行
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- ./config:/config # 配置文件映射到本地,数据不会因为Docker停止而丢失
- ./data:/data # 数据映射到本地,数据不会因为Docker停止而丢失
ports:
- 3000:3000 # 左边的8080可以自己调整端口号,右边的3000不要改
restart: unless-stopped
如果跨服务器进行了迁移,可能会出现进入页面无权限的问题。
此时进入容器,进入/data
文件夹,将cache
和uploads
文件夹的权限改为1000:1000
。
docker exec -it [容器id] bash
cd /data
chown -R 1000:1000 cache uploads
7.9 chatgpt客户端 pandora
chatgpt代理客户端,和官网页面的使用体验很接近。支持gpt-3.5和gpt-4,基于cookie token登录(需科学上网到官网获取),无需api,所以被官方禁掉的概率很小
最新:开发者github账号被封,客户端已无法使用。开发者已创建pandora2,搭建需要一个license,需要github认证后才能获取,暂未研究。
version: '3'
services:
app:
image: pengzhile/pandora # 不带tga的话,总是使用 latest ,更新时重新 pull 该 tag 镜像即可
ports:
- 8880:8090 # 左边的3002可以自行修改成服务器上没有使用的端口
environment:
PANDORA_CLOUD: cloud
# 二选一
PANDORA_SERVER: 0.0.0.0:8090
#PANDORA_ACCESS_TOKEN: eyxxxx
7.10 chatgpt客户端 chatgpt-next-web
基于chatgpt api,支持gpt-3.5,被官方禁掉的风险比较高。
version: '3.3'
services:
chatgpt-next-web:
ports:
- '8881:3000'
environment:
- OPENAI_API_KEY=xxx # 填写你的API KEY
#- CODE=123456 # 填一个密码,不然你的额度很快就会被刷完
image: yidadaa/chatgpt-next-web
7.11 chatgpt客户端 lobe-chat
支持语音输入输出,识别图像信息。
version: "3"
services:
lobe-chat:
ports:
- 8080:3210
environment:
- OPENAI_API_KEY=sk-xxx # 你的API Key
- ACCESS_CODE=xxx # 设置一个密码
image: lobehub/lobe-chat
7.12 即时通讯服务vocechat
即时通信服务,有手机客户端
version: '3.3'
services:
vocechat:
restart: always
ports:
- '3123:3000' # 冒号左边可以改成自己服务器未被占用的端口
container_name: vocechat-server
volumes:
- './data:/home/vocechat-server/data' # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 data 文件夹中
image: privoce/vocechat-server:latest
7.13 下载神器 qbittorrent
version: "2"
services:
qbittorrent:
image: linuxserver/qbittorrent
container_name: qbittorrent
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai # 你的时区
- UMASK_SET=022
- WEBUI_PORT=8081 # 将此处修改成你欲使用的 WEB 管理平台端口
volumes:
- ~/qBittorrent/config:/config # 绝对路径请修改为自己的config文件夹
- ~/qBittorrent/downloads:/downloads # 绝对路径请修改为自己的downloads文件夹
ports:
# 要使用的映射下载端口与内部下载端口,可保持默认,安装完成后在管理页面仍然可以改成其他端口。
- 6881:6881
- 6881:6881/udp
# 此处WEB UI 目标端口与内部端口务必保证相同,见问题1
- 8081:8081
restart: unless-stopped
web页面:ip:WEBUI_PORT
默认用户名密码:admin/adminadmin
7.14 nextcloud网盘
nextcloud不仅仅是一个网盘,它有强大的插件系统,可以通过插件市场下载安装非常丰富的插件,如drawio(画流程图)、即时通讯模块、记事本模块(支持markdown)、邮件等。
version: "2.1"
services:
nextcloud:
image: lscr.io/linuxserver/nextcloud:latest
container_name: nextcloud
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- ./config:/config
- ./data:/data
ports:
- 3333:80 # web端口
- 4433:443
restart: unless-stopped
7.15 SearXNG搜索引擎
SearXNG是一个开源搜索引擎,集合了多个搜索引擎的结果,无广告。由于容器启动初始化时需要访问一些被墙的资源,所以部署的服务器需要科学上网或者使用国外服务器,否则会启动失败,服务无法访问。
github:https://github.com/searxng/searxng
官网文档:https://docs.searxng.org
services:
redis:
container_name: redis
image: "redis:alpine"
command: redis-server --save "" --appendonly "no"
restart: always
networks:
- searxng
tmpfs:
- /var/lib/redis
cap_drop:
- ALL
cap_add:
- SETGID
- SETUID
- DAC_OVERRIDE
searxng:
container_name: searxng
image: searxng/searxng:latest
restart: always
networks:
- searxng
ports:
- "8180:8080" # 这个冒号左边的端口可以更改,右边的不要改
volumes:
- ./searxng:/etc/searxng:rw
environment:
- SEARXNG_BASE_URL=https://域名或者ip+端口/
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
- DAC_OVERRIDE
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "1"
networks:
searxng:
ipam:
driver: default
如果搜索后出现too many requests
,修改searxng目录下的settings.yml
文件,把limiter改成false
。
7.16 ncmfucker,网易云音乐ncm格式转换
可以将网易云音乐的ncm格式音乐,转换为flac或mp3格式。
github:https://github.com/Asumer14/NCM-Fucker#
Dockerfile
FROM node:22.16.0
WORKDIR /app
COPY package*.json ./
# 使用 --legacy-peer-deps 解决依赖冲突
RUN npm install --legacy-peer-deps
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]
.dockerignore
node_modules
.git
.DS_Store
.env
dist
build
docker-compose.yml
services:
ncmfucker:
image: dd5407/ncmfucker:latest
ports:
- "3000:3000"
restart: always
7.17 moonTV视频聚合播放站
MoonTV 是一个开箱即用的、跨平台的影视聚合播放器。它基于 Next.js 14 + Tailwind CSS + TypeScript 构建,支持多资源搜索、在线播放、收藏同步、播放记录、本地/云端存储,让你可以随时随地畅享海量免费影视内容。
github:https://github.com/senshinya/MoonTV
docker-compose.yml
services:
moontv-core:
image: ghcr.io/senshinya/moontv:latest
container_name: moontv
restart: unless-stopped
ports:
- '3000:3000'
environment:
- USERNAME=admin
- PASSWORD=password
- NEXT_PUBLIC_STORAGE_TYPE=redis
- REDIS_URL=redis://moontv-redis:6379
- NEXT_PUBLIC_ENABLE_REGISTER=true #开放注册
networks:
- moontv-network
depends_on:
- moontv-redis
# 如需自定义配置,可挂载文件
#volumes:
# - ./config.json:/app/config.json:ro
moontv-redis:
image: redis
container_name: moontv-redis
restart: unless-stopped
networks:
- moontv-network
networks:
moontv-network:
driver: bridge
7.18 bililivego直播视频录播工具
支持抖音、b站等多平台直播视频录播。
github:https://github.com/hr3lxphr6j/bililive-go
docker-compose.yml
volumes:
prometheus_data: {}
services:
bililive-go:
image: chigusa/bililive-go
restart: unless-stopped
container_name: bililive-go
volumes:
- ./Videos:/srv/bililive
- ./config.docker.yml:/etc/bililive-go/config.yml
ports:
- 8080:8080 # 左边的8080可以自由修改成服务器上没有被占用的端口,右边的8080不要动。
prometheus:
image: quay.io/prometheus/prometheus
restart: unless-stopped
container_name: bililive-prom
volumes:
- prometheus_data:/prometheus
- ./contrib/prometheus:/etc/prometheus
command:
# retention 建议大于30天
- '--storage.tsdb.retention.time=30d'
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
ports:
- 9090:9090 # 左边的9090可以自由修改成服务器上没有被占用的端口,右边的9090不要动。
grafana:
image: grafana/grafana-oss
restart: unless-stopped
container_name: bililive-graf
volumes:
- ./contrib/grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_USER=${ADMIN_USER}
- GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD}
- GF_USERS_ALLOW_SIGN_UP=false
- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/etc/grafana/provisioning/dashboards/bilipanel.json
ports:
- 3000:3000 # 左边的3000可以自由修改成服务器上没有被占用的端口,右边的3000不要动。
7.19 palworld-server-docker幻兽帕鲁服务器
幻兽帕鲁服务器,4c8g配置支持2-4人游玩。
github:https://github.com/thijsvanloef/palworld-server-docker
启动docker容器前,需要先在docker-compose.yml
同级目录下配置.env
文件。env文件中的服务器配置,在容器启动时会写入到帕鲁服务器配置文件中。如果要修改配置,不要直接修改帕鲁服务器的配置文件,要修改.env
文件,配置会在删除并重启容器后覆盖,直接重启容器不会覆盖配置。
.env
TZ=Asia/Shanghai
PLAYERS=6
PORT=8211
PUID=1000
PGID=1000
MULTITHREADING=false
COMMUNITY=false
PUBLIC_IP=
PUBLIC_PORT=
SERVER_NAME=palworld-server
SERVER_DESCRIPTION=palworld-server
SERVER_PASSWORD=serverPassword
ADMIN_PASSWORD=adminPassword
UPDATE_ON_BOOT=true
RCON_ENABLED=false
RCON_PORT=25575
QUERY_PORT=27015
BACKUP_ENABLED=true
DELETE_OLD_BACKUPS=false
OLD_BACKUP_DAYS=30
BACKUP_CRON_EXPRESSION=0 0 * * *
AUTO_UPDATE_ENABLED=false
AUTO_UPDATE_CRON_EXPRESSION=0 * * * *
AUTO_UPDATE_WARN_MINUTES=30
AUTO_REBOOT_ENABLED=false
AUTO_REBOOT_EVEN_IF_PLAYERS_ONLINE=false
AUTO_REBOOT_WARN_MINUTES=5
AUTO_REBOOT_CRON_EXPRESSION=0 0 * * *
AUTO_PAUSE_ENABLED=false
AUTO_PAUSE_TIMEOUT_EST=180
AUTO_PAUSE_LOG=true
AUTO_PAUSE_DEBUG=false
ENABLE_PLAYER_LOGGING=true
PLAYER_LOGGING_POLL_PERIOD=5
DIFFICULTY=None
RANDOMIZER_TYPE=
RANDOMIZER_SEED=none
DAYTIME_SPEEDRATE=1.000000
NIGHTTIME_SPEEDRATE=1.000000
EXP_RATE=1.000000
PAL_CAPTURE_RATE=1.000000
PAL_SPAWN_NUM_RATE=1.000000
PAL_DAMAGE_RATE_ATTACK=1.000000
PAL_DAMAGE_RATE_DEFENSE=1.000000
PLAYER_DAMAGE_RATE_ATTACK=1.000000
PLAYER_DAMAGE_RATE_DEFENSE=1.000000
PLAYER_STOMACH_DECREASE_RATE=1.000000
PLAYER_STAMINA_DECREASE_RATE=1.000000
PLAYER_AUTO_HP_REGEN_RATE=1.000000
PLAYER_AUTO_HP_REGEN_RATE_IN_SLEEP=1.000000
PAL_STOMACH_DECREASE_RATE=1.000000
PAL_STAMINA_DECREASE_RATE=1.000000
PAL_AUTO_HP_REGEN_RATE=1.000000
PAL_AUTO_HP_REGEN_RATE_IN_SLEEP=1.000000
BUILD_OBJECT_HP_RATE=1.000000
BUILD_OBJECT_DAMAGE_RATE=1.000000
BUILD_OBJECT_DETERIORATION_DAMAGE_RATE=1.000000
COLLECTION_DROP_RATE=1.000000
COLLECTION_OBJECT_HP_RATE=1.000000
COLLECTION_OBJECT_RESPAWN_SPEED_RATE=1.000000
ENEMY_DROP_ITEM_RATE=1.000000
DEATH_PENALTY=None
ENABLE_PLAYER_TO_PLAYER_DAMAGE=False
ENABLE_FRIENDLY_FIRE=False
ENABLE_INVADER_ENEMY=True
ACTIVE_UNKO=False
ENABLE_AIM_ASSIST_PAD=True
ENABLE_AIM_ASSIST_KEYBOARD=False
DROP_ITEM_MAX_NUM=3000
DROP_ITEM_MAX_NUM_UNKO=100
BASE_CAMP_MAX_NUM=128
BASE_CAMP_WORKER_MAX_NUM=50
DROP_ITEM_ALIVE_MAX_HOURS=1.000000
AUTO_RESET_GUILD_NO_ONLINE_PLAYERS=False
AUTO_RESET_GUILD_TIME_NO_ONLINE_PLAYERS=72.00000
GUILD_PLAYER_MAX_NUM=6
BASE_CAMP_MAX_NUM_IN_GUILD=10
PAL_EGG_DEFAULT_HATCHING_TIME=0.10000
WORK_SPEED_RATE=1.000000
AUTO_SAVE_SPAN=30.000000
IS_MULTIPLAY=False
IS_PVP=False
HARDCORE=False
PAL_LOST=False
CAN_PICKUP_OTHER_GUILD_DEATH_PENALTY_DROP=False
ENABLE_NON_LOGIN_PENALTY=True
ENABLE_FAST_TRAVEL=True
IS_START_LOCATION_SELECT_BY_MAP=True
EXIST_PLAYER_AFTER_LOGOUT=False
ENABLE_DEFENSE_OTHER_GUILD_PLAYER=False
INVISIBLE_OTHER_GUILD_BASE_CAMP_AREA_FX=False
BUILD_AREA_LIMIT=False
ITEM_WEIGHT_RATE=1.000000
COOP_PLAYER_MAX_NUM=4
REGION=
USEAUTH=True
BAN_LIST_URL=https://api.palworldgame.com/api/banlist.txt
REST_API_ENABLED=False
REST_API_PORT=8212
SHOW_PLAYER_LIST=True
SUPPLY_DROP_SPAN=180
ENABLE_PREDATOR_BOSS_PAL=True
MAX_BUILDING_LIMIT_NUM=0
SERVER_REPLICATE_PAWN_CULL_DISTANCE=15000.000000
SERVER_REPLICATE_PAWN_CULL_DISTANCE_IN_BASE_CAMP=5000.000000
CROSSPLAY_PLATFORMS=(Steam,Xbox,PS5,Mac)
USE_BACKUP_SAVE_DATA=True
USE_DEPOT_DOWNLOADER=False
INSTALL_BETA_INSIDER=False
ALLOW_GLOBAL_PALBOX_EXPORT=True
ALLOW_GLOBAL_PALBOX_IMPORT=False
# Box64 Configs (Only relevant for ARM64 hosts)
# These can be adjusted if the server keeps on crashing.
BOX64_DYNAREC_STRONGMEM=1 # This can be set to 2 or 3 with 3 being the most stable but worst performance.
BOX64_DYNAREC_BIGBLOCK=1 # This can be set to 0 for better stability but worse performance.
BOX64_DYNAREC_SAFEFLAGS=1 # This can be set to 2 for better stability but worse performance.
BOX64_DYNAREC_FASTROUND=1 # This can be set to 0 for better stability but worse performance.
BOX64_DYNAREC_FASTNAN=1 # This can be set to 0 for better stability but worse performance.
BOX64_DYNAREC_X87DOUBLE=0 # This can be set to 1 for better stability but worse performance.
重要配置项
- TZ:时区,国内建议设置为
Asia/Shanghai
。 - PLAYERS:服务器内最大玩家数量。
- PORT:服务器端口,客户端连接专用服务器时填写的端口。
- SERVER_PASSWORD:服务器连接密码,玩家在客户端连接专用服务器时要输入的密码。
- ADMIN_PASSWORD:管理员密码,在游戏内,回车打开命令行,输入
/AdminPassword {管理员密码}
后获取管理员权限,即可使用管理员命令。 - DIFFICULTY:难度设置,建议设置为None,还有Normal和Difficulty选项。
- EXP_RATE:经验倍率。
- DEATH_PENALTY:死亡惩罚。None死亡不掉落,Item掉落背包中物品,ItemAndEquipment掉落物品和身上装备,All所有物品都会掉落,包括身上的帕鲁。
- BUILD_OBJECT_DETERIORATION_DAMAGE_RATE:建筑劣化倍率。
- ENABLE_PLAYER_TO_PLAYER_DAMAGE:允许玩家对玩家造成伤害。
- ENABLE_INVADER_ENEMY:允许入侵。
- BASE_CAMP_MAX_NUM:整个服务器内据点最大数量。
- BASE_CAMP_WORKER_MAX_NUM:每个据点内,工作帕鲁最大数量。
- AUTO_RESET_GUILD_NO_ONLINE_PLAYERS:工会无人在线自动重置,结合下一个配置使用。
- AUTO_RESET_GUILD_TIME_NO_ONLINE_PLAYERS:超过多少小时无人在线的公会会被重置,重置后据点会被销毁。
- GUILD_PLAYER_MAX_NUM:工会内玩家最大数量。
- BASE_CAMP_MAX_NUM_IN_GUILD:工会内据点最大数量。
- PAL_EGG_DEFAULT_HATCHING_TIME:帕鲁蛋默认孵化时间,单位小时。
- HARDCORE:硬核模式,只有一条命,死了就只能重新开新档。建议False。
- ITEM_WEIGHT_RATE:物品重量倍率。
- SUPPLY_DROP_SPAN:补给/陨石掉落间隔(分钟)。
- ENABLE_PREDATOR_BOSS_PAL:开启狂暴化帕鲁。
docker-compose.yml
services:
palworld:
image: thijsvanloef/palworld-server-docker:latest
restart: unless-stopped
container_name: palworld-server
stop_grace_period: 30s # Set to however long you are willing to wait for the container to gracefully stop
ports:
- 8211:8211/udp
- 27015:27015/udp
# - 8212:8212/tcp # Port for REST API if REST_API_ENABLED: true
env_file:
- .env
volumes:
- ./palworld:/palworld/
容器启动后,会先从steam下载最新版本的服务端文件,需要等待一段时间等下载完,服务启动完成后才能游玩。可以使用docker logs -f {容器id}
查看日志。
游戏版本有更新时(通常客户端升级了,服务端就得升级),可以通过重启容器触发帕鲁服务器版本文件更新。
7.20 Frp内网穿透
Frp是一款国人开发的开源内网穿透工具,支持多种代理类型,包括TCP、UDP、HTTP、HTTPS等等,支持流量加密、压缩,身份认证,代理限速,负载均衡等众多能力,同时提供一个代理连接实时流量可视化面板。
官网:https://gofrp.org
github:https://github.com/fatedier/frp
Frp本身使用就非常简单,只需一条命令(服务器:./frps -c frps.toml
,客户端:./frpc -c frpc.toml
)就可以启动。但还是以docker方式来部署,更好维护。
作者自己做的镜像,没有加载配置文件,启动后只能无密码访问,很不安全。所以修改了dockerfile自己做了镜像。
服务端
Dockerfile
FROM golang:1.23 AS building
COPY . /building
WORKDIR /building
RUN make frps
RUN mkdir -p /etc/frps
FROM alpine:3
RUN apk add --no-cache tzdata
COPY --from=building /building/bin/frps /usr/bin/frps
COPY --from=building /building/conf/frps.toml /etc/frps/frps.toml
ENTRYPOINT ["/usr/bin/frps","-c","/etc/frps/frps.toml"]
docker-compose.yml
services:
frps:
image: dd5407/frps:v0.64.0
container_name: frps
restart: always
volumes:
- ./frps.toml:/etc/frps/frps.toml
#开启主机网络模式,可以任意使用主机端口,安全起见,也可以注释这个,开启下面的ports配置的主机端口映射,以限制主机端口的使用
#network_mode: host
ports:
- "7000:7000" # 服务端通信端口
- "8080:8080" # HTTP 端口,
- "7500:7500" # Dashboard 端口
- "6000-6100:6000-6100" # 额外增加的端口,供其他tcp/udp等协议使用
frps.toml
# 客户端连接服务端的端口
bindPort = 7000
# 客户端连接校验密码,部署时需要自行改成复杂的密码
auth.token = "password"
# 开启web服务的端口,客户端反代http服务时,需要使用这个端口,然后根据客户端绑定的域名来进行区分
vhostHTTPPort = 8080
# 默认为 127.0.0.1,如果需要公网访问,需要修改为 0.0.0.0。
webServer.addr = "0.0.0.0"
# dashboard页面端口
webServer.port = 7500
# dashboard 用户名密码,可选,默认为空,部署时需要自行改成复杂的登录信息
webServer.user = "admin"
webServer.password = "password"
# 表示 server 端只接受 TLS 连接的客户端,新版本默认就是开启的,开启后,会自动使用自签证书或自定义配置的证书进行通信流量加密
transport.tls.force = true
客户端
如果内网机器是windows,推荐使用Frpc-Desktop,这是一款基于Frp的开源图形化客户端,可以图形化操作,还能实时查看日志,使用比较方便。
github:https://github.com/luckjiawei/frpc-desktop
首先配置服务器连接信息,再配置本地需要穿透的端口,配置完启动就ok了。启动页面有没有连上都会显示成功,要看日志内的信息查看有没有成功。
如果是linux,用docker方式启动
Dockerfile
FROM golang:1.23 AS building
COPY . /building
WORKDIR /building
RUN make frpc
RUN mkdir -p /etc/frpc
FROM alpine:3
RUN apk add --no-cache tzdata
COPY --from=building /building/bin/frpc /usr/bin/frpc
COPY --from=building /building/conf/frpc.toml /etc/frpc/frpc.toml
ENTRYPOINT ["/usr/bin/frpc","-c","/etc/frpc/frpc.toml"]
docker-compose.yml
services:
frpc:
image: dd5407/frpc:v0.64.0
container_name: frpc
restart: always
volumes:
- ./frpc.toml:/etc/frpc/frpc.toml
frpc.toml
#这里连接服务端的配置
serverAddr = "公网服务器IP或者域名"
serverPort = 7000
auth.token = "服务器连接密码"
#http服务穿透1,如果域名已经指向公网服务器,可以配置域名访问,如http://www.abc.com:8080
[[proxies]]
name = "web_test1"
type = "http"
localIp = "172.17.0.1"
localPort = 9000
customDomains = ["www.abc.com"]
#http/tcp服务穿透2,可以自定义公网端口,如下配置可以访问:http://公网ip:9999/
[[proxies]]
name = "web_test2"
type = "tcp"
localIP = "172.17.0.1"
localPort = 9000
remotePort = 9999
#mysql服务穿透示例,可以连接公网6033端口访问内网中mysql服务
[[proxies]]
name = "mysql_test"
type = "tcp"
localIP = "172.17.0.1"
localPort = 3306
remotePort = 6033
7.21 minipaint图片编辑器
这是一个类似photoshop的简化版图片编辑工具,没有ps时可以应急用一下。
github:https://github.com/viliusle/miniPaint
docker-compose.yml
services:
minipaint:
image: wbsu2003/minipaint
container_name: minipaint
restart: always
ports:
- 3584:8080
如果启动时出现System limit for number of file watchers reached
报错,有以下解决方法,在容器外执行。
# 临时解决方案
sysctl fs.inotify.max_user_watches=131070
sysctl -p
# 永久方案
echo fs.inotify.max_user_watches = 524288 | sudo tee -a /etc/sysctl.conf
sysctl -p