portainer
sh
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/portainer/portainer-ce:2.16.2
mysql8
sh
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
执行上面的命令提示
sh
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 配置损坏了,解决方案
sh
# 停止所有容器
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启动的方式如下配置
yml
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
conf
[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