Docker實操:安裝MySQL5.7詳解
介紹
Docker 中文網址: https://www.dockerdocs.cn
Docker Hub官方網址:https://hub.docker.com
Docker Hub中MySQL介紹:https://hub.docker.com/_/mysql



準備
先創建3個目錄,創建MySQL容器時會掛載容器的卷(Volume),用于Docker和宿主機(Centos)之間文件共享,包括配置文件、數據文件和日志文件。
什么是卷(Volume)?命令 docker -v 中的“-v”就是這個卷,“-v”只是“--volume”的簡寫。
客官請留步,多少的看一下!!!
Docker官方文檔解釋卷的含義:https://docs.docker.com/storage/volumes/
由于本人的英文水平非常的一般,所有我看的中文文檔:https://www.dockerdocs.cn/storage/volumes/

下面這個操作可以不用,因為下面會有整合完整的使用命令!!!
使用 -p 創建多級目錄,即 mydata 目錄下創建 mysql 目錄, mysql 目錄下又創建 log 、data 、conf 三個目錄:
mkdir -p /mydata/mysql/log
mkdir -p /mydata/mysql/data
mkdir -p /mydata/mysql/conf
sudo chmod -R 777 /mydata
安裝
- 拉取MySQL指定版本的鏡像
- 運行容器
sudo docker run -p 53306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
--restart=always \
-e MYSQL_ROOT_PASSWORD=Aa123098@\
-d mysql:5.7
這個 Docker 命令是用于啟動 MySQL 5.7 容器的,讓我們解釋其中的各個部分:
docker run:這是 Docker 啟動容器的命令。
-p 53306:3306:這部分命令將主機的端口53306映射到容器內的3306端口。這樣,您可以通過主機的3306端口來訪問容器內運行的 MySQL 服務。
--name mysql:通過此選項,您為容器指定了一個名稱,即mysql。這使得容器更容易識別和管理。
-v /mydata/mysql/log:/var/log/mysql:這是一個數據卷掛載操作,將主機上的/mydata/mysql/log目錄掛載到容器內的/var/log/mysql目錄。這樣,MySQL 日志文件將在主機上存儲,以供查看。
-v /mydata/mysql/data:/var/lib/mysql:同樣,這是另一個數據卷掛載操作,將主機上的/mydata/mysql/data目錄掛載到容器內的/var/lib/mysql目錄。這用于將 MySQL 數據文件保存在主機上,以便數據持久化。
-v /mydata/mysql/conf:/etc/mysql:此掛載操作將主機上的/mydata/mysql/conf目錄掛載到容器內的/etc/mysql目錄。這樣,您可以提供自定義的 MySQL 配置文件。
--restart=always:這個選項指示 Docker 在容器退出時自動重新啟動容器。這對于確保 MySQL 服務一直可用非常有用。
-e MYSQL_ROOT_PASSWORD=123456:這個選項設置 MySQL 根用戶的密碼。在示例中,密碼被設置為123456
-d:這個選項使容器在后臺運行,以允許您繼續在終端中執行其他命令。
mysql:5.7:這是要運行的 Docker 鏡像的名稱和標簽。在此示例中,使用 MySQL 5.7 鏡像。
這個命令將啟動一個 MySQL 5.7 容器,將 MySQL 數據、日志和配置文件掛載到主機上的目錄中,設置 MySQL 根密碼,并允許容器在后臺運行,以及在容器退出時自動重新啟動。這是一個典型的用例,用于在 Docker 中運行 MySQL 數據庫容器。
宿主機新建配置文件
在宿主機,宿主機,宿主機上新建!!!
自定義的 my.cnf 配置文件。 注意!!!在 /mydata/mysql/conf/ 目錄下創建自定義的 my.cnf 配置文件。文件名隨意,文件格式必須為 .cnf 。
vi /mydata/mysql/conf/my.cnf
添加容器運行的配置參數。使用的是utf8mb4編碼而不是 utf8 編碼。
[client]default-character-set=utf8mb4
[mysql]default-character-set=utf8mb4
[mysqld]
init_connect="SET collation_connection = utf8mb4_unicode_ci"
init_connect="SET NAMES utf8mb4"
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
保存后,已經創建了一個名為 /mydata/mysql/conf/my.cnf 的 MySQL 配置文件。這個文件包含了一些 MySQL 的配置選項,用于配置 MySQL 服務器的字符集和排序規則等設置。讓我解釋一下這個配置文件的內容:
[client]部分包含了 MySQL 客戶端的配置,確保客戶端使用 UTF-8 字符集。[mysql]部分也配置了 MySQL 客戶端的默認字符集。[mysqld]部分包含了 MySQL 服務器的配置選項,用于配置 MySQL 服務器的行為。
以下是這個配置文件的各個配置選項的解釋:
default-character-set=utf8mb4和default-character-set=utf8mb4:這兩個選項在[client]和[mysql]部分都設置了默認字符集為 UTF-8,確保客戶端和服務器使用相同的字符集。
init_connect='SET collation_connection = utf8mb4_unicode_ci'和init_connect='SET NAMES utf8mb4':這些選項在[mysqld]部分設置了初始化連接時執行的 SQL 語句。這些語句設置了連接的字符集和排序規則為 UTF-8 和utf8mb4_unicode_ci。
character-set-server=utf8mb4:這個選項設置了 MySQL 服務器的字符集為 UTF-8。
collation-server=utf8mb4_unicode_ci:這個選項設置了 MySQL 服務器的排序規則為utf8mb4_unicode_ci,通常用于支持國際化和多語言字符的正確排序。
skip-character-set-client-handshake:這個選項用于禁用客戶端字符集握手,允許客戶端和服務器之間的字符集設置更加靈活。
skip-name-resolve:這個選項禁用了主機名解析,以提高連接性能。
它適用于確保 MySQL 以正確的字符集和排序規則處理數據。確保將這個配置文件用于啟動 MySQL 服務器,可以通過 -v 選項將配置文件掛載到容器內。例如:
docker run -d -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
--restart=always \
-e MYSQL_ROOT_PASSWORD=123xxx \
-d mysql:5.7
將在容器內使用自定義配置文件 /mydata/mysql/conf/my.cnf 來啟動 MySQL 服務器。
進入容器
docker exec -it mysql bash
- 可以使用外部工具連接測試
mysql -h 主機IP地址 -P 3306 -u root -p
退出MySQL服務
退出容器
添加配置
- 修改容器中的MySQL時間不同步的問題
- 修改容器中的MySQL分組only_full_group_by問題
- 修改表名不區分大小寫問題
在MySQL配置文件(通常是my.cnf)中,確保已正確配置時區。您可以在配置文件中添加以下內容:
[mysqld]
default_time_zone = '+8:00'
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
這是一個 MySQL 配置文件(my.cnf 或 my.ini)中的一部分,用于設置數據庫的默認時區、SQL 模式和其他選項。以下是這些選項的詳細解釋:
default_time_zone = '+8:00':設置數據庫的默認時區為 UTC+8。這意味著在執行與日期和時間相關的操作時,數據庫將根據這個時區進行轉換。
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION:設置 SQL 模式,以便更嚴格地遵循 SQL 標準。這有助于避免潛在的數據問題和錯誤。具體來說,這些模式包括:
STRICT_TRANS_TABLES:禁止在嚴格模式下插入無效日期和數據。
NO_ZERO_IN_DATE:禁止使用零日期(如 '0000-00-00')。
NO_ZERO_DATE:禁止使用零日期(如 '0000-00-00')。
ERROR_FOR_DIVISION_BY_ZERO:將除以零的操作視為錯誤,而不是警告。
NO_AUTO_CREATE_USER:禁止自動創建用戶。
NO_ENGINE_SUBSTITUTION:如果請求的存儲引擎不可用,禁止自動使用替代存儲引擎。
lower_case_table_names = 1:將所有表名存儲為小寫。這有助于避免因大小寫不同而導致的表名混淆和錯誤。在某些操作系統(如 Windows 和 macOS)上,這個選項可能對大小寫不敏感,而在其他操作系統(如 Linux)上可能對大小寫敏感。設置為 1 表示啟用該功能,0 表示禁用。
重啟服務/容器
修改密碼
進入容器
docker exec -it mysql bash
登錄MySQL
修改密碼
# 修改普通用戶,只改一個就好
SET PASSWORD FOR 'youruser' = PASSWORD('xxxxxxxx');# 修改root用戶,改兩個
SET PASSWORD FOR 'root' = PASSWORD('xxxxxxxxx');
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('xxxxxxxxx');
注意,注意,注意!!!到此為止,docker下的MySQL服務已經可用了,下面是一些細化操作。
禁用 root 賬戶被外部工具連接
進入到容器里,連接mysql,刪除mysql數據庫user表中 user=“root”,host="%"的那條記錄。因為這條數據會允許 root 賬戶被允許外部工具(如Navicat或SQLyog)連接,實際上,應該禁止這么做,正確做法是只允許 root 賬戶本地連接。如果想 root 賬戶繼續被外部工具連接,那就把root密碼設置得更復雜,過于簡單不安全!
切換到 mysql 數據庫,并查看 user 表。
select user,host from user;
刪除mysql數據庫user表中 user=“root”,host="%"的那條記錄,并刷新權限。
可以這么做,但是不建議這么干,改個復雜的密碼,不暴露給其他使用者就好了!!!
可以這么做,但是不建議這么干,改個復雜的密碼,不暴露給其他使用者就好了!!!
可以這么做,但是不建議這么干,改個復雜的密碼,不暴露給其他使用者就好了!!!
delete user from mysql.user where user='root' and host='%';
創建新賬戶供外部工具連接
使用 CREATE 創建賬戶,例如對應mysql.user表中,字段user為 goboy,字段host為 % ,賬號密碼為 123456 ,“%”代表任何主機。使用 GRANT 授予賬戶特定權限。
創建用戶和密碼
CREATE USER 'goboy'@'%' IDENTIFIED BY '123456';
授予賬戶特定權限。ALL 和 ALL PRIVILEGES 是一樣的,可簡寫為 ALL 。
GRANT ALL ON *.* TO 'goboy'@'%' WITH GRANT OPTION;
刷新賬號權限。
新用戶登錄測試
容器基礎操作
啟動容器
docker start mysql
或
docker start 容器ID
停止容器
docker stop mysql
或
docker stop 容器ID
刪除容器
docker rm mysql
或
docker rm 容器ID
重啟容器
docker restart mysql
或
docker restart 容器ID
查看狀態
查看所有容器的運行狀態,包括運行的和停止的
查看所有運行中的容器的狀態,不包括停止的
我正在參與2023騰訊技術創作特訓營第三期有獎征文,組隊打卡瓜分大獎!
MySQL的conf.d和conf文件都是用于配置MySQL服務的重要文件,但它們在配置管理和使用上有所不同。以下是它們之間的主要區別:
conf.d文件的作用
自定義配置文件:conf.d目錄下的文件主要用于存放自定義的MySQL配置,例如,如果您想要添加或修改某些服務端或客戶端的配置,可以在這個目錄下創建相應的.cnf文件。
合并配置:MySQL會讀取conf.d目錄下的所有.cnf文件,并將它們合并為一個配置。這意味著,如果您在conf.d目錄下創建了新的my.cnf文件,MySQL會將其讀取并合并到配置中,但不會覆蓋/etc/my.cnf文件。
conf文件的作用
默認配置文件:conf文件通常是MySQL的默認配置文件,它包含了MySQL的基本配置信息。這個文件通常位于/etc/mysql/mysql.cnf或/etc/my.cnf,具體取決于您的操作系統和MySQL版本。
服務啟動和運行的基礎:conf文件是MySQL服務啟動和運行的基礎,它包含了服務所需的基本配置,如數據庫目錄、日志文件位置等。

浙公網安備 33010602011771號