Docker 基础篇之快速上手【二】

1. 镜像原理

1.1 镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件

  • UnionFs 【联合文件系统】
    UnionFs 联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一虚拟文件系统下。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承、基于基础镜像【没有父镜像】,也可以制作各种具体的应用镜像。
    特性:一次同时加载多个文件系统,但从外面来看,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
  • Docker 镜像加载原理
    docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。bootfs(boot file system)主要包括 bootloader 和 kernel,bootloader 主要是引导加载 kernel ,Linux 刚启动时会加载 bootfs 文件系统,在 Docker 镜像的最底层是 bootfs。这一层与我们典型的 Linux/Unix 系统是一样的,包含 boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs。
    rootfs(root file system),在 bootfs 之上。包含的就是典型 Linux 系统中的 /dev,/proc,/bin,/etc等标准目录和文件,rootfs 就是各种不同的操作系统发行版,比如 Ubuntu,CentOS 等等。
  • 分层的镜像
  • 为什么 Docker 镜像要采用这种分层结构呢
    最大的一个好处就是:共享资源
    比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份 base 镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。

1.2 镜像的特点

  • Docker 镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”

1.3 Docker 镜像 commit 操作补充

docker commit 提交容器副本使之称为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[TAG]

1.3.1 Docker 方式启动 tomcat,访问首页出现 404 错误如何解决

  1. 从 hub 上下载 tomcat 镜像到本地并成功运行
docker run -it -p 8888:8080 tomcat
  1. 发现运行过 tomcat 后访问页面发生 404 问题,如何解决
    使用命令 :docker exec it tomcat容器ID /bin/bash 进入 tomcat 的目录
    【tomcat 默认的欢迎页面实际上是放在 webapps/ROOT/index.jsp这里面】然后我们进入其中发现 webapps目录是空的,这里的文件都放了一个叫 webapps.dist 目录中,估计是因为 tomcat 新版本升级的原因。这样如何解决问题,我们可以将 webapps.dist文件夹名称改成 webapps 就能解决这个问题。【当然这只是暂时性的解决了这个问题,如果在启动一个新的 tomcat 还会存在这样的问题,我们需要从根处解决】

    在这里插入图片描述
    在这里插入图片描述
  2. 将我们修改过的 tomcat 镜像映射成本地镜像【可解决根本问题】
    使用 docker commit 命令来将修改后的容器生成新的镜像
docker commit -a="bjb" -m="new tomcat" d8b1bc9c527a atguigu/tomcat:1.2

在这里插入图片描述
这次我们启动新的 tomcat 测试以下结果是否正确
在这里插入图片描述
最后也是能成功访问 tomcat,也是从根本上解决了这个问题
在这里插入图片描述

1.3.2 以守护进程方式启动 Tomcat

docker run -d -p 8080:8080 atguigu/tomcat:1.2

2. Docker 容器数据卷

  • 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
  • 容器之间希望有可能共享数据

Docker 容器产生的数据,如果不通过 docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能够保存数据再 docker 中我们使用卷。

2.1 是什么

一句话:类似于Redis中的 rdb 和 aof 文件

2.2 能干吗

  • 容器的持久化
  • 容器间继承+共享数据

特点:

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

2.3 数据卷

2.3.1 容器内添加

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
  1. 查看数据卷是否挂载成功
// 首先查看正在运行的 centos 实例
docker inspect centos

看到其中具有这两个就代表挂载成功过了
在这里插入图片描述

  1. 容器和宿主机之间数据共享
    在这里插入图片描述
    在这里插入图片描述
    最后我们发现容器和宿主机之间可以达到数据共享
  2. 容器停止退出后,主机修改后数据是否同步
    可以达到同步操作
  3. 命令(带权限)
    此命令作用也是建立起宿主机和容器文件共享,但只具备读操作
docker run -it -v /宿主机绝对路径目录:/容器内目录:or 镜像名

2.3.2 DockerFile 添加

  1. 根目录下新建 mydocker 文件夹进入其中
// 进入根目录
cd /
// 新建文件夹并进入其中
mkdir mydocker
cd mydocker
  1. 可在 Dockerfile 中使用 VOLUME 指令来给镜像添加一个或多个数据卷
vim Dockerfile
// 添加内容
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,------- success1"
CMD /bin/bash
  1. File 构建【.不能缺少】
docker build -f /mydocker/Dockerfile -t centos02 .
  1. build 后生成镜像
    在这里插入图片描述

  2. run 容器
    运行刚才构建的centos02镜像

docker run -it centos02
  1. 通过上述步骤,容器内的卷目录地址已经知道对应的主机目录地址哪?
    容器内的卷目录地址如下:
    在这里插入图片描述
    对应的主机地址如下:
// 首先查询正在运行的 docker 镜像
docker ps
// 找到我们刚刚运行的 centos,并查看详细信息
docker inspect centosID号

看到如下结果图:
在这里插入图片描述

主机对应默认地址
在这里插入图片描述

2.3.3 备注

Docker 挂载主机目录Docker 访问出现 cannot open directory :Permission decied
解决办法:在挂载目录后面多加一个 --pricileged=true参数即可

2.4 数据卷容器

2.4.1 是什么

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

2.4.2 容器间传递共享【volumes-from】

  1. 先启动一个父容器 dc01【再 dataVolumeContainer2新增内容】
// 启动一个父容器
docker run -it --name dc01 centos02
// 进入 dataVolumeContainer2 目录中去
cd dataVolumeContainer2
// 新增一个文本文件
touch dc01_add.txt
  1. dc02/dc03 继承自 dc01
// dc02 继承自 dc01
docker run -it --name dc02 --volumes-from dc01 centos
// dc03 继承自 dc01
docker run -it --name dc03 --volumes-from dc01 centos

在这里插入图片描述
在这里插入图片描述

  1. 回到 dc01 可以看到 02/03 各自添加的都能共享了

在这里插入图片描述

  1. 删除 dc01,dc02修改后dc03可否访问
    在这里插入图片描述
  2. 删除 dc02后dc03可否访问【测试后可以访问】
  3. 新建 dc04 继承 dc03 后再删除 dc03【同上】
    结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

3. Docker 安装常用软件

3.1 总体步骤

  • 搜索镜像
  • 拉取镜像
  • 查看镜像
  • 启动镜像
  • 停止容器
  • 移除容器

3.2 安装 tomcat

1. docker hub 上面查询 tomcat 镜像

docker search tomcat

2. 从 docker hub 上拉取 tomcat 镜像到本地

docker pull tomcat

3. docker images 查看是否由拉取到 tomcat

docker images

4. 使用 tomcat 镜像创建容器(也称作运行镜像)

-p 主机端口:docker 容器端口
-P:随机分配端口
i:交互
t:终端

docker run -it -p 8080:8080 tomcat

3.3 安装 mysql

1.docker hub 上面查找 mysql 镜像

在这里插入图片描述

2. 从 docker hub 上拉取mysql镜像到本地【标签为5.6】

在这里插入图片描述

3. 使用 mysql5.6 镜像创建容器(也叫运行镜像)

3.1 使用 mysql 镜像
docker run -p 3306:3306 --name mysql 
-v /opt/mysql/conf:/etc/mysql/conf.d 
-v /opt/mysql/logs:/logs 
-v /opt/mysql/data:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=123456 
-d mysql:5.6

命令说明:【提示:命令中不存在的路径均可以自动创建,不需要手动添加】

  • -p 3306:3306 :将主机的 3306 端口映射到 docker 容器的 3306 端口
  • –name mysql:运行服务名字
  • -v /opt/mysql/conf:/etc/mysql/conf.d :将主机 /opt/mysql 目录下的 conf.my.cnf 挂载到容器的 /etc/mysql/conf.d 中去。
  • -v /opt/mysql/logs:/logs:将主机 /opt/mysql/目录下的 logs 目录挂载到容器的 /logs 中去。
  • -v /opt/mysql/data:/var/lib/mysql :将主机 /opt/mysql/ 目录下的 data 目录挂载到容器的 /var/lib/mysql 中去
  • -e MYSQL_ROOT_PASSWORD=123456 :初始化 root 用户的密码。
  • -d mysql:5.6 :后台运行 mysql5.6
3.2 如何操作 mysql

【如何进入 mysql 中进行操作呢?】
【1. 首先进入到 mysql 容器中去】

// 进入到正在运行的 mysql 容器中去
docker exec -it 正在运行的容器ID /bin/bash
// mysql 的登入命令不多说
mysql -uroot -p 
回车后输入密码 123456 即可登陆成功

【2. 通过命令登陆到 mysql 即可】
在这里插入图片描述
【3. 剩下的就是对数据库的操作了】
在这里插入图片描述

4. 外部 windows 来测试连接在 docker 上的 mysql 服务

  1. 首先查看自己的虚拟机地址什么
ifconfig
  1. 然后通过 navcat 连接即可
    在这里插入图片描述
  2. 我们对其进行操作
    在这里插入图片描述
  3. 再回到 docker 中去查询发现数据同步到位了
    在这里插入图片描述

5. 数据备份小测试

docker exec 正在运行的mysql ID sh -c 'exec mysqldump --all-databases -uroot -p"123456"'  > /opt/all-databases.sql

在这里插入图片描述

3.4 安装 redis

1. 拉取 redis

// 拉取最新 redis 版本
docker pull redis
// 拉取固定版本 redis【标签名同等与版本号】
docker pull redis:标签名

2. 运行 redis 镜像

docker run -p 6379:6379 -v /opt/myredis/data:/data -v /opt/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf -- appendonly yes

3. 测试 redis-cli 连接上来

docker exec -it 运行的Redis服务的容器ID redis-cli

在这里插入图片描述

4. 测试持久化文件生成

在这里插入图片描述

发布了72 篇原创文章 · 获赞 398 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43647359/article/details/105624225