下載 MySQL Server Docker Image
#tag代表版本號,如5.5,5.6,5.7,8.0或者latest
docker pull mysql/mysql-server:tag
更多mysql鏡像性含,請查看https://hub.docker.com/r/mysql/mysql-server/tags/
#查看下載的鏡像
docker images
要下載MySQL Enterprise Edition 鏡像,請運行如下命令:
docker pull store/oracle/mysql-enterprise-server:tag
或
docker pull container-registry.oracle.com/mysql/enterprise-server:tag
開啟MySQL Server 實例
使用以下命令為MySQL社區(qū)服務(wù)器啟動一個新的Docker容器:
docker run --name=mysql1 -d mysql/mysql-server:tag
如果從Oracle容器注冊表中下載了Docker鏡像稽物,那么就可以使用這個命令為MySQL企業(yè)服務(wù)器啟動一個新的Docker容器:
docker run --name=mysql1 -d container-registry.oracle.com/mysql/enterprise-server:tag
如果Docker映像是從Docker商店下載的,那么就用這個命令為MySQL企業(yè)服務(wù)器啟動一個新的Docker容器:
docker run --name=mysql1 -d store/oracle/mysql-enterprise-server:tag
--name 選項鸦做,為docker容器提供一個自定義的名稱,如mysql1,這個操作是可選的励烦。如果沒有提供容器名稱,則會生成一個隨機的容器名泼诱。如果之前的Docker pull 或 Docker run命令沒有下載指定名稱和標簽的Docker鏡像坛掠,那么上面的命令會去下載最新的mysql鏡像。下載完后治筒,容器的初始化就開始執(zhí)行屉栓。當(dāng)您運行docker ps命令時,docker容器列表中會顯示:
shell> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a24888f0d6f4 mysql/mysql-server "/entrypoint.sh my..." 14 seconds ago Up 13 seconds (health: starting) 3306/tcp, 33060/tcp mysql1
容器初始化可能需要一些時間耸袜。當(dāng)服務(wù)器準備好使用時友多,docker ps 命令輸出中的容器的狀態(tài)從(health:starting)到(healthy).上面的docker run 命令中使用的 -d 選項使容器在后臺運行。使用這個命令監(jiān)視容器的輸出:
docker logs mysql1
一旦初始化完成堤框,命令的輸出就會包含為root用戶生成的隨機密碼域滥。例如纵柿,檢查密碼。
shell> docker logs mysql1 2>&1 | grep GENERATED
GENERATED ROOT PASSWORD:Axegh3kAJyDLaRuBemecis&EShOs
從容器內(nèi)連接到MySQL服務(wù)器
一旦服務(wù)器準備好了骗绕,您就可以在剛剛啟動的MySQL服務(wù)器容器中運行MySQL客戶端藐窄,并將其連接到MySQL服務(wù)器。使用Docker exec -it 命令在您已經(jīng)啟動的Docker容器中啟動一個mysql客戶端酬土,如下所列:
docker exec -it mysql1 mysql -uroot -p
當(dāng)被詢問時荆忍,輸入生成的根密碼(參見上面關(guān)于如何查找密碼的MySQL服務(wù)器實例的最后一步)。因為mysql onetime password選項默認為true撤缴,在您將mysql客戶端連接到服務(wù)器之后刹枉,您必須通過發(fā)出以下語句重置服務(wù)器根密碼:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
用您選擇的密碼替換密碼。一旦密碼被重置屈呕,服務(wù)器就可以使用了微宝。
容器Shell訪問
要讓shell訪問MySQL服務(wù)器容器,請使用docker exec -it 命令在容器內(nèi)啟動一個bash shell:
shell> docker exec -it mysql1 bash
bash-4.2#
然后您可以在容器內(nèi)運行Linux命令虎眨。例如蟋软,要查看容器內(nèi)服務(wù)器的數(shù)據(jù)目錄中的內(nèi)容,請使用以下命令:
bash-4.2# ls /var/lib/mysql
auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 mysql mysql.sock.lock private_key.pem server- cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 mysql.sock performance_schema public_key.pem server-key.pem
停止并刪除一個MySQL容器
要停止我們創(chuàng)建的MySQL服務(wù)器容器嗽桩,請使用以下命令:
docker stop mysql1
docker stop 向mysqld進程發(fā)送SIGTERM信號岳守,這樣服務(wù)器就會優(yōu)雅地關(guān)閉。
還要注意的是碌冶,當(dāng)容器的主進程(MySQL服務(wù)器容器中的mysqld)停止時湿痢,Docker容器會自動停止。
再次啟動MySQL服務(wù)器容器:
docker start mysql1
重啟容器
docker restart mysql1
刪除mysql服務(wù)容器前先停止容器:
docker stop mysql1
docker rm mysql1
如果您想要同時刪除服務(wù)器數(shù)據(jù)目錄的Docker卷扑庞,則將 -v 選項添加到Docker rm命令中譬重。
致此,以上操作已經(jīng)完全滿足docker安裝mysql的方式罐氨。如下是針對Docker的優(yōu)化MySQL安裝 臀规。
針對Docker的優(yōu)化MySQL安裝
MySQL的Docker鏡像針對代碼的大小進行了優(yōu)化,這意味著它們只包含了那些在Docker容器中運行MySQL實例的大多數(shù)用戶的關(guān)鍵組件栅隐。在以下方面以现,MySQL Docker安裝與普通的、非Docker的安裝不同:
包含的二進制文件僅限于:
/usr/bin/my_print_defaults
/usr/bin/mysql
/usr/bin/mysql_config
/usr/bin/mysql_install_db
/usr/bin/mysql_tzinfo_to_sql
/usr/bin/mysql_upgrade
/usr/bin/mysqladmin
/usr/bin/mysqlcheck
/usr/bin/mysqldump
/usr/bin/mysqlpump
/usr/sbin/mysqld
所有的二進制被剝落约啊,不包含調(diào)試信息。
配置MySQL Server
當(dāng)你啟動mysql docker容器時佣赖,您可以通過Docker run命令將配置選項傳遞給服務(wù)器;例如:
docker run --name mysql1 -d mysql/mysql-server:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_col
命令以utf8mb4作為默認字符集和utf8mb4col作為您的數(shù)據(jù)庫的默認排序啟動MySQL服務(wù)器恰矩。
另一種配置MySQL服務(wù)器的方法是準備一個配置文件,并將其掛載到容器內(nèi)的服務(wù)器配置文件的位置憎蛤。有關(guān)詳細信息外傅,請參閱持久數(shù)據(jù)和配置更改纪吮。
持久數(shù)據(jù)和配置更改
Docker容器在原則上是臨時的,如果容器被刪除或損壞,任何數(shù)據(jù)或配置都將丟失(參見討論)。然而,Docker卷提供了一種機制,可以在Docker容器中保存數(shù)據(jù)萎胰。在初始化時,MySQL服務(wù)器容器為服務(wù)器數(shù)據(jù)目錄創(chuàng)建Docker卷碾盟。運行docker檢查容器命令的JSON輸出有一個掛載鍵,其值提供數(shù)據(jù)目錄卷的信息:
shell> docker inspect mysql1
...
"Mounts": [
{
"Type": "volume",
"Name": "4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652",
"Source": "/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
輸出顯示源文件夾
/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data,將數(shù)據(jù)持久化到主機上的數(shù)據(jù),已經(jīng)安裝在/var/lib/mysql中技竟,容器內(nèi)的服務(wù)器數(shù)據(jù)目錄冰肴。
保存數(shù)據(jù)的另一種方法是在創(chuàng)建容器時使用 --mount 選項掛載主機目錄。同樣的技術(shù)可以用來持久化服務(wù)器的配置榔组。下面的命令創(chuàng)建一個MySQL服務(wù)器容器熙尉,并將數(shù)據(jù)目錄和服務(wù)器配置文件綁定在一起:
docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/path-on-host-machine/datadir,dst=/var/lib/mysql \
-d mysql/mysql-server:tag
配置文件path-on-host-machine/my.cnf必須存在,同時包含指定的用戶:
[mysqld]
user=mysql
path-on-host-machine.datadir目錄必須存在搓扯。要發(fā)生服務(wù)器初始化检痰,目錄必須是空的。您還可以安裝一個帶有數(shù)據(jù)的目錄锨推,并使用它啟動服務(wù)器;但是铅歼,您必須確保啟動Docker容器,其配置與創(chuàng)建數(shù)據(jù)的服務(wù)器具有相同的配置换可,并且啟動容器時所需的任何主機文件或目錄都被安裝椎椰。
運行額外的初始化腳本
如果您想在創(chuàng)建后立即在數(shù)據(jù)庫上運行任何.sh或.sql腳本,您可以將它們放入主機目錄中锦担,然后mount目錄在/docker-entrypoint-initdb.d
docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/scripts/,dst=/docker-entrypoint-initdb.d/ \
-d mysql/mysql-server:tag
從另一個Docker容器中的應(yīng)用程序連接到MySQL
通過建立一個Docker網(wǎng)絡(luò)俭识,你可以讓多個Docker容器相互通信,這樣洞渔,在另一個Docker容器中的客戶端應(yīng)用程序就可以在服務(wù)器容器中訪問MySQL服務(wù)器套媚。首先,創(chuàng)建一個Docker網(wǎng)絡(luò):
docker network create my-custom-net
然后磁椒,當(dāng)您創(chuàng)建并啟動服務(wù)器和客戶端容器時堤瘤,使用-網(wǎng)絡(luò)選項將它們放在您創(chuàng)建的網(wǎng)絡(luò)上。例如:
docker run --name=mysql1 --network=my-custom-net -d mysql/mysql-server
docker run --name=myapp1 --network=my-custom-net -d myapp
myapp1容器隨后可以與mysql1主機連接到mysql1容器浆熔,反之亦然本辐,因為Docker會自動為給定的容器名稱設(shè)置一個DNS。在下面的例子中医增,我們從myapp1容器中運行mysql客戶端慎皱,以便在自己的容器中連接主機mysql1:
docker exec -it myapp1 mysql --host=mysql1 --user=myuser --password
參考:https://dev.mysql.com/doc/refman/5.7/en/docker-mysql-more-topics.html