Docker下安裝並使用MySQL有兩種方式,第一使用遠程倉庫鏡像,第二自定義鏡像。
【1】使用Hub鏡像安裝MySQL
從Hub鏡像安裝軟件常規步驟
搜索鏡像、拉取鏡像、查看鏡像、啓動鏡像、停止容器與移除容器。
① 搜索MySQL鏡像
docker search mysql
② 從docker hub上(阿里雲加速器)拉取mysql鏡像到本地
如下所示,拉去MySQL5.7:
docker pull mysql:5.7
③ 創建容器實例並運行
命令如下:
docker run -p 3306:3306 --name mysql -v /mydocker/mysql/conf:/etc/mysql/conf.d -v /mydocker/mysql/logs:/var/log/mysql -v /mydocker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
命令解釋說明:
-p 3306:3306
:將主機的3306端口映射到docker容器的3306端口。
--name mysql
:運行服務名字
-v /mydocker/mysql/conf:/etc/mysql/conf.d
:將主機/mydocker/mysql錄下的conf/my.cnf 掛載到容器的 /etc/mysql/conf.d
-v /mydocker/mysql/logs:/var/log/mysql
:將主機/mydocker/mysql目錄下的 logs 目錄掛載到容器的 /logs。
-v /mydocker/mysql/data:/var/lib/mysql
:將主機/mydocker/mysql目錄下的data目錄掛載到容器的 /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
:初始化 root 用戶的密碼。
-d mysql:5.7
: 後臺程序運行mysql5.7
--character-set-server=utf8mb4
:設置字符集
--collation-server=utf8mb4_unicode_ci
:設置校對集
然後在/mydocker/mysql/conf編輯你的數據庫配置文件即可,如下所示:
[root@localhost conf]# pwd
/mydocker/mysql/conf
[root@localhost conf]# ll
total 4
-rw-r--r--. 1 root root 1379 Feb 20 07:40 my.cnf
宿主機上的my.cnf將會自動同步到容器內/etc/mysql/conf.d
路徑下,需要注意的是my.cnf權限不能是777,否則會因爲權限過高mysql忽略掉!
可以查看容器日誌:
docker logs -f -t --tail 100 529a4d9afd8e
進入容器內部查看:
docker exec -it 529a4d9afd8e /bin/bash
退出容器兩種方式:
exit–容器停止退出
crtl+p+q—容器不停止退出
本地window10用Navicat連接docker運行的mysql:
宿主機上備份數據庫:
docker exec 529a4d9afd8e sh -c ' exec mysqldump --all-databases -uroot -p"123456" ' > /mydocker/mysql/all-databases.sql
④ 容器其他操作
停止容器
docker stop 容器id
強制停止容器
docker kill 容器ID
刪除容器
docker rm [-f] 容器ID
刪除所有容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
【2】 mysql5.7容器內部情況
① 配置文件
配置文件路徑在/etc/mysql下
root@2c1ae7a2f3cd:/etc/mysql# ls -l
total 16
drwxr-xr-x. 2 root root 4096 Feb 20 15:02 conf.d
lrwxrwxrwx. 1 root root 24 Feb 1 18:06 my.cnf -> /etc/alternatives/my.cnf
-rw-r--r--. 1 root root 839 Jul 9 2016 my.cnf.fallback
-rw-r--r--. 1 root root 1215 Dec 18 13:15 mysql.cnf
drwxr-xr-x. 2 root root 4096 Feb 1 18:06 mysql.conf.d
my.cnf文件內容如下(引入了conf.d 、mysql.conf.d路徑下的文件):
my.cnf.fallback文件內容如下(引入了conf.d路徑下的文件):
mysql.cnf文件內容如下(引入了conf.d 、mysql.conf.d路徑下的文件):
如下所示/etc/mysql/mysql.conf.d
下有個mysqld.cnf配置文件:
root@2c1ae7a2f3cd:/etc/mysql/mysql.conf.d# ls -l
total 4
-rw-r--r--. 1 root root 1610 Feb 1 18:06 mysqld.cnf
mysqld.cnf配置文件內容如下:
root@2c1ae7a2f3cd:/etc/mysql/mysql.conf.d# cat mysqld.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
② 運行進程文件
在上面mysqld.conf中可以看到,mysql的進程文件在/var/run/mysqld路徑下,如下所示:
root@2c1ae7a2f3cd:/var/run/mysqld# pwd
/var/run/mysqld
root@2c1ae7a2f3cd:/var/run/mysqld# ls -l
total 8
-rw-r-----. 1 mysql mysql 2 Feb 20 15:02 mysqld.pid
srwxrwxrwx. 1 mysql mysql 0 Feb 20 15:02 mysqld.sock
-rw-------. 1 mysql mysql 2 Feb 20 15:02 mysqld.sock.lock
③ 數據文件
在上面mysqld.conf中可以看到,mysql的數據文件在/var/lib/mysql路徑下,如下所示:
root@2c1ae7a2f3cd:/var/run/lock# cd /var/lib/mysql
root@2c1ae7a2f3cd:/var/lib/mysql# ls -l
total 188476
-rw-r-----. 1 mysql mysql 56 Feb 20 15:02 auto.cnf
-rw-------. 1 mysql mysql 1680 Feb 20 15:02 ca-key.pem
-rw-r--r--. 1 mysql mysql 1112 Feb 20 15:02 ca.pem
-rw-r--r--. 1 mysql mysql 1112 Feb 20 15:02 client-cert.pem
-rw-------. 1 mysql mysql 1680 Feb 20 15:02 client-key.pem
-rw-r-----. 1 mysql mysql 1346 Feb 20 15:02 ib_buffer_pool
-rw-r-----. 1 mysql mysql 50331648 Feb 20 15:02 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 Feb 20 15:02 ib_logfile1
-rw-r-----. 1 mysql mysql 79691776 Feb 20 15:02 ibdata1
-rw-r-----. 1 mysql mysql 12582912 Feb 20 15:02 ibtmp1
drwxr-x---. 2 mysql mysql 4096 Feb 20 15:02 mysql
drwxr-x---. 2 mysql mysql 4096 Feb 20 15:02 performance_schema
-rw-------. 1 mysql mysql 1676 Feb 20 15:02 private_key.pem
-rw-r--r--. 1 mysql mysql 452 Feb 20 15:02 public_key.pem
-rw-r--r--. 1 mysql mysql 1112 Feb 20 15:02 server-cert.pem
-rw-------. 1 mysql mysql 1680 Feb 20 15:02 server-key.pem
drwxr-x---. 2 mysql mysql 12288 Feb 20 15:02 sys
【3】自定義MySQL鏡像
如在實例化容器並啓動的時候初始化數據庫,可以通過自定義DockerFile實現。
在mysql5.7官方DockerFile中可以看到其執行了docker-entrypoint.sh
文件:
在官方腳本docker-entrypoint.sh中可以看到其執行了初始化路徑下的一系列腳本文件:
編寫自定義DockerFile如下:
FROM mysql:5.7
# 複製數據庫初始化腳本my_initdb.sql到/docker-entrypoint-initdb.d文件夾下
COPY my_initdb.sql /docker-entrypoint-initdb.d/my_initdb.sql
my_initdb.sql實例如下:
drop database IF EXISTS `lvyou` ;
create database `lvyou` default character set utf8 collate utf8_general_ci;
use `lvyou`;
-- ----------------------------
-- Table structure for t_admin
-- ----------------------------
DROP TABLE IF EXISTS `t_admin`;
CREATE TABLE `t_admin` (
`userId` int(11) NOT NULL,
`userName` varchar(50) DEFAULT NULL,
`userPw` varchar(50) DEFAULT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of t_admin
-- ----------------------------
INSERT INTO `t_admin` VALUES ('1', 'admin', '123456');
目錄結構如下所示:
[root@localhost ~]# cd /mydocker/mysql
[root@localhost mysql]# ll
-rw-r--r--. 1 root root 241 Feb 20 12:41 Dockerfile
-rw-r--r--. 1 root root 7260 Feb 20 13:05 my_initdb.sql
在/mydocker/mysql路徑下執行命令創建鏡像:
docker build -f Dockerfile -t mysql5.7v1 .
實例化容器並運行:
docker run -p 3306:3306 --name mysql5.7v1 -v /mydocker/mysql/conf:/etc/mysql/conf.d -v /mydocker/mysql/logs:/var/log/mysql -v /mydocker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql5.7v1 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
查看日誌可以看到執行了初始化腳本:
docker logs -f -t --tail 100 367090145c91
Navicat連接測試進行驗證(可以看到正常初始化數據庫lvyou):
查看其字符集:
查看宿主機/mydocker/mysql目錄:
重啓服務器,再次查看:
Navicat連接mysql進行驗證:
說明自動從宿主機/mydocker/mysql/data
中拿到了數據!