- 卷就是目录文件,存在于一个或多个容器中,由docker挂载到容器,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性
- 卷的设计目的就是数据持久化,完全独立于容器的生命周期,因此,docker不会在容器删除时删除挂载的数据卷。
- 将docker容器内的数据保存到宿主机磁盘中
- 运行一个挂载由容器卷存储功能的容器实例
docker run -it -priileged=true -v /宿主机绝对路径目录:/容器内路径 镜像名
- 参数
ro
和rw
-
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
步骤:
- 从docker 远程仓库上检索tomcat(
docker search tomcat:TAG
) - 从docker 远程仓库上down 下 tomcat(
docker pull tomcat:TAG
) - 使用
docker images tomcat
查看是否拉取成功 - 运行tomcat镜像,并创建容器对象(
docker run -d --name t1 -p 8080:8080 tomcat
) - 访问tomcat主页出现问题
- 报错404?
- 可能没有端口映射或者设置有防火墙
- 解决方案
- 方案1
- 将tomcat下的webapps.dist目录更名成webapps
- 然后重启tomcat,并重新访问tomcat首页
- 方案2:
- 下载低版本tomcat,如:
docker pull billygoo/tomcat8-jdk8
或docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
二、安装MySQL
简单版
步骤:
- 从docker远程仓库上查找mysql镜像(
docker search mysql:TAG
) - 从docker远程仓库上down 下mysql(
docker pull mysql:TAG
) - 使用
docker images mysql
查看是否拉取成功 - 运行tomcat镜像,并创建容器对象(
docker run -d --name mysql001 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
)
- 可能报错:端口被占用,可能是宿主机上开了mysql,占用了3306端口,可以将宿主机上的mysql停止,再运行以上命令
- 打开交互式容器(
docker exec -it 镜像ID或镜像名 bashShell
) - 输入账号密码登陆到Mysql数据库(
mysql -uroot -p123456
) - 对数据库和表进行相应操作
坑:
- 当我们使用软件向数据库表中插入中文记录时,会乱码(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%'
)
编码都会自动更改成utf8格式
- 此时,重新执行select语句,查询中文就不会乱码了
三、安装Redis
- 从Docker hub上(阿里云加速器)上pull下来一个Redis镜像
- 运行redis(端口映射方式)
注意:容器数据卷记得加--privileged=true
- 建目录
mkdir -p /app/redis
- 将redis配置文件模板redis.conf拷贝进/app/redis目录下
- 修改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