热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

docker容器状态restarting_20分钟极简入门Docker

有错误请指出~什么是Docker首先来介绍一下什么是Docker,Docker是早于2013年发布的开源项目,它借助操作系统的虚拟化技术来实现应用间的资

8a1d6a4ac092310c6324a403e862b33c.png

有错误请指出~


4188fb10613db52c4371540130196141.png

什么是Docker

首先来介绍一下什么是Docker,Docker是早于2013年发布的开源项目,它借助操作系统的虚拟化技术来实现应用间的资源隔离,从而应用能更加快速方便地打包和部署在任何地方。根据官网描述,Docker是一个借助容器进行开发,部署和运行应用的工具,通俗来说,Docker容器好比一个集装箱一样,里面存放了应用所需要的文件和依赖,这种把应用标准化的过程被叫做为“容器化”。

a3701ca271297f65b931d654263a74c7.png

Docker适合做什么

对于开发人员来说,容器技术为应用的部署提供了沙盒环境,开发者可以在独立的容器运行和管理应用程序进程,Docker提供的抽象层使得开发人员之间可以保持开发环境相对的一致,因此Docker适合用于应用隔离,搭建沙箱环境,此外,由于Docker容器的轻量化,它也被适用于进行持续集成和持续部署。

2ca97223d1d6d602dade832e7e2e1636.png

Container VS VM

人们经常用虚拟机和容器来做比较,那么它们两之间有什么区别呢?其实它们最核心的区别在于虚拟化资源的层面不一样,虚拟机是在硬件层之上实现虚拟化的,而容器则直接在操作系统之上实现虚拟化,从图中可以看出,每个虚拟机都需要在一个Guest OS之上,而容器则可以都处在同一个宿主机之上。

因为容器没有虚拟机造成的额外损耗,所以与虚拟机对比,容器不仅运行效率更高,而且部署速度也更快。

9849f974aadc622b69343a92c0174043.png

Docker Engine

Docker Engine是用于运行和编排容器的基础设施工具,我们平时说到的Docker大多数指的是Docker Engine,也就是在命令行和Docker进行交互的时候打交道的后台进程。

这是Docker Engine目前的架构,Docker客户端通过REST API与Docker Daemon来进行交互,Daemon把命令下发给containerd,containerd负责容器的生命周期管理以及镜像管理等,而runc负责创建容器。

Docker首次发布时,Docker Engine由两个核心组件构成:LXC和Docker Daemon。Docker Daemon是单一的二进制文件,包含诸如 Docker客户端、Docker API、容器运行时、镜像构建等。LXC提供了对Namespace(资源隔离)和CGroup(资源限制)等基础工具的操作能力,它们是基于Linux内核的容器虚拟化技术。

安装Docker

安装好Docker后,可以执行两条命令查看Docker环境以及版本信息:

  • docker version
  • docker info

2fd21dc9d6f887564b313334881d9923.png

Docker镜像

如果说Docker容器本质上是一个运行的进程以及它需要的一些依赖,而Docker镜像则是定义容器的一个"模版",容器则是镜像运行的一个实例。镜像是一个打包好的文件,里面包含了应用程序运行所需的所有库、配置和依赖。

Docker镜像结构

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。以Dockerfile为例,每一行指令都产生一个新层。

镜像由一个或多个只读的镜像层构建而成,每个镜像层拥有独立的哈希值,Docker在拉取或推送镜像时,会判断哪几层在本地或远端已存在,避免不必要的操作。

Docker镜像命令

我们可以通过下面这些命令进行一些Docker镜像相关的基本操作。

b302cecc24525fff0855ddbd51387e99.png

e2d69c48dd5a989b919b9e95d151c9fc.png

Docker容器

容器是镜像的一个运行的实例,用户可以从单个镜像上启动一个或多个容器。

774c0490ca97530f07693c3937a74150.png

Docker容器的生命周期

容器在创建时进入Created状态,运行后进入Running状态,接着会进入到Pause状态或Exited状态,对已经退出的容器执行重启操作会使容器进入Restarting状态,随后转为Running状态。

Docker容器操作

4e9765d3cbbedc6efe5e419872334651.png

e1227f64d5f46319e5488dca2ff57e68.png
c2c099bcfb7a7aa8c984175714fed51e.png
创建一个Docker容器https://www.zhihu.com/video/1166455714251264000

8aaf26439f85621ac60dcb1bc00ec45e.png

Dockerfile

Dockerfile是一个用以构建镜像的文本文件,它包括了一系列的执行用来表示当前应用的描述、依赖以及该如何运行这个应用,Docker Engine通过解析Dockerfile里的指令,来构建一个Docker镜像。

执行docker build命令会从顶层开始解析Dockerfile中的指令并逐行执行。而对每一条指令,Docker都会检查缓存中是否已经有与该指令对应的镜像层。

7448e649cc06d05e19a53efb212e9464.png
3baaf9b71b3835c209ce7e15f28a3e15.png
编写一个Dockerfilehttps://www.zhihu.com/video/1166455944463732736

a69b00a0acb08bd357f79bbaf0c068d0.png

多阶段构建

当Dockerfile中包含多个FROM语句时,触发多阶段构建。使用多阶段构建可以文件从另一个阶段复制到另一个阶段,生成的镜像将会是最后一个阶段构建的结果。

这个功能在某些情况下会十分有用,比如我们在编译应用时需要用到许多依赖,但想要保持镜像尽可能地小,这时候就可以通过多阶段构建来将编译环境和运行环境分离,在最终生成的镜像中只保留编译好的可执行文件。

2059342b47fad55d79dcd594ffc22613.png
Dockerfile多阶段构建https://www.zhihu.com/video/1166456122667143168

应用容器化

这时候归纳一下应用容器化的过程:

  1. 首先获取和编写应用代码
  2. 为应用编写Dockerfile
  3. 通过Dockerfile来构建应用的镜像
  4. 将镜像交付到物理机和云端
  5. 最终测试和运行容器化应用。

Docker Registry

Docker Registry是镜像存储和分发的仓库,以完成镜像的搜索、拉取和推送等操作。

推送一个镜像:

  • docker push ubuntu(http://docker.io)
  • docker push myregistrydomain:port/foo/bar(myregistrydomain:port)

拉取一个镜像:

  • docker pull ubuntu(http://docker.io)
  • docker pull myregistrydomain:port/foo/bar(myregistrydomain:port)

124fbc34e4eeb4dbfa5061813288a8a7.png

Docker数据管理

下面介绍一下Docker是怎么管理和存储数据的,Docker提供了3种方法将数据从宿主机挂载到容器:volumes,bind mounts和tmpfs mounts。其中volume适合在不同的容器中共享数据和数据迁移,bind mount适合宿主机与容器之间共享配置和代码,tmpfs适合不需要持久化数据的场景。

e56c01289bfc950d825d04aee210d939.png

Docker网络

Docker基于CNM实现了网络模型,CNM模型由三个部分组成:Sandbox,Endpoint,Network。

Docker内置了以下几种网络驱动,其中bridge桥接网络是Docker默认的网络驱动,在这种模式下,连接到同一个网桥的容器会使用同一个DNS解析服务,容器间可以使用这个解析服务来相互通信,而overlay是swarm模式下默认的网络驱动。

dcbdc9265300d6d97ff32f9039c71236.png

e4d3bfc26a213dcfbe9264340497e356.png

dcbce3ba3238ccdbaa9725c7c73400e8.png
c036e13d2f589d12dcb04876dda087b8.png
Docker DNShttps://www.zhihu.com/video/1166460676783669248

8698f3a6257af80ec8291c571f32896a.png

Docker Machine

Docker Machine是一个用来在虚拟机安装Docker Engine的工具,以及通过命令行来管理和登录这些主机。

92eb7f6721d8a415a30c72f91a4e6c2c.png

Docker Compose

Docker Compose是一个定义和运行多容器应用的工具,通过编写Compose文件来定义和配置应用,只需要用docker-compose一条命令就可以一次把所有定义好的服务启动起来。

02a55f5b16e32ad80e4ba9c40df35ca5.png
Docker Compose部署应用https://www.zhihu.com/video/1166457477158903808

14684ecdf705e5eb778509a3eaecf9e8.png

Docker Swarm

Docker Swarm是Docker原生的集群管理和调度工具,它把多个Docker主机抽象成单个虚拟的系统,开发者方便地可以通过Docker Swarm在多个主机上来调度和部署Docker容器。

ed1e3b0cac171e4c7484024bef6d87c2.png

在Swarm中有几个概念,Node代表着Swarm集群中的一个Docker主机,其中每个主机可以是Manager或者Worker两个角色,他们分别代表管理节点和工作节点。Task可以理解为一个Docker容器以及其运行的命令,Service是一组Task的集合与定义,即运行在Node上的服务。

06b7031c648eb864dc37e9de6e61a67b.png

Docker Swarm提供了多种调度策略,来按需选择将容器分配到不同的节点上。

f4a623ddc435d1810e9e36ec9b38aec5.png
使用Swarm部署应用https://www.zhihu.com/video/1166463996525010944

9a753889ea4c34b0e6f1330ee754f281.png

好了,希望看到这后你对Docker可以有一个了解。



推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 如何利用 Myflash 解析 binlog ?
    本文主要介绍了对Myflash的测试,从准备测试环境到利用Myflash解析binl ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文介绍了在RHEL 7中的系统日志管理和网络管理。系统日志管理包括rsyslog和systemd-journal两种日志服务,分别介绍了它们的特点、配置文件和日志查询方式。网络管理主要介绍了使用nmcli命令查看和配置网络接口的方法,包括查看网卡信息、添加、修改和删除配置文件等操作。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
author-avatar
手机用户2502854251
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有