前言
本文分三個(gè)部分:
1)啟動(dòng)一個(gè)測(cè)試/開發(fā)級(jí)別的數(shù)據(jù)庫(kù)辈双。
2)啟動(dòng)一個(gè)生產(chǎn)級(jí)別的數(shù)據(jù)庫(kù)
3)開發(fā)環(huán)境的一個(gè)自動(dòng)化方案挽绩。讓開發(fā)人員在宿主機(jī)上隨時(shí)快速啟動(dòng)一個(gè)mysql數(shù)據(jù)庫(kù)伞广。
*其他相關(guān)文檔:
《k8s啟動(dòng)單點(diǎn)mysql》
《helm啟動(dòng)單節(jié)點(diǎn)mysql》
《helm啟動(dòng)mysql-ha》
《k8s啟動(dòng)phpmyadmin》
1. 測(cè)試/開發(fā)使用
優(yōu)點(diǎn):
- 簡(jiǎn)單
你不需要關(guān)于mysql的知識(shí)即可在一個(gè)服務(wù)器上啟動(dòng)很多mysql數(shù)據(jù)庫(kù)汁果。
簡(jiǎn)單使用中你也不需要更多關(guān)于容器的知識(shí)涡拘。 - 高效
即刻讓一個(gè)數(shù)據(jù)庫(kù)拔地而起。 - 干凈
當(dāng)你不用了据德,停止容器后不會(huì)有任何系統(tǒng)垃圾鳄乏。
1.1 環(huán)境準(zhǔn)備
已安裝docker和docker-compose
1.2 docker-compose文件
創(chuàng)建mysql目錄跷车,目錄下新建 docker-compose.yml 文件,內(nèi)容如下:
version: '3'
services:
db:
image: 'docker.io/mysql:latest' #使用的鏡像
restart: always
container_name: mysql #容器名
volumes:
- ./data:/var/lib/mysql #掛載目錄汞窗,持久化存儲(chǔ)
ports:
- '3306:3306'
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: "liubei@2021" #設(shè)置root用戶的密碼
1.3 啟動(dòng)mysql
在剛才創(chuàng)建的mysql 目錄下執(zhí)行命令
# docker-compose up -d
啟動(dòng)之后姓赤,數(shù)據(jù)庫(kù)就可以正常使用了。
1.4 其他操作
- 查看服務(wù)狀態(tài)
# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------
mysql docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp
- 停止服務(wù)
# docker-compose stop
Stopping mysql ... done
# docker-compose ps
Name Command State Ports
--------------------------------------------------------
mysql docker-entrypoint.sh mysqld Exit 0
- 重啟容器
# docker-compose restart
- 關(guān)閉容器容器
# docker-compose down
Stopping mysql ... done
Removing mysql ... done
Removing network mysql_default
# docker-compose ps
Name Command State Ports
------------------------------
說(shuō)明:可以看到仲吏,stop的時(shí)候不铆,容器是Exit狀態(tài)。而down之后容器被徹底刪除了裹唆,但是不用擔(dān)心誓斥,我們已經(jīng)對(duì)數(shù)據(jù)做了持久話存儲(chǔ),up之后數(shù)據(jù)還在许帐。
2 生產(chǎn)級(jí)使用
說(shuō)明:
此處只討論mysql的創(chuàng)建劳坑,不介紹高可用或主從架構(gòu)。
如果要做主從的話只需要放一個(gè)腳本或sql在 2.4中的 init目錄下成畦。
思路簡(jiǎn)述:
創(chuàng)建mysql目錄距芬,下邊創(chuàng)建如下文件和目錄
- docker-compose.yml
生命周期和編排文件 - my.cnf
mysql配置文件,掛載出來(lái)便于修改循帐,同時(shí)也是對(duì)配置的持久化存儲(chǔ)框仔。 - data目錄
將msyql的數(shù)據(jù)持久化存儲(chǔ)以避免執(zhí)行 down 后數(shù)據(jù)丟失。 - init目錄
用來(lái)放 mysql的初始化腳本拄养,如果data目錄中有文件离斩,則再會(huì)執(zhí)行初始化。
2.1 docker-compose 文件
version: '3'
services:
db:
image: 'docker.io/mysql:latest'
restart: always
container_name: mysql
volumes:
- ./data:/var/lib/mysql
- ./my.cnf:/etc/mysql/my.cnf
- ./init:/docker-entrypoint-initdb.d/
ports:
- '3306:3306' #“宿主機(jī)端口號(hào):容器內(nèi)端口號(hào)”
environment:
MYSQL_ROOT_PASSWORD: "liubei@2021"
MYSQL_USER: 'liubei' # 創(chuàng)建普通用戶
MYSQL_PASSWORD: 'liubei@2021' #普通用戶密碼
MYSQL_DATABASE: 'liubeidb' #創(chuàng)建一個(gè)庫(kù)
2.2 my.cnf
說(shuō)明:msyql的配置文件瘪匿,下邊只是一個(gè)示例跛梗,你可以根據(jù)需要更改
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Custom config should go here
!includedir /etc/mysql/conf.d/
2.3 data目錄
可以不提前創(chuàng)建,容器啟動(dòng)的時(shí)候會(huì)自動(dòng)創(chuàng)建并掛載棋弥。
2.4 init目錄和初始化腳本
將啟動(dòng)腳本寫放到init目錄核偿,給執(zhí)行權(quán)限即可,可以是shell嘁锯,可以是sql宪祥。如果你不需要就不放任何文件。數(shù)據(jù)庫(kù)沒有初始化時(shí)候會(huì)執(zhí)行該腳本家乘。
2.5 容器啟動(dòng)和操作
同上文 1.3 和 1.4蝗羊,不贅述。
3 自動(dòng)創(chuàng)建腳本
說(shuō)明:
1)在宿主機(jī)中執(zhí)行如下腳本仁锯,自動(dòng)啟動(dòng)一個(gè)容器供開發(fā)測(cè)試使用耀找。
2)執(zhí)行過(guò)程中需要一些交互式輸入:安裝位置、root密碼、使用端口野芒、庫(kù)名蓄愁。實(shí)際應(yīng)用
我將這個(gè)腳本放在ftp服務(wù)器上,開發(fā)人員需要啟動(dòng)mysql的時(shí)候執(zhí)行
# wget ftp://10.252.xxx.xxx/script/x'x'x'x.sh -O xxx.sh && bash xxx.sh
即可直接啟動(dòng)一個(gè)開發(fā)/測(cè)試級(jí)的 msyql數(shù)據(jù)庫(kù)
#!/bin/bash
########## 定義變量 ##########
read -p "輸入安裝的位置(回車默認(rèn)/usr/local/mysql ) " home_dir
if [ -z "${home_dir}" ];then
home_dir=/usr/local/mysql
fi
read -p "輸入密碼(回車默認(rèn)liubei@2021):" mysql_passwd
if [ -z "${mysql_passwd}" ];then
mysql_passwd="liubei@2021"
fi
read -p "輸入端口(默認(rèn)3306):" mysql_port
if [ -z "${mysql_port}" ];then
mysql_port=3306
fi
read -p "新建庫(kù)(默認(rèn)liubeidb):" mysql_db
if [ -z "${mysql_db}" ];then
mysql_db=liubeidb
fi
############## yml文件 ##################
mkdir ${home_dir} -p
cat > ${home_dir}/docker-compose.yml << EOF
version: "3.1"
services:
mysql:
image: docker.io/mysql:latest
environment:
MYSQL_ROOT_PASSWORD: ${mysql_passwd}
MYSQL_DATABASE: ${mysql_db}
TZ: Asia/Shanghai
restart: always
ports:
- ${mysql_port}:3306
volumes:
- ./data:/var/lib/mysql
EOF
cd ${home_dir}
docker-compose up -d
docker ps