Docker学习_镜像和容器篇

简介

Docker是一种容器化的技术,可以实现在一台宿主机电脑上运行多个不同的容器,每个容器之间都相互独立,具有完整的一套文件,网络和端口。

可以将其理解为一种虚拟机技术,只不过和VMware等虚拟化技术不同,docker共享宿主机的操作系统,只创建应用和应用运行的依赖。这样就大大减少了每个容器的体积。这样容器部署和启动速度更快,开销更小,也更容易迁移。

工作流程

Docker是一个CS架构的软件,客户端通过docker api与服务端进行交流,并由服务端完成docker的相关操作。

Docker操作中主要涉及如下几个概念:

  • 仓库(registry): 存储docker镜像的远程仓库,通常为docker hub
  • 镜像(image): 创建容器的模板,类似于VM中的虚机模板
  • 容器(container): 应用实际运行的地方,类似于VM中的一个虚拟机

创建docker容器的步骤如下:

  1. 从远程仓库拉取镜像
  2. 利用镜像生成容器

安装Docker Desktop

Docker Desktop中包含了Docker引擎,Docker命令行客户端,Docker扩展工具,Docker Compose等,并支持图形显式,针对入门学习是一个不错的工具。

首先根据各自的操作系统,在Docker官网下载应用安装包。此处以Windows系统为例进行安装。

系统要求

  1. WSL版本1.1.3.0+
  2. Win10 +
  3. BIOS支持虚拟化
  4. 内存4GB+
  5. 64位操作系统

安装过程

1.双击安装包开始安装

2.勾选添加桌面快捷方式

3. 等待程序安装完成

4. 双击图标打开应用,统一许可证书

5. 在道客官网注册账户,并获取docker加速器

6. 配置Docker desktop的镜像加速器(由于默认为docker hub,是一个国外网站,国内打开较慢)

7. 查看docker版本

在cmd中输入docker version显示docker的相关版本信息。

docker version

8. 运行hello-world容器

在cmd中输入docker run hello-world,看到“Hello from Docker!”等信息就说明docker已经安装完成。

9. 查看docker desktop的变化

镜像中多了一个hello-world镜像

容器中多了一个使用hello-world镜像的仓库。

镜像

镜像是创建容器的基础,有了容器才能启动容器。

获取镜像

更具镜像的获取方式不同,有如下几种获取镜像的方式。

1. 拉取镜像

从镜像仓库中拉取镜像是最常见的获取镜像的方式。主要通过docker pull指令完成。

docker pull [选项] <镜像名>[:标签]

这里标签不存在时,默认为latest标签。标签通常为镜像的版本号。

镜像名称并不是我们随便书写的,它应该在仓库中存在。一般情况下为应用的名称,例如django,python等

为了确保镜像名称正确,可以通过docker search指令查看仓库中相关的仓库有哪些,通常选择官方的镜像。

这样就确定了镜像的名称。

镜像名称确认后可以在docker hub中查看该镜像的标签。

一个简便的方法就是通过如下网址进行查看https://hub.docker.com/v2/repositories/library/镜像名称/tags/

2. 还原镜像

 有时候内部通过tar文件来存储镜像,此时通过docker image import <镜像tar文件> <镜像名>指令完成镜像文件的制作。

此处通过镜像tar文件制作镜像还有另一个指令docker image load -i <镜像文件名>指令完成镜像文件的制作。

对比这两种指令产生的镜像发现如下不同:

对比项docker importdocker load
大小变大不变
构建历史丢失保持

查看镜像

1. 查看本地所有镜像

利用docker image ls指令可以查看本地所有的镜像。

2. 查看镜像详细信息

利用docker image inspect <镜像id>指令查看某个镜像的详细信息。

3. 查看镜像历史过程

利用docker image history <镜像名>可以查看镜像的制作历史,即Dockerfile的部分过程。

制作镜像

镜像本质上由Dockerfile制作而来,通过查看镜像,发现镜像是一个多层结构。通过docker pull获取镜像时,经常会发现拉取多个镜像层。

镜像的存储结构如下:由多个只读层的镜像层组成,并在顶层创建一个读写层来运行容器。上层可以读取和覆盖下层相同的文件。

镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如/a,上层的/a会覆盖下层的/a。也就是说用户只能访问到上层中的文件/a。在容器层中,用户看到的是一个叠加之后的文件系统。

1. 根据Dockerfile制作

Dockerfile可以理解为时创建镜像文件每个步骤的脚本文件。

以hello-world镜像为例,它的Dockerfile内容为

FROM scratch
COPY hello /
CMD ["/hello"]

并将文件名命名为Dockerfile。

这样利用docker image build 指令创建一个镜像。

docker image build -t 镜像名称:标签  路径

2. 根据容器制作镜像

不推荐!

这种方式容易出错,效率低且可重复性差。

使用者不知道镜像的制作过程,无法对镜像进行审计

通过更改容器中一些内容,并以这个容器作为运行对象创建一个新的镜像。

利用docker container commit 容器名  镜像名:标签来实现以一个容器为基础创建新的镜像。

分享镜像

1. 通过仓库分享

docker hub是一个公共的docker仓库网站,它存储镜像的要求是镜像名称以 用户名/镜像名:标签的方式命名。

当通过镜像仓库来分享镜像时需要在docker hub中创建自己的账户,并通过docker login命令登录自己的账号。

然后通过docker image tag指令将目标镜像改为满足推送要求的镜像名称。

最后通过docker image push指令将镜像推送到仓库完成共享。

2. 通过文件分享

当没有仓库可以使用的时候,可以将镜像文件存储为tar文件进行存储,然后分享给其他人使用。

利用docker image save -o <文件名> <镜像名>指令将镜像以tar文件存储。

docker image save -o hello-world.tar hello-world

删除镜像

删除镜像的前提是没有任何运用该镜像的容器,所以要删除镜像首先需要删除依赖该镜像的所有容器。

通过docker image rm <镜像id>指令删除镜像。

通过docker image prune -a指令可以删除所有没有被使用的镜像。

容器

容器就是基于镜像创建的运行应用的地方。通常一个容器对应一个应用和其运行的最少依赖。

创建容器

容器由镜像而来,一个镜像可以创建多个容器,容器之间的资源是相互独立的。每个容器都有自己的名称空间,实现文件,网络和端口的隔离。

1. 单纯创建一个容器

通过docker container create <镜像名>指令会创建一个匿名容器(容器名称由docker随机命名).

当需要指定容器的一些配置时可以通过添加选项来实现,常用的一些选项说明如下:

  • --name 指定容器的名称,必须在宿主机中是唯一的
  • -e 为容器设置环境变量
  • -p 为宿主机和容器进行端口映射
  • -v 为容器映射宿主机文件目录
  • --mount 为容器绑定文件目录
  • -h 设定容器主机名
  • --network 为容器绑定网络
  • --ip 为容器指定ip地址

2. 创建并运行一个容器

通过docker container run <镜像名>指令会创建并运行一个匿名容器。

docker container run的很多选项和docker container create的是一致的,此外再补充几个.

  • -d 容器在后台运行
  • -t 使用命令行终端
  • -i 与容器交互

删除容器

当存在不再使用的容器时可以将容器删除。

通过在docker container rm <容器id>指令可以完成容器删除操作。

当删除正在运行的容器时会产生报错。

正确的操作步骤应该是先暂停容器,然后再删除容器。或者通过-f选项,将运行中的容器强制删除。

通过docker container prune -a指令可以删除所有暂停的容器。

查看容器

1. 容器列表

通过docker container ls 指令可以查看系统中正在运行的容器列表。通过docker container ls -a指令可以查看系统中所有的容器列表。

2. 查看容器配置信息

通过docker container inspect <容器id>指令可以查看对应容器在系统中的设置。

操作容器

容器的状态和操作示意图

1. 启动容器

当容器创建后,可以通过docker container start <容器id>指令启动容器。

2. 暂停容器

通过docker container stop <容器id>指令暂停容器。

3. 进入容器

进入容器表示进入容器内部,目前有两种操作方式。

attach方式

通过docker container attach <容器id>指令可以直接进入容器启动命令的终端,不会启动新的进程。

exec方式

通过docker container exec <容器id>指令可以在容器中打开新的终端,并且可以启动新的进程。

最佳实践

服务类容器如mysql,nginx等,通过-d后台方式启动,并以exec -it进入容器。

工具类容器通常给我们提供一个临时的工作环境,以run -it方式运行,exit退出容器后容器暂停。

4. 退出容器

在容器中输入exit即可退出容器进入宿主机环境。

5. 重启容器

通过docker container restart <容器id>指令可以重启容器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/90419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LM小型可编程控制器软件(基于CoDeSys)笔记三十一:保持变量和非保持变量

所谓变量&#xff0c;就是用字母、数字和下划线组成的一个标识符。 按照数据类型的不同&#xff0c;变量可以分为标准类型和用户自定义类型。其中标准类型包括布尔型 &#xff08; BOOL &#xff09;、整型&#xff08; INT &#xff09;、实型&#xff08; REAL &#xff09…

18.备忘录模式(Memento)

意图&#xff1a;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;这样就可以在以后将该对象恢复到原先保存的状态。 上下文&#xff1a;某些对象的状态在转换过程中&#xff0c;可能由于某种需要&#xff0c;要求…

ChunJun: 自定义插件

序言 Chunjun的版本兼容可能会有问题,在我们了解了自定义插件后,在修改源码以应对不同的场景就会得心应手了,针对Chunjun1.12.Release版本说明cuiyaonan2000163.com 自定义插件整体流程 从数据流的角度来看ChunJun&#xff0c;可以理解为不同数据源的数据流通过对应的ChunJu…

搭建自己的搜索引擎之三

一、前言 接上一篇 搭建自己的搜索引擎之二&#xff0c;本篇主要讲一下我们如何操作ElasticSearch&#xff0c;就是最简单的增删改查命令怎么写。 二、几个概念 搭建自己的搜索引擎之一 这篇文章我们对比搜索引擎在做海量数据实时查询优于关系型数据库的一些原因&#xff0c…

DevExpress WinForms图表组件 - 直观的数据信息呈现方式!(二)

在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们为大家介绍了DevExpress WinForms图表控件的互动图表、图标设计器及可定制功能等&#xff0c;本文将继续介绍DevExpress WinForms图表控件的数据分析、大数据功能等&#xff0c;欢迎持续关注我们哦~ Dev…

【Ubuntu18.04】Autoware.ai安装

Autoware.ai安装 引言1 ROS安装2 Ubuntu18.04安装Qt5.14.23 安装GCC、G4 Autoware.ai-1.14.0安装与编译4.1 源码的编译4.1.1 python2.7环境4.1,2 针对Ubuntu 18.04 / Melodic的依赖包安装4.1.3 先安装一些缺的ros依赖4.1.4 安装eigen3.3.74.1.5 安装opencv 3.4.164.1.6 编译4.1…

桥梁模板人工费多少钱?

桥梁模板是桥梁工程中不可或缺的一部分&#xff0c;它起到支撑和固定混凝土浇筑的作用。在桥梁建设中&#xff0c;模板人工费用是一个重要的成本因素。那么&#xff0c;桥梁模板人工费到底是多少呢&#xff1f;下面我们来详细了解一下。 首先&#xff0c;需要明确的是&#xff…

ESP32IDF出现Syntax Warning in cmake code at column 47报错

前言 &#xff08;1&#xff09;ESP32的资料还是挺难找的&#xff0c;遇到bug处理起来挺折磨人的。今天分享一个我遇到的bug&#xff0c;以及处理思路。 报错日志 &#xff08;1&#xff09;前天在些博客的时候&#xff0c;做测试发现了一个奇怪的bug&#xff0c;报错日志如下。…

【数据结构初阶】六、线性表中的队列(链式结构实现队列)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【数据结构初阶】五、线性表中的栈&#xff08;顺序表实现栈&#xff09;_高高的胖子的博客-CSDN博客 1 . 队列&#xff08;Queue&#xff09; 队列的概念和结构&#xff1a; 队列…

手写Hystrix基本原理

本文已收录于专栏 《中间件合集》 目录 概念说明什么是HystrixHystrix解决的问题 提供服务工作流程代码实现HystrixSDKMyHystrixCommand注解MyHystrixProperty注解MyAspect注解解释器 发送请求端引入Hystrix的依赖调用代码 接收请求端执行效果发送请求端 总结提升 概念说明 什…

JAVA:实现Excel和PDF上下标

1、简介 最近项目需要实现26个小写字母的上下标功能,自己去网上找了所有Unicode的上下标形式,缺少一些关键字母,顾后面考虑自己创建上下标字体样式,以此来记录。 2、Excel Excel本身是支持上下标,我们可以通过Excel单元格的样式来设置当前字体上下标,因使用的是POI的m…

通过java向jar写入新文件

文章目录 原始需求分析实施步骤引入依赖核心编码运行效果 原始需求 有网友提问&#xff1a; 我想在程序中动态地向同一个jar包中添加文件&#xff0c;比如&#xff0c;我的可执行jar包是test.jar,我要在它运行时生成一些xml文件并将这些文件添加到test.jar中,请问如何实现&…

细胞机器人系统的概念

摘要 本文讨论了一种新型机器人系统的理论和工程的概念基础。该系统由协作完成任务的自主机器人单元组成。本文在描述了该系统与细胞自动机和神经网络的相关性和差异后&#xff0c;建立了该系统的基础属性及其对机器人单元结构的影响、它们操作的空间以及它们完成全局任务的算法…

【Ambari】银河麒麟V10 ARM64架构_安装Ambari2.7.6HDP3.3.1问题总结

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1f338;文…

如何快速学习AdsPower RPA(2)——中级、高级部分

Tool哥继续给大家分享快速学习AdsPower RPA的方法。上一篇在这里&#xff0c;还没看过的小伙伴赶快补课去&#xff1a;如何快速学习AdsPower RPA&#xff08;1&#xff09;——简单、进阶部分 能进入到中级、高级阶段的学习&#xff0c;说明你自学能力超强&#xff01;只要跟着…

java spring cloud 企业电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

编译原理简介

编译原理简介 编译原理的研究对于理解和设计编程语言、编译器和解释器都非常重要。它不仅可以提高程序的执行效率&#xff0c;还可以帮助开发人员更好地理解程序的运行机制。编译原理是计算机科学中的一个重要分支&#xff0c;研究的是编译器的设计和实现。对于从事编译器开发…

OpenGL之着色器

着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说&#xff0c;着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序&#xff0c;因为它们之间不能相互通信&#xff1b;它们之间唯一的沟通只有通过输入和…

开发模式-敏捷开发

1. 概述 随着软件开发技术的不断发展&#xff0c;现在出现了很多种不同的开发模式&#xff0c;其实敏捷开发已经成为现在很多企业开发应用程序都想要选择的开发方案&#xff0c;那么什么是敏捷开发呢&#xff1f; 1.1 四种开发模式 1.1.1 瀑布式开发 瀑布式开发是一种老旧的…

66种智能优化算法跑23个基准测试函数

目录 1、66种智能优化算法 2 、23个标准测试函数 3 、多种智能优化算法在CEC2005上对比 3.1、 多个算法对比 3.2 单个算法运行 1、66种智能优化算法 将66种智能优化算法在23个经典测试函数上进行对比&#xff0c;这些智能优化算法包括一些高性能算法&#xff0c;如…