文章目录
一、docker容器数据的持久化
数据是软件的生命,即使容器删了,数据也不能丢,所以我们要实现数据的持久化
当我们使用以下命令启动容器时
docker run -d -e MYSQL_ROOT_PASSWORD=root 容器ID
在mysql里创建数据库后,删除了容器后,数据库也不复存在了
为解决这个问题,docker为我们提供了三个不同的方式来实现数据的持久化
volume 、bind mount、tmpfs
使用volume挂载卷(最佳方式)
volume是存在一个或多个容器中特定文件或文件夹,这个目录能够独立于联合文件系统的形式在宿主机中存在,并为数据的共享和持久提供便利,volume能在不同的容器之间共享和重用,而且对volumez中数据操作不会影响到镜像本身
原理:将文件从容器中挂载到外面,可以理解为在外面创建一个文件的快捷方式
eg.将mysql存数据的文件/var/lib/mysql 挂载到centos中
docker默认在主机上有一个特定的区域(/var/lib/docker/volumes)存放volume挂载卷
volume是通过volume进行管理的,如创建、删除等操作
docker volume的一些命令
docker volume ls
查看所有的挂载卷,默认名字是一串无规则的数字
docker volume rm 挂载卷名
删除一个挂载卷
docker volume rm -f $(docker volume ls -q)
删除所有能查到的不在使用的挂载卷
使用中的挂载卷是使用不了的
可以使用下列命令查看挂载卷的详细信息
docker volume inspect 无法删除的挂载卷名
然后先删除容器,后删除挂载卷
mysql使用volume
mysql默认是有volume的,但是挂载卷名是一串无规则的数字
所以我们创建容器的时候使用如下命令创建自定义名称的挂载卷
docker run -d -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql镜像ID
在mysql里创建一个test的数据库,然后删除容器,但不删除挂载卷
再启动一个mysql时,test数据库仍然存在
删除创建test数据库的容器,不删除卷
test在新的容器里仍然存在
使用Mounted挂载文件和文件夹
进入到宿主机存放想要挂载文件或文件夹的目录,使用如下命令
docker run -d -v $(pwd):/usr/local/tomcat/webapps 镜像ID
此命令与下面命令是相同的
docker run -d -v /root/docker/tomcat1:/usr/local/tomcat/webapps 镜像ID
eg.
二、实现WordPress搭建个人博客系统
wordpress是个啥
WordPress是帮助客户打造个人网站的公司
wordpress官网
拉取wordpress镜像,wordpress里有一套完整的个人博客系统
部署
拉取wordpress镜像
在docker hub查找wordpress的拉取命令
且可以查看如何使用wordpress
docker pull wordpress
wordpress连接数据库
wordpress需要连接mysql作为个人博客系统的数据库,并且要创建一个wordpress数据库
docker run -d --name mysql -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql镜像ID
MYSQL_DATABASE=wordpress 启动容器一个wordpress数据库
启动wordpress容器
docker run -d -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress镜像ID
WORDPRESS_DB_HOST=mysql:3306 指定使用的数据库是启动的mysql容器
访问wordpress
在浏览器输入192.168.160.10(虚拟机IP):8080访问并注册登录
三、Dockerfile实现自定义镜像
Dockerfile的作用
当我们正常启动容器并导入数据时,步骤比较繁琐,使用Dockerfile可以扩展基础镜像,将其作为我们的自定义镜像
可以理解为基类与扩展类的关系
以mysql为例:
正常启动步骤
1、docker run 启动容器
2、docker exec 进入容器
3、mysql -u root -p 登录mysql
4、source xxx.sql 导入数据文件
5、use mysql;
GRANT ALL PRIVILEGES ON . TO ‘root’@’%’ IDENTIFIED BY ‘root’ WITH GRANT OPTION;
flush privileges;
配置远程连接
步骤相当繁琐
但只要在Dockerfile中编辑以下操作即可完成上述工作
1、指定自定义镜像的基础镜像
2、编写需要融入到镜像中的文件
3、使用Dockerfile命令编辑操作命令
4、下一次启动的时候只要启动自定义的image即可
自定义一个mysql镜像
准备需要的文件
1、创建Dockerfile文件
touch Dockerfile
2、将easybuy.sql数据文件与Dockerfile文件放在同一个目录下,如果数据文件在主机,使用WinSCP工具
3、创建远程连接权限文件(后缀为.sql)并与Dockerfile放到同一目录下
远程连接权限文件内容
use mysql;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
flush privileges;
4、编写启动文件(shell脚本)setup.sh,同与Dockerfile在一个目录下
touch setup.sh
vim setup.sh
#setup.sh文件内容如下
#表示使用bash解释器解释shell脚本
#!/bin/bash
#告诉解释器,如果有一条命令出错就退出,防止错误像滚雪球一样越来越大
set -e
#查看mysql容器启动状态,方便调试
echo `service mysql status`
#启动mysql
echo '1、启动mysql'
sevice mysql start
#睡眠3秒
sleep 3
#再次查看mysql状态,确认是否启动
echo `service mysql status`
#导入数据,因为设置了免密登录mysql就直接登录了
echo '2、开始导入数据'
mysql</mysql/easybuy.sql
echo '导入数据成功'
sleep 3
echo `service mysql status`
#配置允许远程连接权限
echo '3.配置开放远程连接权限'
mysql</mysql/privileges.sql
echo '远程连接权限开放成功'
sleep 3
echo `service mysql status`
echo 'Success! mysql容器启动完毕'
#防止容器启动后自动退出
tail -f /dev/null
编辑Dockerfile文件
Dockerfile文件中的内容
Dockerfile是有自己的语法的
比较重要的两条:
1、FROM 作为第一句,确定基础镜像
2、#开头的语句作为注释
Dockerfile文件中的内容
#1、设置base image
FROM mysql:5.7
#2、设置免密码登录
ENV MYSQL_ALLOW_EMPTY_PASSWORD=yes
#3、将easybuy.sql数据文件拷贝到镜像中
COPY easybuy.sql /mysql/easybuy.sql
#4、将配置远程连接权限的文件拷贝到镜像中
COPY privileges.sql /mysql/privileges.sql
#5、将setup.sh启动文件拷贝到镜像中
COPY setup.sh /mysql/setup.sh
#6、设置容器启动时执行的命令
CMD ["sh","/mysql/setup.sh"]
将配置好的东西构建为新的image
docker build . -t dean/mysql-easybuy:1.0
也可以通过-f /root/docker/mysql/Dockerfile指定Dockerfile文件的位置
命名也可不按照命名规则执行
启动自定义的镜像
docker run -d -e MYSQL_ROOT_PASSWORD=root 镜像ID
执行这条命令时会自动执行setup.sh文件
docker logs 容器ID
使用此条命令查看启动容器的日志,可以看到我们在setup.sh文件里写的输出信息
使用Dockerfile的文件实质的执行过程:
1、Dockerfile在基础镜像上加入需要的文件封装为新的镜像
2、docker run 运行容器时,实质在执行setup.sh文件,setup文件里在做导入数据库,设置远程连接权限这些工作
四、 docker-compose自动化编排个人博客系统服务
docker-compose是个啥
docker-compose是docker中的一个工具
多容器的服务体系非常的麻烦,需要我们一个一个的取启动、停止管理容器
docker-compose可以起到一个容器管家的作用,多个容器组成一个整体,能够实现同时启动,同时停止
我们只要写一个docker-compose.yml文件即可,docker-compose.yml 的核心内容services(声明所有的容器),volumes(声明挂载卷),network(声明网络)
docker-compose使用
下载docker-compose
先查看docker-compose是否安装
docker-compose --version
若此条命令显示权限不够,使用如下命令对docker-compose加执行权限
chmod +x /usr/local/bin/docker-compose
如未安装执行下列的命令安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
创建docker-compose.yml文件
在wordpress文件夹里创建docker-compose.yml文件
touch docker-compose.yml
docker-compose.yml文件内容
version: "3"
#docker-compose版本为3 该版本比较稳定
services: #声明所有的容器
wordpress: #第一个容器
image: wordpress
ports:
- "8080:80"
links:
- mysql
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
mysql: #第二个容器
image: mysql:5.7
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- wordpress-data:/var/lib/mysql
volumes: 声明挂载卷
wordpress-data:
启动docker-compose
docker-compose up -d
使用该命令的前提是,当前目录必须有一个docker-compose.yml文件
在虚拟机的浏览器里访问8080端口
可以看到部署成功了