1. docker概述

Docker概述

1.1 基本介绍

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

Docker是一种容器化技术的落地。容器作为一类操作系统层面的虚拟化技术,其目标是在单一Linux主机交付多套隔离性环境,容器共享同一套主机操作系统内核。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。官网:https://docs.docker.com/

1.2 应用场景

Web 应用的自动化打包和发布。

自动化测试和持续集成、发布。

在服务型环境中部署和调整数据库或其他的后台应用。

1.3 Docker 的优势

Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。

1、快速,一致地交付您的应用程序。Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。

容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:

您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。

2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。

Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。

3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。

2. 虚拟化技术和容器化技术

虚拟化技术特点:1.资源占用多 2.冗余步骤多 3.启动很慢

容器化技术:容器化技术不是模拟的一个完整的操作系统

2.1比较Docker和虚拟机的不同:

2.2. 传统虚拟机,虚拟出硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。

2.3. Docker容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件。

2.4. 每个容器都是相互隔离的,每个容器都有属于自己的文件系统,互不影响。

容器化带来的好处在这里插入图片描述

2.5 docker为什么比vm快

1.Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。

2.Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。
在这里插入图片描述

3. Docker的基本组成

Docker的基本组成图如下:

在这里插入图片描述说明:
Docker 包括三个基本概念:
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

4. Docker的安装

查看系统的内核:

uname -r

系统内核版本为3.10.0

[root@iZwz99sm8v95sckz8bd2c4Z ~]# uname -r
3.10.0-957.21.3.el7.x86_64

4.1查看系统配置

cat /etc/os-release

[root@iZwz99sm8v95sckz8bd2c4Z ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
VERSION=7<<--------代表是centos7版本
注意安装docker必须满足centos7以上版本否则无法安装

Docker的安装步骤:

4.2卸载旧的版本

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

4.3下载需要的安装包

yum install -y yum-utils

(3.1)设置阿里云镜像的仓库(可以根据需求选择镜像产库)

  1. 第一种方法

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker- ce.repo**

  1. 第二种方法

    wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo (下载仓库配置文件)
    放到/etc/yum.repos.d

4.4 更新yum软件包缓存

注释:将软件包信息提前在本地索引缓存 用来提高搜索安装软件的速度,建议执行这个命令可以提升yum安装的速度
yum makecache fast

4.5 安装docker相关的配置

docker-ce 是社区版,docker-ee 企业版

 yum install docker-ce docker-ce-cli containerd.io

三个包的含义:
containerd.io                    docker镜像文件
docker-ce                        守护进程(可以理解为docker服务)
docker-ce-cli                   客户端(可以理解为控制服务)
出现了completed即安装成功。

4.6启动Docker

systemctl start docker

查看当前版本号,是否启动成功

docker version
结果如下图:
在这里插入图片描述

设置开机自启动

systemctl enable docker;

=================================================================
下载hello-world镜像进行测试一下;
docker pull 镜像名称         (拉取镜像)
docker images                     (查看本机拥有的镜像)
在这里插入图片描述

5. docker卸载

5.1 卸载依赖

yum remove docker-ce docker-ce-cli containerd.io

5.2 删除资源

rm -rf /var/lib/docker                            /var/lib/docker是docker的默认工作路径

6. 配置阿里云镜像加速(非必选)(免费)

(1)进入阿里云官网(https://www.aliyun.com/?spm=5176.12818093.top-nav.dlogo.2c9516d0JovgfA),搜索容器镜像服务
注释:每个人的加速地址不一样,Docker镜像默认的下载地址为国外官网,国内下载太慢,为了解决这个问题,国内出现了阿里云,网易云等的镜像加速器
在这里插入图片描述
(2)依次执行官方的这四条命令即可

 sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

7. Docker容器运行流程

在这里插入图片描述

8. 底层原理

在这里插入图片描述

9. docker常用命令

9.1基础命令

docker version                 #查看docker的版本信息
docker info                    #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help              #帮助命令(可查看可选的参数)

9.2镜像命令

[root@lmj ~]# docker images

REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   11 months ago   13.3kB

解释:
1.REPOSITORY 镜像的仓库源

2.TAG 镜像的标签

3.IMAGE ID 镜像的id

4.CREATED 镜像的创建时间

5.SIZE 镜像的大小

可选参数

-a/–all 列出所有镜像

[root@lmj ~]# docker images -a
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   7 months ago   13.3kB
centos        latest    5d0da3dc9764   7 months ago   231MB

-q/–quiet 只显示镜像的id

[root@lmj ~]# docker images -q
feb5d9fea6a5
5d0da3dc9764

9.3.docker search 搜索镜像

[root@lmj ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10308     [OK]
mariadb                           MariaDB is a community-developed fork of MyS…   3819      [OK]
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   754                  [OK]
percona                           Percona Server is a fork of the MySQL relati…   517       [OK]
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   86
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   79
centurylink/mysql                 Image containing mysql. Optimized to be link…   60                   [OK]

#可选参数

Search the Docker Hub for images

Options:
-f, --filter filter          基于给定条件过滤输出
–format string          使用模板格式化显示输出
–limit int                   最大搜索结果数
–no-trunc                   禁止截断输出
–stars :                  文收藏数不小于指定值的镜像

#搜索收藏数大于3000的镜像

[root@lmj ~]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   10308     [OK]
mariadb   MariaDB is a community-developed fordockerk of MyS…   3819      [OK]

9.4 删除镜像

#1.删除指定的镜像id
[root@lmj ~]# docker rmi -f  镜像id
#2.删除多个镜像id
[root@lmj ~]# docker rmi -f  镜像id 镜像id 镜像id
#3.删除全部的镜像id
[root@lmj ~]# docker rmi -f  $(docker images -aq)

9.5 下载一个mysql镜像(案例)

[root@lmj ~]# docker pull mysql
Using default tag: latest            #如果不写tag默认就是latest(最新)
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete          #分层下载,docker image的核心-联合文件系统
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
6aa3859c4789: Pull complete
1ed875d851ef: Pull complete
Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  #下载来源的真实地址  #docker pull mysql等价于docker pull docker.io/library/mysql:latest

指定版本下载

#注释Already exists代表已经存在,docker分层下载核心精髓
[root@lmj ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
6ec7b7d162b2: Already exists   
fedd960d3481: Already exists
7ab947313861: Already exists
64f92f19e638: Already exists
3e80b17bff96: Already exists
014e976799f9: Already exists
59ae84fee1b3: Already exists
7d1da2a18e2e: Pull complete
301a28b700b9: Pull complete
529dc8dbeaf3: Pull complete
bc9d021dc13f: Pull complete
Digest: sha256:c3a567d3e3ad8b05dfce401ed08f0f6bf3f3b64cc17694979d5f2e5d78e10173
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

9.6 容器命令

首先拉取一个centos镜像

docker pull centos

运行容器的命令说明:

docker run [可选参数] image

#参数说明
--name="名字"           指定容器名字
-d                     后台方式运行
-it                    使用交互方式运行,进入容器查看内容
-p                     指定容器的端口
(
-p ip:主机端口:容器端口  配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口
)
-P                     随机指定端口(大写的P)

运行并进入容器centos

[root@lmj ~]# docker run --name="vm" -it centos  /bin/bash
[root@45a00a9c40b1 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@45a00a9c40b1 /]#

退出容器命令:

#exit 停止并退出容器(后台方式运行则仅退出)
#Ctrl+P+Q  不停止容器退出
[root@bd1b8900c547 /]# exit
exit
[root@lmj ~]#

列出运行过的容器命令:

#docker ps 
      # 列出当前正在运行的容器
      # 列出所有容器的运行记录  -a 
      # 显示最近创建的n个容器   -n=? 
      # 只显示容器的编号        -q  

[root@CENTOS7 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
1680b9779cd0   centos    "/bin/bash"   3 seconds ago   Up 2 seconds             vm
[root@CENTOS7 ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND       CREATED          STATUS         PORTS     NAMES
60962608650a   hello-world   "bash"        5 minutes ago    Up 5 minutes            musing_nobel
1680b9779cd0   centos        "/bin/bash"   7 minutes ago    Up 7 minutes             vm

删除容器命令:

docker rm 容器id                 #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq)   #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器

启动和停止容器命令:

docker start 容器id          #启动容器
docker restart 容器id        #重启容器
docker stop 容器id           #停止当前运行的容器
docker kill 容器id           #强制停止当前容器

9.7 其他常用命令

9.7.1 日志的查看


-f : 跟踪日志输出

-t : 显示时间戳

--since :显示某个开始时间的所有日志

--tail :仅列出最新N条容器日志

常用:
docker logs -tf 容器id
docker logs --tail number 容器id #num为要显示的日志条数


#docker容器后台运行,必须要有一个前台的进程,否则会自动停止
#编写shell脚本循环执行,使得centos容器保持运行状态
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -d centos /bin/sh -c "while true;do echo hi;sleep 5;done"
c703b5b1911ff84d584390263a35707b6024816e1f46542b61918a6327a570dc
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
c703b5b1911f   centos    "/bin/sh -c 'while t…"   13 seconds ago   Up 10 seconds             pedantic_banach
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker logs -tf --tail 10 c703b5b1911f
2020-12-27T03:34:07.255599560Z hi
2020-12-27T03:34:12.257641517Z hi
2020-12-27T03:34:17.259706294Z hi
2020-12-27T03:34:22.261693707Z hi
2020-12-27T03:34:27.262609289Z hi
2020-12-27T03:34:32.267862677Z hi
2020-12-27T03:34:37.270382873Z hi
2020-12-27T03:34:42.272414182Z hi
2020-12-27T03:34:47.274823243Z hi
2020-12-27T03:34:52.277419274Z hi

9.7.2 查看容器中进程信息

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker top c703b5b1911f    (容器id)
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                11156               11135               0                   11:31               ?                   00:00:00            /bin/sh -c while true;do echo hi;sleep 5;done
root                11886               11156               0                   11:43               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5

9.7.3 查看容器的元数据

[root@lmj ~]# docker inspect 容器id

9.7.4 进入当前正在运行的容器

因为通常我们的容器都是使用后台方式来运行的,有时需要进入容器修改配置
方式一:

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it 容器id /bin/bash
[root@c703b5b1911f /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@c703b5b1911f /]# ps -ef      
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 03:31 ?        00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done
root       279     0  0 03:54 pts/0    00:00:00 /bin/bash
root       315     1  0 03:56 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5
root       316   279  0 03:56 pts/0    00:00:00 ps -ef

方式二

[root@lmj ~]# docker attach c703b5b1911f

docker exec 进入容器后开启一个新的终端,可以在里面操作

docker attach 进入容器正在执行的终端,不会启动新的进程

9.7.5 拷贝文件

拷贝操作的命令如下:

#拷贝容器的文件到主机中
docker cp 容器id:容器内路径  目的主机路径

#拷贝宿主机的文件到容器中
docker cp 目的主机路径 容器id:容器内路径
#拷贝docker容器里的文件到宿主机/home下
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker cp c703b5b1911f:/home/test.java /home
[root@iZwz99sm8v95sckz8bd2c4Z ~]# ls /home
hai  pan  test.java

命令小节的图解如下:
在这里插入图片描述

10. 部署案例

部署案例

11. 可视化管理工具Portainer (不常用)

一、Portainer介绍
Docker的可视化管理工具有DockerUI、Shipyard、Rancher、Portainer等,具体的功能差异请查看Docker的可视化管理工具对比,本文使用Portainer工具对Docker环境进行管理。

Portainer是一个轻量级的docker环境管理UI,可以用来管理docker宿主机和docker swarm集群。

Portainer主要功能:

1.提供状态显示面板:显示主机或者swarm集群上有多少镜像,容器、网络、数据卷等;

2.应用模板快速部署:可以使用预存的模板或者自己定制的模板快速部署;

3.镜像网络数据卷管理:通过页面进行管理和操作,例如构建镜像,增删数据卷等;

4.事件日志显示:对任何操作有记录,并且有页面可以显示审计日志;

5.容器控制台操作:查看容器,启停容器,查看容器占用的性能(内存,cpu等)

6.Swarm集群管理:可以管理swarm集群,是最大的优点;

7.登录用户管理:有完备的用户系统,权限控制(高级功能需付费);

页面功能如下图:
在这里插入图片描述

11.1 安装Portainer并且管理单台Docker主机

1.安装Portainer

#注释 -v /var/run/docker.sock:/var/run/docker.sock:挂载本地 /var/run/docker.socker与容器的/var/run/docker.socker连接
#注释 -v portainer_data:/data:数据持久化
#注释 --privileged=true 添加访问权限
docker run -d -p 9000:9000 --name portainer --privileged=true  -v /var/run/docker.sock:/var/run/docker.sock -v  portainer_data:/data portainer/portainer 

2.打开自己映射的端口,以上面创建的为例9000,网页输出 IP地址:端口 到达创建管理用户界面
在这里插入图片描述
3.选择管理模式,由于这里是单台Docker主机,我们选择Local 本机即可
在这里插入图片描述
4.进入管理界面,目前常用的操作到这就结束了
在这里插入图片描述

12. Docker镜像详解

12.1 什么是镜像

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

12.2 Docker镜像加载原理

  1. docker的镜像实际上由一层一层的文件系统组成,这种层级文件系统就是上述的UnionFS。接着,在内部又分为2部分:

  2. bootfs(boot file system):docker镜像的最底层是bootfs,主要包含bootloader(加载器)和kernel(内核)。bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统。这一层与典型的linux/Unix系统一样,包含bootloader和kernel。

  3. 当boot加载完成后,整个内核就在内存中了,此时内存的使用权已由bootfs转交给了内核,此时系统也会卸载bootfs。
    这里的加载,可以理解为,我们windows电脑开机时候,从黑屏到进入操作系统的过程。

  4. rootfs(root file system):在bootfs之上,包含的就是典型linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。
    rootfs就是各种不同的操作系统发行版,比如Ubuntu、Centos等等。

12.3 分层原理

额可以下载一个镜像,观察下载日志输出,可以看到是一层一层下载的!
[root@CENTOS7 ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Already exists
c7a4e4382001: Pull complete
4044b9ba67c9: Pull complete
c8388a79482f: Pull complete
413c8bb60be2: Pull complete
1abfd3011519: Pull complete
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

思考:docker镜像为什么要采用分层架构
最大的好处,资源共享,复用!多个镜像从相同的bash镜像构建而来,那么宿主机只需在磁盘保留一份bash镜像,同时内存中也只需要加载一份bash镜像,这样就可以为所有容器服务了,而且镜像的每一层都是可以倍共享的

查看镜像分层方式可以通过docker image inspect 镜像名:版本,往下滑找到Layers关键词代表分层信息:

Layers": [
                "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
                "sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb",
                "sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1",
                "sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372",
                "sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed",
                "sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952"

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层
举一个简单的例子,假如基于Ubuntu Linux16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包.就会在基础镜像层之上创建第二个镜像层如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。
在这里插入图片描述

在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
在这里插入图片描述
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。

Linux上可用的存储引擎有AUFS、Overlav2、Device MapperBtrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的
文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows上仅支持windowsfilter一种存储引警,该引警基于NTES文件系统之上实现了分层和CoW11
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

特点

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!
在这里插入图片描述

13. 提交镜像

使用docker commit 命令提交容器成为一个新的版本,在原有的镜像做一些操作,然后commit 提交成一个新的镜像包

docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名:[TAG]

下面做一个案例:由于默认的Tomcat镜像的webapps文件夹中没有任何内容,需要从webapps.dist中拷贝文件到webapps文件夹。下面自行制作镜像:就是从webapps.dist中拷贝文件到webapps文件夹下,并提交该镜像作为一个新的镜像。使得该镜像默认的webapps文件夹下就有文件。具体步骤如下:

1.复制文件夹

[root@lmj~]# docker run -it tomcat /bin/bash
root@2a3bf3eaa2e4:/usr/local/tomcat# cd webapps
root@2a3bf3eaa2e4:/usr/local/tomcat/webapps# ls
root@2a3bf3eaa2e4:/usr/local/tomcat/webapps# cd ../
root@2a3bf3eaa2e4:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@2a3bf3eaa2e4:/usr/local/tomcat# cd webapps
root@2a3bf3eaa2e4:/usr/local/tomcat/webapps# ls
"ROOT  docs  examples  host-manager  manager"
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED         STATUS         PORTS                    NAMES
2a3bf3eaa2e4   tomcat                "/bin/bash"    4 minutes ago   Up 4 minutes   8080/tcp                 competent_torvalds

2.提交镜像作为一个新的镜像

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker commit -m="add webapps" -a="lmj" 2a3bf3eaa2e4 mytomcat:3.0
sha256:f189aac861de51087af5bc88a5f1de02d9574e7ee2d163c647dd7503a2d3982b
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
mytomcat              3.0       f189aac861de   7 seconds ago   653MB
mysql                 5.7       f07dfa83b528   6 days ago      448MB
tomcat                latest    feba8d001e3f   10 days ago     649MB
nginx                 latest    ae2feff98a0c   12 days ago     133MB
centos                latest    300e315adb2f   2 weeks ago     209MB
portainer/portainer   latest    62771b0b9b09   5 months ago    79.1MB
elasticsearch         7.6.2     f29a1ee41030   9 months ago    791MB

3.运行容器

[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it mytomcat:3.0 /bin/bash
root@1645774d4605:/usr/local/tomcat# cd webapps
root@1645774d4605:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
wz99sm8v95sckz8bd2c4Z ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
mytomcat              1.0       f189aac861de   7 seconds ago   653MB
mysql                 5.7       f07dfa83b528   6 days ago      448MB
tomcat                latest    feba8d001e3f   10 days ago     649MB
nginx                 latest    ae2feff98a0c   12 days ago     133MB
centos                latest    300e315adb2f   2 weeks ago     209MB
portainer/portainer   latest    62771b0b9b09   5 months ago    79.1MB
elasticsearch         7.6.2     f29a1ee41030   9 months ago    791MB

14. 容器卷使用(挂载)

41.1 容器数据卷

什么是容器数据卷?

docker的理念回顾
将应用和环境打包成一个镜像!

数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!
需求:数据可以持久化 ,     也就是是容器删了 数据还在数据可以存体在本地!

容器之间可以有一个数据共点的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!日录的挂载,将我们容器内的目录,挂载到LInux上面!
在这里插入图片描述
总结一句话:数据持久化和数据同步!容器之间也可以数据共享!

14.2 使用数据卷

方式一: 可以使用 -v 来进行挂载 前面是宿主机路径后面是docker路径

[root@CENTOS7 ~]# docker run  -itd -p 8447:8080 -v /home/ceshi:/home  tomca1:2.0
f59be4c7959d741ac4ce835641036accbafb6b687a2287ede97444c6b56e6d11

下面进行测试:
1. 在touact容器创建一个文本

[root@CENTOS7 ceshi]# docker ps
CONTAINER ID   IMAGE                 COMMAND             CREATED         STATUS         PORTS                                       NAMES
f59be4c7959d   tomca1:2.0            "catalina.sh run"   3 minutes ago   Up 3 minutes   0.0.0.0:8447->8080/tcp, :::8447->8080/tcp   hopeful_murdock
[root@CENTOS7 ceshi]# docker exec -it f59be4c7959d bash
root@f59be4c7959d:/usr/local/tomcat# cd /home/
root@f59be4c7959d:/home# ls
root@f59be4c7959d:/home# touch 20220425.text

2. 查看挂载信息,通过docker inspect 容器id 然后找到关键字Mounts

 [root@CENTOS7 ceshi]# docker inspect f59be4c7959d
 "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/ceshi",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }

3.退出容器查看宿主机挂载的目录, 可以看到文件已经同步过来,相反宿主机在目录添加或者修改内容也会同步到容器

root@f59be4c7959d:/home# exit
exit
[root@CENTOS7 home]# cd /home/ceshi/
[root@CENTOS7 ceshi]# ls
20220425.text

扩展
通过 rw ro 来改变读写权限
一旦设置权限,容器对我们挂载出来的东西就有限定了
docker run -itd -p 8447:8080 -v /home/ceshi:/home:ro tomca1:2.0
docker run -itd -p 8447:8080 -v /home/ceshi:/home:rw tomca1:2.0
ro只要看到这个参数就说明只能通过宿主机来操作,容器内部无法操作

14.3 匿名挂载

挂载格式如下:

docker run -d -v 容器内目录 镜像名 # 匿名挂载

docker volume 可以查看所有卷

docker volume inspect 容器名/容器id 可以针对某个容器进项查看

[root@CENTOS7 ~]# docker run -itd -v /home nginx
219ddc67ae93a583d2fcb9b09ce99aeac4a29a4c6285bf0e1190f16c8e644541
[root@CENTOS7 ~]# docker volume ls             
DRIVER    VOLUME NAME
local     0f56520ce82468a700794c3d9a7dde1414964072d08a6d91223cf70d7ecea338  #这就是创建匿名卷
[root@CENTOS7 ~]# docker volume  inspect nginx    #可以用当前命令查看Mountpoint参数
[
    {
        "CreatedAt": "2022-04-26T06:23:21-04:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginx/_data",  #主机内目录
        "Name": "nginx",
        "Options": null,
        "Scope": "local"
    }
]

14.4 具名挂载(推荐)

docker run -d -v 卷名:容器内目录 镜像名 # 具名挂载

[root@CENTOS7 ~]# docker run -itd  -v redis2022:/home -P redis
b625756e430f8def1986bf203aebb3cb423741631a209e5c4ec67e2978b23f3b
[root@CENTOS7 ~]# docker volume ls
DRIVER    VOLUME NAME
local     redis2022

可以通过docker volume inspect 卷名 命令找到主机内目录

[root@CENTOS7 ~]# docker volume  inspect  nginx
    {
        "CreatedAt": "2022-04-26T06:23:21-04:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginx/_data",
        "Name": "nginx",
        "Options": null,
        "Scope": "local"
    }

14.5容器数据相互同步

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐