docker中使用mysql
1铭污、搜索源
docker search mysql
2房资、下載源(這里以mysql:5.6為例)
docker pull mysql:5.6
3淘这、創(chuàng)建并啟動(dòng)mysql容器(設(shè)置端口才可以連接)
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password --name mysql mysql:5.6
解釋一下上面的參數(shù)run就是運(yùn)行docker鏡像的命令穴张,--name就是給容器取個(gè)名字叫mysql掉伏,-e就是設(shè)置容器里的環(huán)境變量缝呕,我們?cè)O(shè)置了mysql的密碼環(huán)境變量,這個(gè)變量會(huì)傳入容器里面來(lái)設(shè)置mysql的密碼斧散,-d就是把容器運(yùn)行在后臺(tái)供常,后面加的就是鏡像的名字了
容器如果刪了,那么我們的數(shù)據(jù)不就也沒(méi)有了鸡捐,那么有沒(méi)有一種方法把容器中的數(shù)據(jù)存在容器外面栈暇,有,我們換一種方式來(lái)運(yùn)行mysql容器闯参,首先在本地新建一個(gè)/root/vol3/data文件夾用來(lái)存放mysql的數(shù)據(jù)文件
docker run -d -p 3306:3306 -v /root/vol3/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.6
-v的意思就是把容器中的目錄和宿主機(jī)中的目錄做映射瞻鹏,我們只要把容器中mysql的數(shù)據(jù)目錄映射到本地悲立,將來(lái)就算這個(gè)容器被刪除了,那么數(shù)據(jù)也還是在本地
4新博、查看容器
docker ps mysql
5薪夕、進(jìn)入mysql容器
docker exec -it mysql /bin/bash
容器內(nèi)使用mysql命令可以進(jìn)行相關(guān)操作
root@c2ea1f543f35:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.44 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, 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>
創(chuàng)建成功,宿主機(jī)中的//root/vol3/data目錄也有通過(guò)mysql創(chuàng)建的數(shù)據(jù)庫(kù)
6赫悄、完成之后刪除mysql這個(gè)容器
docker stop mysql
docker rm mysql
接著我們重新生成容器
docker run -d -p 3306:3306 -v /root/vol3/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.6
檢查原來(lái)存放于mysql中數(shù)據(jù)可以重新訪問(wèn)原献,啟動(dòng)docker速度還快。
7埂淮、使用容器中的客戶端去連接其他的mysql數(shù)據(jù)庫(kù)(假設(shè)遠(yuǎn)程數(shù)據(jù)庫(kù)ip:72.17.0.1)
docker run -it --rm mysql:5.6 mysql -h172.17.0.1 -uroot -p
--rm的意思就是當(dāng)容器運(yùn)行結(jié)束之后就自動(dòng)刪除
~ docker run -it --rm mysql:5.6 mysql -h172.17.0.1 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.6.44 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, 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.
還有一種連接方法姑隅,你可以想一下,兩個(gè)都是容器倔撞,那么就沒(méi)有一種更簡(jiǎn)單的方法去連接嗎讲仰?,實(shí)際上真的有痪蝇,采用--link我們可以這樣做
docker run -it --link mysql-data:mysql --rm mysql:5.6 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
通過(guò)mysql啟動(dòng)時(shí)自動(dòng)執(zhí)行sql文件
1鄙陡、首先創(chuàng)建Dckerfile:
FROM mysql:5.6
#設(shè)置免密登錄
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
#將所需文件放到容器中
COPY setup.sh /mysql/setup.sh
COPY schema.sql /mysql/schema.sql
COPY privileges.sql /mysql/privileges.sql
#設(shè)置容器啟動(dòng)時(shí)執(zhí)行的命令
CMD ["sh", "/mysql/setup.sh"]
2、編寫容器啟動(dòng)腳本setup.sh:
#!/bin/bash
set -e
#查看mysql服務(wù)的狀態(tài)躏啰,方便調(diào)試趁矾,這條語(yǔ)句可以刪除
echo `service mysql status`
echo '1.啟動(dòng)mysql....'
#啟動(dòng)mysql
service mysql start
sleep 3
echo `service mysql status`
echo '2.開(kāi)始導(dǎo)入數(shù)據(jù)....'
#導(dǎo)入數(shù)據(jù)
mysql < /mysql/schema.sql
echo '3.導(dǎo)入數(shù)據(jù)完畢....'
sleep 3
echo `service mysql status`
#重新設(shè)置mysql密碼
echo '4.開(kāi)始修改密碼....'
mysql < /mysql/privileges.sql
echo '5.修改密碼完畢....'
#sleep 3
echo `service mysql status`
echo 'mysql容器啟動(dòng)完畢,且數(shù)據(jù)導(dǎo)入成功'
tail -f /dev/null
這里是先導(dǎo)入數(shù)據(jù),然后才是設(shè)置用戶和權(quán)限给僵,是因?yàn)閙ysql容器一開(kāi)始為免密登錄毫捣,Dockerfile中有如下設(shè)置:ENV MYSQL_ALLOW_EMPTY_PASSWORD yes,此時(shí)執(zhí)行導(dǎo)入數(shù)據(jù)命令不需要登錄驗(yàn)證操作,如果是先執(zhí)行權(quán)限操作帝际,那么導(dǎo)入數(shù)據(jù)則需要登錄驗(yàn)證蔓同,整個(gè)過(guò)程就麻煩了許多。
3胡本、需要導(dǎo)入數(shù)據(jù)的mysql腳本命令schema.sql:
-- 創(chuàng)建數(shù)據(jù)庫(kù)
create database `docker_mysql` default character set utf8 collate utf8_general_ci;
use docker_mysql;
-- 建表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL,
`created_at` bigint(40) DEFAULT NULL,
`last_modified` bigint(40) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`first_name` varchar(255) DEFAULT NULL,
`last_name` varchar(255) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- 插入數(shù)據(jù)
INSERT INTO `user` (`id`, `created_at`, `last_modified`, `email`, `first_name`, `last_name`, `username`)
VALUES
(0,1590257904,1590257904,'TigerwolfC@example.com','TigerwolfC','chen','user');
因?yàn)槭菧y(cè)試牌柄,所以隨便寫了一個(gè)建表語(yǔ)句,如果是真實(shí)項(xiàng)目肯定不止這一張表侧甫,直接將建表語(yǔ)句覆蓋過(guò)來(lái)就好珊佣。
4、mysql權(quán)限設(shè)置命令privileges.sql:
use mysql;
select host, user from user;
-- 因?yàn)閙ysql版本是5.7披粟,因此新建用戶為如下命令:
create user docker identified by '123456';
-- 將docker_mysql數(shù)據(jù)庫(kù)的權(quán)限授權(quán)給創(chuàng)建的docker用戶咒锻,密碼為123456:
grant all on docker_mysql.* to docker@'%' identified by '123456' with grant option;
-- 這一條命令一定要有:
flush privileges;
5、創(chuàng)建鏡像
docker build -t ./docker-mysql .
docker build 為創(chuàng)建鏡像命令守屉,名稱為./docker-mysql惑艇,'.'表示當(dāng)前目錄,即Dockerfile文件所在的目錄,特別注意上述命令最后的一個(gè)“.”滨巴,千萬(wàn)不要弄掉思灌,創(chuàng)建過(guò)程如下:
你只要回車,連密碼嗎都可以不用輸入恭取,就是命令有點(diǎn)長(zhǎng)泰偿。
執(zhí)行docker images查看該鏡像是否存在于鏡像列表中。
6蜈垮、啟動(dòng)容器
docker run -d -p 3306:3306 docker-mysql
7耗跛、進(jìn)入容器
啟動(dòng)時(shí)容器的id為76d6c460e6f5,因此執(zhí)行exec命令進(jìn)入容器:
docker exec -it 76d6c460e6f5 /bin/bash
這個(gè)命令不要直接使用攒发,因?yàn)樵谀銠C(jī)器上id可能不同调塌,替換掉id值即可。
前文中創(chuàng)建了docker_mysql數(shù)據(jù)庫(kù)惠猿,并在此數(shù)據(jù)庫(kù)中創(chuàng)建了user表羔砾,同時(shí)將數(shù)據(jù)庫(kù)的連接授權(quán)賦予了新建的docker用戶,因此驗(yàn)證過(guò)程為:
使用docker用戶登錄數(shù)據(jù)庫(kù):mysql -u docker -p
輸入密碼123456通過(guò)登錄驗(yàn)證,show databases;
切換至docker_mysql數(shù)據(jù)庫(kù):use docker_mysql;
查看數(shù)據(jù)庫(kù)中的表:show tables;
查看表中的數(shù)據(jù):select * from user;
如有不對(duì)紊扬,歡迎指正蜒茄,相互學(xué)習(xí)唉擂,共同進(jìn)步餐屎。