Open WangShuXian6 opened 1 year ago
https://github.com/docker-library/mysql/blob/master/template/Dockerfile.oracle https://github.com/docker-library/mysql/issues https://hub.docker.com/_/mysql
启动一个MySQL实例非常简单:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
... 其中
some-mysql
是你想要为容器指定的名称,my-secret-pw
是要设置给MySQL root用户的密码, 而tag
则是指定你所需的MySQL版本的标签。请参阅上面提供的标签列表以获取相关的标签信息。
以下命令启动另一个
mysql
容器实例,并在你原始的mysql
容器上运行mysql
命令行客户端,从而允许你执行SQL语句来操作你的数据库实例:
$ docker run -it --network some-network --rm mysql mysql -hsome-mysql -uexample-user -p
... 其中
some-mysql
是你原始的mysql
容器的名称(连接到some-network
Docker网络)。这个镜像也可以用作非Docker环境或远程实例的客户端:
$ docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql-user -p
有关MySQL命令行客户端的更多信息可以在MySQL文档中找到。
docker-compose
or docker stack deploy
mysql的示例docker-compose.yml文件如下:
# 使用以下用户/密码凭据:root/example
version: '3.1'
services:
db:
image: mysql
# 注意:不推荐使用 "mysql_native_password" 认证插件:https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password
# (这只是一个示例,不适用于生产环境配置)
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
adminer:
image: adminer
restart: always
ports:
- 8080:8080
运行
docker stack deploy -c stack.yml mysql
(或docker-compose -f stack.yml up
),等待它完全初始化后,访问 http://swarm-ip:8080、http://localhost:8080 或 http://host-ip:8080(根据情况选择)。
docker exec 命令允许你在Docker容器内运行命令。以下命令行将在你的 mysql 容器内提供一个bash shell:
$ docker exec -it some-mysql bash
日志可通过Docker的容器日志获得:
$ docker logs some-mysql
MySQL的默认配置文件位于
/etc/mysql/my.cnf
,它可能会!includedir
其他目录,例如/etc/mysql/conf.d
或/etc/mysql/mysql.conf.d
。请查看 mysql 镜像内部的相关文件和目录,以获取更多详细信息。!includedir 是MySQL配置文件中的一个特殊指令,用于包含其他配置文件所在的目录
如果
/my/custom/config-file.cnf
是你自定义配置文件的路径和名称,你可以像下面这样启动 mysql 容器(注意,此命令中只使用了自定义配置文件的目录路径):
$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
这将启动一个新的容器
some-mysql
,其中MySQL实例将使用/etc/mysql/my.cnf
和/etc/mysql/conf.d/config-file.cnf
中的组合启动设置,后者的设置优先生效。
cnf
文件的配置许多配置选项可以作为参数传递给
mysqld
。这将使你能够在不需要cnf
文件的情况下自定义容器。例如,如果你想将所有表的默认编码和排序规则更改为使用UTF-8(utf8mb4
),只需运行以下命令:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
如果你想查看所有可用选项的完整列表,只需运行:
$ docker run -it --rm mysql:tag --verbose --help
当你启动
mysql
镜像时,可以通过在docker run
命令行上传递一个或多个环境变量来调整MySQL实例的配置。请注意,如果你使用已经包含数据库的数据目录启动容器,下面的任何变量都不会生效:任何已存在的数据库在容器启动时都将保持不变。关于MySQL本身支持的环境变量,可以参考 https://dev.mysql.com/doc/refman/5.7/en/environment-variables.html 以获取更多文档信息(尤其是像
MYSQL_HOST
这样的变量,在使用该镜像时已知会引起问题)。
MYSQL_ROOT_PASSWORD
此变量是必需的,用于指定将设置给MySQL
root
超级用户账户的密码。在上面的示例中,它被设置为my-secret-pw
。
MYSQL_DATABASE
此变量是可选的,允许你指定在镜像启动时要创建的数据库名称。如果提供了用户名/密码(参见下文),那么该用户将被授予该数据库的超级用户权限(对应于
GRANT ALL
)。
MYSQL_USER
、MYSQL_PASSWORD
这些变量是可选的,结合使用来创建一个新用户并设置该用户的密码。该用户将被授予上面指定的
MYSQL_DATABASE
变量所对应的数据库的超级用户权限。这两个变量都需要提供,以创建用户。请注意,无需使用此机制来创建root超级用户,该用户会默认使用
MYSQL_ROOT_PASSWORD
变量指定的密码被创建。
MYSQL_ALLOW_EMPTY_PASSWORD
这是一个可选变量。设置为非空值,比如
yes
,将允许容器以空密码启动root用户。注意:不建议将此变量设置为yes
,除非你确切知道自己在做什么,因为这将完全不安全,允许任何人获得完全的超级用户权限。
MYSQL_RANDOM_ROOT_PASSWORD
这是一个可选变量。设置为非空值,比如
yes
,将为root用户生成一个随机的初始密码(使用pwgen
)。生成的root密码将会打印到stdout(GENERATED ROOT PASSWORD: .....
)。
MYSQL_ONETIME_PASSWORD
将root(不是
MYSQL_USER
中指定的用户!)用户设置为在初始化完成后过期,强制在首次登录时进行密码更改。任何非空值都会启用此设置。注意:此功能仅支持MySQL 5.6及更高版本。在MySQL 5.5上使用此选项会在初始化期间引发适当的错误。
MYSQL_INITDB_SKIP_TZINFO
默认情况下,入口脚本会自动加载
CONVERT_TZ()
函数所需的时区数据。如果不需要时区数据,设置为任何非空值即可禁用时区加载。
作为将敏感信息传递给环境变量的替代方法,可以在先前列出的环境变量后添加 _FILE 后缀,从而使初始化脚本从容器中存在的文件加载这些变量的值。特别地,这可以用于从存储在 /run/secrets/
文件中的Docker机密中加载密码。例如
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag
目前,这仅支持
MYSQL_ROOT_PASSWORD
、MYSQL_ROOT_HOST
、MYSQL_DATABASE
、MYSQL_USER
和MYSQL_PASSWORD
这几个环境变量。
当第一次启动容器时,将创建一个新的数据库,并使用提供的配置变量进行初始化。此外,它还将执行在
/docker-entrypoint-initdb.d
目录下找到的.sh
、.sql
和.sql.gz
扩展名的文件。文件将按字母顺序执行。你可以通过将SQL转储文件挂载到该目录来轻松填充mysql
服务,并提供自定义镜像以提供贡献的数据。SQL文件将默认导入到由MYSQL_DATABASE
变量指定的数据库中。
重要提示:有几种方法可以存储在Docker容器中运行的应用程序使用的数据。我们鼓励使用
mysql
镜像的用户熟悉现有的选项,包括:
Docker文档是了解不同存储选项和变种的良好起点,还有许多博客和论坛帖子在这方面进行了讨论和建议。我们将简单地展示上述后一种选项的基本步骤:
/my/own/datadir
。使用以下方式启动你的 mysql
容器:
$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
命令中的 -v /my/own/datadir:/var/lib/mysql
部分将底层主机系统上的 /my/own/datadir
目录挂载为容器内的 /var/lib/mysql
,MySQL默认会将其数据文件写入该目录。
如果容器启动时没有初始化数据库,则将创建一个默认数据库。虽然这是预期的行为,但这意味着在初始化完成之前它将不接受连接。这可能会在同时启动多个容器的自动化工具(如 docker-compose
)中引发问题。
如果你连接到MySQL的应用程序不处理MySQL的停机或等待MySQL优雅地启动,则可能需要在服务启动之前放置一个连接重试循环。关于如何在官方镜像中实现此类功能的示例,请参阅 WordPress 或 Bonita。
如果启动 mysql
容器实例时,数据目录已经包含一个数据库(具体地说,是一个 mysql
子目录),则应该在运行命令行中省略 $MYSQL_ROOT_PASSWORD
变量;无论如何,它都将被忽略,并且现有的数据库不会受到任何改变。
如果你知道目录的权限已经正确设置(例如在上面描述的对现有数据库运行),或者需要使用特定的UID/GID运行 mysqld
,你可以通过将 --user
设置为任意值(除了 root
/0
)来调用此镜像,以实现所需的访问/配置:
$ mkdir data
$ ls -lnd data
drwxr-xr-x 2 1000 1000 4096 Aug 27 15:54 data
$ docker run -v "$PWD/data":/var/lib/mysql --user 1000:1000 --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
大多数常规工具都能正常工作,尽管在某些情况下,它们的使用可能有点复杂,以确保它们可以访问 mysqld
服务器。确保这一点的简单方法是使用 docker exec
并从同一个容器中运行工具,类似于以下示例:
$ docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql
要还原数据,你可以使用带有 -i
标志的 docker exec
命令,类似于以下示例:
$ docker exec -i some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql
有关该镜像中包含的软件的许可信息,请查看许可证信息。
与所有Docker镜像一样,这些镜像可能还包含其他软件,其可能受到其他许可证的约束(例如来自基础分发的Bash等等,以及主要软件的直接或间接依赖项)。
可能还有一些附加的许可证信息可以自动检测到,可以在repo-info仓库的 mysql/
目录中找到。
对于任何预构建镜像的使用,用户需要确保符合所有软件许可证的相关规定。
version: '3'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123
MYSQL_USER: saga
MYSQL_PASSWORD: saga
volumes:
- ./data:/var/lib/mysql
- ./sql_scripts:/var/sql_scripts
container_name: saga
ports:
- 3306:3306
docker-compose up -d docker exec -it saga bash mysql -u root -p SHOW DATABASES; CREATE DATABASE saga; CREATE DATABASE sagalogin; USE sagalogin; source /var/sql_scripts/sagalogin.sql SHOW TABLES; USE saga; source /var/sql_scripts/sagamap.sql SHOW TABLES;
本机通过”localhost:3306“链接数据库
以下文档有误,需要修改验证
version: '3'
services:
db:
image: mysql
restart: always
environment:
#MySQL的根密码
MYSQL_ROOT_PASSWORD: your_root_password
#创建名为saga的数据库
MYSQL_DATABASE: saga
#用户名
MYSQL_USER: your_username
#密码
MYSQL_PASSWORD: your_password
volumes:
#将MySQL的数据目录映射到主机上的./data目录,以便持久化数据。
- ./data:/var/lib/mysql
#将login.sql放置在与docker-compose.yml文件相同的目录下,这将把login.sql文件从外部目录映射到MySQL容器内部的/docker-entrypoint-initdb.d目录中
#当容器每次启动时,MySQL将自动将/docker-entrypoint-initdb.d目录中的SQL文件导入到sagalogin数据库中。
#在这种情况下,它将导入位于外部目录中的login.sql文件。
#- ./sagalogin.sql:/docker-entrypoint-initdb.d/sagalogin.sql
#- ./sagamap.sql:/docker-entrypoint-initdb.d/sagamap.sql
#添加了:ro来将卷映射设置为只读模式。这将阻止容器内的/docker-entrypoint-initdb.d/sagalogin.sql文件被修改
#- ./login.sql:/docker-entrypoint-initdb.d/sagalogin.sql:ro
#这将使容器保持运行状态而不执行任何默认的启动脚本。可以禁止sagalogin.sql和sagamap.sql的自动导入,同时会导致MySQL无法启动尔无法连接数据库报错
#entrypoint: ["tail", "-f", "/dev/null"]
container_name: saga
#ports部分的左侧数字表示主机(Host)的端口,右侧数字表示容器(Container)的端口
#将主机的端口3306映射到容器的端口3306
#通过访问主机的端口3306来访问容器中运行的MySQL服务
#左侧的端口可以是您选择的主机端口,而右侧的端口必须与容器中正在运行的服务所侦听的端口相匹配
ports:
- 3306:3306
#将主机的端口3307映射到容器的端口3306
#- 3307:3306
docker-compose up -d
请将your_username替换为您的MySQL用户名,并按提示输入密码
docker exec -it <container_name> mysql -u root -p
CREATE DATABASE saga;
CREATE DATABASE sagalogin;
SHOW DATABASES;
将切换到sagalogin数据库并执行sagalogin.sql文件中的SQL语句
USE sagalogin; source /docker-entrypoint-initdb.d/sagalogin.sql;
前提是MySQL容器正在运行 container_ip_address是容器的内部IP地址,用于在容器网络中唯一标识容器。 这个地址是由Docker引擎自动分配给容器的,并且在容器之间是唯一的 如果您希望在容器之间进行通信,可以使用容器的内部IP地址。 但请注意,容器的内部IP地址只在容器网络中有效,并且可能不可用于主机或外部网络。
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name>
mysql -h <container_ip_address> -P 3306 -u your_username -p
您可以使用主机的网络地址(通常是localhost或127.0.0.1)来连接到MySQL容器 当您在主机上运行容器时,可以使用localhost或127.0.0.1作为主机地址来访问容器的服务。 这是因为容器服务通过端口映射或网络配置将容器内部的端口映射到主机上,从而可以通过主机地址进行访问
mysql -h localhost -P 3306 -u your_username -p
/docker-entrypoint-initdb.d
目录中的SQL文件如果您希望在每次容器启动时只执行一次sagalogin.sql文件,您可以通过以下方法实现: 在容器启动后,登录到容器并执行以下命令:
rm /docker-entrypoint-initdb.d/sagalogin.sql
./sql_scripts:/sql_scripts
version: '3'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123
MYSQL_USER: saga
MYSQL_PASSWORD: saga
volumes:
- ./data:/var/lib/mysql
- ./sql_scripts:/sql_scripts
container_name: saga
ports:
- 3306:3306
在docker-entrypoint.sh脚本中,您可以添加逻辑来检查标志文件是否存在。 如果标志文件存在,则跳过执行sagalogin.sql文件。
docker-entrypoint.sh
if [ ! -f /sql_scripts/imported.flag ]; then mysql -u root -p"$MYSQL_ROOT_PASSWORD" < /sql_scripts/sagalogin.sql touch /sql_scripts/imported.flag fi
上述示例在执行login.sql文件后创建一个名为imported.flag的标志文件。在下次容器启动时,如果该标志文件存在,则不会再次导入sagalogin.sql文件。
通过以上方法,您可以控制只在首次容器启动时导入sagalogin.sql文件,并避免在每次容器启动时重复导入。
请注意,如果您在docker-compose.yml文件中修改了sagalogin.sql文件或重新生成了容器,可能需要删除旧的标志文件,并再次运行容器以触发首次导入sagalogin.sql文件的逻辑
version: '3'
services:
db:
build:
context: .
dockerfile: Dockerfile
restart: always
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_USER: your_username
MYSQL_PASSWORD: your_password
volumes:
- ./data:/var/lib/mysql
- ./sql_scripts:/sql_scripts
- ./docker-entrypoint.sh:/docker-entrypoint.sh
entrypoint: ["sh", "/docker-entrypoint.sh"]
container_name: saga
ports:
- 3306:3306
在与 docker-compose.yml 文件相同的目录中,包含了自定义的 docker-entrypoint.sh 脚本文件。
build 部分用于构建自定义的 MySQL 镜像。您需要创建一个名为 saga 的文件来定义构建过程。 确保在与 docker-compose.yml 文件相同的目录中创建了 data 文件夹,并将您的 sagalogin.sql 文件放置在同一目录下 此配置将使用自定义的 docker-entrypoint.sh 脚本作为容器的入口点,而不是默认的 MySQL 入口点。您可以在 docker-entrypoint.sh 脚本中添加额外的自定义逻辑和操作,例如在容器启动时执行其他命令或设置进一步的配置。
Dockerfile
FROM mysql:latest
COPY docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["mysqld"]
>在上述示例中,saga.dockerfile使用 mysql:latest 作为基础镜像,并复制了自定义的 docker-entrypoint.sh 脚本到容器内部的根目录。
>通过 RUN 命令给 `docker-entrypoint.sh` 脚本添加了可执行权限。
>ENTRYPOINT 指令设置容器的入口点为 /docker-entrypoint.sh 脚本。
>CMD 指令设置容器默认运行的命令为 mysqld,这是 MySQL 服务器的默认启动命令
>docker-entrypoint.sh
```sh
#!/bin/bash
# 检查标志文件是否存在
if [[ ! -f /sql_scripts/imported.flag ]]; then
# 新建数据库
if [[ -f /sql_scripts/init.sql ]]; then
echo "Importing init.sql..."
mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE" < /sql_scripts/init.sql
echo "init.sql imported successfully."
fi
# 导入 login.sql 文件
if [[ -f /sql_scripts/sagalogin.sql ]]; then
echo "Importing sagalogin.sql..."
mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE" < /sql_scripts/sagalogin.sql
echo "sagalogin.sql imported successfully."
fi
# 导入 map.sql 文件
if [[ -f /sql_scripts/sagamap.sql ]]; then
echo "Importing sagamap.sql..."
mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE" < /sql_scripts/sagamap.sql
echo "sagamap.sql imported successfully."
fi
# 创建标志文件
touch /sql_scripts/imported.flag
fi
# 执行默认的 entrypoint.sh 脚本
exec "$@"
上述代码片段在执行原始的 entrypoint.sh 脚本逻辑之前,首先检查是否存在 /sql_scripts/imported.flag 标志文件。如果标志文件不存在,则继续检查是否存在 sagalogin.sql 和 sagamap.sql 文件,并根据需要导入这两个文件。然后,它创建了一个标志文件 /sql_scripts/imported.flag。
在后续的容器启动中,由于标志文件存在,sagalogin.sql 和 sagamap.sql 文件将不会再次导入。
上述代码片段首先执行原始的 entrypoint.sh 脚本逻辑(您可以在此处添加额外的自定义逻辑),然后检查是否存在 /sql_scripts/sagamap.sql 文件。如果文件存在,则使用 sagamysql 命令导入 sagamap.sql 文件到 MySQL 数据库中
"执行默认的 entrypoint.sh 脚本" 指的是在自定义的
docker-entrypoint.sh
脚本中,通过以下方式执行原始的entrypoint.sh
脚本的逻辑:
exec "$@"
exec "$@"
的作用是以传递给当前脚本的参数来执行命令。在这种情况下,"$@"
表示将传递给当前脚本的所有参数。因此,exec "$@"
将以传递给自定义脚本的参数来执行命令。在上述示例中,我们假设在原始的
entrypoint.sh
脚本中有一些额外的逻辑和命令。通过执行exec "$@"
,可以确保这些额外的逻辑和命令在自定义脚本执行完毕后继续执行。这种方式保留了原始的
entrypoint.sh
脚本的功能,同时添加了我们自定义的逻辑。请注意,原始的
entrypoint.sh
脚本的路径和内容取决于所使用的基础镜像和其默认配置。
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
由于使用了 entrypoint: ["tail", "-f", "/dev/null"] 禁止运行脚本导致MySQL未启动。
GPT Tech Support Advisor 遇到 “Authentication plugin 'caching_sha2_password' cannot be loaded” 错误通常是因为 MySQL 8.0 引入了一种新的默认身份验证插件 caching_sha2_password,这可能与您的应用程序使用的 MySQL 客户端库不兼容。如果客户端库不支持这种新的认证方法,就会出现连接问题。
有两种解决方法:
升级客户端库: 更新您的应用程序所使用的 MySQL 客户端库到支持 caching_sha2_password 插件的版本。
更改认证插件: 修改您的 MySQL 服务器配置,使用旧的 mysql_native_password 插件代替 caching_sha2_password。
如果您选择第二种方法,在 docker-compose.yml 文件中,您可以通过设置 MYSQL_ROOT_HOST 环境变量来允许 root 用户从任何主机连接,并且通过命令行参数更改认证插件,如下所示:
在 MySQL 中使用 mysql_native_password 插件时,并不是必须要设置 MYSQL_ROOT_HOST = '%' 环境变量来允许 root 用户从任何主机连接。这两者是独立的设置
version: '3'
services:
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootmmoarpg
MYSQL_ROOT_HOST: '%'
MYSQL_USER: mmoarpg
MYSQL_PASSWORD: mmoarpg
volumes:
- ./data:/var/lib/mysql
- ./sql_scripts:/docker-entrypoint-initdb.d
container_name: mmoarpg
ports:
- "3306:3306"
这里的 command 行会使 MySQL 服务器在启动时使用 mysql_native_password 身份验证插件,而 MYSQL_ROOT_HOST: '%' 允许从任何主机连接到数据库。
请尝试这个修改,然后重新启动您的容器:
Copy code
docker-compose down
docker-compose up -d
在重新启动之后,您的应用程序应该能够使用旧的认证插件连接到 MySQL 服务器了。如果您的应用程序依然无法连接,请确保您的客户端库是最新的,或者检查是否有其他的连接问题。如果问题依然存在,我会很乐意进一步帮助您解决。
type *.sql >> ..\aaa.sql
docker run --name mmomysql -e MYSQL_ROOT_PASSWORD=rootmmoarpg -p 3306:3306 -d mysql --ssl=0
--ssl=0 已弃用
--ssl-mode=DISABLED
--ssl-mode=REQUIRED
docker run --name mmomysql -e MYSQL_ROOT_PASSWORD=rootmmoarpg -p 3306:3306 -d mysql --ssl=0 --default-authentication-plugin=mysql_native_password
或
docker-compose up -d
version: '3' services: db: image: mysql:8.0 command: --default-authentication-plugin=mysql_native_password --ssl=0 restart: always environment: MYSQL_ROOT_PASSWORD: rootmmoarpg MYSQL_ROOT_HOST: '%' MYSQL_USER: mmoarpg MYSQL_PASSWORD: mmoarpg volumes: - ./data:/var/lib/mysql - ./sql_scripts:/docker-entrypoint-initdb.d container_name: mmoarpg ports: - "3306:3306"
--ssl=0
是一个额外的参数,用于禁用 SSL--default-authentication-plugin=mysql_native_password
使用mysql_native_password
作为身份验证插件
MySQL 概述
MySQL是世界上最受欢迎的开源数据库。凭借其卓越的性能、可靠性和易用性,MySQL已成为基于Web的应用程序的首选数据库,涵盖了从个人项目和网站,到电子商务和信息服务,甚至到包括Facebook、Twitter、YouTube、Yahoo!等知名网络平台在内的各种领域。