Docker学习笔记---day007(容器卷和Docker 常规软件安装)
文章目录
- [Docker学习笔记---day007(容器卷和Docker 常规软件安装)](#Docker学习笔记—day007(容器卷和Docker 常规软件安装))
-
- 一、Docker容器数据卷
- [二、Docker 常规安装简介](#二、Docker 常规安装简介)
-
- 2.1、总体步骤
-
- [2.1.1、 搜索镜像](#2.1.1、 搜索镜像)
- [2.1.2、 拉取镜像](#2.1.2、 拉取镜像)
- [2.1.3、 查看镜像](#2.1.3、 查看镜像)
- [2.1.4、启动镜像 -- 服务端口映射](#2.1.4、启动镜像 -- 服务端口映射)
- 2.1.5、停止镜像
- [2.1.6、 删除镜像](#2.1.6、 删除镜像)
- 2.2、安装Tomcat
-
- [2.2.1、 [docker hub](https://hub.docker.com/)上面查找tomcat镜像](#2.2.1、 docker hub上面查找tomcat镜像)
- [2.2.2、从docker hub上拉取tomcat镜像到本地](#2.2.2、从docker hub上拉取tomcat镜像到本地)
- [2.2.4、docker images查看是否有拉取到的tomcat](#2.2.4、docker images查看是否有拉取到的tomcat)
- 2.2.5、使用tomcat镜像创建容器实例(运行镜像)
- 2.2.6、访问tomcat首页
- [2.2.7. 免修改版说明](#2.2.7. 免修改版说明)
- 2.3、安装Mysql
-
- [2.3.1、 拉取mysql5.7镜像](#2.3.1、 拉取mysql5.7镜像)
- 2.3.2、运行mysql镜像实例(实战版)
- 2.3.3、进入mysql实例容器中
- 2.3.4、连接mysql
- 2.3.5、MYSQL容器里面插入数据会存在中文乱码的问题
- 2.3.6、解决中文乱码
- 2.4、安装Redis
一、Docker容器数据卷
通过数据卷可以实现数据的持久化
问题1:Docker挂载主机目录访问会出现cannot open directory :Permission denied
解决办法: 在挂载的目录后面多加一个 --privileged=true 参数即可(扩大容器的权限解决挂载目录没有权限的问题),即使用该参数后,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限
1.1、数据卷是什么
数据卷是目录或文件 ,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过联合文件系统UnionFS提供一些用于持续存储或共享数据的特性。
即将docker容器里面的数据保存进宿主机的磁盘当中。
运行一个带数据卷的容器实例
powershell
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
1.2、数据卷能够干什么
数据卷设计的目的是备份 + 数据的持久化,完全独立于容器的生命周期,因此docker不会在容器删除时删除其挂载的数据卷
容器卷的特性:
- 容器卷可在容器之间共享或重用数据
- 卷重的更改可以直接实时生效
- 数据卷的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
1.3、数据卷案例
1.3.1、宿主机Vs容器之间添加容器卷
命令:
powershell
# 如果宿主机没有host_data文件夹,默认会自动创建(在有权限的前提下)
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu

宿主机和容器之间数据共享
- docker 修改、主机同步获得
- 主机修改,docker 同步获得
- docker 容器stop、主机修改,docker 容器重启之后数据也是同步获取

查看数据卷是否挂载成功:
powershell
doccker inspect 容器ID/容器名
容器里面的挂载信息
json
"Mounts": [
{
"Type": "bind", // 宿主机的挂载目录
"Source": "/tmp/host_data", // 容器内部的挂载目录
"Destination": "/tmp/docker_data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
1.3.2、读写规则映射添加说明
- 可读可写(默认)
容器和宿主机都是可读可写的
shell
# 这两条命令等价,rw是默认值(可读可写)
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data:rw --name=u1 ubuntu
- 只读(修改修改规则)
shell
# ro代表read only
docker run -it --privileged=true -v /mydocker/u:/tmp/u:ro --name=u2 ubuntu
容器实例内部被限制,只能读取不能写
此时,如果宿主机写入内容,可以同步给容器内,容器可以读取


1.3.3、卷的继承和共享
- 容器1完成和宿主机的映射
shell
docker run -it --privileged=true -v /mydocker/u:/tmp/u --name=u1 ubuntu /bin/bash

- 容器2继承容器1的卷规则
--volumes-from 相当于extends继承其它容器的规则
shell
# 容器 u2 继承 u1 的所有规则
docker run -it --privileged=true --volumes-from u1 --name=u2 ubuntu /bin/bash

那么如果容器u1停了之后,结果会怎么样呢?(相当于子类没有了父类)
不会影响容器u2的所有功能(相当于,一个主机上面挂了两个硬盘,谁死都无所谓)

二、Docker 常规安装简介
2.1、总体步骤
2.1.1、 搜索镜像
shell
docker search 镜像名/镜像ID'
2.1.2、 拉取镜像
shell
docker pull 镜像名/镜像ID
2.1.3、 查看镜像
shell
docker iamges
2.1.4、启动镜像 -- 服务端口映射
shell
docker run -d --name mytomcat -p 8080:8080 tomcat:latest
2.1.5、停止镜像
shell
docker stop 镜像名/镜像ID
2.1.6、 删除镜像
shell
docker rmi -f 镜像名/镜像ID
2.2、安装Tomcat
2.2.1、 docker hub上面查找tomcat镜像
2.2.2、从docker hub上拉取tomcat镜像到本地
shell
docker pull tomcat
2.2.4、docker images查看是否有拉取到的tomcat
shell
docker images
2.2.5、使用tomcat镜像创建容器实例(运行镜像)
shell
docker run -d --name mytomcat -p 8080:8080 --name tomcat1 tomcat:latest
2.2.6、访问tomcat首页
ip+端口号进行访问
出现这种情况的原因由两个:
(a)可能没有映射端口或者没有关闭防火墙。
shell
# 检查防火墙状态
systemctl status firewalld
# 临时关闭防火墙
systemctl stop firewalld
# 永久性的关闭防火墙
systemctl disable firewalld
(b)把webapps.dist目录换成webapps(进入容器排查)
shell
# 进入到tomcat容器当中
docker exec -it tomcatID /bin/bash
ls -l # 查看tomcat的目录结构
rm -f webapps # 删除webapps这个目录
mv webapps.dist webapps

2.2.7. 免修改版说明
实际上,使用的时候一般不用最新版的tomcat,在旧版本的tomcat中就不存在上面问题
shell
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat-jdk8
2.3、安装Mysql
2.3.1、 拉取mysql5.7镜像
shell
docker pull mysql:5.7
2.3.2、运行mysql镜像实例(实战版)
shell
# 1、简单版
# 运行前先查一下3306端口是否被占用
ps -ef|grep mysql
# MYSQL_ROOT_PASSWORD:mysql设置的密码
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
# 2、实战版(数据持久化)
docker run -d -p 3306:3306 --privileged=true
-v /radan/mysql/log:/var/log/mysql # 日志信息持久化
-v /radan/mysql/data:/var/lib/mysql # 数据信息持久化
-v /radan/mysql/conf:/etc/mysql/conf.d # 配置信息持久化
-e MYSQL_ROO_PASSWORD=123456 # 给mysql实例容器配置密码
--name mysql # 给容器实例起一个新的名字mysql
mysql:5.7 # 镜像名称+tag
2.3.3、进入mysql实例容器中
shell
docker exec -it 容器ID/容器名 /bin/bash
2.3.4、连接mysql
shell
mysql -uroot -p
# 接着输入密码
2.3.5、MYSQL容器里面插入数据会存在中文乱码的问题
查看数据库的字符编码
sql
show VARIABLES LIKE 'character%'
在docker容器中的mysql默认编码是拉丁文
在windows中mysql连接工具中的mysql默认编码是utf-8(会自动转为utf-8)
2.3.6、解决中文乱码
在/radan/mysql/conf目录下新建my.cnf(添加编码设置)

重新启动mysql实例容器
shell
docker run -d -p 3306:3306 --privileged=true
-v /radan/mysql/log:/var/log/mysql # 日志信息持久化
-v /radan/mysql/data:/var/lib/mysql # 数据信息持久化
-v /radan/mysql/conf:/etc/mysql/conf.d # 配置信息持久化
-e MYSQL_ROO_PASSWORD=123456 # 给mysql实例容器配置密码
--name mysql # 给容器实例起一个新的名字mysql
mysql:5.7 # 镜像名称+tag
注意:误删除mysql实例容器的时候,在我们已使用数据卷的时候,直接使用第一次run的命令可以恢复到原本的mysql实例容器状态
注意:docker安装完Mysql并run出容器后,建议先修改完字符集编码后再新建mysql(库-表-插数据)
2.4、安装Redis
2.4.1、拉取redis镜像
shell
docker pull redis:6.0.8
2.4.2、启动redis实例(添加容器数据卷)
提醒:容器卷记得加入 --privileged=true
- 在centos主机下新建/app/redis文件夹
shell
mkdir -p /app/redis
- 将一个redis.conf文件模版拷贝进/app/redis目录下
- 修改redis.conf文件
开启redis验证(可选):requirepass 123
允许redis外地连接,必须注释掉 #bind 127.0.0.1
将daemonize yes 注释掉或者设置为 daemonize no设置(原因:该配置会和docker run 里面的 -d 参数冲突,会导致容器一直启动失败)
开启redis持久化 appendonly yes 可选
关闭保护模式 protected-mode no
创建redis实例容器
shell
docker run -p 3306:3306 --name myredis --privileged=true
-v /app/redis/redis.conf:/etc/redis/redis.conf # 通过宿主机可以控制redis内部的配置
-v /app/redis/data:/data # 备份数据
-d redis:6.0.8 # 镜像
redis-server /etc/redis/redis.conf # 让redis服务器读取配置文件
# 完整命令
docker run -d -p 6379:6379 --name myredis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data redis:6.0.8 redis-server /etc/redis/redis.conf
2.4.3、进入容器并进入redis客户端
shell
# 进入redis实例容器
docker exec -it 容器ID /bin/bash
# redis客户端
redis-cli

