我是一直想把全部的程序都跑在docker裏面,這樣一方面是爲了便於管理,另一方面也能夠加強本身對docker的理解,因此今天我就想學習一下最重要的數據庫部分php
首先就是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就是把容器運行在後臺,後面加的就是鏡像的名字了html
在pull wordpress鏡像以前,咱們先作一個實驗,首先咱們先看一下當前mysql容器的ip,咱們能夠輸入下面的命令查看mysql容器如今的ip sudo docker inspect 7c6a577b0d51
輸出可能有點多,那麼咱們就過濾一下,輸入下面的命令 sudo docker inspect 7c6a577b0d51 |grep IPAddress
node
➜ ~ 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可能會變,可是個人域名是不會變的把,那麼我應用就使用數據庫的域名來鏈接mysql
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了linux
如標題,咱們的容器若是刪了,那麼咱們的數據不就也沒有了,那麼有沒有一種方法把容器中的數據存在容器外面,有,咱們換一種方式來運行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
以後登陸數據庫檢查一下數據庫是否是建立成功sql
➜ ~ 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>
沒錯建立成功了docker
➜ ~ 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容器啓動很快,若是即便發現就能夠在幾分鐘的時間去完成應用的恢復數據庫
有時候docker容器還有一個更好玩的地方,好比我有一天忽然要遠程鏈接一臺遠程的mysql服務器,可是我本地沒有mysql的客戶端怎麼辦?不怕,docker幫助你,首先咱們要知道遠程的MySQL服務器的ip,好比我選擇的是容器中的mysql,ip是172.17.0.3apache
docker run -it --rm mysql:5.6 mysql -h172.17.0.3 -uroot -p
bash
➜ ~ 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