Skip to main content

容器技术

什么是docker

ocker是一种开源的容器化平台,用于创建、部署和运行应用程序和服务。它提供了一种轻量级的容器化技术,使应用程序及其所有依赖项能够以一种一致、可移植和可复制的方式在不同环境中运行,无论是开发、测试还是生产环境。

以下是Docker与宿主机之间的一些区别:

  1. 容器化: Docker的核心概念是容器化。容器是轻量级的、可独立运行的应用程序和其依赖项的封装,它们运行在主机操作系统上。与传统虚拟机不同,容器共享主机操作系统内核,因此更加轻量级和高效。
  2. 独立性: Docker容器是独立的,每个容器包含了应用程序及其依赖项,而且它们彼此隔离。这意味着你可以在同一台宿主机上运行多个容器,每个容器都有自己的环境,而宿主机不受容器的影响。
  3. 可移植性: Docker容器是可移植的。一旦你创建了一个容器,它可以在任何支持Docker的环境中运行,而无需担心配置和依赖问题。
  4. 部署和管理: Docker提供了丰富的工具和命令行接口,
  5. 使应用程序容易部署、扩展和管理。你可以使用Docker Compose来定义多个容器的应用程序堆栈,使用Docker Swarm或Kubernetes来管理容器集群,以实现高可用性和自动化。
  6. 资源消耗: Docker容器相对较轻量,因此在宿主机上消耗的资源较少。与传统虚拟机相比,容器启动更快,占用更少的内存和存储空间。
  7. 隔离性: Docker容器提供了一定程度的隔离,但它们共享主机操作系统内核。虚拟机在更高程度上隔离了不同的操作系统实例,而容器则更适合共享相同操作系统的应用程序。

总之,Docker是一种强大的容器化平台,可以在不同环境中实现一致性、可移植性和高效性。它与传统虚拟化技术相比,更加轻量级,并使应用程序的部署和管理变得更加便捷。

docker跟kvm有什么区别

  1. 虚拟化级别:
    • Docker:Docker使用容器化技术,它在宿主操作系统上创建轻量级的容器,容器共享主机操作系统内核,这使得容器更加轻量、启动更快。
    • KVM:KVM是一种硬件虚拟化技术,它允许在宿主机上运行多个虚拟机,每个虚拟机都有自己的独立操作系统内核。KVM虚拟机通常比容器更重,因为它们模拟完整的操作系统。
  2. 资源隔离:
    • Docker:Docker容器是进程级的隔离,它们共享主机操作系统的内核,因此资源隔离相对较低。容器之间可以共享操作系统内核,但资源限制可以通过Linux内核特性进行控制。
    • KVM:KVM虚拟机提供了更高级别的资源隔离,因为每个虚拟机都有自己的独立操作系统内核,可以完全独立配置和隔离资源。
  3. 启动时间和性能:
    • Docker:Docker容器启动快速,通常在几秒内,因为它们不需要启动整个操作系统。容器通常占用较少的资源,因此性能较高。
    • KVM:KVM虚拟机通常需要更长的时间来启动,因为它们必须启动整个操作系统。由于每个虚拟机都是独立的操作系统实例,资源开销较高,性能较低。
  4. 应用场景:
    • Docker:Docker适用于轻量级应用程序容器化,尤其是微服务架构。它侧重于快速部署和扩展应用程序
    • KVM:KVM更适用于虚拟机中运行传统应用程序,尤其是需要完全隔离和独立操作系统的应用程序。它通常用于虚拟化服务器和运行多个操作系统的场景。

Docker的网络模式

docker的四种网络模式为:

1、host模式,使用“–net=host”指定;

2、container模式,用“–net=container:NAME_or_ID”指定;

3、none模式,用“–net=none”指定;

4、bridge模式

Dockerfile

ARG和ENV指定变量

USER指定用户运行

WORKDIR设置工作目录

EXPOSE暴露端口

ADD和COPY有什么区别

  • COPY: 把本地文件复制到容器;
  • ADD: COPY的加强版,可以从url复制文件,并自动解压

RUN,CMD,ENTRYPOINT的区别

RUN

命令执行命令并创建新的镜像层,通常用于安装软件包

CMD

CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换

  • CMD用于定义容器启动时要执行的默认命令。你可以在Dockerfile中使用CMD指令来指定应用程序或脚本,这个命令将在容器启动时执行。
  • 一个Dockerfile通常只能包含一个CMD指令。如果有多个CMD指令,只有最后一个指令会生效。
  • CMD的参数可以被覆盖,这意味着用户可以在运行容器时(docker run)通过附加命令行参数来替换CMD中的默认命令。

ENTRYPOINT:

ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令)

  • ENTRYPOINT类似于CMD,它也用于定义容器启动时要执行的命令,但与CMD不同的是,ENTRYPOINT定义的命令是不可覆盖的(但是可以容器运行时传递多个参数)。
  • 如果在容器启动时提供了附加命令行参数,它们将被追加到ENTRYPOINT指令定义的命令之后。
  • 通常,ENTRYPOINT用于定义容器的主要执行程序,而CMD则通常用于提供默认参数。

案例:

#假设你有一个Docker镜像,其Dockerfile包含以下ENTRYPOINT指令:
ENTRYPOINT ["echo", "Hello"]

docker run my-image

#这将输出
Hello

docker run my-image "World"

#这将输出:
Hello World

注意:

在Docker中,CMDENTRYPOINT可以使用exec格式定义,这是为了提供更好的信号处理和操作系统间兼容性。使用exec格式的CMDENTRYPOINT以JSON数组的形式定义命令,这有助于确保命令以可执行文件的形式运行,而不是通过shell解释。这对于信号处理和与操作系统的交互更加可控,尤其在Linux环境下。

shell 格式底层会调用 shell /bin/sh -c <command>,而exec会直接调用<command>,不会被shell解析

CMD 可为 ENTRYPOINT 提供额外的默认参数同时可利用 docker run 命令行替换默认参数。

ENTRYPOINT ['command']
CMD['args1','args2']

cmd 和 ENTRYPOINT如何使用exec格式

CMD [ "nginx", "-g", "daemon off;" ]

ENTRYPOINT [ "nginx", "-g", "daemon off;" ]

cmd 和 ENTRYPOINT如何使用shell格式

CMD nginx -g "daemon off;"

ENTRYPOINT nginx -g "daemon off;"

ONBUILD子镜像指令

AS阶段构建指令

一个 dockerfile 可以有多个 FROM创建多个镜像,或区分构建阶段,将一构建阶段作二构建阶段的依赖项; AS <阶段名> 就是命名当前构建阶段; 在后续构建阶段,可以给 FROMCOPY 指令用上,通过 --from=<上一个阶段名> 引用上一阶段构建的镜像.

HEALTHCHECK

作用

健康检查 当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting,在 HEALTHCHECK 指令检查成功后变为 healthy,如果连续一定次数失败,则会变为 unhealthy

HEALTHCHECK 返回值 决定了该次健康检查的成功与否:0:成功;1:失败;2:保留(不要使用这个值)

在没有 HEALTHCHECK 指令前,Docker 引擎只可以通过容器内主进程是否退出来判断容器是否状态异常 很多情况下这没问题,但是如果程序进入死锁状态,或者死循环状态,应用进程并不退出,但是该容器已经无法提供服务了

在 1.12 以前,Docker 不会检测到容器的这种状态,从而不会重新调度,导致可能会有部分容器已经无法提供服务了却还在接受用户请求 自 1.12 之后,Docker 提供了 HEALTHCHECK 指令,通过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态

HEALTHCHECK 支持的选项

 --interval=<间隔> :两次健康检查的间隔,默认为 30 秒;
--timeout=<时长> :健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
--retries=<次数> :当连续失败指定次数后,则将容器状态视为 unhealthy ,默认 3 次

格式

设置检查容器健康状况的命令

HEALTHCHECK [选项] CMD <命令>

如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK NONE

查看容器健康检查信息

刚启动时的状态是 health:starting,过多几秒后就变成 healthy 了 如果健康检查连续失败超过了重试次数,状态就会变为 unhealthy

查看容器健康检查信息 为了帮助排障,健康检查命令的输出(包括 stdout 以及 stderr)都会被存储于健康状态里,可以用 docker inspect 来查看

docker inspect --format '{{json .State.Health}}' web | python -m json.tool

查看镜像层

# 查看nginx镜像的文件层

docker history omaidb/gost:3.0.0-rc6

容器相关的命令

docker inspect container //查询容器元数据

docker stats --no-stream //查看资源

docker system df

docker system prune -a //清理所有资源-谨慎操作

docker build -t xxxx .

docker save -o exp_ubuntu_v1.tar exp/ubuntu:v1 //导出镜像