Docker容器:数据管理与镜像的创建(主要基于Dockerfile)

目录

一、Docker 数据管理

1、数据卷(Data Volumes)

2、数据卷容器(DataVolumes Containers)

二、容器互联(使用centos镜像)

三、Docker 镜像的创建

1、基于现有镜像创建

2、基于本地模板创建

3、基于Dockerfile 创建

3.1 联合文件系统(UnionFS)

3.2 docker镜像的分层(基于AUFS构建)

3.2.1 镜像的分层

3.2.2 涉及技术

3.3 镜像加载原理

3.3 为什么 Docker 里的centos的大小才200M

3.4 认识 Dockerfile

3.5 Dockerfile 结构

3.6 Docker 镜像结构的分层

3.7 Dockerfile 操作常用的指令

四、Dockerfile 镜像实战

1、构建 SSH 镜像

1.1 建立工作目录

1.2 创建 sshd Dockerfile 文件

1.3 生成镜像

1.4 启动容器并修改root密码

2、构建 systemctl 镜像

2.1 建立工作目录

2.2 创建 systemctl Dockerfile 文件

2.3 生成镜像

2.4 启动容器,并挂载宿主机目录挂载到容器中,和进行初始化

2.5 进入容器,使用 systemcd 管理服务

3、构建 apache 镜像

3.1 建立工作目录

3.2 创建 nginx Dockerfile 文件

3.3 创建启动容器时执行的脚本

3.4 准备网站页面

3.5 生成镜像

3.6 新镜像运行容器

3.7 浏览器测试页面

4、构建 nginx 镜像

4.1 建立工作目录并上传nginx安装包

4.2 创建 nginx Dockerfile 文件

4.3 创建启动容器时执行的脚本

4.4 生成镜像

4.5 启动容器并开启宿主机端口映射

4.6 浏览器测试页面

5、构建 tomcat 镜像

5.1 建立工作目录并上传所需安装包

5.2 创建 tomcat Dockerfile 文件

5.3 生成镜像

5.4 启动容器并指定宿主机端口映射 tomcat 8080 端口

5.5 浏览器测试访问页面

6、构建 mysql 镜像

6.1 建立工作目录并上传mysql安装包

6.2 创建 mysql Dockerfile 文件

6.3 可选创建启动容器时执行的脚本

6.4 编辑mysql主配置文件

6.5 生成镜像

6.6 启动容器,并进行初始化

6.7 进入容器,授权远程连接 mysql

五、总结

1、数据管理

2、创建镜像

2.1 基于现有镜像创建

2.2 基于本地模版创建

2.3 基于 Dockerfile 创建镜像


一、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等&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值