docker使用

Scroll Down

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://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.jsonconfig.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.comweb访问地址为mail.aa.com

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文件夹,将cacheuploads文件夹的权限改为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