史上最全docker基础知识汇总
正文
Docker常用命令
run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-e设置环境变量;-e username=zhj
--name为容器指定一个名称;--name=zhj
-p指定端口映射,格式为:主机(宿主)端口:容器端口 -p 80:8080
-t为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-i以交互模式运行容器,通常与 -t 同时使用;
-d后台运行容器,并返回容器ID;
-v宿主机目录:容器目录。将宿主机目录挂载到容器内。
docker cp
复制容器内的文件到宿主机
docker start
启动一个或多个已经被停止的容器
docker stop
停止一个运行中的容器
docker restart
重启容器
docker rm
删除容器
docker pause
暂停容器中所有的进程;
docker unpause
恢复容器中所有的进程;
docker exec :
在运行的容器中执行命令
docker exec -it mynginx /bin/sh /root/runoob.sh
docker logs
获取容器的日志;
docker ps
列出UP的容器;docker ps -a列出所有容器。包括Exited等状态的容器;
docker top
查看容器中运行的进程信息,支持 ps 命令参数;
docker inspect
获取容器/镜像的元数据;
docker login
登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub;
docker logout
登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub;
docker tag
标记本地镜像,将其归入某一仓库;
docker push
将本地的镜像上传到镜像仓库,要先登陆到镜像仓库;
docker pull
从镜像仓库中拉取或者更新指定镜像;
docker search
从Docker Hub查找镜像;
docker images
列出本地镜像;
docker rmi
删除本地一个或多少镜像;
docker build
命令用于使用 Dockerfile 创建镜像。
docker build -t runoob/ubuntu:v1 .
会默认使用当前目录的Dockerfile进行编译镜像,编译后的镜像名为runoob/ubuntu:v1
docker history
查看指定镜像的创建历史
docker history runoob/ubuntu:v3
docker save
将指定镜像保存成 tar 归档文件。
docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
docker load
导入使用 docker save命令导出的镜像。
docker load -i my_ubuntu_v3.tar
-i参数指定输入的文件。
docker info
显示 Docker 系统信息,包括镜像和容器数。
docker version
显示 Docker 版本信息。
Docker的存储驱动
Docker支持AUFS、Btrfs、Device mapper、OverlayFS、ZFS五种存储驱动;
写时复制(CoW)
所有驱动都用到的技术——写时复制(CoW)。CoW就是copy-on-write,表示只在需要写时才去复制,这个是针对已有文件的修改场景。比如基于一个image启动多个Container,如果为每个Container都去分配一个image一样的文件系统,那么将会占用大量的磁盘空间。而CoW技术可以让所有的容器共享image的文件系统,所有数据都从image中读取,只有当要对文件进行写操作时,才从image里把要写的文件复制到自己的文件系统进行修改。写操作会在每个容器的文件系统里生成一个复本,每个容器修改的都是自己的复本,相互隔离,相互不影响。使用CoW可以有效的提高磁盘的利用率。
用时分配(allocate-on-demand)
而写时分配是用在原本没有这个文件的场景,只有在要新写入一个文件时才分配空间,这样可以提高存储资源的利用率。比如启动一个容器,并不会为这个容器预分配一些磁盘空间,而是当有新文件写入时,才按需分配新空间。
Overlay VS Device mapper
devicemapper将所有的镜像和容器存储在自己的虚拟块设备上,所有的操作都是直接对块进行操作,而不是文件。当要写入一个新文件时,在容器的镜像内为其分配新的块并写入数据,这个叫用时分配。当要修改已有文件时,再使用CoW为容器快照分配块空间,将要修改的数据复制到在容器快照中新的块里再进行修改。
overlay是基于文件级的存储。只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层。当需要修改一个文件时,使用CoW将文件从只读的lower复制到可写的upper进行修改,结果也保存在upper层。
Overlay是文件级存储,Device mapper是块级存储,当文件特别大而修改的内容很小,Overlay不管修改的内容大小都会复制整个文件,对大文件进行修改显示要比小文件要消耗更多的时间,而块级无论是大文件还是小文件都只复制需要修改的块,并不是整个文件,在这种场景下,显然device mapper要快一些。因为块级的是直接访问逻辑盘,适合IO密集的场景。而对于程序内部复杂,大并发但少IO的场景,Overlay的性能相对要强一些。
Overlay VS Overlay2
overlay驱动只工作在一个lower OverlayFS层之上,因此需要硬链接来实现多层镜像,但overlay2驱动原生地支持多层lowerOverlayFS镜像(最多128层)。因此overlay2驱动在合层相关的命令(如build和commit)中提供了更好的性能,与overlay驱动对比,消耗了更少的inode。
Docker的网络模式
可以看:[docker的五种网络模式总结]
https://blog.csdn.net/u010900754/article/details/78526443
安装 Docker 时,它会自动创建 3 个网络。可以使用 docker network ls命令列出这些网络。
这 3 个网络包含在 Docker 实现中。运行一个容器时,可以使用 the --net标志指定您希望在哪个网络上运行该容器。您仍然可以使用这 3 个网络。
bridge 网络表示所有 Docker 安装中都存在的 docker0 网络。除非使用docker run --net=选项另行指定,否则 Docker 守护进程默认情况下会将容器连接到此网络。在主机上使用 ifconfig命令,可以看到此网桥是主机的网络堆栈的一部分。
none 网络在一个特定于容器的网络堆栈上添加了一个容器。该容器缺少网络接口。
host 网络在主机网络堆栈上添加一个容器。容器中的网络配置与主机相同。可以通过主机IP访问,端口也会使用主机端口。所以主机端口不能被占用,否则容器启动会有问题。
Dockerfile知识点
ENV
设置环境变量指令,用法
ENV WORKPATH /tmp
也可以这样:
ENV abc=bye def=$abc
第一种用法用于设置单个变量(第一个空格前为key,之后都是value,包括后面的空格),第二种用于同时设置多个变量(空格为分隔符,value中包含空格时可以用双引号把value括起来,或者在空格前加\反斜线),当需要同时设置多个环境变量时推荐使用第二种格式。这些环境变量可以通过docker run命令的--env参数来进行修改。
ENV用法如下:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy
FROM
设置基础镜像,一个有效的Dockerfile必须有一个FROM指令指定一个基础镜像,这个镜像可以是任何你可以从共用仓库获取到的镜像。执行命令格式
FROM <image>
或者
FROM <image>:<tag>
或者
FROM <image>@<digest>
MAINTAINER
设置创建镜像的作者信息。
MAINTAINER zhanghaojie@qq.com
RUN
这个指令有两种格式.
第一种形式:
RUN chown user2:user2 /home/webapi (以shell形式执行命令,等同于/bin/sh -c);
第二种形式:
RUN ["executable","param1", "param2"]
(等同于exec命令形式),注意此处必须是双引号("),因为这种格式被解析为JSON数组。
ARG
ARG <name>[=<default value>]
ARG指令设置一些创建镜像时的参数,这些参数可以在执行docker build命令时通过--build-arg =设置,如果指定的创建参数在Dockerfile中没有指定,创建时会输出错误信息: One or more build-args were not consumed, failing build.
Dockerfile 作者可以为ARG设置一个默认参数值,当创建镜像时如果没有传入参数就会使用默认值:
FROM busybox
我们可以使用ARG或者ENV指令来指定RUN指令使用的变量。我们可以使用ENV定义与ARG定义名称相同的变量来覆盖ARG定义的变量值。如下示例,我们执行
docker build --build-arg CONT_IMG_VER=v2.0.1 Dockerfile
后将获取到的CONTIMGVER变量值为v1.0.0:
FROM ubuntu
WORKDIR
WORKDIR /path/to/workdir
WORKDIR指令用来设置Dockerfile中任何使用目录的命令的当前工作目录,此目录如果不存在就会被自动创建,即使这个目录不被使用
VOLUME
VOLUME ["/data"] (exec格式指令)
VOLUME指令创建一个可以从本地主机或其他容器挂载的挂载点。经常用到的是
docker run -ti -v /data:/data nginx:1.12 bash
时指定本地路径和容器内路径的映射。
COPY
COPY指令能够将构建命令所在的主机本地的文件或目录,复制到镜像文件系统。
exec格式用法(推荐):
COPY ["<src>",... "<dest>"]
特别适合路径中带有空格的情况。
shell格式用法:
COPY <src>... <dest>
ADD
ADD指令不仅能够将构建命令所在的主机本地的文件或目录,而且能够将远程URL所对应的文件或目录,作为资源复制到镜像文件系统。
所以,可以认为ADD是增强版的COPY,支持将远程URL的资源加入到镜像的文件系统。
exec格式用法(推荐):
ADD ["<src>",... "<dest>"]
特别适合路径中带有空格的情况。
shell格式用法:
ADD <src>... <dest>
说明,对于从远程URL获取资源的情况,由于ADD指令不支持认证,如果从远程获取资源需要认证,则只能使用RUN wget或RUN curl替代。
另外,如果源路径的资源发生变化,则该ADD指令将使Docker Cache失效,Dockerfile中后续的所有指令都不能使用缓存。因此尽量将ADD指令放在Dockerfile的后面。
参考:Dockerfile中的COPY和ADD指令详解与比较
https://blog.csdn.net/taiyangdao/article/details/73222601
EXPOSE指令
EXPOSE <端口> [<端口>...]
指令用于标明,这个镜像中的应用将会侦听某个端口,并且希望能将这个端口映射到主机的网络界面上。但是,为了安全,docker run命令如果没有带上响应的端口映射参数,docker并不会将端口映射到宿主机。
CMD 与 ENTRYPOINT
二者的区别看:[docker CMD ENTRYPOINT 区别 终极解读]
https://blog.csdn.net/u010900754/article/details/78526443
从根本上说, ENTRYPOINT和CMD都是让用户指定一个可执行程序, 这个可执行程序在container启动后自动启动. 实际上, 如果你想让自己制作的镜像自动运行程序(不需要在docker run后面添加命令行指定运行的命令), 你必须在Dockerfile里面,使用ENTRYPOINT或者CMD命令。在命令行启动docker镜像时, 执行其他命令行参数,覆盖默认的CMD。和CMD类似, 默认的ENTRYPOINT也在docker run时, 也可以被覆盖. 在运行时, 用--entrypoint覆盖默认的ENTRYPOINT。
dockerfile中的CMD命令被覆盖:
CMD:提供了容器默认的执行命令。Dockerfile 只允许使用一次 CMD 指令。使用多个 CMD 会抵消之前所有的指令,只有最后一个指令生效。CMD 有三种形式:
CMD ["executable","param1","param2"] (exec form, thisis the preferred form)
ENTRYPOINT:配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。类似于CMD,Docker只允许一个ENTRYPOINT,多个ENTRYPOINT会抵消之前所有的指令,只执行最后的ENTRYPOINT指令。语法如下:
ENTRYPOINT ["executable", "param1","param2"]
本公众号免费提供csdn下载服务,海量IT学习资源,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【2】,免费邀请加技术交流群互相学习提高,会不定期分享编程IT相关资源。
扫码关注,精彩内容第一时间推给你
史上最全docker基础知识汇总的更多相关文章
- 史上最全TensorFlow学习资源汇总
来源 | 悦动智能(公众号ID:aibbtcom) 本篇文章将为大家总结TensorFlow纯干货学习资源,非常适合新手学习,建议大家收藏. ▌一 .TensorFlow教程资源 1)适合初学者的Te ...
- 史上最全Docker环境安装指南-让安装docker简单到爆
一.思考❓❔ 1.什么是Docker? 装应用的容器 开发.测试.运维都偏爱的容器化技术 轻量级 扩展性 一次构建.多次分享.随处运行 2.安装Docker难不难? So easy! 此文看过之后,读 ...
- 史上最全PHP正则表达式实例汇总
收集了一份php正则表达式的实例教程,真心不错,记录下. 正则表达式用于字符串处理.表单验证等场合,实用高效. 一些常用的表达式: $str = preg_replace("/(<a. ...
- 34张史上最全IT架构师技术知识图谱 最新下载
本文是笔者多年来积累和收集的知识技能图谱,小编极力推荐分享给身边的技术人儿,希望这份技术知识图谱能够帮助到每一位奋斗在技术路上的小伙伴. 下面是笔者多年来积累和收集的知识技能图谱,有的是笔者原创总结的 ...
- 优秀后端架构师必会知识:史上最全MySQL大表优化方案总结
本文原作者“ manong”,原创发表于segmentfault,原文链接:segmentfault.com/a/1190000006158186 1.引言 MySQL作为开源技术的代表作之一,是 ...
- GitHub上史上最全的Android开源项目分类汇总 (转)
GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...
- 史上最全的 Java 新手问题汇总
史上最全的 Java 新手问题汇总 Java是目前最流行的编程语言之一——它可以用来编写Windows程序或者是Web应用,移动应用,网络程序,消费电子产品,机顶盒设备,它无处不在. 有超过30亿 ...
- 史上最全面的SignalR系列教程-目录汇总
1.引言 最遗憾的不是把理想丢在路上,而是理想从未上路. 每一个将想法变成现实的人,都值得称赞和学习. 致正在奔跑的您! 2.SignalR介绍 SignalR实现服务器与客户端的实时通信 ,她是一个 ...
- Java基础面试题(史上最全、持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
随机推荐
- Netty源码分析 (四)----- ChannelPipeline
netty在服务端端口绑定和新连接建立的过程中会建立相应的channel,而与channel的动作密切相关的是pipeline这个概念,pipeline像是可以看作是一条流水线,原始的原料(字节流)进 ...
- SpringMVC的工作原理图
SpringMVC的工作原理图: SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMa ...
- zookeeper学习(零)_安装与启动
zookeeper学习(零)_安装与启动 最近换了新的电脑,终于买了梦寐以求的macbook.最近也换了新的公司,公司技术栈用到了zookeeper.当然自己也要安装学习下.省的渣渣的我,被鄙视就麻烦 ...
- Factory Method工厂方法模式
定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类,属于创建型模式 在此模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生产 ...
- .Net基础篇_学习笔记_第七天_三元数表达式(if-else的转换写法)
三元表达式语法: 表达式1?表达式2:表达式3; 表达式1一般为一个关系表达式.如果表达式1的值为true,那么表达式2的值就是整个三元表达式的值.如果表达式1的值为false,那么表达式3的值就是整 ...
- centos7上安装zookeeper
centos7上安装zookeeper 1 准备工作 1.准备服务器,本次安装采用 centos7系统.内存2G.存储60G的虚拟机服务器一台: 2.服务器安装java环境: 参考文章<cent ...
- 关于样式style
今天看到了一个bgcolor和以前看过的background-color,特意查了一下区别 百度是这么说的:background-color是标准CSS属性,bgcolor应该是IE扩展的html元素 ...
- Elastic Stack 笔记(七)Elasticsearch5.6 聚合分析
博客地址:http://www.moonxy.com 一.前言 Elasticsearch 是一个分布式的全文搜索引擎,索引和搜索是 Elasticsarch 的基本功能.同时,Elasticsear ...
- Android的显示意图和隐式意图总结
显示意图 简而言之: 通过指定特定Activity的包名和类名开启Activity 应用场景: 一般应用于本App内的activity间的跳转. XML配置信息: AndroidManifest.xm ...
- CSS新增的伪类选择器
:root 选择文档的根元素,等同于 html 元素 :empty 选择没有子元素的元素 :target 选取当前活动的目标元素 :not(selector) 选择除 selector 元素意外的元素 ...