Docker学习笔记—day007

Docker学习笔记---day007(容器卷和Docker 常规软件安装)

文章目录

一、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、读写规则映射添加说明
  1. 可读可写(默认)

容器和宿主机都是可读可写的

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
  1. 只读(修改修改规则)
shell 复制代码
# ro代表read only
docker run -it --privileged=true -v /mydocker/u:/tmp/u:ro   --name=u2 ubuntu

容器实例内部被限制,只能读取不能写

此时,如果宿主机写入内容,可以同步给容器内,容器可以读取


1.3.3、卷的继承和共享
  1. 容器1完成和宿主机的映射
shell 复制代码
 docker run -it --privileged=true -v /mydocker/u:/tmp/u   --name=u1 ubuntu /bin/bash
  1. 容器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
相关推荐
Rsingstarzengjx2 小时前
PS 笔记1
笔记
㱘郳2 小时前
软考软件设计师笔记
笔记·软件工程
嵌入式学习者。2 小时前
Eplan自学笔记1
笔记
PyAIGCMaster2 小时前
如何编译一个apk,我是新手
深度学习·学习
立志成为大牛的小牛3 小时前
数据结构——四十四、平衡二叉树的删除操作(王道408)
数据结构·学习·程序人生·考研·算法
风123456789~3 小时前
【OceanBase专栏】OceanBase 外部表实验
数据库·笔记·oceanbase
howard20053 小时前
Docker实战 - 将Web项目打成war包部署到tomcat容器里运行
docker·容器化部署web项目
p***c9493 小时前
Docker机器学习实战
机器学习·docker·容器
步达硬件3 小时前
【FPGA】FPGA初学者开发板选择及学习路线
学习·fpga开发