我是一直想把全部的程序都跑在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