docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > docker portainer的应用

docker portainer的应用及实践

作者:warrah

这段文章主要讨论了在部署Portainer和Nacos过程中遇到的问题的解决方法,包括Portainer版本过旧需要升级、Docker iptables配置损坏的解决步骤以及haproxy和nginx配置调整等确保服务正常运行

portainer

docker volume create portainer_data
docker run \
-v /etc/localtime:/etc/localtime \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
--publish published=8005,target=9000,protocol=tcp,mode=host \
--name portainer \
--restart always -d \
10.101.10.9:8081/eayc/portainer/portainer-ce:2.16.2

我在新的一台机器上部署porainer,安装nacos的时候提示

Error response from daemon: client version 1.37 is too old. Minimum supported API version is 1.40, please upgrade your client to a newer version

这个根本原因是portainer有些旧,要重装了portainer/portainer-ce:2.33.0版本

调整后为

docker volume create portainer_data
docker run \
-v /etc/localtime:/etc/localtime \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
--publish published=8005,target=9000,protocol=tcp,mode=host \
--name portainer \
--restart always -d \
10.101.10.9:8081/eayc/portainer/portainer-ce:2.33.0

mysql8

docker run -d \
  --name mysql8 \
  --restart unless-stopped \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD="123456" \
  -e TZ=Asia/Shanghai \
  -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf:ro \
  -v /home/mysql/data:/var/lib/mysql \
  -v /home/mysql/logs:/var/log/mysql \
  10.101.10.9:8081/eayc/mysql:8.0 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_general_ci \
  --default-authentication-plugin=mysql_native_password \
  --lower_case_table_names=1

执行上面的命令提示

docker: Error response from daemon: driver failed programming external connectivity on endpoint mysql8 (8b856e1a86c3eaa0e6ea0cd3ebe035c8849de0494a39d69d64f6f6a6060eb297):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-destination 172.17.0.3:3306 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).

这个问题确实是 Docker 的 iptables 配置损坏了,解决方案

# 停止所有容器
docker stop $(docker ps -aq) 2>/dev/null

# 停止 Docker 服务
sudo systemctl stop docker

# 清理 iptables
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X

# 设置默认策略
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
#
# 启动 Docker
sudo systemctl start docker

使用stack启动的方式如下配置

version: '3.8'

services:
  mysql:
    image: 10.101.10.9:8081/eayc/mysql:8.0
    container_name: mysql8-simple
    restart: unless-stopped
    
    # 明确使用相同的环境变量
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - TZ=Asia/Shanghai
      # 不要设置 MYSQL_CHARSET 和 MYSQL_COLLATION,使用命令行参数
    
    ports:
      - "3306:3306"
    
    volumes:
      - /home/mysql/conf/my.cnf:/etc/mysql/my.cnf:ro
      - /home/mysql/data:/var/lib/mysql
      - /home/mysql/logs:/var/log/mysql
    
    # 使用与 docker run 完全相同的命令参数
    command: 
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
      - --default-authentication-plugin=mysql_native_password
      - --lower_case_table_names=1

my.cnf

[mysqld]
# 基础配置
port = 3306
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock

# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

# 表名大小写
lower_case_table_names = 1

# 连接配置
max_connections = 500
wait_timeout = 600

# InnoDB 配置(MySQL 8.0 使用新参数)
# 删除旧的:innodb_log_file_size 和 innodb_log_files_in_group
innodb_buffer_pool_size = 2G
innodb_redo_log_capacity = 256M  # 替换 innodb_log_file_size
innodb_flush_log_at_trx_commit = 2

# 网络配置
skip-name-resolve
max_allowed_packet = 64M

# SQL 模式
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

# 日志配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_error = /var/log/mysql/error.log

# 删除不存在的参数:
# slow_query_log_always_write_time=1  # 这个参数不存在!

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

导入备份文件

# 1. 将SQL文件复制到容器
docker cp nacos_2025-12-10_00-16-36.sql 66f54627cf8c:/tmp/nacos.sql

# 2. 在容器内执行
docker exec 66f54627cf8c mysql -u root -p12345 nacos -e "source /tmp/nacos.sql"

# 3. 清理
docker exec 66f54627cf8c rm /tmp/nacos.sql

如果提示

2025-12-17 21:41:51+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.44-1.el9 started.

2025-12-17 21:41:52+08:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'

2025-12-17 21:41:52+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.44-1.el9 started.

ls: cannot access '/docker-entrypoint-initdb.d/': Operation not permitted
version: '3.8'
services:
  mysql:
    image: 58.49.122.210:8081/eayc/mysql:8.0
    container_name: mysql8-simple
    restart: unless-stopped
    # 添加在这里
    privileged: true
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - TZ=Asia/Shanghai
    ports:
      - "3306:3306"
    volumes:
      - /home/mysql/conf/my.cnf:/etc/mysql/my.cnf:ro
      - mysql_data:/var/lib/mysql
      - mysql_logs:/var/log/mysql
    command: 
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
      - --default-authentication-plugin=mysql_native_password
      - --lower_case_table_names=1
volumes:
  mysql_data:
  mysql_logs:

redis

version: '3.8'
services:
  redis:
    image: 10.101.10.9:8081/eayc/redis:7.4.0
    container_name: redis
    restart: unless-stopped
    ports:
      - "6379:6379"
    volumes:
      # 数据持久化
      - /home/redis/data:/data
      # 日志目录(可选)
      - /home/redis/logs:/logs
    environment:
      - TZ=Asia/Shanghai
    command: >
      redis-server
      --appendonly yes
      --appendfsync everysec
      --maxmemory 1gb
      --maxmemory-policy allkeys-lru
      --save 900 1
      --save 300 10
      --save 60 10000
      --loglevel notice

rabbitmq

version: '3.8'
services:
  rabbitmq:
    image: 10.101.10.9:8081/eayc/rabbitmq:3.8.17-management
    container_name: rabbitmq
    restart: unless-stopped
    ports:
      - "5672:5672"   # AMQP 协议端口,供客户端连接
      - "15672:15672" # Web 管理界面端口
    environment:
      - RABBITMQ_DEFAULT_USER=hbbwadmin    # 设置默认用户名(强烈建议更改)
      - RABBITMQ_DEFAULT_PASS=hbbw2015 # 设置默认密码(强烈建议更改)
      # 如果你想使用更安全的密码哈希方式,可以定义 secret(高级用法)
      # - RABBITMQ_DEFAULT_PASS_SECRET=my_password_secret
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq # 持久化数据卷
      # - ./enabled_plugins:/etc/rabbitmq/enabled_plugins # 如需自定义插件,可挂载此文件
volumes:
  rabbitmq_data:
    name: rabbitmq_data

nacos

version: '3.8'
services:
  nacos:
    image: 10.101.10.9:8081/eayc/nacos/nacos-server:2.0.3
    container_name: nacos
    restart: always
    environment:
      MYSQL_SERVICE_HOST: 10.101.10.5     # 默认创建的数据库名
      MYSQL_SERVICE_DB_NAME: nacos
      MYSQL_SERVICE_USER: root            # 超级用户账号
      MYSQL_SERVICE_PASSWORD: '654123'   # 超级用户密码
      NACOS_AUTH_ENABLE: false
      SPRING_DATASOURCE_PLATFORM: mysql
      MODE: standalone
    volumes:
      - /etc/localtime:/etc/localtime  # 初始化脚本(可选)
    ports:
      - "8848:8848"  # 格式: 主机端口:容器端口
      - "9848:9848"  # 格式: 主机端口:容器端口
      - "9849:9849"  # 格式: 主机端口:容器端口
firewall-cmd --zone=public --add-port=8848/tcp --permanent
firewall-cmd --zone=public --add-port=9848/tcp --permanent
firewall-cmd --zone=public --add-port=9849/tcp --permanent
firewall-cmd --reload

应用

端口映射

version: '3.8'
# 声明使用外部网络
networks:
  eayc-network:
    external: true
services:
  eayc-gateway-server:
    image: 10.101.10.9:8081/eayc/eayc-gateway-server:3.0.0-2026.3.22-1
    container_name: eayc-gateway-server
    restart: unless-stopped
    networks:
      - eayc-network  # 使用自定义网络
    environment:
      - SPRING_APPLICATION_JSON={"nacos":{"server-addr":"10.101.10.19:8848","namespace":"prod","dubbo-addr":"10.101.10.19:8848","dubbo-namespace":"dubbo-prod"}}
      # Spring Profile 可以单独设置
      - SPRING_PROFILES_ACTIVE=prod
    volumes:
      - eayc_gateway_server_logs:/application/logs  # 将数据持久化到命名卷
      - eayc_gateway_server_upload:/application/upload
    ports:
      - "31350:8350"  # 格式: 主机端口:容器端口
volumes:
  eayc_gateway_server_logs:  # 声明一个命名卷
  eayc_gateway_server_upload: 
    # driver: local # 默认就是local驱动,通常无需指定

前端服务

前端启动提示下面的错误

/docker-entrypoint.sh: Configuration complete; ready for start up

2025/12/21 06:12:36 [emerg] 1#1: host not found in upstream "acc-mbms-server" in /etc/nginx/conf.d/mbms-front.conf:14

nginx: [emerg] host not found in upstream "acc-mbms-server" in /etc/nginx/conf.d/mbms-front.conf:14

配置如下

version: '3.8'
services:
  mbms-front:
    image: 10.101.10.9:8081/eayc/mbms-front:pro_2.0_639
    container_name: mbms-front
    restart: unless-stopped
    volumes:
      - mbms-front_logs:/var/log/nginx  # 将数据持久化到命名卷
    extra_hosts:
      - "acc-mbms-server:10.101.10.5"  # 先解决这个错误
      # 暂时注释掉下面两个,如果需要再添加
      # - "proxyServer:IP地址"
      # - "openapiProxyServer:IP地址"
    environment:
      ENV: pro
    ports:
      - "30503:18009"  # 格式: 主机端口:容器端口
volumes:
  mbms-front_logs:  # 声明一个命名卷
    # driver: local # 默认就是local驱动,通常无需指定

磁盘扩展

以下是rockylinux的配置

yum install -y cloud-utils-growpart
lsblk
sudo growpart /dev/sda 3
# 3. 等待系统识别新的分区大小
sleep 2
sudo partprobe /dev/sda || sudo partx -u /dev/sda
# 4. 扩展物理卷(PV)以识别新增的空间
sudo pvresize /dev/sda3
# 5. 扩展逻辑卷(LV)到使用卷组中所有剩余空间
sudo lvextend -l +100%FREE /dev/mapper/rl_bs251-root
# 6. 扩展XFS文件系统(根据你的df -T输出,确认是xfs)
sudo xfs_growfs /
# 7. 验证最终结果
echo "=== 分区情况 ==="
lsblk
echo "=== 根分区空间 ==="
df -h /
df -lh


haproxy

version: '3.8'

services:
  haproxy:
    image: 10.101.10.9:8081/mid/haproxy:2026.3.28
    container_name: haproxy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "9000:9000"
      - "8888:8888"
    volumes:
      # 修正:配置文件应该是文件,不是目录
      - /home/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
      # 子配置目录
      - /home/haproxy/conf.d:/usr/local/etc/haproxy/conf.d:ro
      # 日志目录
      - /home/haproxy/logs:/var/log/haproxy
    networks:
      - haproxy-network
    environment:
      - TZ=Asia/Shanghai
    command: >
      haproxy -f /usr/local/etc/haproxy/haproxy.cfg -f /usr/local/etc/haproxy/conf.d

networks:
  haproxy-network:
    driver: bridge

haproxy.cfg

global
    # 注释掉 group 和 user,让容器使用默认用户
    # group haproxy
    # user haproxy
    daemon
    log stdout format raw local0 notice
    # 使用容器内可写的目录
    pidfile /tmp/haproxy.pid
    maxconn 20000
    spread-checks 3
    nbthread 4

defaults
    log global
    mode http
    retries 3
    option redispatch
    timeout connect 5s
    timeout client 50s
    timeout server 50s

conf.d下配置

最后一行要有回车符

admin.cfg

listen admin
    bind *:8888
    mode http
    stats enable
    stats hide-version
    stats uri /admin?status
    stats auth ha:ha
    stats refresh 5s

minio.cfg

# MinIO 服务
frontend minio-front
    bind *:9000
    mode tcp
    option tcplog
    default_backend minio-end

backend minio-end
    mode tcp
    # 移除 option tcplog
    balance roundrobin
    default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
    server minio-node01 10.101.10.20:9001 check
    server minio-node02 10.101.10.20:9002 check
    server minio-node03 10.101.10.20:9003 check
    server minio-node04 10.101.10.20:9004 check

nginx.cfg

# HTTP 前端配置
frontend www
    bind *:80
    mode http
    option forwardfor
    option http-keep-alive
    option httplog
    option dontlognull
    option logasap
    log global
    timeout client 15s
    # 移除 timeout server(frontend 不支持)
    default_backend openresty

backend openresty
    mode http
    balance roundrobin
    cookie SERVERID insert indirect nocache
    option httpchk GET /health
    http-check expect status 200
    timeout connect 5s
    timeout server 15s
    server server-10-162 10.101.10.15:80 maxconn 5000 check inter 4000 rise 3 fall 5 weight 100

# HTTPS 前端配置
frontend https_frontend
    bind *:443
    mode tcp
    log global
    option tcplog
    timeout client 3600s
    backlog 4096
    maxconn 1000000
    default_backend https_back

backend https_back
    mode tcp
    option log-health-checks
    option redispatch
    balance roundrobin
    timeout connect 5s
    timeout queue 10s
    timeout server 3600s
    timeout tunnel 3600s
    server server-10-162 10.101.10.15:443 maxconn 50000 check inter 4000 rise 3 fall 5 weight 100

nginx

更改了nginx配置,执行docker exec nginx-proxy nginx -s reload进行生效

version: '3.8'

services:
  nginx:
    image: 10.101.10.9:8081/eayc/openresty:alpine
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      # 配置文件映射(宿主机:容器)
      - /home/nginx/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf:ro
      - /home/nginx/waf:/usr/local/openresty/nginx/conf/waf:ro
      - /home/nginx/extra:/usr/local/openresty/nginx/conf/extra:ro
      - /home/nginx/upstream:/usr/local/openresty/nginx/conf/upstream:ro
      - /home/nginx/conf.d:/usr/local/openresty/nginx/conf/conf.d:ro
      - /home/nginx/logs:/usr/local/openresty/nginx/logs
      - /home/nginx/html:/usr/local/openresty/nginx/html:ro
      - /home/nginx/ssl:/usr/local/openresty/nginx/conf/ssl:ro
      - /home/nginx/temp:/usr/local/openresty/temp:rw
      - /home/nginx/jsonlogs:/usr/local/openresty/nginx/jsonlogs:rw
      - /home/nginx/bw580.com:/usr/local/openresty/nginx/conf/bw580.com:ro
    networks:
      - proxy-net
    restart: unless-stopped

networks:
  proxy-net:
    driver: bridge

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文