Docker2

Docker介绍

虚拟机和docker都可以搭建环境,但是带操作系统的虚拟机太笨重,需要更多的内存,以及更长时间的操作


Docker和虚拟机都可以拷贝环境方便测试人员等调试,但是操作系统有更长的响应时间,且相对来说更加的笨重。操作系统重启是非常慢的,因为操作系统要从头到尾把该检测的都检测了该加载的都加载上,这个过程非常缓慢,动辄数分钟,因此操作系统还是太笨了。

这时我们就可以使用docker它几乎没有响应时间,同时对环境的拷贝也更加的简单

docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container.这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系

docker中有这样几个概念:

  • Dockerfile
  • image
  • container

容器

Docker容器类似与集装箱,它可以隔离应用程序(类似虚拟机)。与虚拟机通过操作系统实现隔离不同,容器技术只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统

从图中我们可以看到容器更加的轻量级且占用的资源更少,与操作系统动辄几G的内存占用相比,容器技术只需数M空间,因此我们可以在同样规格的硬件上大量部署容器,这是虚拟机所不能比拟的,而且不同于操作系统数分钟的启动时间容器几乎瞬时启动,容器技术为打包服务栈提供了一种更加高效的方式

Docker daemon

Docker以C/S的方式运行,Docker daemon可以接受客户的请求

Docker daemon 是 Docker 的核心组件之一,它是一个后台进程,负责管理 Docker 容器的生命周期、镜像的构建、存储和分发等任务。Docker daemon 运行在宿主机上,通过 Docker API 与客户端进行通信,接收客户端的命令并执行相应的操作。Docker daemon 还负责管理 Docker 网络、存储卷等资源,确保容器之间的隔离和安全性。

Docker 工作方式

image相当于一种可执行的程序,就可以运行程序了。image相当于程序的静态,container相当于运行状态。接下来使用命令docker run,docker daemon接收到该命令后找到具体的image,然后加载到内存开始执行,image执行起来就是所谓的container。

docker build

当我们写完Dockerfile交给docker“编译”时使用这个命令,那么client在接收到请求后转发给docker daemon,接着docker daemon根据Dockerfile创建出“可执行程序”image

docker pull

docker build和docker run是两个最核心的命令。

我们之前说过,docker中image的概念就类似于“可执行程序”,我们可以从哪里下载到别人写好的应用程序呢?很简单,那就是APP Store,即应用商店。与之类似,既然image也是一种“可执行程序”,那么有没有"Docker Image Store"呢?答案是肯定的,这就是Docker Hub,docker官方的“应用商店”,你可以在这里下载到别人编写好的image,这样你就不用自己编写dockerfile了。

docker registry 可以用来存放各种image,公共的可以供任何人下载image的仓库就是docker Hub。那么该怎么从Docker Hub中下载image呢,就是这里的docker pull命令了。

因此,这个命令的实现也很简单,那就是用户通过docker client发送命令,docker daemon接收到命令后向docker registry发送image下载请求,下载后存放在本地,这样我们就可以使用image了。

Docker 底层

docker基于Linux内核提供这样几项功能实现的:

  • Name Space

    Docker namespace 是 Docker 中用于实现容器隔离的一种机制。它通过将不同的资源分配到不同的命名空间中,使得容器之间的进程、网络、文件系统等资源相互隔离,从而实现容器的隔离性。 Docker namespace 主要包括以下几种类型:

    1. PID namespace:用于隔离进程 ID,使得容器内的进程只能看到自己的进程 ID,而不能看到宿主机或其他容器的进程 ID。

    2. Network namespace:用于隔离网络资源,使得容器内的网络接口、IP 地址、路由表等与宿主机或其他容器相互隔离。

    3. Mount namespace:用于隔离文件系统,使得容器内的文件系统只能看到自己的文件系统,而不能看到宿主机或其他容器的文件系统。

    4. UTS namespace:用于隔离主机名和域名,使得容器内的主机名和域名与宿主机或其他容器相互隔离。

    5. IPC namespace:用于隔离进程间通信资源,使得容器内的进程只能与自己的进程通信,而不能与宿主机或其他容器的进程通信。

    通过使用 Docker namespace,可以实现容器之间的隔离,从而提高容器的安全性和可靠性。

  • Docker Group

    Docker Control groups(cgroups)是 Linux 内核提供的一种机制,用于限制进程组的资源使用。Docker 使用 cgroups 来限制容器的 CPU、内存、磁盘 I/O 等资源的使用,从而保证容器之间的资源隔离和公平性。

    通过 cgroups,Docker 可以为每个容器分配一定的 CPU 时间片、内存、磁盘 I/O 带宽等资源,并限制容器的资源使用量,防止容器占用过多的资源导致宿主机性能下降或其他容器受影响。 Docker cgroups 主要包括以下几种类型:

    1. CPU cgroups:用于限制 CPU 使用量,可以设置 CPU 时间片的分配比例。
    2. Memory cgroups:用于限制内存使用量,可以设置容器的内存限制和交换空间限制。
    3. Block I/O cgroups:用于限制磁盘 I/O 带宽,可以设置容器的磁盘 I/O 限制。
    4. Network cgroups:用于限制网络带宽,可以设置容器的网络带宽限制。 通过使用 Docker cgroups,可以实现容器之间的资源隔离和公平性,从而提高容器的可靠性和性能。

Docker 还有带桌面版 和 Docker Machine

Docker容器转化为镜像

Docker File



如果项目依赖更多的第三方软件,我们需要管理的容器就更加多,每个都要单独配置运行,指定网络。
这节,我们使用 docker-compose 把项目的多个服务集合到一起,一键运行。https://hexo.io/docs/writing.html)

Docker Compose

使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况,例如要实现一个web项目,除了web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
compose允许用户通过一个单独docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)
docker-compose将所管理的容器分为三层, 分别是工程(project)服务(service)以及**容器(containner)

docker-compose运行目录下的所有文件(docker-compose.yml文件、extends文件或环境变量等)组成一个工程,如无特殊指定,工程名即为当前目录名。
一个工程当中,可以包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。
一个服务中可以包括多个容器实例,docker-compose并没有解决负载均衡的问题。因此需要借助其他工具实现服务发现及负载均衡,比如consul。

build

指定为构建镜像上下文路径:

  • context:上下文路径。它指定了 Dockerfile 文件的位置,Docker 在构建镜像时会将该路径下的所有文件和目录打包发送给 Docker 引擎,然后在 Docker 引擎中进行构建。
  • dockerfile:指定构建镜像的 Dockerfile 文件名。
  • args:添加构建参数,这是只能在构建过程中访问的环境变量。
  • labels:设置构建镜像的标签。
  • target:多层构建,可以指定构建哪一层。

container_name

指定自定义容器名称,而不是生成的默认名称。

depends_on

设置依赖关系。

  • docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
  • docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
  • docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。

env_file

从文件添加环境变量。可以是单个值或列表的多个值。

例如:

environment:
  RACK_ENV: development
  SHOW: 'true'

volumes

将主机的数据卷或着文件挂载到容器里

$ hexo server

network_mode

设置网络模式。

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

extra_hosts

Docker 多容器互联

创建一个名为test-net的网络:
docker network create test-net
运行 Redis 在 test-net 网络中,别名redis
docker run -d --name redis --network test-net --network-alias redis redis:latest
运行 Web 项目,使用同个网络
docker run -p 8080:8080 --name test -v D:/test:/app --network test-net -d test:v1

link

使用link指令将多容器互相连接

其他实现方式

具体实现多容器互联的方法有以下几种:

  1. 使用Docker网络 首先,需要创建一个Docker网络,可以使用以下命令:

docker network create my-network

然后,将需要互联的容器连接到该网络中,可以使用以下命令:

docker run --name container1 --network my-network image1

docker run --name container2 --network my-network image2

Docker -p

重要学习链接:

https://blog.csdn.net/CSDN1csdn1/article/details/123961079?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167937031216800222877294%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167937031216800222877294&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-123961079-null-null.142v74insert_down2,201v4add_ask,239v2insert_chatgpt&utm_term=Docker%E7%BD%91%E7%BB%9C&spm=1018.2226.3001.4187

未完待续

posted @ 2023-03-21 14:56  ZZX11  阅读(21)  评论(0编辑  收藏  举报