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.xdnf.cn/news/146788.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【工具】idea 设置自动渲染注释

前言 需求&#xff1a;自动渲染文档注释&#xff0c;看源码更加舒服。 已知 crtl alt Q 可以 设置 尝试搜索 render&#xff0c;发现有启用 “渲染文档注释” 的地方 坐标 &#xff1a; Settings -> Editor-> Appearance

链表经典面试题(五)

求链表的公共结点 1.题目2.详细的图示3.详细注释和代码实现 1.题目 2.详细的图示 3.详细注释和代码实现 public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {//定义两个表示长度的指针,让它们指向headA和headB//我们暂时无法知道哪…

14:00面试测试岗,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到9月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

ElementUI之首页导航+左侧菜单

文章目录 一、Mock.js1.1.什么是Mock.js1.2.安装与配置1.3使用 二、登录注册跳转2.1.在views中添加Register.vue2.2.在Login.vue中的methods中添加gotoRegister方法2.3.在router/index.js中注册路由 三、组件通信&#xff08;总线&#xff09;3.1 在main.js中添加内容3.2.在com…

分布式搜索引擎es-3

文章目录 数据聚合聚合的种类RestAPI实现聚合 自动补全自定义拼音分词器自动补全查询案例&#xff1a;实现酒店搜索框自动补全自动补全的javaAPI实现搜索框自动补全 口述自动补全数据同步集群集群的分布式存储集群分布式查询集群故障转移 数据聚合 什么是聚合&#xff1f; 聚合…

chrome extensions mv3通过content scripts注入/获取原网站的window数据

开发插件的都知道插件的content scripts和top window只共享Dom不共享window和其他数据&#xff0c;如果想拿挂载在window的数据还有点难度&#xff0c;下面会通过事件的方式传递cs和top window之间的数据写一个例子 代码 manifest.json 这里只搞了2个js&#xff0c;content.…

【前端】ECMAScript6从入门到进阶

【前端】ECMAScript6从入门到进阶 1.ES6简介及环境搭建 1.1.ECMAScript 6简介 &#xff08;1&#xff09;ECMAScript 6是什么 ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准&#xff0c;已经在2015年6月正式发布了。它的目标&#xff…

Excel·VBA分列、字符串拆分

看到一篇博客《VBA&#xff0c;用VBA进行分列&#xff08;拆分列&#xff09;的2种方法》&#xff0c;使用VBA对字符串进行拆分 目录 Excel分列功能将字符串拆分为二维数组&#xff0c;Split函数举例 将字符串拆分为一维数组&#xff0c;正则表达式举例 Excel分列功能 Sub 测…

[NOIP2012 提高组] 国王游戏(贪心,排序,高精度)

[NOIP2012 提高组] 国王游戏 题目描述 恰逢 H 国国庆&#xff0c;国王邀请 n n n 位大臣来玩一个有奖游戏。首先&#xff0c;他让每个大臣在左、右手上面分别写下一个整数&#xff0c;国王自己也在左、右手上各写一个整数。然后&#xff0c;让这 n n n 位大臣排成一排&…

ssl证书 阿里的域名,腾讯云的证书

目录 1.腾讯云申请ssl免费证书 2.去阿里云进行解析 3.回到腾讯云 4.nginx的配置 说明&#xff1a;阿里云的免费证书用完了&#xff08;每年可以申请20个&#xff09;&#xff0c;还有个项目要用证书&#xff0c;第三方的证书免费的都是90天的。看了下腾讯云业可以申请免费的…

C++代码示例:排列数简单生成工具

文章目录 前言代码仓库内容代码&#xff08;有详细注释&#xff09;编译和运行命令结果总结参考资料作者的话 前言 C代码示例&#xff1a;排列数简单生成工具。 代码仓库 yezhening/Programming-examples: 编程实例 (github.com)Programming-examples: 编程实例 (gitee.com) …

数据集划分——train_test_split函数使用说明

当我们拿到数据集时&#xff0c;首先需要对数据集进行划分训练集和测试集&#xff0c;sklearn提供了相应的函数供我们使用 一、讲解 快速随机划分数据集&#xff0c;可自定义比例进行划分训练集和测试集 二、官网API 官网API sklearn.model_selection.train_test_split(*a…

Spring5 自定义标签开发

spring5 自定义脚本开发步骤 1 定义bean&#xff0c; public class User {private String id;private String userName;private String email;private String password;public String getId() {return id;}public void setId(String id) {this.id id;}public String getUser…

网络爬虫——urllib(2)

前言&#x1f36d; ❤️❤️❤️网络爬虫专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Python网络爬虫_热爱编程的林兮的博客-CSDN博客 前篇讲解了urllib的基本使用、一个类型六个方法与下载相关内容&#xff0…

云原生Kubernetes:K8S配置资源管理

目录 一、理论 1.Secret 2.Secret创建 3.Secret使用 4.Configmap 5.Configmap创建 6.Configmap使用 二、实验 1.Secret创建 2.Secret使用 3.Configmap创建 4.Configmap使用 三、问题 1.变量引用生成资源报错 2.查看pod日志失败 3.创建configmap报错 4.YAML创建…

好看的货架效果(含3D效果)

搭配thymeleaf layui合成 货架一 1. css #gudinghuojia2F .layui-row { display: flex; justify-content: space-between; height: 100%;} #gudinghuojia2F .layui-col-xs10 {margin-right: 4%;} #gudinghuojia2F .layui-col-xs10:last-child {margin-right: 0;} .inner-ti…

Centos一键安装、切换各版本JDK

查看服务中的安装的jdk rpm -qa | grep java获取jdk各版本信息 yum -y list java*查看指定版本 yum -y list java*|grep 1.8安装jdk yum install java-11-openjdk当服务器中有多个版本jdk&#xff0c;切换指定jdk版本 alternatives --config java按照提示输入编号即可切换&…

2021-06-10 51单片机设计一个蜂鸣器报警电路每秒

缘由求助一下谢谢啦51单片机_嵌入式-CSDN问答设计一个蜂鸣器报警电路&#xff0c;按下K1&#xff0c;蜂鸣器响一声&#xff0c;按下K2&#xff0c;蜂鸣器响三声&#xff0c;按下K3,蜂鸣器长鸣。要求响声和间隔的时间均为1秒&#xff0c;长鸣不限时&#xff0c;但是此时应设置一…

验证曲线(validation_curve)项目实战

验证曲线 validation_curve 一、简介 validation_curve验证曲线&#xff0c;可确定不同参数值下的训练和测试分数 根据指定参数的不同值计算估计器的得分 这与使用一个参数的网格搜索类似。不过&#xff0c;这也会计算训练得分&#xff0c;只是一个用于绘制结果的工具。 二、…

【C++】unordered_set、unordered_map的介绍及使用

unordered_set、unordered_map的介绍及使用 一、unordered系列关联式容器二、unordered_map and unordered_multimap1、unordered_map的介绍2、unordered_map的使用&#xff08;1&#xff09;定义&#xff08;2&#xff09;接口使用 3、unordered_multimap 二、unordered_set a…