• 卷就是目录文件,存在于一个或多个容器中,由docker挂载到容器,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性
  • 卷的设计目的就是数据持久化,完全独立于容器的生命周期,因此,docker不会在容器删除时删除挂载的数据卷。
  • 将docker容器内的数据保存到宿主机磁盘中
  • 运行一个挂载由容器卷存储功能的容器实例
  • docker run -it -priileged=true -v /宿主机绝对路径目录:/容器内路径 镜像名
  • 参数
  • rorw
  • ro:表示在容器中只读,在宿主机中是读写状态的目录
  • rw(read and write):表示在容器中和在宿主机中都是可读写的目录
  • --volumes-from u1 :继承u1的数据卷

作用

  • 将运行与运行时的环境打包镜像,run后形成一个容器实例运行,但是我们对数据的要求是持久化的
  • docker容器产生的数据,如果不备份,那么当容器实例删除后,相应的容器内的数据也会随之删除,为了保证数据的安全性,我们使用容器数据卷的形式来存储容器中的数据
  • 特点
  • 数据卷可在容器之间共享和重用数据
  • 卷中的数据修改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新
  • 数据卷的生命周期一直持续到没有容器使用它为止

  • Docker挂载主机目录访问如果出现 cannot open directory.: Permission denied
  • 解决办法:在挂载目录后多增加一个参数privileget=true即可

Docker的常规安装

总体步骤:

  • 搜索镜像docker search 镜像名:TAG
  • 拉取镜像docker pull 镜像名:TAG
  • 查看镜像docker images 镜像名
  • 启动镜像(端口映射方式)docker run -d --name 容器别名 -p 宿主机端口:容器内端口 镜像名:TAG
  • 停止容器docker stop 容器ID|容器名
  • 移除容器docker rm 容器ID|容器名

一、安装Tomcat

步骤:

  1. 从docker 远程仓库上检索tomcat(docker search tomcat:TAG)
  2. 从docker 远程仓库上down 下 tomcat(docker pull tomcat:TAG)
  3. 使用docker images tomcat查看是否拉取成功
  4. 运行tomcat镜像,并创建容器对象(docker run -d --name t1 -p 8080:8080 tomcat)
  5. 访问tomcat主页出现问题
  • 报错404?
  • 可能没有端口映射或者设置有防火墙
  • 解决方案
  • 方案1
  • 将tomcat下的webapps.dist目录更名成webapps
  • 然后重启tomcat,并重新访问tomcat首页
  • 方案2:
  • 下载低版本tomcat,如:docker pull billygoo/tomcat8-jdk8docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

二、安装MySQL

简单版

步骤:

  1. 从docker远程仓库上查找mysql镜像(docker search mysql:TAG)
  2. 从docker远程仓库上down 下mysql(docker pull mysql:TAG)
  3. 使用docker images mysql 查看是否拉取成功
  4. 运行tomcat镜像,并创建容器对象(docker run -d --name mysql001 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql)
  1. 可能报错:端口被占用,可能是宿主机上开了mysql,占用了3306端口,可以将宿主机上的mysql停止,再运行以上命令
  1. 打开交互式容器(docker exec -it 镜像ID或镜像名 bashShell)
  2. 输入账号密码登陆到Mysql数据库(mysql -uroot -p123456)
  3. 对数据库和表进行相应操作

  • 当我们使用软件向数据库表中插入中文记录时,会乱码(docker上默认字符集编码隐患)
  • 当有人直接删除了我们正在操作的mysql容器,我们的数据将会直接丢失(真正意义上的从删库到跑路)

分析原因

  • 数据库的编码不支持utf8格式( SHOW VARIABLES LIKE 'character%)
  • 数据库容器上没有挂载容器数据卷

实战版

  • 新建mysql容器实例
  • docker run -d -p 3306:3306 --privileged=true -v /mydocker/mysql/log:/var/log/mysql -v /mydocker/mysql/data:/var/lib/mysql -v /mydocker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:8.0.28
  • 解决乱码问题:
  • 通过容器数据卷的形式同步给容器实例
  • 在宿主机的/mydocker/mysql/conf目录下新建my.cnf文件,并输入如下内容
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_c
character_set_server = utf8
  • 重新启动mysql容器实例,并重新用上述命令查看数据库编码(SHOW VARIABLES LIKE 'character%')
  • docker 作为root docker :ro_docker

编码都会自动更改成utf8格式

  • 此时,重新执行select语句,查询中文就不会乱码了

三、安装Redis

  • 从Docker hub上(阿里云加速器)上pull下来一个Redis镜像
  • 运行redis(端口映射方式)

docker 作为root docker :ro_容器_02

注意:容器数据卷记得加--privileged=true

  1. 建目录mkdir -p /app/redis
  2. 将redis配置文件模板redis.conf拷贝进/app/redis目录下
  3. 修改redis.conf配置文件
  • 注释掉bind 127.0.0.1 允许redis外地连接
  • darmonize yes改为daemonize no或者注释起来,因为该配置和docker中-d参数冲突,会导致容器一直启动失败
  • 开启redis数据持久化appendonly yes(AOF)
docker run  -p 6379:6379 --name myr3 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf