茂展的分享博客

Docker容器——深度解读

Docker容器——深度解读

docker容器技术
深入一个技术最好的方式,看文档,点我去官网

Docker容器不是虚拟机

为什么要用docker

Docker 是开源的应用容器引擎。
Docker 可以让你将所有应用软件以及它的依赖打包成软件开发的标准化单元。
Docker 容器将软件以及它运行安装所需的一切文件(代码、运行时、系统工具、系统库)打包到一起,这就保证了不管是在什么样的运行环境,总是能以相同的方式运行。就好像 Java 虚拟机一样,“一次编写,到处运行(Write once, run anywhere)”,而 Docker 是“一次构建,到处运行(Build once,run anywhere)”。

Docker 的优点

  1. 轻量级:所有容器在一台机器上共享同一个操作系统内核,这样他们立即开始,并更有效地利用内存。Image 是从分层文件系统的构建,这样他们能够共享公共文件,使得磁盘使用率和 Image 的下载更加高效。

  2. 开放:Docker 容器是基于开发的标准,允许容器运行在主流的 Linux 发布版和 Microsoft 操作系统作为所有的基础设施。

  3. 安全:容器使得应用程序彼此隔离,而基础架构同时为应用程序提供了额外的保护层。

  4. 开发更加敏捷:Docker 让开发人员可以自由定义环境,创建和部署的应用程序更快、更容易,IT 运维人员快速应对变化也更加灵活性。

  5. 更加可控:Docker 使得开发人员保存从基础设施到应用的代码,帮助 IT 运维人管理拥有标准的、安全的、可扩展的操作环境。

  6. 高可移植性:Docker 允许自由选择,可以是从笔记本电脑到一个团队,从私人基础设施到公共云提供商。

Docker底层实现

Docker 的容器利用了 LXC(Linux Container 虚拟机容器技术),管理利用了 namespaces 来做权限的控制和隔离,cgroups 来进行资源的配置,并且还通过 aufs 来进一步提高文件系统的资源利用率,而这些技术都不是 Docker 独创。

Docker存储驱动之AUFS

AUFS曾是Docker默认的首选存储驱动。它非常稳定、有很多真实场景的部署、很强的社区支持。它有以下主要优点:

  • 极短的容器启动时间
  • 有效的存储利用率
  • 有效的内存利用率

Dockfile

Dockfile是一个用于编写docker镜像生成过程的文件,其有特定的语法。在一个文件夹中,如果有一个Dockfile的文件,其内容满足语法要求,在这个文件夹路径下执行命令: docker build --tag name:tag .,就可以构建一个镜像了。name是镜像的名称,tag是镜像的版本或者是标签号,不写默认是latest,千万不可以忘记命令中后面有一个空格和一个.

Dockfile语法

Dockerfile的基本指令有十三个,分别是:FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD。

FROM

用法: FROM
说明:第一个指令必须是FROM,其指定了一个构建镜像的基础源镜像,如果本地没有就会从公共库中拉取,没有指定镜像标签就会使用默认的latest标签,可以出现多次,如果需要在一个Dockfile中构建多个镜像。

MAINTAINER

用法: MAINTAINER < name> < email>
说明: 描述镜像的创建者,包括名称和邮箱

RUN

用法: RUN “command” “param1””param2”
说明: RUN命令是一个常用的命令,执行完成之后会成为一个新的镜像,这里也是指镜像的分层构建。一句RUN就是一层,也相当于一个版本。这就是之前说的缓存的原理。我们知道docker是镜像层是只读的,所以你如果第一句安装了软件,用完在后面一句删除是不可能的。所以这种情况要在一句RUN命令中完成,可以通过&符号连接多个RUN语句。RUN后面的必须是双引号不能是单引号(没引号貌似也不要紧),command是不会调用shell的,所以也不会继承相应变量,要查看输入RUN “sh” “-c” “echo” “$HOME”,而不是RUN “echo” “$HOME”。

CMD

用法:CMD command param1 param2
说明:CMD在Dockerfile中只能出现一次,假如有多个,那么只有最后一个会有效。其作用是在启动容器的时候提供一个默认的命令项。如果用户执行docker run的时候提供了命令项,就会覆盖掉这个命令。没提供就会使用构建时的命令。

EXPOSE

用法:EXPOSE < port> [< port>…]
说明:告诉Docker服务器容器对外映射的容器端口号,在docker run -p的时候生效。

ENV

用法:EVN 只能设置一个 ; EVN =允许一次设置多个
说明:设置容器的环境变量,可以让其后面的RUN命令使用,容器运行的时候这个变量也会保留

ADD

用法:ADD < src> < dest>
说明:复制本机文件或目录或远程文件,添加到指定的容器目录,支持GO的正则模糊匹配。路径是绝对路径,不存在会自动创建。如果源是一个目录,只会复制目录下的内容,目录本身不会复制。ADD命令会将复制的压缩文件夹自动解压,这也是与COPY命令最大的不同

COPY

用法:COPY < src> < dest>
说明:COPY除了不能自动解压,也不能复制网络文件。其它功能和ADD相同。

ENTRYPOINT

用法:ENTRYPOINT “command” “param1” “param2”
说明:这个命令和CMD命令一样,唯一的区别是不能被docker run命令的执行命令覆盖,如果要覆盖需要带上选项–entrypoint,如果有多个选项,只有最后一个会生效。

VOLUME

用法:VOLUME [“path”]
说明:在主机上创建一个挂载,挂载到容器的指定路径。docker run -v命令也能完成这个操作,而且更强大。这个命令不能指定主机的需要挂载到容器的文件夹路径。但docker run -v可以,而且其还可以挂载数据容器。

USER

用法:USER daemon
说明:指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT也会使用指定的用户运行命令。

WORKDIR

用法:WORKDIR path
说明:为RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径。如:WORKDIR /home  WORKDIR test 。最终的路径就是/home/test。path路径也可以是环境变量,比如有环境变量HOME=/home,WORKDIR $HOME/test也就是/home/test。

ONBUILD

用法:ONBUILD [INSTRUCTION]
说明:配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。意思就是,这个镜像创建后,如果其它镜像以这个镜像为基础,会先执行这个镜像的ONBUILD命令。

特别注: 上面关于Dockfile知识摘抄此文章,点我去看,仅用于参考,不盈利。

综合上面语法

举个栗子

1
2
3
4
5
6
7
8
9
10
11
FROM centos
MAINTAINER nobody "xx@qq.com"
RUN mkdir -p /opt/jdk/
RUN mkdir -p /opt/tomcat/
ADD jdk1.7.0_79 /opt/jdk/
ADD tomcat /opt/tomcat/
ENV CATALINA_HOME /opt/tomcat
ENV JAVA_HOME /opt/jdk
EXPOSE 8080
ENV PATH $PATH:$JAVA_HOME/bin
CMD ["/opt/tomcat/bin/catalina.sh","run"]

下一篇继续深入学习Docker容器化构建

------本文结束感谢阅读------
🐶 您的支持将鼓励我继续创作 🐶