概述
我是一直想把所有的程序都跑在docker里面,這樣一方面是為了便於管理,另外一方面也可以增強自己對docker的理解,所以今天我就想學習一下最重要的數據庫部分
讓mysql數據庫在docker下跑起來
首先就是pull鏡像下來了docker pull mysql:5.6
從上面看出,我是使用了5.6版本的mysql,實際上是5.6.40,在pull鏡像的時候我推薦加上鏡像的tag,少用latest標簽
之后就是讓他跑起來docker run --name mysql -e MYSQL_ROOT_PASSWORD="woyaoxuehuilinux" -d mysql:5.6
解釋一下上面的參數run就是運行docker鏡像的命令,--name就是給容器取個名字叫mysql,-e就是設置容器里的環境變量,我們設置了mysql的密碼環境變量,這個變量會傳入容器里面來設置mysql的密碼,-d就是把容器運行在后台,后面加的就是鏡像的名字了
pull一個wordpress鏡像,讓它連接mysql容器
在pull wordpress鏡像之前,我們先做一個實驗,首先我們先看一下當前mysql容器的ip,我們可以輸入下面的命令查看mysql容器現在的ipsudo docker inspect 7c6a577b0d51
輸出可能有點多,那么我們就過濾一下,輸入下面的命令sudo docker inspect 7c6a577b0d51 |grep IPAddress
~ sudo docker inspect 7c6a577b0d51 |grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
可以看到ip是172.17.0.3,如果我們把這個容器停止了刪除了,再用這個鏡像去生成一個容器,ip地址還會是這個嗎?ip是肯定會變的,但是我們的應用是不允許數據庫的ip變來變去的,不然就會連接不上了,所以我們怎么做才可以讓數據庫在變了ip的情況下還可以始終和應用連接着呢?docker其實完美提供了解決方案,首先我們pull下wordpress,作為我們的應用docker pull wordpress:4.9.5-php5.6-apache
之后運行起來docker run --name wordpress --link mysql:mysql -p8080:80 -d wordpress:4.9.5-php5.6-apache
解釋一下參數--link,--link其實就是docker把兩個容器之間建立連接,實際上就是修改容器中hosts文件來達到這種效果的,簡單來說,我應用連接數據庫ip可能會變,但是我的域名是不會變的把,那么我應用就使用數據庫的域名來連接
root@e323ea2a7f99:/var/www/html# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 mysql 81322690e4f7
172.17.0.4 e323ea2a7f99
如果你想退出docker容器那么輸入ctrl+d,之后你就可以訪問服務器的8080端口來訪問wordpress了
如果容器掛了數據庫不就沒了?
如標題,我們的容器如果刪了,那么我們的數據不就也沒有了,那么有沒有一種方法把容器中的數據存在容器外面,有,我們換一種方式來運行mysql容器
首先在本地新建一個文件夾用來存放mysql的數據文件mkdir /data
之后用下面的命令來運行容器docker run --name mysql-data -v /data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD="woyaoxuehuilinux" -d mysql:5.6
-v的意思就是把容器中的目錄和宿主機中的目錄做映射,我們只要把容器中mysql的數據目錄映射到本地,將來就算這個容器被刪除了,那么數據也還是在本地對吧,同樣的,我們新建一個wordpress容器連接上mysql容器,這樣會在mysql數據庫中新建一個wordpress數據庫docker run --name wordpress-data --link mysql-data:mysql -p 8080:80 -d wordpress:4.9.5-php5.6-apache
之后登錄數據庫檢查一下數據庫是不是創建成功
~ docker exec -it b3fdafa94f56 /bin/bash
root@b3fdafa94f56:/# 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.39 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 |
| performance_schema |
| wordpress |
+--------------------+
4 rows in set (0.00 sec)
mysql>
沒錯創建成功了
~ ls /data
auto.cnf ib_logfile0 ib_logfile1 ibdata1 mysql performance_schema wordpress
宿主機中的/data目錄也有wordpress這個目錄
之后我們訪問ip:8080來安裝wordpress並且發布一篇文章
完成之后刪除mysql-data這個容器docker stop mysql-data
docker rm mysql-data
這個時候訪問一下我們的wordpress網站,發現報錯Error establishing a database connection
說明數據庫是徹底的掛了
接着我們重新生成容器docker run --name mysql-data -v /data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD="woyaoxuehuilinux" -d mysql:5.6
網站是不是又可以訪問了呢?而且docker容器啟動很快,如果即使發現就可以在幾分鍾的時間去完成應用的恢復
使用容器中的客戶端去連接別的mysql數據庫
有時候docker容器還有一個更好玩的地方,比如我有一天突然要遠程連接一台遠程的mysql服務器,但是我本地沒有mysql的客戶端怎么辦?不怕,docker幫助你,首先我們要知道遠程的MySQL服務器的ip,比如我選擇的是容器中的mysql,ip是172.17.0.3
docker run -it --rm mysql:5.6 mysql -h172.17.0.3 -uroot -p
~ docker run -it --rm mysql:5.6 mysql -h172.17.0.3 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.6.39 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 |
| performance_schema |
| wordpress |
+--------------------+
4 rows in set (0.00 sec)
mysql>
上面的--rm的意思就是當容器運行結束之后就自動刪除
還有一種連接方法,你可以想一下,兩個都是容器,那么就沒有一種更簡單的方法去連接嗎?,實際上真的有,我們上面說了--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"'
你只要回車,連密碼嗎都可以不用輸入,就是命令有點長,所以當你知道mysql密碼的時候,推薦使用第一種,如果你不知道那么第二種比較方便
歡迎關注Bboysoul的博客www.bboysoul.com
Have Fun