什么是docker和docker的架构

一、什么是docker

https://www.runoob.com/docker/docker-container-usage.html

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化

通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。 容器是镜像的运行实例,当被运行时有镜像状态和用户进程,可以使用docker ps 查看。

二、docker的四种网络模式

1.host模式:–net=host 容器和宿主机共享Network namespace

 如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好

2.container模式:容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器 共享一个Network namespace

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信

3.none模式:无网络模式,–net=none 容器有独立的Network namespace,但并没有对其进行任何网 络设置,如分配veth pair 和网桥连接,配置IP等

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。


4.bridge模式:–net=bridge 默认为该模式

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中

bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看

三、docker的三大核心组件

1.镜像

镜像类似于虚拟机镜像,可以把它理解为一个只读的模板。例如,一个包含 Nginx 应用程序的镜像,其内部包含一个基本的操作系统环境以及 Nginx 应用程序 。 镜像是创建 Docker 容器的基础,通过版本管理和增量文件系统, Docker 提供了一套机制来创建或更新现有的镜像,我们还可以从网上下载并使用别人已经做好的镜像。

2.容器

 Docker 容器类似于一个轻量级沙箱, Docker 利用容器来运行和隔离上层应用。容器与镜像的关系类似于面向对象编程中的对象与类。从镜像中创建的应用,在容器中运行实例,从而保证实例之间不会相互影响。容器可以启动 、 开始 、 停止 、 删除,并且这些容器都是彼此相互隔离 、 互不可见的

3.仓库

Docker 仓库类似于代码仓库,是集中存放 Docker 镜像文件的地方。根据所存储的镜像是否公开,我们可以把仓库分为公开仓库 ( Public ) 和私有仓库 ( Private ) 两种形式

四、docker容器的生命周期

​ 1、create:初建状态

​ 2、running:运行状态

​ 3、stopped:停止状态

​ 4、paused:暂停状态

​ 5、deleted:删除状态

五、docker主要模块

1.docker client:

docker client 是docker架构中用户用来和docker daemon建立通信的客户端,用户使用的可执行文件为 docker,通过docker命令行工具可以发起众多管理container的请求。

2.docker daemon:

docker daemon 是docker架构中一个常驻在后台的系统进程,功能是: 接收处理docker client发送的请求。 该守护进程在后台启动一个server,server负载接受docker client发送的请求; 接受请求后,server通过路由与分发调度,找到相应的handler来执行请求。
docker daemon启动所使用的可执行文件也为docker,与docker client启动所使用的可执行文件docker相同,在docker命令执行时,通过传入的参数来判别docker daemon与docker client。
docker daemon的架构可以分为: docker server、engine、job。 daemon

3.docker server:

docker server在docker架构中时专门服务于docker client的server,该server的功能时: 接受并调度分发docker client发送的请求

4.engine:

Engine是Docker架构中的运行引擎,同时也Docker运行的核心模块。 它扮演Docker container存储仓库的角色,并且通过执行job的方式来操纵管理这些容器。
在Engine数据结构的设计与实现过程中,有一个handler对象。 该handler对象存储的都是关于众多特定job的handler处理访问。 举例说明,Engine的handler对象中有一项为: {“create”: daemon.ContainerCreate,},则说明当名为”create”的job在运行时,执行的是daemon.ContainerCreate的handler。

5.job:

一个Job可以认为是Docker架构中Engine内部最基本的工作执行单元。 Docker可以做的每一项工作,都可以抽象为一个job。 例如: 在容器内部运行一个进程,这是一个job; 创建一个新的容器,这是一个job,从Internet上下载一个文档,这是一个job; 包括之前在Docker Server部分说过的,创建Server服务于HTTP的API,这也是一个job,等等

6.docker registry:

Docker Registry是一个存储容器镜像的仓库。 而容器镜像是在容器被创建时,被加载用来初始化容器的文件架构与目录

7.graph

Graph在Docker架构中扮演已下载容器镜像的保管者,以及已下载容器镜像之间关系的记录者。 一方面,Graph存储着本地具有版本信息的文件系统镜像,另一方面也通过GraphDB记录着所有文件系统镜像彼此之间的关系

8.libcontainer

libcontainer是Docker架构中一个使用Go语言设计实现的库,设计初衷是希望该库可以不依靠任何依赖,直接访问内核中与容器相关的API。
正是由于libcontainer的存在,Docker可以直接调用libcontainer,而最终操纵容器的namespace、cgroups、apparmor、网络设备以及防火墙规则等。 这一系列操作的完成都不需要依赖LXC或者其他包

9.docker container

  • Docker container(Docker容器)是Docker架构中服务交付的最终体现形式。
    
    Docker按照用户的需求与指令,订制相应的Docker容器:
    - 用户通过指定容器镜像,使得Docker容器可以自定义rootfs等文件系统;
    - 用户通过指定计算资源的配额,使得Docker容器使用指定的计算资源;
    - 用户通过配置网络及其安全策略,使得Docker容器拥有独立且安全的网络环境;
    - 用户通过指定运行的命令,使得Docker容器执行指定的工作
    

六、namespace 和cgroup 的区别

Namespace:隔离技术的第一层,确保 Docker 容器内的进程看不到也影响不到 Docker 外部的进程。
Control Groups:LXC 技术的关键组件,用于进行运行时的资源限制。

七、Docker Compose 容器编排工具、docker三剑客之一。

 Docker Compose 可以高效的管理容器,它是一个用于定义和运行多个容器 Docker 的应用程序工具
Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)
Docker Compose 还可以更新容器
docker-compose ps   			ps:列出所有运行容器
docker-compose logs   			查看日志
docker-compose port eureka 8761   port:打印绑定的公共端口,下面命令可以输出 eureka 服务 8761 端口所绑定的								  公共端口
docker-compose build  			 build:构建或者重新构建服务
docker-compose start eureka  	 start:启动指定服务已存在的容器
docker-compose stop eureka       stop:停止已运行的服务的容器
docker-compose rm eureka  		rm:删除指定服务的容器
docker-compose up				up:构建、启动容器
docker-compose kill eureka       kill:通过发送 SIGKILL 信号来停止指定服务的容器

八、dockerfile

1.什么是dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

2.dockerfile的作用

安装dockerfile中的指令定义docker容器或者容器中的应用程序以及服务 Dockerfile制作一个镜像模板安装模板统一生成容器

3.dockerfile中常见的指令和作用

FROM:指定创建镜像的基础镜像           				   
MAINTAINER:Dockerfile作者信息,一般写的是联系方式      
RUN:运行Linux系统的命令使用							
CMD:指定容器启动执行的命令;启动容器中的服务
LABEL:指定生成镜像的源数据标签
EXPOSE:指定镜像容器监听端口号;发布服务使用
ENV:使用环境变量
ADD:对压缩文件进行解压缩;将数据移动到指定的目录
COPY:复制宿主机数据到镜像内部使用
WORKDIR:切换到镜像容器中的指定目录中
VOLUME:挂载数据卷到镜像容器中
USER:指定运行容器的用户
ARG:指定镜像的版本号信息
ONBUILD:创建镜像,作为其他镜像的基础镜像运行操作指令
ENTRYPOINT:指定运行容器启动过程执行命令,覆盖CMD参数

4.dockerfile的文件说明

FROM:

指定基础镜像,必须为第一个命令

格式:
  FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>
示例:
  FROM mysql:5.6
注:
  tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
MAINTAINER

维护者信息

格式:
    MAINTAINER <name>
示例:
    MAINTAINER Jasper Xu
    MAINTAINER sorex@163.com
    MAINTAINER Jasper Xu <sorex@163.com>
RUN:

构建镜像时执行的命令

RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行
格式:
    RUN <command>
exec执行
格式:
    RUN ["executable", "param1", "param2"]
示例:
    RUN ["executable", "param1", "param2"]
    RUN apk update
    RUN ["/etc/execfile", "arg1", "arg1"]
注:
  RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
CMD:

构建容器后调用,也就是在容器启动时才进行调用。

格式:
    CMD ["executable","param1","param2"] (执行可执行文件,优先)
    CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    CMD command param1 param2 (执行shell内部命令)
示例:
    CMD echo "This is a test." | wc -
    CMD ["/usr/bin/wc","--help"]
注:
   CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
LABEL:

用于为镜像添加元数据

格式:
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
  LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
  使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
EXPOSE:

指定于外界交互的端口

格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080
    EXPOSE 11211/tcp 11211/udp
注:
  EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
ENV:

设置环境变量

格式:
    ENV <key> <value>  #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
    ENV <key>=<value> ...  #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
    ENV myName John Doe
    ENV myDog Rex The Dog
    ENV myCat=fluffy
ADD:

将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
    ADD hom* /mydir/          # 添加所有以"hom"开头的文件
    ADD hom?.txt /mydir/      # ? 替代一个单字符,例如:"home.txt"
    ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/
COPY:
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
WORKDIR:

工作目录,类似于cd命令

格式:
    WORKDIR /path/to/workdir
示例:
    WORKDIR /a  (这时工作目录为/a)
    WORKDIR b  (这时工作目录为/a/b)
    WORKDIR c  (这时工作目录为/a/b/c)
注:
  通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
VOLUME:

用于指定持久化目录

格式:
    VOLUME ["/path/to/dir"]
示例:
    VOLUME ["/data"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:
  一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它
USER:

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

 格式:
  USER user
  USER user:group
  USER uid
  USER uid:gid
  USER user:gid
  USER uid:group

 示例:
  USER www

 注:

  使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
ARG:

用于指定传递给构建运行时的变量

格式:
    ARG <name>[=<default value>]
示例:
    ARG site
    ARG build_user=www
ONBUILD:

用于设置镜像触发器

格式:
  ONBUILD [INSTRUCTION]
示例:
  ONBUILD ADD . /app/src
  ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
  当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
ENTRYPOINT:

配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    ENTRYPOINT command param1 param2 (shell内部命令)
示例:
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
注:
   ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐