Docker学习_镜像和容器篇

news2024/12/29 17:10:08

简介

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.coloradmin.cn/o/1048940.html

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

相关文章

Day05-循环高级和数组

循环高级 1.无限循环 概念&#xff1a; 又叫死循环。循环一直停不下来。 for格式&#xff1a; for(;;){System.out.println("循环执行一直在打印内容"); } 解释&#xff1a; 初始化语句可以空着不写&#xff0c;表示循环之前不定义任何的控制变量。 条件判断…

C++标准模板(STL)- 输入/输出操纵符-(std::setbase,std::setfill)

操纵符是令代码能以 operator<< 或 operator>> 控制输入/输出流的帮助函数。 不以参数调用的操纵符&#xff08;例如 std::cout << std::boolalpha; 或 std::cin >> std::hex; &#xff09;实现为接受到流的引用为其唯一参数的函数。 basic_ostream::…

深信服云桌面用户忘记密码后的处理

深信服云桌面用户忘记了密码&#xff0c;分两种情况&#xff0c;一个是忘记了登录深信服云桌面的密码&#xff0c;另外一个是忘记了进入操作系统的密码。 一、忘记了登录深信服云桌面的密码 登录虚拟桌面接入管理系统界面&#xff0c;在用户管理中选择用户后&#xff0c;点击后…

C++ | 计算几何:判断点与多边形的关系

在屏幕坐标上有一个多边形&#xff0c;给定一个点&#xff0c;判断该点和多边形的关系。 例如在下图中&#xff0c;点A位于多边形内&#xff0c;点B位于多边形外&#xff0c;点C位于多边形上。 注意: 1.屏幕坐标系中&#xff0c;x轴从左往右为正方向&#xff0c;y轴从上到下为…

10分钟巩固多线程基础

10分钟巩固多线程基础 前言 多线程是并发编程的基础&#xff0c;本篇文章就来聊聊多线程 我们先聊聊概念&#xff0c;比如进程与线程&#xff0c;串行、并行与并发 再去聊聊线程的状态、优先级、同步、通信、终止等知识 进程与线程 什么是进程&#xff1f; 操作系统将资…

外汇天眼:假投资平台COINPAYEX非法吸金2158万,项目小组循线破获诈团据点

近年来加密货币投资愈来愈普及&#xff0c;许多人们开始关注并投入这个市场&#xff0c;期望能够获得高额报酬&#xff0c;甚至达到财务自由的目标。 但需要注意的是&#xff0c;市面上充斥各种黑平台&#xff0c;一不小心恐怕蒙受极大的损失。 9/12&#xff0c;警政署刑事警察…

c语言 - 实现每隔1秒向文件中写入当前系统时间

实现思路 主要是通过库函数和结构体获取当前系统时间&#xff08;年月日和时分秒&#xff09;保存到变量里&#xff0c;然后通过格式化输出函数将当前系统时间输出到文件中去。 但是需要注意的是题目要求每隔 1 s对系统时间进行输出&#xff0c;所以需要加入 sleep()函数进行调…

windows 环境变量设置

方法一&#xff1a;打开环境变量设置窗口&#xff08;或者cmd 执行sysdm.cpl命令&#xff09; 方法二&#xff1a; powershell执行如下命令&#xff0c;注意修改<要增加的环境变量值>值为要设置的环境变量值 [Environment]::SetEnvironmentVariable("PATH", $E…

2023最新团购社群小程序源码 社区商城小程序源码开源版 带完整后台+部署教程

随着互联网的不断发展&#xff0c;社群团购成为了一种新型的商业模式。在这种模式下&#xff0c;通过社群分享和团购折扣&#xff0c;消费者可以享受到更优惠的价格和更便捷的购物体验。给大家分享一个2023最新团购社群小程序源码&#xff0c;包含社区商城小程序源码开源版和完…

openGauss学习笔记-83 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用内存和存储规划

文章目录 openGauss学习笔记-83 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用内存和存储规划83.1 MOT内存规划83.2 存储IO83.3 容量需求 openGauss学习笔记-83 openGauss 数据库管理-内存优化表MOT管理-内存表特性-MOT使用内存和存储规划 本节描述了为满足特定…

No132.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

基于python的智慧城市社区服务平台及养老服务子系统的设计与实现

文章目录 导文摘要前言绪论课题背景国内外现状与趋势国内现状:国外现状:趋势:课题内容相关技术与方法介绍系统分析系统设计系统实现导文 基于python的智慧城市社区服务平台及养老服务子系统的设计与实现 摘要 本文基于Python开发了一款智慧城市社区服务平台及养老服务子系统…

ant-design-pro的可编辑表格editprotable的遇到的一些小问题

需求&#xff1a;1、使用可编辑表格实现对某一行表格的数据进行编辑&#xff0c;对输入内容控制必须低于同行某一数据 2、解决搜索数据和列名展示不同&#xff0c;和不可编辑的列不展示在搜索框 实现效果 解决搜索和readonly之间的问题 因为本次需求只要求修改一个数据&…

ElementPlus· tab切换/标签切换 + 分页

tab切换 ---> <el-tabs><el-tab-pane>... 分页 --------> <el-pagination> tab切换 // tab标签切换 // v-model双向绑定选项中的name&#xff0c;tab-change事件在 activeName改变时触发 <script setup> const tabChange (tab, event)>{…

【JAVA】飞机大战

代码和图片放在这个地址了&#xff1a; https://gitee.com/r77683962/fighting/tree/master 最新的代码运行&#xff0c;可以有两架飞机&#xff0c;分别通过WASD&#xff08;方向&#xff09;&#xff0c;F&#xff08;发子弹&#xff09;&#xff1b;上下左右&#xff08;控…

大型企业网如何部署NAT实现需求

1.企业中堕胎电脑如何共享上网&#xff1f; 2.NAT地址转换原理讲解&#xff1b; 3.企业机房如何用NAT让服务器更安全&#xff1f; - NAT - 网络地址转换 - 什么式网络地址 IP地址 -通信时候的设备标识 - 为什么要把IP地址做转换呢&#xff1f; -- 公网IP&#xff…

迷你无人车 Navigation 导航(5)— 基础框架学习

迷你无人车 Navigation 导航&#xff08;5&#xff09;— 基础框架学习 整个功能包整个功能包集合以move_base为核心&#xff0c;将里程计信息、传感器信息、定位信息、地图以及目标点输入给move_base&#xff0c;move_base经过规划后会输出速度指令 move_base包括三个关键部分…

如何像人类一样写HTML之第一个HTML、标签的关系与注释

文章目录 前言一、创建第一个HTML文档创建方式1创建方式2 二、标签的关系三、注释的使用总结 前言 在现代数字化社会中&#xff0c;网页是我们获取信息、与他人交流以及展示自己的重要工具之一。要了解如何创建网页&#xff0c;HTML&#xff08;Hypertext Markup Language&…

给网站引入各大搜索引擎的关键字提示,白给的接口薅他羊毛

属于是导航网站必要的了 因为网站是个导航网站&#xff0c;有一个搜索框&#xff0c;用户搜索时需要像百度一样有个搜索提示关键词列表。 之前只是用百度&#xff0c;现在给增加了好几个&#xff0c;想换那个就换那个了&#xff0c;直接上图片 可以配置属于是想选哪个选哪个&…

树莓派4B使用Docker部署SpringBoot项目——(二)使用docker安装mysql

树莓派4B使用docker安装mysql 使用的树莓派4B为8GB版本&#xff0c;使用docker pull命令拉取MySQL镜像&#xff1a; docker pull --platformarm64 mysql/mysql-server等待拉取完成 使用docker images查看镜像 创建MySQL容器 docker run -di --namemysql -p 3306:3306 -e MY…