Linux六 —— Docker

Docker

定义

Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的Linux容器解决方案。

Docker将应用程序与该程序的依赖打包在一个文件夹里。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。

总体来说,Docker的接口就相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享和修改,就好像管理普通的代码一样。

出现的意义

开发和维护两套环境,而环境的配置又十分复杂。如在Windows上开发,要发布到Linux上等情况。

Docker的部分常用内容

在这里插入图片描述
)]

镜像(image)

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

Docker把应用程序及其以来,打包在image文件里。只有通过这个文件,才能生成Docker容器,相当于一个模板,通过这个模板来创建容器服务,可以通过一个镜像创建多个容器。image是二进制文件。实际开发中,一个image文件往往通过继承另一个image文件,加上一些个性化设置而生成的。

容器 (container)

  • image文件生成的容器示例,本身也是一个文件,称为容器文件,独立运行一个或一组应用

  • 基本命令有:启动,停止,删除等

  • 可理解为成一个简单的Linux系统

仓库 (repository)

存放镜像的地方(共有/私有)

运行原理

Docker是一个Client-Server结构的系统,以守护进程运行在主机上。通过Socket从客户端访问。

Docker与传统虚拟机相比:

在这里插入图片描述

Docker 优点

  • 不模拟完整的操作系统,系统内核非常小,更少的抽象层(GuestOS:如CentOS)
  • 容器内的应用直接运行在宿主机的内核,容器本身没有自己的内核,也没有虚拟硬件
  • 每个容器相互隔离,内部都有属于自己的文件系统,互不影响

Docker实现DevOps(开发、部署)

  1. 应用更快速的交付与部署
  2. 打包镜像发布测试,一键运行;不需要写大量的帮助文档,安装程序
  3. 更便捷的升级和扩缩容
  4. 部署应用就和搭积木一样
  5. 更简单的系统运维
  6. 开发和测试的环境高度一致
  7. 更高效的计算机资源利用
  8. 内核级别的虚拟化,可以在一个物理机上运行很多容器实例,服务器性能可以被压缩到极值

Docker常用命令

在这里插入图片描述

镜像命令

docker rmi -f 容器id                 # 删除指定容器
docker rmi -f 容器id 容器id 容器id  # 删除多个容器
docker rmi -f $(docker images -aq)# 删除所有容器

容器命令

注意:有了镜像才可以创建容器

1. 下载镜像

docker pull centos         # 下载一个centos镜像来测试学习

2. 创建新容器

docker run [options] 镜像名/id [command]    # 建立容器并启动
 
[options]:
    --name=容器名        # 命名容器以区分不同容器
    --d                  # 在后台运行容器(必须有一个前台进程,否则后台进程会自动关闭)
    -it                  # 使用交互方式运行,进入容器查看内容
    -p 主机端口:容器端口 # 暴露指定容器端口
    -P                   # 暴露容器所有端口
 
[command]:
 
    /bin/bash            # 控制台

在这里插入图片描述

3. 容器操作命令

Exit            # 从容器中退回主机
CTRL+Q+P        # 容器不停止退出
docker ps        # 显示当前运行的容器
docker -a            # 带出历史运行过的容器
docker rm 容器名/id           # 删除指定容器
docker rm &(docker ps -aq) # 删除全部容器

其他命令

docker start/restart/stop/kill 容器名/id
docker logs -ft --tail 显示的日志条数 容器名/id    # 查看日志
docker top 容器名/id                            # 查看容器中的进程信息
docker inspect 容器名/id                        # 查看镜像的元数据
docker exec -it 容器名/id /bin/bash            # 通常容器以后台方式运行,需要进入其中修改配置:进入容器后,开启一个新的终端
docker attach 容器名/id                        # 进入容器正在执行的终端
docker cp 容器名/id:容器内路径 主机文件路径         # 从容器内拷贝文件到主机上

UnionFS (联合文件系统)

联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下。

**联合文件系统是Docker镜像的基础。**镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像

特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

镜像加载原理

镜像是一种静态结构,可以看成面向对象里面的类,而容器是镜像的一个实例

镜像包含着容器运行时所需要的代码以及其它组件,它是一种分层结构,每一层都是只读的(read-only layers)。构建镜像时,会一层层构建,前一层是后一层的基础,镜像的这种分层存储结构很适合镜像的复用以及定制。

构建容器时,通过在镜像的基础上添加一个可写层(writable layer),用来保存容器运行过程中的修改。

Docker的镜像实际上是由一层层的文件系统构成的:

bootfs(boot file system)

主要包含bootloader和kernel。bootloader主要是引导加载kernel,完成后整个内核就都在内存中了。此时内存的使用权已由bootfs交给内核,系统卸载bootfs。可以被不同的Linux发行版公用。

rootfs(root file system)

包含典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同操作系统发行版(Ubuntu,CentOS等)。因为底层直接用Host的kernel,rootfs只包含最基本的命令,工具和程序就可以了。

分层理解

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的容器层。

容器在启动时,会在镜像最外层上建立一层可读写的容器层(R/W),而镜像层是只读的(R/O)

容器数据卷

为了实现数据持久化,使容器之间可以共享数据。可以将容器内的⽬录,挂载到宿主机上或其他容器内,实现同步和共享的操作。即使将容器删除,挂载到本地的数据卷也不会丢失。

使用命令:

docker run -it -v 主机内目录:容器内目录 镜像名/id

容器内目录挂载到主机内目录上,通过docker inspect命令,查看该容器,即可看到挂载信息:

"Mounts":[
	{
		"Type":"bind",
		"Source": "/home/mountdir",#主机内地址
		"Destination":"/home",#容器内地址
		"Mode": "",
		"RW":true,
		"Propagation":"rprivate"
	}
],

建立挂载关系后,只需要使用命令在主机内新建一个文件:

touch /home/mountdir/text.txt

就会在容器内的挂载目录下发现相同的文件,从而实现了容器和主机的文件同步和共享。

Dockerfile

用来构建docker镜像的文件

构建步骤

docker build -f 文件路径 -t 标签 . # 文件名为Dockerfile时,可省略且最后的.不能忽略
docker run 		# 运行镜像
docker push 	# 发布镜像

构建过程

  1. 每个保留关键字(指令)都必须是大写字母
  2. 从上到下顺序执行
  3. “#”表示注释
  4. 每一个指令都会创建一个新的镜像层并提交

Docker网络

通过命令ip addr查看本地ip地址,我们发现除了本机回环地址和埃⾥远的内⽹地址外,还多了⼀个⽹卡:Docker0,这是Docker服务启动后⾃动⽣成的。

⽽如果进⼊⼀个正在后台运⾏的tomcat容器,同样使⽤ip addr命令,发现容器得到了⼀个新的⽹络: 12:eth@if13, ip地址: 172.17.0.2。这是Docker在容器启动时为其分配的。

linux可以ping通docker容器内部,因为docker0的ip地址为172.17.0.1,容器为172.17.0.2原理:我们每启动⼀个docker容器, docker就会给容器分配⼀个默认的可⽤ip,我们只要安装了docker,就会有⼀个⽹卡docker0(bridge)。⽹卡采⽤桥接模式,并使⽤veth-pair技术(veth-pair就是⼀堆虚拟设备接⼝,成对出现,⼀段连着协议,⼀段彼此相连,充当⼀个桥梁。)。

这时我们退出容器,回到主机再次观察主机的ip地址:

发现了⼀个新⽹络13: vethda1df4b@if12,对应容器内⽹络地址的12: eth@if13。

容器和容器之间是可以互相ping通的:容器1→Docker0→容器2

在这里插入图片描述

Docker中的所有⽹络接⼝都是虚拟的 ,转发效率⾼。删除容器后,对应的⽹桥也随之删除。

在桥接模式下,虚拟机ip地址需要与主机在同⼀个⽹段,如果需要联⽹,则⽹关与DNS需要与主机⽹卡⼀致。

Docker中的⽹络模式有:

  1. bridge:桥接(docker默认)
  2. none:不配置⽹络
  3. host:和宿主机共享⽹络
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L☆★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值