当前位置: 首页 > 编程日记 > 正文

【Docker】Docker的三大核心组件

镜像(Image)、容器(Container)、仓库(Repository)是我们常说的Docker的三大组件,接下来就让我们一起详细地探索一番吧。

一、镜像(Image)
什么是Docker镜像?
简单地理解,Docker镜像就是一个Linux的文件系统(Root FileSystem),这个文件系统里面包含可以运行在Linux内核的程序以及相应的数据。

谈到这里,我们可能需要先补充一点与Linux操作系统相关的知识:

一般而言, Linux分为两个部分:Linux内核(Linux Kernel)与用户空间,而真正的Linux操作系统,是指Linux内核,我们常用的Ubuntu、CentOS等操作系统其实是不同厂商在Linux内核基础上添加自己的软件与工具集(tools)形成的发布版本(Linux Distribution)。

因此,我们也可以把镜像看成是上面所说的用户空间,当Docker通过镜像创建一个容器时,就是将镜像定义好的用户空间作为独立隔离的进程运行在宿主机的Linux内核之上。

镜像的两个特征:

镜像是分层(Layer)的:即一个镜像可以多个中间层组成,多个镜像可以共享同一中间层,我们也可以通过在镜像添加多一层来生成一个新的镜像。

镜像是只读的(read-only):镜像在构建完成之后,便不可以再修改,而上面我们所说的添加一层构建新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,因为容器是可以动态改变的。

通过下面的示意图,我可以更好地理解Docker镜像与Linux的关系:
图片

操作镜像的命令
Docker中与镜像操作相关的命令都在docker image这条子命令下,通过docker image --help这条命令,可以看到docker image子命令的详细文档,如下:

Usage: docker image COMMAND

Manage images

Commands:
build Build an image from a Dockerfile(构建镜像的命令)
history Show the history of an image(显示镜像构建历史过程)
import Import the contents from a tarball to create a filesystem image(导入一个由容器导出的镜像)
inspect Display detailed information on one or more images(显示一个镜像的详细信息)
load Load an image from a tar archive or STDIN(从一个文件或标准输入流中导入镜像)
ls List images(查看镜像列表)
prune Remove unused images(删除虚悬镜像)
pull Pull an image or a repository from a registry(从仓库拉取镜像)
push Push an image or a repository to a registry(推送镜像到仓库)
rm Remove one or more images(删除镜像)
save Save one or more images to a tar archive(streamed to STDOUT by default)(保存镜像到文件)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE(给镜像打标签)
获取镜像
在安装了Docker之后,我们本地并没有任何镜像,当然我们可以自己构建,不过更方便还是从Docker官方提供的仓库服务Docker Hub上拉取官方或第三方已经构建好的镜像。

拉取镜像可以使用docker image pull,其格式如下:

#docker pull [OPTIONS] NAME[:TAG|@DIGEST]

要拉取镜像,需要指定Docker Registry的URL和端口号,默认是Docker Hub,另外还需要指定仓库名和标签,仓库名和标签唯一确定一个镜像,而标签是可以省略,如果省略,则默认使用latest作为标签名。

所以,在省略了那么参数后,比如我们想拉取centos镜像,可以使用下面简单的命令从Docker Hub上拉到:

#docker pull centos

查看本地镜像
通过上面的方法我们将镜像拉取到了本地,那要如何查看本地有哪些镜像呢?通过下面的命令我们可以查看本地的全部镜像:

#docker images

镜像导出与导入
如果想与别人共享某个镜像,除了从镜像服务仓库中pull镜像和把镜像push到仓库上去之外,其实我们还可以将本地构建好的镜像直接导出并保存为文件发送给别人,如下:

#docker image save /tmp/test_image.tar.gz

而当你拿到别人导出的镜像文件,你可以使用docker load命令把镜像加载到本地的Docker镜像列表中,如下:

#docker load < /tmp/test_image.tar.gz

删除本地镜像
要删除一个或多个本地的镜像,可以使用下面的命令:

#docker rmi [option] IMAGE1,IMAGE2,…IMAGEn

可以使用镜像的长ID、镜像短ID、镜像摘要以及镜像名称来删除镜像,如下:

#docker rmi f7302e4ab3a8

使用镜像的摘要也可以删除镜像,镜像的摘要可以使用下面的命令查询:

#docker image ls --digests

另外,一般如果镜像已经被使用来创建容器,使用上面的命令删除会报下面的错误,告诉我们该镜像已经被使用,不允许删除。

Error response from daemon: conflict: unable to remove repository reference “mysql:5.7” (must force) - container ccd406c07a78 is using its referenced image e1e1680ac726

对于已经被用于创建容器的镜像,删除方法有两种,一种是先把容器删除,再删除镜像,另一种则只需要在删除镜像的命令中跟一个-f参数便可。

#docker rim -f f7302

使用docker commit构建镜像
上面的例子都是直接使用官方提供的镜像,其实,除了从官方仓库或其他镜像仓库拉取别人构建好的镜像外,我们也可以构建自己的镜像,一般有以下两种构建方式。

使用docker commit命令,我们可以将修改过的容器重新提交为一个镜像,如:

#docker commit conntaner_id name

使用这种方式构建的镜像,我们称为黑箱镜像,就是一个黑箱子一样,别人并不知道我们对容器做了哪些修改和操作,所以会对其安全性有所质疑。
所以不推荐使用这种方式构建镜像,下面我们介绍一种更加通用且方便的方式。

使用Dockerfile构建镜像
一般推荐编写Dockerfile来构建一种镜像,Docker Hub上的镜像都是采用这种方式构建的,采用这种方式的好处就是,我们不用把镜像分发给别人,而只是把Dockerfile和相应需要写入镜像的资料发给别人,别人也能自己构建镜像,安全透明。

编写Dockerfile文件

下面我们编写一个简单的Dockerfile文件,构建自己的第一个镜像,如下:

从一个空白的镜像开始

从一个空白的镜像开始

FROM httpd
ADD hello /

执行

CMD /hello
Dockerfile常用指令

开始构建镜像

编写好Dockerfile文件后,需要使用docker build命令进行构建,docker build命令的格式如下:

#docker build [OPTIONS] PATH | URL | -

上面只是简单演示了使用Dockerfile文件如何构建镜像,关于Dockerfile,还有许多更加深入地用法,我们之后有机再谈。

二、容器(Container)
因为容器是通过镜像来创建的,所以必须先有镜像才能创建容器,而生成的容器是一个独立于宿主机的隔离进程,并且有属于容器自己的网络和命名空间。
我们前面介绍过,镜像由多个中间层(layer)组成,生成的镜像是只读的,但容器却是可读可写的,这是因为容器是在镜像上面添一层读写层(writer/read layer)来实现的,如下图所示:

操作容器的相关命令
Usage: docker container COMMAND

Manage containers

Commands:
attach Attach local standard input, output, and error streams to a runnin g container
commit Create a new image from a container’s changes(把容器保存为镜像)
cp Copy files/folders between a container and the local filesystem
create Create a new container(创建一个新的容器)
diff Inspect changes to files or directories on a container’s filesyste m
exec Run a command in a running container(在一个运行的容器中执行命令)
export Export a container’s filesystem as a tar archive
inspect Display detailed information on one or more containers
kill Kill one or more running containers(杀死一个或多个正在运行的容器)
logs Fetch the logs of a container
ls List containers(显示本地容器列表)
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
prune Remove all stopped containers
rename Rename a container(重命名容器)
restart Restart one or more containers(重启一个或多个容器)
rm Remove one or more containers(删除一个或多个容器)
run Run a command in a new container(运行一个新的容器)
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers(停止一个或多个容器)
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes

启动容器
启动容器有几种不同的方式,最常用的方法是使用docker run命令可以通过镜像创建一个容器,如:

/bin/bash表示运行容器后要执行的命令

#docker run -it centos /bin/bash

docker run命令有一些比较常用的参数,比如容器是一种提供服务的守护进程,那么通常需要开放端口供外部访问,如:

#docker run -p 80:80 nginx

也可以为容器指定一个名称,如:

#docker run -p 80:80 --name zhangshan nginx

另外一种则是使用docker start命令重新启动已经停止运行的容器,如:

container_id表示容器的id

#docker start container_id

而对于正在运行的容器,也可以通过docker restart命令重新启动,如:

container_id表示容器的id

#docker restart container_id

查看本地容器列表
运行容器后,我们可以通过下面的命令查看本地所有容器:

#docker container ls

不过docker container ls也简洁的写法:

#docker ps

上面命令执行结果如下:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4f184f5ffb9 redis:latest “docker-entrypoint.s…” 6 seconds ago Up 4 seconds 0.0.0.0:6379->6379/tcp myredis
f7d970e7d4ce mysql:5.7 “docker-entrypoint.s…” 7 seconds ago Up 5 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp docker-mysql

上面的命令只会显示正在运行的容器,如果要显示全部容器,包含退出执行的,可以加参数-a,如:

#docker ps -a

有时候,我们只想查到容器的ID,可以用下面的命令:

#docker ps -aq

执行结果:

f4f184f5ffb9
f7d970e7d4ce

停止容器
对于已经不需要的容器,可以使用docker stop命令停止其运行,如:

#docker stop container_id

批量停止容器,如:

#docker stop $(docker ps -qa)

容器的三种运行模式
概括而言,Docker容器大体上有三种运行模式,如下:

运行后退出

下面语句创建的容器,在运行后会退出。

#docker run centos echo “hellowrold”

常驻内存,就是守护进程的模式

如果容器中运行一个守护进程,则容器会一直处于运行状态,如:

#docker run -d -p 80:80 nginx

交互式

我们也可以在运行容器时,直接与容器交互。

#docker run -it centos /bin/bash

删除容器
#docker container rm container_id

删除容器的命令也有简洁的写法,如下:

#docker rm container_id

也可以像上面批量停止容器一样,我们也可以批量删除容器,如:

#docker rm $(docker ps -qa)

进入容器
对于正在运行的容器,我们也可以通过docker exec命令再次进入容器,如:

#docker exec -it container_id /bin/bash

需要指定容器的id或name,上面的命令我们用的是ID。

导出容器为镜像
#docker export -o ./image.tar.gz container_id

将容器导出后,我们可以另外一台有安装Docker的电脑中将文件包导入成为镜像,如:

#docker import image.tar.gz

上面讲的是容器的概念和一些常用的命令,关于容器,还可以设置数据卷和网络空间,这些我们有机会后面再谈。

三、仓库(Repository)
仓库(Repository)是集中存储镜像的地方,这里有个概念要区分一下,那就是仓库与仓库服务器(Registry)是两回事,像我们上面说的Docker Hub,就是Docker官方提供的一个仓库服务器,不过其实有时候我们不太需要太过区分这两个概念。

公共仓库
公共仓库一般是指Docker Hub,前面我们已经多次介绍如何从Docker Hub获取镜像,除了获取镜像外,我们也可以将自己构建的镜像存放到Docker Hub,这样,别人也可以使用我们构建的镜像。
不过要将镜像上传到Docker Hub,必须先在Docker的官方网站上注册一个账号,注册界面如下,按要求填写必要的信息就可以注册了,很简单的。

注册好了之后,可以在本地使用命令登录到Dokcer Hub了,过程如下:

在命令行中输入

#docker login

在输入账号密码登录到Docker Hub之后,便可以使用docker push命令把镜像推送到Docker Hub。

#docker push test:1.0

私有仓库
有时候自己部门内部有一些镜像要共享时,如果直接导出镜像拿给别人又比较麻烦,使用像Docker Hub这样的公共仓库又不是很方便,这时候我们可以自己搭建属于自己的私有仓库服务,用于存储和分布我们的镜像。

Docker官方提供了registry这个镜像,可以用于搭建私有仓库服务,我们把镜像拉到本地之后,用下面命令创建该镜像的容器便可以搭建一个仓库服务,如下:

#docker run -d -p 5000:5000 --restart=always --name registry registry

假设我们把一台IP为192.168.0.00的服务器作为仓库服务,并运行上面的语句,那么我们可以下面的语句重新构建上面的镜像,如:

#docker build -t “192.168.0.100/hello-go:1.0” .

然后使用下面的语句推送到自己的私有仓库服务器:

#docker push 192.168.0.100/hello-word:1.0

相关文章:

很高兴开始博客之旅

来到博客园&#xff01;&#xff0c;开启我的博客之旅&#xff0c;感觉棒棒哒转载于:https://www.cnblogs.com/pbnull/p/4562230.html

Android Studio Day02-2

AndroidDay02-2&#xff08;AVD&#xff09; Android APP编译的过程之中总是会需要进行相应的功能的调试&#xff0c;以及界面的布局设置在不同手机上的效果的展示。相应的Android平台都包含有Android虚拟设备管理器&#xff0c;Android虚拟设备管理器允许用户自己创建自己的虚…

网络增强现实开发简介 Introduction to Web AR development

搭配webXR、mindAR、three.js和tensorflow.js 你会学到: 获得构建不同类型的网络增强现实应用程序的实践经验&#xff0c;包括图像效果、人脸效果和世界效果 获得关于增强现实如何在网络浏览器中工作的基本理解 掌握使用WebXR、mind-ar-js和threejs构建web AR应用程序 学习使用…

umi脚手架搭建的项目_15天零成本搭建静态博客,托管于Github Page

博客地址技术栈概览前台&#xff1a;Umi(路由) Antd(视图) TypeScript(增加项目可维护性以及规范性)后台&#xff1a;Umi(路由) Antd(视图) TypeScript(增加项目可维护性以及规范性) Rematch(数据管理)服务&#xff1a;Egg.js(基于koa的下一代企业级应用框架) MongoDB搭建…

[maven] 使用问题及思考汇总

&#xff08;1&#xff09;Maven坐标 maven坐标可以唯一标识一个项目&#xff0c;包含四个元素 groupId , artifactId, packaging, version。 groupId&#xff1a;一般为团体,公司,项目。如 oceanic-web, oceanic-dal, oceanic-biz 同属一个 groupId。 artifactId&#xff1a;在…

VS调试时提示此项目已经过期

问题出因&#xff1a; 1.先前卸载VS重新安装时不全面 解决办法&#xff1a; 1.VS应安装两个C的组件 2.首先在“生成”-》 “生成解决方案”完成编译&#xff0c;问题解决。

(DBA之路【五】)关于锁的故事

首先很抱歉&#xff1a;这篇文章我其实整合了很多别人的文章&#xff0c;但是因为太多&#xff0c;一开始被没留意出处所以很难声明来源&#xff0c;很抱歉&#xff0c;但是这篇文章只用来作为学习笔记&#xff0c;作为新手&#xff0c;我以后会注意的。&#xff08;一&#xf…

Android Studio Day03-1(Android studio 系统界面简介)

IDE&#xff08;integrated Development Environment&#xff09;的主要的目的就是用来编辑文本的。 在界面中的分布如下&#xff08;以下的两张图片均为的《Android studio实战快速高效地构建Android应用》一书中的&#xff09;

全流程游戏模型制作学习教程

尤金彼得罗夫|时长:36小时 |视频:H264 19201080 |音频:AAC 44&#xff0c;1 kHz 2ch |大小解压后 35 GB 含课程文件 |语言:英语 (无字幕&#xff0c;) 在本教程中&#xff0c;我将介绍为现代FPS视频游戏创建游戏就绪武器资产的整个过程。我将展示我的工作管道&#xff0c;使用…

requirednew基于xml配置日志不回滚_Elasticsearch配置IK分词器的远程词库

在生活中很多很多地方都涉及到了全文检索&#xff0c;最常见的就好比日常使用到的百度搜索等搜索引擎&#xff0c;也都是基于全文检索来实现的&#xff1b;全文检索种类较多&#xff0c;就好比Elasticsearch、Sorl等。为Ealsticsearch配置词库&#xff0c;可以很好的解决生活中…

PS切图篇(一)---界面设置

#工作区设置 四大主要面板&#xff1a;信息 字符 图层 历史记录 打开必要属性&#xff1a; 选择工具设置 选择图层的方式&#xff1a;ctrl鼠标左击想选择的图层转载于:https://www.cnblogs.com/yinzf/p/5339873.html

简单解决用VS编写hello world时命令行一闪而过

一、在return 0;前一行加一个getchar(); 二、使用项目模板为 windows 桌面向导 c 3、命令行控制台一闪而过。这是我们使用空文件夹加载的项目&#xff0c;默认不是控制台应用程序&#xff0c;新建控制台程序&#xff0c;或者在代码中加入system(“pause”);这种通过代码人为的…

粒子群算法(1)----粒子群简要

一、历史粒子群算法从复杂适应系统衍生PSO算法&#xff08;Complex Adaptive System,CAS&#xff09;。CAS理论于1994年正式提出&#xff0c;CAS中的成员称为主体。比方研究鸟群系统&#xff0c;每一个鸟在这个系统中就称为主体。主体有适应性&#xff0c;它能够与环境及其它的…

Android Studio Day03-2(常用操作)

&#xff08;1&#xff09;选择文本 1.CtrlA 选中全文 2.在将光标置于任意的单词中时按住CtrlW&#xff0c;选中整个词 继续按CtrlW 选中的区域将扩大&#xff0c;扩大至包含任意数量的相邻的单词 按CtrlwShift 进行区域的缩小 &#xff08;2&#xff09;Undo和Redo&…

Blender数字雕刻终极指南学习教程

CGBoost–Blender中的3D雕刻大师–数字雕刻终极指南 大小&#xff1a;29G 含课程项目文件 Master 3D Sculpting in Blender – The Ultimate Guide to Digital Sculpting 本课程教你所有重要的Blender雕刻基础知识&#xff0c;以及如何仅使用免费工具从头开始创建令人惊叹的3D雕…

生产指挥调度系统_市安全生产应急救援指挥中心将大型装载机械设备储备信息纳入应急指挥调度系统...

为拓展应急救援力量体系&#xff0c;发挥社会力量在开展全市重特大突发事件应急救援中的重要作用&#xff0c;近日&#xff0c;市安全生产应急救援指挥中心在加强应急指挥信息平台“一网七库”建设的基础上&#xff0c;成功对接甘肃省非道路移动机械监管平台&#xff0c;做到数…

java.sql.Exception:setString 只能处理少于 32766 个字符的字符串

java.sql.Exception:setString 只能处理少于 32766 个字符的字符串 解决方式是 : 升级ojdbc的版本, 将原来的 ojdbc14_10.2.0.2.0.jar 升级到 ojdbc6_11.2.0.1.0.jar这边行方用的是 oracle版本是 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0maven 安装到本地…

无需自己输入include这些的方法

使用项目模板为 windows 桌面向导 c 不用空白项 直接默认 不用勾选其他

第二次团队冲刺2

实现了查询的webservice服务端&#xff0c;做了查询时等待界面&#xff0c;对查询速度做了一点优化。 还写了一个入馆须知模块&#xff0c;介绍图书馆借阅规则。 还有借阅个人信息没做出来&#xff0c;还没进行界面优化。 转载于:https://www.cnblogs.com/318abc/p/4569576.htm…

Android StudioDay03-3(键盘导航)

Android Studio Day03-3(键盘导航) (1)打开Select In 快捷键&#xff1a;altF1 如下图&#xff1a; &#xff08;2&#xff09;打开Class CtrlN Class操作允许用后导航到特定的JAVA类&#xff09;&#xff0c;因此此操作也只能在Java文件中使用。 Android studio已…

虚幻中的风格化环境制作学习教程

Learn Squared-Tyler Smith-虚幻中的风格化环境 信息: 像AAA游戏开发者一样在虚幻引擎中创建风格化的环境。行业领先的游戏艺术家泰勒史密斯将教你在虚幻引擎中构建美丽的实时世界的规划、构建、集成和优化阶段使用多种巧妙的技术。 大小解压后&#xff1a;22G 时长6h 13m 19…

【转】oracle PLSQL基础学习

【转】oracle PLSQL基础学习 --oracle 练习&#xff1b;/**************************************************PL/SQL编程基础***************************************************************/--firstday--》》》数据类型-- Create tablecreate table T_CSCUSTOMER( CUST_NO…

python如何创建不同元素的矩阵_python – 如何在数据帧中创建矩阵元素的数...

我在.TXT文件中有3个参数’A’,’B’,’C’的数据集,在我用2420矩阵打印后,我需要收集’A’,’B’,’C’的第一个元素熊猫数据帧中的长数组,然后是每个第二个元素,然后是第3个,直到第480个元素为止. 所以我的数据在文本文件中是这样的&#xff1a; 我的数据是txt文件如下&#…

wps多窗口打开

在wps中打开wps文档不在一个窗口的方法如下&#xff1a; 1、启动wps文档&#xff0c;点击wps文字→选项&#xff0c;在弹出的选项对话框点击视图选项卡&#xff0c;勾选 在任务栏中显示所有窗口&#xff1b;

RHEL7.0系列 修改字符终端分辨率

由于是在VM里面安装的&#xff0c;完了之后终端界面的分辨率非常高&#xff0c;很难操作 因为RHEL7用了grub2&#xff0c;而不再是grub了&#xff0c;在grub2中要修改的文件是/boot/grub2/grub.cfg; 这里有一张分辨率的对照表&#xff08;在grub.cfg中添加vgaask,系统重启后就会…

Java Day01-1

1.JAVA语言介绍 &#xff08;1&#xff09;特点&#xff1a;可移植性&#xff0c;平台无关性&#xff0c;面相对性&#xff0c;健壮性&#xff0c;分布式&#xff0c;多线程 &#xff08;2&#xff09;版本&#xff1a;JavaSE&#xff08;标准版&#xff09;、JavaME&#xf…

Autocad 3D 完全学习教程

Autocad 3D 完全学习教程 你会学到什么 如何使用AutoCAD三维基本特征 了解如何在AutoCAD中创建和开发三维模型 准备实体、网格和曲面几何图形 不同的命令2d和3D 要求 不需要事先了解 18章 63节讲座 全长5小时7分 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译…

[转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

首先这是现在最基本的分层方式&#xff0c;结合了SSH架构。modle层就是对应的数据库表的实体类。Dao层是使用了Hibernate连接数据库、操作数据库&#xff08;增删改查&#xff09;。Service层&#xff1a;引用对应的Dao数据库操作&#xff0c;在这里可以编写自己需要的代码&…

springmvc工作流程简单易懂_三极管的结构和工作特性,简单易懂

今天&#xff0c;我们来认识另一种十分重要的半导体器件&#xff1a;三极管。生活中&#xff0c;授课、集会、维持秩序等场合需要用到扩音器、音响等设备&#xff0c;这些设备之所以能够放大声音是因为它们都包含放大器&#xff0c;而放大器的核心部件就是三极管。那三极管究竟…

多个excel文件(内含多个工作表)查找

1.在父目录查找处输入关键词 2.将找到的文件进去查找-工作簿