目录
2、数据卷容器(DataVolumes Containers)
3.3 为什么 Docker 里的centos的大小才200M
2.2 创建 systemctl Dockerfile 文件
2.4 启动容器,并挂载宿主机目录挂载到容器中,和进行初始化
5.4 启动容器并指定宿主机端口映射 tomcat 8080 端口
一、Docker 数据管理
管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)
1、数据卷(Data Volumes)
- 数据卷是一个供容器使用的特殊目录,位于容器中
- 可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移
- 数据卷的使用类似于 Linux 下对目录进行的 mount 操作
- 数据卷通常适用于挂载服务器的配置文件目录、网页站点目录、日志目录
案例一:创建数据卷
(1)创建新容器并设置数据卷,然后在容器的数据卷目录写入新文件
#宿主机目录/var/www 挂载到容器中的/data1
注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径
docker run -it -v /mnt:/data1 --name web1 centos:7 /bin/bash
#-v 选项可以在容器内创建数据卷
#在容器的数据卷目录里写入新文件,并退出
ls
echo "welcome to my world" > /data1/test
cat /data1/test
exit
(2)查看宿主机的挂载点目录是否有刚创建的新文件
ls /mnt
cat /mnt/test
(3)创建一个新容器并使用web1容器的数据卷挂载点目录,则新容器就有相应的挂载点目录和目录中的所有文件
docker run -it -v /mnt:/data1 --name example centos:7 /bin/bash
ls
cat /data1/test
(4)在本地宿主机上的挂载点目录/mnt下写入新文件
echo "hello world" > /mnt/bak
cat /mnt/bak
(5)开启web1和example容器,并分别进入这两个容器,能查看到在挂载点目录有bak文件(这是在宿主机上写入的新数据文件)
#开启web1容器,能查看到在挂载点目录有bak文件(这是在宿主机上写入的新数据文件)
docker start web1
docker exec -it web1 /bin/bash
cat /data1/bak
exit
#开启example容器,能查看到在挂载点目录有bak文件(这是在宿主机上写入的新数据文件)
docker start example
docker exec -it example /bin/bash
ls /data1/
cat /data1/bak
exit
案例二: 将外部的nginx配置文件迁移到nginx的容器中,并且能访问到nginx容器提供的页面
(1) 上传nginx.conf配置文件并创建nginx01容器,然后将本地的nginx配置文件挂载到容器的nginx配置文件
cd /opt #上传nginx.conf配置文件到宿主机目录
docker run -itd --name nginx01 -p 80:80 -v /opt/nginx.conf:/etc/nginx/nginx.conf nginx /bin/bash
#创建nginx01容器,并将本地的nginx配置文件挂载到容器的nginx配置文件
(2)查看 nginx.conf配置文件指定的网页站点根目录
(3)进入到nginx01容器中,然后创建站点目录和网页文件,最后启动nginx服务
#进入到nginx01容器中
docker exec -it nginx01 /bin/bash
#创建站点目录和网页文件
mkdir /mnt/html
echo " hello world" > /mnt/html/index.html
#启动nginx服务
/usr/sbin/nginx
(4)浏览器访问宿主机IP地址,测试能否查看到网页资源
2、数据卷容器(DataVolumes Containers)
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器
数据卷容器是一个独立的容器,专门用来提供数据卷供其他容器挂载。当你创建一个数据卷容器时,它会在容器的指定目录中创建一个数据卷,其他容器可以通过挂载这个数据卷来访问其中的数据
(1)创建一个容器web2作为数据卷容器
#创建一个容器作为数据卷容器
docker run -it --name web2 -v /mnt -v /opt centos:7 /bin/bash
#在数据卷容器中的数据卷目录中写入新文件
echo "this is hello" > /mnt/abc.txt
echo "this is world" > /opt/ABC.txt
(2) 使用 --volumes-from 来挂载 web2 容器中的数据卷到新的容器
#使用 --volumes-from 来挂载 web2 容器中的数据卷到新的容器
docker run -it --volumes-from web2 --name web3 centos:7 /bin/bash
cat /mnt/abc.txt
cat /opt/ABC.txt
二、容器互联(使用centos镜像)
容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息
(1)创建并运行源容器
#创建并运行源容器取名web4
docker run -itd -P --name web4 centos:7 /bin/bash
(2)创建并运行接收容器取名web5,使用--link选项指定连接容器以实现容器互联
#创建并运行接收容器取名web5,使用--link选项指定连接容器以实现容器互联
docker run -itd -P --name web5 --link web4:web4 centos:7 /bin/bash
#--link 容器名:连接的别名
#web4:web4:第一个web4指容器名称为web4,第二个web4是别名,可自定义
(3)进入接收容器web5,使用ping命令来测试能否联通web4
#进web5容器
docker exec -it web5 bash
#使用ping命令来测试能否联通web4
ping web4
三、Docker 镜像的创建
创建镜像有三种方法,分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建
1、基于现有镜像创建
(1)首先创建并启动一个容器,在容器里新增数据
docker run -it --name test centos:7 /bin/bash
echo "hello world" > 1.txt
exit
docker ps -a
(2)然后将新增数据后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像
docker ps -a | grep test #查看test容器的ID
docker commit -m "new" -a "centos" 6e642a617401 centos:news #创建新镜像
#常用选项:
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行
docker images
(3)创建新容器并使用该镜像
docker run -it --name ke centos:news /bin/bash
ls
cat 1.txt
2、基于本地模板创建
通过导入操作系统模板文件可以生成镜像,模板可以从 OPENVZ 开源项目下载
下载地址为:http://openvz.org/Download/template/precreated
方法一:浏览器下载包并上传至Linux机器
cd /opt #上传debian-7.0-x86-minimal.tar.gz
方法二:直接在Linux机器下载包
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
#导入为镜像
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test
#查看当前所有镜像
docker images
#创建新容器并运行,可使用刚导入的debian镜像
docker run -itd --name deb debian:test /bin/bash
#也可进入并使用该容器
docker exec -it deb /bin/bash
3、基于Dockerfile 创建
3.1 联合文件系统(UnionFS)
- UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
- Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
- 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
- 我们下载的时候看到的一层层的就是联合文件系统
联合文件系统的主要优点包括:
① 节省空间:由于联合文件系统的特性,相同的文件只需在底层文件系统存储一次,因此可以节省存储空间
② 快速构建和部署:通过将不同层的文件系统组合在一起,可以快速构建和部署容器镜像
③ 轻量级:联合文件系统允许容器共享相同的基础镜像层,从而减少了资源消耗
常见的联合文件系统实现包括 OverlayFS、AUFS、btrfs、Devicemapper等。这些技术在不同的操作系统和容器平台中有不同的支持程度,但它们都提供了类似的功能,使得容器技术能够更高效地利用文件系统资源
3.2 docker镜像的分层(基于AUFS构建)
3.2.1 镜像的分层
镜像不是一个单一的文件,而是有多层构成。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker 使用存储驱动管理镜像每层内容及可读写层的容器层
- Dockerfile 中的每个指令都会创建一个新的镜像层
- 镜像层将被缓存和复用
- 当Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应镜像层缓存就会失效
- 某一层的镜像缓存失效,它之后的镜像层缓存都会失效
- 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在 Docker 容器中不可见了
① Kernel(内核层)
是操作系统的核心组件,负责管理硬件资源、提供系统服务,并为应用程序提供运行环境。在Docker场景下,提及 Kernel 通常是指 Docker 宿主机的 Kernel,而不是镜像内部的 Kernel
② Base Image(基础镜像层)
是构建其他 Docker 镜像的基础。它通常是最底层的镜像,包含一个精简的操作系统环境(如Alpine Linux、Ubuntu、CentOS等&#