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

Docker镜像与容器常用命令图文详解

一文搞懂dock

一.系统命令

  1. #查看docker版本

  2. docker version

  3. #查看docker的系统信息,包含镜像容器的数量

  4. docker info

  5. #查看docker的所有命令

  6. docker --help

  7. #查看该docker命令的帮助信息

  8. docker 命令 --help

二.镜像命令:

1 .镜像是什么?

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件

(1): UnionFS(联合文件系统)

UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Dokcer镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统加载起来,这样最终的文件系统会包含所有的底层文件和目录

(2): Docker镜像加载原理

docker的镜像实际上是由一层一层的文件系统构成,这种层级的文件系统UnionFS。

主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的linux/unix系统是一样的,包含boot加载器内核。当boot加载完之后整个内核就都在内存中了,此时内存的使用权已经由bootfs交给内核了,此时系统也会卸载bootfs

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M。

一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就行,因为底层直接用host和kernel,自己只需要提供rootfs就行。由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以用bootfs。

(3): 分层的镜像

以pull为例,在下载的过程中我么可以看到docker的镜像好像是在一层一层的下载

(4): 为什么Docker镜像要采用这种分层的结构

最大一个好处就是——共享资源

比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也需要加载一份base镜像,就可以为所有服务器服务了。而且镜像的每一层都可以被共享。

(5): 特点

  • docker镜像都是只读的

    • 当容器启动时,一个新的可写层被加载到镜像的顶部。

  • 这一层通常被称作“容器层”,“容器层”之下都叫“镜像层”

所有的docker镜像都源自于基础镜像层,当我们进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。举一个简单的例子,假如基于Ubuntu Linux16.04创建一个新的镜像,这就是新镜像的第一层;如果在新镜像中添加Python包,就会在基础镜像层上创建第二个镜像层;如果继续添加一个安全补丁,就会添加第三个镜像层。如下图:

2.查看本机镜像:

  1. #查看本机所有镜像

  2. docker images [可选命令]

从下图我们可以看到镜像的信息,

每个标签的含义如下:

标签含义
REPOSITORY来自于哪个仓库,比如 ubuntu
TAG镜像的标签,TAG 信息用来标记来自同一个仓库的不同镜像,例如 ubuntu 仓库中有多个镜像,通过 TAG 信息来区分发行版本,例如 10.04、12.04、12.10、13.04、14.04 等。
IMAGE ID镜像的唯一id,如果镜像的id相同,说明它们实际上是同一镜像。
CREATED镜像的创建时间
SIZE镜像的大小

命令可选项讲解:

参数描述
-a, —all显示所有镜像 all可以简写成-a,也就是说 -a ,—all都能显示所有镜像
-f, —filter根据所提供的条件过滤输出
-q只显示镜像的id

可选参数用法:

  1. #显示所有镜像

  2. docker images -a

  3. #显示所有镜像,但是只展示镜像id

  4. docker images -aq

3.搜索镜像:

  1. docker search

搜索结果如下:

每个标签的含义如下:

  1. NAME #名称

  2. DESCRIPTION #描述

  3. STARS #相当于GitHub的STARS,表示受欢迎程度

  4. OFFICIAL #是否为官方的

  5. AUTOMATED #自动构建,表示该镜像由Docker Hub自动构建流程创建的

可选项:

  1. -f, --filter filter 根据所提供的条件过滤输出


  2. #例如:搜索仓库中镜像中mysql STARS大于1000的

  3. docker search mysql --filter=STARS=1000

4.下载镜像:

  1. docker pull 镜像名[:tag]


  2. #运行效果:

  3. [root@iZwz94ro78u8c5qdlixltzZ /]# docker pull mysql

  4. Using default tag: latest #如果不写tag,默认为latest

  5. Trying to pull repository docker.io/library/mysql ...

  6. latest: Pulling from docker.io/library/mysql

  7. 8559a31e96f4: Pull complete #分层下载,docker镜像的核心

  8. d51ce1c2e575: Pull complete #分层下载,docker镜像的核心

  9. c2344adc4858: Pull complete

  10. fcf3ceff18fc: Pull complete

  11. 16da0c38dc5b: Pull complete

  12. b905d1797e97: Pull complete

  13. 4b50d1c6b05c: Pull complete

  14. c75914a65ca2: Pull complete

  15. 1ae8042bdd09: Pull complete

  16. 453ac13c00a3: Pull complete

  17. 9e680cd72f08: Pull complete

  18. a6b5dc864b6c: Pull complete

  19. Digest: sha256:8b7b328a7ff6de46ef96bcf83af048cb00a1c86282bfca0cb119c84568b4caf6 #签名

  20. Status: Downloaded newer image for docker.io/mysql:latest #状态

我们可以看到第二句:
Using default tag: latest 不加参数,默认为下载最新版本

指定镜像版本下载:

  1. docker pull mysql:5.7


  2. 运行效果:

  3. [root@iZwz94ro78u8c5qdlixltzZ /]# docker pull mysql:5.7

  4. Trying to pull repository docker.io/library/mysql ...

  5. 5.7: Pulling from docker.io/library/mysql

  6. 8559a31e96f4: Already exists #共用文件,无需下载,节省资源,得益于docker联合文件系统

  7. d51ce1c2e575: Already exists #共用文件,无需下载

  8. c2344adc4858: Already exists #共用文件,无需下载

  9. fcf3ceff18fc: Already exists #共用文件,无需下载

  10. 16da0c38dc5b: Already exists #共用文件,无需下载

  11. b905d1797e97: Already exists #共用文件,无需下载

  12. 4b50d1c6b05c: Already exists #共用文件,无需下载

  13. d85174a87144: Pull complete

  14. a4ad33703fa8: Pull complete

  15. f7a5433ce20d: Pull complete

  16. 3dcd2a278b4a: Pull complete

  17. Digest: sha256:32f9d9a069f7a735e28fd44ea944d53c61f990ba71460c5c183e610854ca4854

  18. Status: Downloaded newer image for docker.io/mysql:5.7

该版本需要在docker仓库中存在,点击传送仓库地址:

查看下载的镜像:

mysql镜像下载成功~

5.删除镜像:

  1. docker rmi [id或者名称]

  2. #rm linux中的删除命令 i代表为镜像

  3. #rmi 删除镜像

例如根据名字删除镜像:

  1. docker rmi 镜像名

根据id删除:

  1. #删除指定id的容器

  2. docker rmi imageID

  3. #删除指定id的多个容器:

  4. docker rmi imageID imageID imageID

6.通过$()表达式删除镜像:

  1. #删除全部的容器

  2. docker rmi $(docker images -aq)

  3. #命令详解

  4. #docker rmi 删除镜像

  5. #$(docker images -aq) 查询所有镜像id a查询所有 q查询镜像id

  6. #可以使用$()来查询,当做参数传递,然后递归删除所有.

已经全部删除:

三.容器命令:

我们有了镜像才能创建容器,接下来我们下载一个CentOS镜像来创建一个容器:
下载镜像:

  1. docker pull centos

效果如下:

1.新建容器并启动:

  1. docker run [可选参数] 镜像名

  2. #常用可选参数讲解:

  3. --name="name" 给运行的容器起个名字,用来区分容器

  4. -d 后台运行,相当于nohup

  5. -it 使用交互方式,可以进入容器,以便查看内容

  6. -p 指定容器运行的端口

  7. -p 四种使用方式:

  8. 1. -p 主机端口:容器端口 主机端口映射到容器端口 ▲常用

  9. 2. -p 容器端口 不做映射处理

  10. 3. 直接写容器端口

  11. 4. -p ip:主机端口:容器端口


  12. -P 大写p,随机指定端口

接下来让我们使用命令试一下:

  1. docker run -it centos /bin/bash

  2. #命令解释:

  3. docker run 启动

  4. -it 进入容器,并以交互方式运行

  5. centos 镜像名

  6. /bin/bash 进入bash shell以实现交互

2.后台启动容器:

  1. docker run -d 镜像名


我们会发现一个问题,应用在后台启动之后,我们通过docker ps查看正在运行的容器,发现没有正在运行的,也就是说,容器停止了.但是我们不是以后台的形式启动了一个吗?
原因:
1、docker容器运行必须有一个前台进程, 如果没有前台进程执行,那么容器会被认为空闲,就会自行退出
2、容器运行的命令如果不是那些一直挂起的命令( 运行top,tail、循环等),就是会自动退出
这种情况一般会发生在容器中没有服务的情况,如果容器中一直运行着tomcat,那么就不会出现这种情况了.

3.退出容器:

  1. exit #停止容器,并且退出

  2. Ctrl + P + Q 快捷键 退出容器但不停止容器

4. 查看正在运行的容器:

  1. #不加参数,显示当前正在运行的容器

  2. docker ps [可选参数]

可选参数详解:

参数作用
-a显示当前正在运行和曾经运行过的容器
-n int显示最近创建的容器,int 为显示个数.
-q只显示的id

5.删除容器:

  1. #删除指定的容器 不能删除正在运行的容器

  2. docker rm 容器id

  3. #删除所有容器

  4. docker rm -f $(docker ps -aq) #可以使用$()来查询,当做参数传递,然后递归删除所有.

  5. #通过管道命令删除所有容器,此处不做演示

  6. docker ps -a -q | xargs docker rm

6.启动,重启,停止容器:

命令作用
docker start 容器id启动容器
docker restart 容器id重启容器
docker stop 容器id停止当前正在运行的容器
docker kill 容器id强制停止当前容器

扩展:

  1. docker ps -aq // 查看所有容器ID

  2. docker stop $(docker ps -aq) // stop停止所有容器

  3. docker rm $(docker ps -aq) // remove删除所有容器

  4. docker stop $(docker ps -q) & docker rm $(docker ps -aq) //一次性停止删除容器

7.查看容器日志:

  1. #语法:

  2. docker logs [OPTIONS] CONTAINER


  3. Options:

  4. --details 显示更多的信息

  5. -f, --follow 跟踪实时日志

  6. --since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)

  7. --tail string 从日志末尾显示多少行日志, 默认是all

  8. -t, --timestamps 显示时间戳

  9. --until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

  10. #例子:

  11. #实时加时间戳显示名字为centos的最近一百条日志

  12. docker logs -f -t --tail 100 centos

  13. #拆分解析:

  14. docker logs 显示日志

  15. -f 显示实时日志

  16. -t 显示时间戳

  17. --tail 100 显示一百条日志

8.查看容器中的进程:

  1. #语法

  2. docker top CONTAINER

9.获取容器/镜像的元数据:

  1. #语法:

  2. docker inspect [OPTIONS] NAME|ID [NAME|ID...]


  3. OPTIONS说明:


  4. -f :指定返回值的模板文件。


  5. -s :显示总的文件大小。


  6. --type :为指定类型返回JSON

10.进入正在运行的容器:

①: 第一种:

  1. #语法

  2. docker exec [OPTIONS] CONTAINER COMMAND [ARG...]


  3. OPTIONS说明:


  4. -d :分离模式: 在后台运行


  5. -i :即使没有附加也保持STDIN 打开


  6. -t :分配一个终端


  7. #例子:

  8. docker exec -it 1e685cda7bf4 /bin/bash

效果如下:

②: 第二种:

  1. #语法:

  2. docker attach [OPTIONS] CONTAINER

  3. 连接到正在运行中的容器,本机的输入直接输到容器中,容器的输出会直接显示在本机的屏幕上,但需要容器处于运行状态.

两者区别:

  1. docker exec 进入容器之后,开启一个新的终端,

  2. docker attach 进入容器正在执行的终端.

11.拷贝文件:

①: 从容器中拷贝内容到主机:

  1. 语法:

  2. #即使容器不处于运行状态也能从中拷贝文件,但容器必须存在,不能被移除.

  3. docker cp 容器id:容器内路径 目的地主机路径

②: 从主机中中拷贝内容到容器:

  1. docker cp 主机目录 容器id:容器目录

12.commit提交镜像

此处以tomcat举例:
首先我们下载一个tomcat镜像,

  1. docker pull toncat

启动tomcat

  1. docker run -d -p 8080:8080 tomcat

测试访问:

发现tomcat中什么都没有,404错误.

但是,我们知道,tomcat Windows版本或者linux版本,是有默认页面的,如下:

其实,docker中tomcat镜像也存在默认页面,我们打开镜像查看目录:

会发现一个名为:webapps.dist的文件夹,此处便是tomcat 的欢迎页在里面.我们将这里所有的文件都拷贝到webapps中,重新访问:

发现欢迎页可以打开了,那我们怎么将我们修改过的tomcat制作一个镜像呢?

  1. #容器成为一个新的镜像

  2. docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[tag]

查询是否成功:

  1. docker images

以后我们想保存容器的状态,可以通过commit来提交,保存为一个新的镜像

四.综合使用:

  1. #1.搜索镜像

  2. docker search Image

  3. #2.下载镜像

  4. docker pull Image

  5. #3.启动容器

  6. docker run

  7. #4.命名容器

  8. --name string

  9. #5.映射端口

  10. -p 主机端口:容器端口

附:docker命令思维导图:




推荐阅读
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
author-avatar
横着走觉察生活_915
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有