docker-執行mysql服務

一只爱阅读的程序员發表於2024-03-25

環境說明

linux系統版本:lsb_release -a

docker 版本: docker -v

不同的作業系統以及軟體版本,可能會遇到不一樣的問題,一定要注意版本問題。

檢視dockermysql的版本,可以去官網,需要kx上網才能開啟。

https://hub.docker.com/

最好是確認自己的伺服器已經設定阿里雲的映象加速,或者使用騰訊的,網易的都是可以的。

自己選,設定之後下載映象的速度回快很多。

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://registry-vpc.cn-hangzhou.aliyuncs.com"]

}

EOF

檢視自己本地的Mysql 版本 Select VERSION();

版本為 5.7.20

.1.拉取dockermysql映象。

因此自己去拉取docker Mysql映象的時候,同樣拉取這個版本。

命令如下,

docker pull mysql:5.7

docker images 命令可以檢視當前伺服器上已經安裝的映象,從圖中可以看出mysql映象已經正確安裝。

.2.啟動測試。

docker run --name=mysql -it -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d 5107333e08a8

引數解釋:

docker run 執行docker 容器服務

--name=mysql 給容器服務取一個名字,便於區分服務,不取會預設給一個名字

-p 3306:3306 表示將宿主機的埠3306對映到mysql容器服務的3306埠上,-p 表示port的簡寫

-e MYSQL_ROOT_PASSWORD=123456 表示設定mysql服務的密碼為123456

-d 5107333e08a8 表示以指定的映象ID啟動容器服務,因為同一種型別的映象可能有多個,比如有多個版本的mysql映象

注意:如果不新增 -d 5107333e08a8 指令,預設啟動時會以最新版本啟動容器服務;沒有最新版本的容器,就會自動去下載最新版本的容器,很煩人。

啟動好之後,會返回一個容器 ID,長度為64位。這個容器 ID Docker 為映象分配的唯一識別符號,可以用於對容器進行操作和管理。

.3.開啟伺服器埠,遠端連線測試。

登入阿里雲伺服器管理控制檯,找到 控制檯->伺服器->安全組,開啟進入的埠,如下所示。

真實使用的時候,建議不要使用預設埠,現在是做測試使用沒啥問題。

測試連線,發現連線錯誤,初步判斷需要開啟遠端連線。

嘗試一:使用阿里雲的通義千問查詢關鍵詞 docker啟動 mysql 開啟遠端連線

刪除之前啟動的mysql容器服務,重新執行下面的命令,

嘗試使用裡面的方式來進行操作

docker run --name=mysql -it \

-p 3306:3306 \

-e MYSQL_ROOT_PASSWORD=123456 \

-e MYSQL_ROOT_HOST=% \

-d 5107333e08a8

命令說明:

-e MYSQL_ROOT_HOST=%:允許任意主機(%)連線到MySQL伺服器(這將啟用遠端連線)

再次遠端連線測試,連線成功。

.4.在宿主機上建立對應的mysql目錄,然後建立必要的目錄和配置檔案。如下所示

新增配置資訊如下,

# For advice on how to change settings please see

# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]

#

# Remove leading # and set to the amount of RAM for the most important data

# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.

# innodb_buffer_pool_size = 128M

#

# Remove leading # to turn on a very important data integrity option: logging

# changes to the binary log between backups.

# log_bin

#

# Remove leading # to set options mainly useful for reporting servers.

# The server defaults are faster for transactions and fast SELECTs.

# Adjust sizes as needed, experiment to find the optimal values.

# join_buffer_size = 128M

# sort_buffer_size = 2M

# read_rnd_buffer_size = 2M

skip-host-cache

skip-name-resolve

datadir=/var/lib/mysql

socket=/var/run/mysqld/mysqld.sock

secure-file-priv=/var/lib/mysql-files

user=mysql

port=3308

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

#log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

[client]

socket=/var/run/mysqld/mysqld.sock

password=自己設定的密碼

至於這些配置資訊如何來的,大致思路說一下,可以先臨時啟動一個mysql容器,然後使用如下命令,

.a.進入mysql容器的命令如下:

docker exec -it tmysql /bin/bash

.b.查詢mysql容器內 配置檔案所在的位置,命令如下

mysql --help | grep my.cnf

結果發現有兩個配置檔案,那麼哪一個配置檔案會生效呢?

對於這個問題,自己就不在去進行測試,直接使用網友給的答案。第二個會生效。

如果想做測試的話,方法很簡單,去修改配置檔案裡面的值,然後重新啟動mysql容器服務,

看修改的值是否生效。比如最大連線數,修改後重啟服務,然後登入mysql查詢一下即可看到效果。

.c.將容器內mysql的配置檔案複製一份到宿主機上儲存,然後停止原來的容器,刪除容器。

其他配置資訊可根據需要進行新增即可。

docker cp mysql:/etc/my.cnf /opt/u01/exam/mysql/my.conf

.5.重新執行命令.

.a.停掉原來的容器服務;

.b.刪除原來的容器服務;

.c.執行新的啟動容器的命令。

docker run --name=mysql -it \

-p 3306:3308 \

-e MYSQL_ROOT_HOST=% \

-v /opt/u01/exam/mysql/my.cnf:/etc/mysql/my.cnf \

-v /opt/u01/exam/mysql/logs:/logs \

-v /opt/u01/exam/mysql/data:/var/lib/mysql \

-d 5107333e08a8

引數說明:

-v /opt/u01/exam/mysql/my.cnf:/etc/mysql/my.cnf 表示將宿主機上的配置檔案掛載到mysql容器中

-v /opt/u01/exam/mysql/logs:/logs 表示宿主機上的日誌目錄掛載到mysql容器中

-v /opt/u01/exam/mysql/data:/var/lib/mysql 表示將宿主機上的目錄掛載到mysql容器中

說明:埠自己已經在mysql的配置檔案中修改為3308,密碼自己直接在配置檔案中進行設定,

因此-e MYSQL_ROOT_PASSWORD=123456 這條命令可以不使用。

.6.檢視掛載的目錄是否生效。

發現宿主機上的data目錄下已經有對應的各種資料檔案,說明目錄掛載已經生效。

測試方式

.a.先進入mysql容器內,查詢最大連線數。

docker exec -it mysql /bin/bash

mysql -u root -p

use mysql;

show VARIABLES like 'max_conn%';

.b.修改宿主機中的配置檔案,新增最大連線數

.c.重啟容器服務,重新檢視是否生效;如下圖所示,已經生效。證明掛載的配置檔案已經生效。

命令: docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql

可以獲取容器內mysql橋接的地址。

遇到問題一:只有有一步操作出現問題,密碼一直是123456,需要自己去重新設定密碼。

mysql -u root -p

use mysql;

如果Mysql的版本是5.7及以上的話update語句如下:

update user set authentication_string=passworD("test") where user='root';

flush privileges;

檢視Mysql對應的埠號語句如下,

show global variables like 'port';

遇到問題二:在設定mysql最大連線數的時候,max_connections=180 的位置一定要放正確。

錯誤示範

導致的問題如下,登入時報錯

正確的設定埠還有最大連線數的位置如下。

遇到問題三:設定mysql配置檔案的時候,啟動容器服務,報密碼錯誤。

使用docker logs 容器ID或名稱如下

導致這個問題的原因是mysql配置檔案中,配置密碼的位置在配置檔案中的[client]的位置一定要注意!

參考博文.

https://juejin.cn/post/6975374769923293191

https://cloud.tencent.com/developer/article/2154817

https://www.cnblogs.com/notchangeworld/p/12208538.html

https://www.cnblogs.com/huoshuyinghua/p/14094530.html

https://www.cnblogs.com/peashooter/p/9456255.html

https://www.cnblogs.com/sheseido/p/12708864.html

https://cloud.tencent.com/developer/article/1872788

相關文章