从网上整理的Docker面经

169 阅读5分钟

什么是Docker

Docker是一种高级容器引擎,它可以简化创建、管理、运行和分发应用程序的过程。

Docker和虚拟机的不同

Docker的系统是依赖于宿主机的系统,而虚拟机是一个虚拟出来的系统。并且Docker仅仅只有能够运行某个镜像最小需要的部分,而虚拟机有额外的许多东西。综上Docker的镜像会比较小,并且启动会比虚拟机快。

Dockerfile

什么是Dockerfile

Dockerfile是一个文本文件,用来自动构建Docker镜像。由于docker镜像采用了联合文件系统,所以其实在Dockerfile中每一条命令就会构建一层,并且每一条指令本质上就是在描述该层如何构建。

Dockerfile常用的指令

  • FROM
    • 使用FROM为后续指令建立基础镜像。在所有有效的Dockerfile中,FROM是第一条指令
  • LABEL
    • 用户组织项目映像,模块,许可等。在自动化部署方面LAVEL也有很大用处。在 LABEL 中指定一组键值对,可用于程序化配置或布署 Docker 。
  • CMD
    • 指定容器启动后要干的事情
    • Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
    • 它和RUN命令的区别
      • CMD是在docker run时运行
      • RUN是在docker build时运行
  • MAINTAINER
    • 镜像维护者的姓名和邮箱地址
  • RUN
    • 容器构建是需要运行的命令
    • 两种格式
      • shell格式
      • exec格式
    • RUN是在docker build时运行
  • EXPOSE
    • 当前容器对外暴露的端口
  • WORKDIR
    • 指定在创建容器后,终端默认登陆进来的工作目录,一个落脚点
  • USER
    • 指定该镜像以什么样的用户去执行,如果都不指定,默认是root
  • ENV
    • 用来在构建镜像过程中设置环境变量
      • 例如JAVA_HOME
  • ADD
    • 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
  • COPY
    • 与ADD相似,只不过ADD会进行一些处理,而COPY不会
  • VOLUME
    • 指定容器数据卷,用于数据保存和持久化工作
  • ENTRYPOINT
    • 也是用来指定一个容器启动时要运行的命令
    • 类似CMD指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序
    • 说明
      • ENTRYPOINT可以和CMD一起用,一般是变参才 会使用CMD,这里的CMD等于是在给ENTRYPOINT传参。
      • 当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成<ENTRYPOINT> "<CMD>"

虚悬镜像

是什么

仓库名和标签名都会<none>的镜像,一般这种镜像都是失去存在价值的镜像,不建议使用。推荐删除掉虚悬镜像

批量删除方法

docker image prune

docker-compose

是什么

docker compose是一种.yml格式的文本文件,用来统一管理多个docker容器组成一个应用。并且它能够帮助我们按顺序启动容器,也能够帮助我们一键启动,一键停止,而且能够通过这份文件做自动化部署。

使用docker-compose时要如何保证容器A先于容器B运行?

在docker-compose文件中,有一个depends_on属性,在要部署的某个服务中,可以用该属性指定哪些服务要先于该服务运行(依赖关系)。

一个完整的Docker的组成部分

  • DockerClient 客户端
  • Docker Daemon 守护进程
  • Docker image 镜像
  • DockerContainer 容器

Docker容器的生命周期

  • 创建
  • 运行
  • 暂停
  • 取消
  • 启动
  • 停止
  • 重启
  • 杀死(kill)
  • 销毁

Docker常用网络模式

  • 网桥(bridge):默认模式
  • 主机(host):与主机共用ip与端口
  • 自定义模式:仅仅直接创建的话,是网桥模式的升级版,允许容器之间以服务名ping对方。

Docker配置文件的位置

  • Ubuntu:/etc/default/docker
  • CentOS:/etc/sysconfig/docker

Docker的优点

1.部署方便

只需要将镜像拉取到本地之后,执行一些命令就能启动,省去许多繁杂的配置

2.环境容易统一

我们经常遇到每个人的配置和环境都不太一样的情况,正常情况下,可能不会出现问题。但是一旦出现问题,将要耗费很多的人力物力去解决这些配置、环境、依赖的问题。但是使用了docker之后,可以很方便的统一环境和版本,而这仅需要一个相同的镜像。

3.隔离性好

不管是开发还是生产,往往我们一台机器上可能需要跑多个服务,而服务各自需要的依赖配置不尽相同,假如说两个应用需要使用同一个依赖,或者两个应用需要的依赖之间会有一些冲突,这个时候就很容易出现问题了。最好还是将其隔离起来。而容器在这方面有天生的优势,每一个容器就是一个隔离的环境

4.管理成本低

随着大环境的发展,docker等容器的使用和学习的成本也是愈发降低

什么是Docker Hub

Docker Hub是类似与GitHub的网站,GitHub是托管代码的平台,而Docker Hub是托管镜像的平台。

Dockerfile中ADD和COPY的区别(再强调一下)

COPY仅仅是把你需要的文件简简单单拷贝进去镜像一份,而ADD会将拷贝进去的压缩包进行解压。

一个Docker容器能够同时运行多个应用吗

可以,但是一般不推荐。前面提到docker有一个隔离性的优点,如果在容器中同时运行多个,那会导致整个优点消失。不过如果一定得运行多个应用的话,有其他的解决方案,比如:可以用过额外的进程管理机制

希望我的整理能够帮助到大家