先在CentOS7里面安裝docker
Docker 要求 CentOS 系統的內核版本高於 3.10 ,查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker 。通過 uname -r 命令查看你當前的內核版本
uname -r
3.10.0-514.el7.x86_64
1、初步安裝和啟動docker
yum update -y
yum -y install docker
systemctl start docker
2、設置鏡像
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://aj2rgad5.mirror.aliyuncs.com"]
}
加速器地址可以在阿里雲找到
3、開放管理端口映射
vi /lib/systemd/system/docker.service
將第11行的ExecStart=/usr/bin/dockerd,替換為:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H tcp://0.0.0.0:7654
2375是管理端口,7654是備用端口
在~/.bashrc中寫入docker管理端口
export DOCKER_HOST=tcp://0.0.0.0:2375
source ~/.bashrc
4、重啟docker
systemctl daemon-reload
systemctl restart docker.service
5、測試docker是否正常安裝和運行
docker run hello-world
6、查看結果
Hello from Docker!
This message shows that your installation appears to be working correctly.
安裝好docker后安裝mysql
安裝
1、拉取鏡像(這里使用5.7.24版本)
docker pull mysql:5.7.24
2、啟動
# 創建了一個名為mysql5_7_24的MySQL數據庫服務器容器實例
docker run --name mysql5_7_24 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.24
命令說明:
-p 3306:3306:將容器的 3306 端口映射到主機的 3306 端口
-e MYSQL_ROOT_PASSWORD=root:初始化 root 用戶的密碼
其他命令
訪問容器
docker exec -it mysql5_7_24 bash
進入容器內部,我們就可以登錄到mysql了
[root@localhost ~]# docker exec -it mysql5_7_24 bash
root@95a0cd6077a0:/# ls
bin boot dev docker-entrypoint-initdb.d entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@95a0cd6077a0:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.24 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| novadb |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql>
查看日志
docker logs -f mysql5_7_24
進入終端
docker exec -it mysql5_7_24 mysql -uroot -proot
使用自定義MySQL配置文件
默認情況下,MySQL的啟動配置文件是/etc/mysql/my.cnf,而/etc/mysql/conf.d目錄下的存在任何.cnf格式的文件時,都會使用該文件中配置項替換默認配置。
因此,如果要使用自定義配置,可以在宿主機創建一個配置文件,然后在創建容器時通過-v參數,以數據卷的方式將自定義配置掛載到mysql容器的/etc/mysql/conf.d目錄下。
例:
docker run --name mysql5_7_24 -p 3306:3306 -v /usr/local/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.24
以上示例會啟動一個名為mysql5_7_24的MySQL服務器容器,該文件啟動時會同時使用/usr/local/mysql/conf/my.cnf中的配置
注:如果使用到mysql主從配置,那么在mysql 5.7版本中不要使用掛載配置文件的方式,可以采用宿主機拷貝替換容器中的/etc/mysql/my.cnf文件,因為博主發現掛載配置文件開啟log-bin沒有生效,在這塊遇到了坑,如果誰有更好的方法可以給博主留言
數據存儲
在使用mysql鏡像創建MySQL容器時,數據庫數據存儲可能會有以下兩種方式:
1).數據卷容器:使用Docker默認的數據管理方式來管理數據庫的數據存儲,在這種方式下,數據庫文件會被寫入數據庫的內部。這種方式對於用戶非常簡單,缺點是很在宿主機上找到所存儲的數據。
2).外部數據卷:在宿主機創建一個數據目錄,再將數據目錄掛載到容器內部。這種方式可以很方便的在宿主機上找到並進行數據管理,但需要確保數據目錄的存在。
當使用外部數據卷時,例:
docker run --name mysql5_7_24 -p 3306:3306 -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.24
表示將宿主機的/usr/local/mysql/data目錄掛載到容器內的/var/lib/mysql目錄
日志存儲
同理,我們也可以將日志掛載到宿主機上,例:
docker run --name mysql5_7_24 -p 3306:3306 -v /usr/local/mysql/log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.24
表示將宿主機的/usr/local/mysql/log目錄掛載到容器內的/var/log/mysql目錄
那么總結起來同時掛載配置、數據卷、日志的命令為:
docker run --name mysql5_7_24 -p 3306:3306 -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/log:/var/log/mysql -v /usr/local/mysql/data:/var/lib/mysql --privileged=true -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.24
我安裝的時候直接指定的my.cnf配置文件也是可以的如下
docker run --name mysql5_7_24 -p 3306:3306 -v /usr/local/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /usr/local/mysql/log:/var/log/mysql -v /usr/local/mysql/data:/var/lib/mysql --privileged=true -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.24
其中的 -- privileged=true
是我啟動mysql的時候發現mysql啟動不了,通過 docker logs命令查看,發現提示信息是:chown: changing ownership of ‘/var/lib/mysql/....‘: Permission denied
於是,解決方法有這么三個:
- 在docker run中加入 --privileged=true 給容器加上特定權限
- 關閉selinux
- 在selinux添加規則,修改掛載目錄的權限
下面開始導入nova.sql,這個文件一共12G
有時候會發現雖然很小的sql文件,在source導入數據庫的時候也會很慢。這時候我們可以來修改一些mysql的數據庫的配置來加快source導入的速度。
編輯/usr/local/mysql/conf/my.cnf加入如下內容
[mysqld]
interactive_timeout = 120
wait_timeout = 120
max_allowed_packet = 32M
1.查看變量 innodb_flush_log_at_trx_commit的值
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit' ;
2.查詢結果如果是1的話,將其修改成0
SET GLOBAL innodb_flush_log_at_trx_commit =0;
3.這時候再source,會發現速度快了很多,在結束后記得把這個變量重新設置成1
SET GLOBAL innodb_flush_log_at_trx_commit =1;
通過docker stop 和docker start來重啟mysql的容器使得配置生效
想要更快的提高source導入的速度需要在執行mysqldump的時候加 -e 參數使得生成的sql腳步是批量入庫方式
source導入速度慢的解決辦法:
假設要講A數據庫的數據導入到B數據庫
1、首先確定目標庫(B)的參數值,登錄數據庫B,執行以下命令
mysql>show variables like 'max_allowed_packet';
mysql>show variables like 'net_buffer_length';
2、根據參數值,在A數據庫中使用mysqldump命令,如:
C:\Windows\system32>mysqldump -uroot -p idsource -e --max_allowed_packet=1048576 --net_buffer_length=16384 >C:\nova_work_document\novaold_mysqldb_backup\idsource20190212.sql
-e 使用包括幾個VALUES列表的多行INSERT語法;
--max_allowed_packet=XXX 客戶端/服務器之間通信的緩存區的最大大小;
--net_buffer_length=XXX TCP/IP和套接字通信緩沖區大小,創建長度達net_buffer_length的行。
注意:max_allowed_packet和net_buffer_length不能比目標數據庫的設定數值 大,否則可能出錯。
3、登錄數據庫B,執行source命令導入
use idsource;
source C:\nova_work_document\novaold_mysqldb_backup\idsource20190212.sql
一、主機與docker容器之間數據導入、導出
從主機復制到容器
sudo docker cp host_path containerID:container_path
從容器復制到主機
sudo docker cp containerID:container_path host_path
二、mysql source導入*.sql文件
進入數據庫容器
docker exec -it containerID bash
數據庫導入
mysql -h localhost -u root -p(進入mysql下面)
create database abc;(創建數據庫)
show databases;(就可看到所有已經存在的數據庫,以及剛剛創建的數據庫abc)
use abc;(進入abc數據庫下面)
show tables;(產看abc數據庫下面的所有表,空的)
source /root/test.sql(導入數據庫表)
show tables;(查看abc數據庫下面的所有表,就可以看到表了)
desc pollution;(查看表結構設計)
select * from pollution;
exit(或者ctrl + c)退出mysql
比如執行 docker cp /root/nova.sql 95a0cd6077a0:/opt/
把文件拷貝到容器后在mysql中執行
use novadb;(進入abc數據庫下面)
show tables;(產看abc數據庫下面的所有表,空的)
source /opt/nova.sql(導入數據庫表)