docker总结

docker简介

官方文档:https://docs.docker.com/

Docker是一种开源的容器平台,它允许开发者将应用程序及其依赖项打包到一个可移植的容器中,并可以在任何支持Docker的机器上运行。

基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker优点

1. 可移植性:Docker容器可以在任何支持Docker的系统上运行,无论是物理机、虚拟机,还是云环境。

2. 版本控制和组件重用:Docker可以跟踪版本变化,重用组件,并分享Docker镜像。

3. 隔离性:每个Docker容器都在自己的环境中运行,互不干扰。

4. 自动化:Docker使用Dockerfile来自动化镜像创建过程,使应用程序的部署更加快速、一致和可重复。

Docker的主要功能

1. 容器管理:Docker提供了一套命令来创建、启动、停止、移动或删除容器。

2. 镜像管理:Docker允许你创建、拉取、推送和管理Docker镜像。你可以使用Dockerfile来定义镜像的创建过程,或者基于现有的镜像来创建新的镜像。

3. 网络管理:Docker提供了网络配置功能,允许你为容器配置网络环境,如创建网络、配置网络模式等。

4. 数据卷管理:Docker允许你创建和管理数据卷,用于持久化容器的数据。

5. 服务编排:通过Docker Compose和Docker Swarm,Docker可以管理多容器应用的部署和扩展。

6. 安全性:Docker提供了一些安全特性,如使用seccomp、AppArmor、SELinux等来限制容器的权限。

7. 日志管理:Docker可以收集和管理容器的日志,支持多种日志驱动。

8. 资源限制:Docker允许你为容器设置CPU、内存等资源的使用限制。

docker应用场景

 

 

Docker主要组件

- Docker Engine:运行和管理容器的核心部分。
- Docker Images:只读的模板,用于创建Docker容器。一个镜像可以基于另一个镜像,添加或修改功能。
- Docker Containers:Docker镜像的运行实例。可以启动、停止、移动或删除容器,并可以连接到一个或多个网络、附加存储,以及创建新的镜像。
- Dockerfile:一种文本文件,定义了一个Docker镜像的内容和创建过程。
- Docker Compose:一个用于定义和运行多容器Docker应用程序的工具。通过Compose,你可以使用YAML文件来配置应用程序的服务,然后使用一个命令来创建和启动所有服务。

docker与window系统

Windows系统支持Docker。但是,需要注意的是,Docker在Windows上的运行需要依赖虚拟化技术。对于Windows 10用户,可以直接安装Docker Desktop。对于旧版本的Windows用户,如Windows 7或8,可以安装Docker Toolbox。

Docker Desktop为Windows用户提供了一个完整的Docker开发环境,包括Docker Engine、Docker CLI客户端、Docker Compose、Docker Machine和Kitematic等组件。

需要注意的是,运行Docker Desktop需要Windows 10 64位版本,并且需要开启硬件虚拟化支持。
 

 

docker与linux容器

Docker是一种使用Linux容器技术的开源平台。Linux容器提供了一种轻量级的虚拟化技术,允许在隔离的环境中运行应用程序。而Docker则提供了一套工具和服务,使得开发者可以更方便地使用Linux容器技术。

简单来说,Linux容器是一种技术,而Docker是这种技术的一种实现。Docker使用Linux内核的特性(如cgroups和namespaces)来创建和管理容器,同时还提供了镜像管理、网络配置、数据卷管理等高级功能。
 

 

基本概念的解释

1. Docker Engine:Docker的核心,负责运行和管理容器。

2. Docker Images:Docker镜像是只读的模板,用于创建Docker容器。镜像包含了运行应用所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

3. Docker Containers:Docker容器是Docker镜像的运行实例。你可以启动、停止、移动或删除容器,并可以连接到一个或多个网络、附加存储,以及创建新的镜像。

4. Dockerfile:Dockerfile是一种文本文件,定义了一个Docker镜像的内容和创建过程。你可以通过编写Dockerfile,然后使用docker build命令来创建新的Docker镜像。

5. Docker Compose:Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过Compose,你可以使用YAML文件来配置应用程序的服务,然后使用一个命令来创建和启动所有服务。

6. Docker Hub:Docker Hub是一个公开的Docker镜像注册服务,你可以从Docker Hub拉取镜像,也可以将自己创建的镜像推送到Docker Hub。

7. Docker Swarm:Docker Swarm是Docker的原生集群管理和编排工具,可以让你在多个Docker主机上部署和管理服务。

镜像

镜像基本概念

Docker镜像是只读的模板,用于创建Docker容器

Docker镜像是通过Dockerfile生成的。Dockerfile是一个文本文件,其中包含了一系列的指令,用于定义如何创建一个Docker镜像。

docker 的镜像是分层的,所有的镜像(除了基础镜像)都是在之前镜像的基础上加上自己这层的内容生成的;

父镜像和基础镜像

- 父镜像:当我们创建一个新的Docker镜像时,我们通常会基于一个已存在的镜像进行创建,这个已存在的镜像就被称为父镜像。在Dockerfile中,我们使用FROM指令来指定父镜像。例如,FROM python:3.7-slim就是指定python:3.7-slim为父镜像。

- 基础镜像:基础镜像是一个特殊的镜像,它不依赖于其他镜像,通常包含了一个最小化的操作系统。例如,alpine, ubuntu, debian等都是常见的基础镜像。基础镜像通常被用作创建其他Docker镜像的基础。

在实际使用中,父镜像和基础镜像的概念有时会交叉。例如,当我们说一个镜像是另一个镜像的基础镜像时,我们通常是指这个镜像是另一个镜像的父镜像。

基础镜像的组成

基础镜像的组成主要包括以下部分:

1. 最小化的操作系统:基础镜像通常包含一个最小化的操作系统,这个操作系统只包含运行最基本功能所需的文件和库。

2. 必要的系统工具:基础镜像还可能包含一些必要的系统工具,例如shell、网络工具等。

3. 元数据:基础镜像还包含一些元数据,例如镜像的创建时间,镜像的作者等。

基础镜像的主要功能是提供一个干净、最小化的环境,用作创建其他Docker镜像的基础。

镜像和dockerfile关系

镜像可以基于dockerfile文件来构建

不基于dockerfile也可以构建镜像,可以使用docker commit命令来创建新的镜像。这个命令可以将一个已经存在的容器的当前状态保存为一个新的镜像

# 创建一个基于ubuntu的新容器
docker run -it ubuntu bash

# 在容器内部进行一些修改,例如安装软件等

# 退出容器

# 提交容器的当前状态为一个新的镜像
docker commit container_id your_new_image_name

需要注意的是,虽然docker commit可以用来创建新的镜像,但是这种方式的可重复性和可追溯性都不如使用Dockerfile。因此,推荐在实际开发中尽可能使用Dockerfile来创建镜像。

Dockerfile

实例:

# 使用官方的Python运行时作为父镜像
FROM python:3.7-slim

# 设置工作目录
WORKDIR /app

# 将当前目录的内容复制到容器的/app目录中
ADD . /app

# 安装在requirements.txt中列出的任何需要的包
RUN pip install --no-cache-dir -r requirements.txt

# 使容器监听80端口
EXPOSE 80

# 定义环境变量
ENV NAME World

# 在容器启动时运行app.py
CMD ["python", "app.py"]

在你的Dockerfile所在的目录中,你可以运行以下命令来构建你的Docker镜像:

docker build -t your-image-name .

这个命令会读取当前目录的Dockerfile,并在当前目录上下文中构建一个新的Docker镜像,镜像的标签是your-image-name。

镜像的组成

Docker镜像由多个层(Layer)组成,每个层都是只读的。这些层一起构成了文件系统。每个层都对应Dockerfile中的一个指令,比如RUN, COPY等。当你改变Dockerfile并重新构建镜像时,只有从你修改的那一行指令开始的后续层会被重新构建,这就是Docker镜像构建的缓存机制。

除了文件系统层,Docker镜像还包含一些元数据,比如镜像的创建时间,镜像的作者,以及构建镜像时的Dockerfile指令等。

以下是一个简单的示例,展示了一个Docker镜像的层级结构:

# 查看镜像的详细信息
docker inspect your_image_name

在输出的JSON中,你可以看到每个层的详细信息,包括每个层的ID,创建时间,以及每个层对应的Dockerfile指令等。 

镜像层

Docker的镜像层可以被多个镜像共享。这是因为Docker镜像是由多个只读的层组成的,每个层都是独立的,并且可以被多个镜像共享。这种设计使得Docker镜像非常轻量,因为相同的层只需要存储一次,无论被多少个镜像使用。

每个镜像层的组成主要包括以下部分:

1. 文件系统的改变:每个镜像层都包含了相对于上一层的文件系统的改变。这些改变可能是添加新文件,修改已有文件,或者删除文件。

2. 元数据:每个镜像层还包含一些元数据,例如层的创建时间,层对应的Dockerfile指令等。

这种层级的设计使得Docker镜像非常轻量,因为相同的层只需要存储一次,无论被多少个镜像使用。
 

 

容器

Container

说明

Docker容器是一种轻量级的、可执行的独立软件包,它包含了运行某个应用所需的所有内容,包括代码、运行时环境、库、环境变量和配置文件。

Docker容器在任何环境中都能一致地运行,无论是在开发者的个人电脑上,还是在测试环境、生产环境,甚至是在物理硬件和云环境中。

Docker容器的主要特点包括:

- 轻量级:Docker容器共享主机系统的内核,不需要像虚拟机那样为每个应用分配操作系统资源,因此它们启动快,占用的资源少。

- 一致性:Docker容器包含了运行应用所需的所有内容,这确保了应用在任何环境中都能一致地运行。

- 可移植性:你可以在一个环境中构建Docker容器,然后在其他任何环境中运行它。

- 隔离性:每个Docker容器都在自己的命名空间中运行,与其他容器隔离。每个容器都有自己的文件系统,不能看到或直接访问其他容器的文件系统。

- 可管理性:Docker提供了强大的命令行和API工具,用于管理容器的生命周期,包括创建、启动、停止、移动和删除容器。

 

Docker容器共享主机系统的内核

Docker容器共享主机系统的内核,意味着所有容器都使用同一个操作系统内核。这是Docker轻量级和高效的关键因素。

在传统的虚拟化技术中,每个虚拟机都运行自己的操作系统,这会占用大量的系统资源。相比之下,Docker容器直接运行在宿主机的操作系统上,所有容器共享同一个内核,但每个容器都在自己的隔离环境中运行。

这种设计使得Docker容器启动快,占用的资源少,而且能够在任何Linux系统上运行,只要这个系统安装了Docker并且使用的是兼容的内核版本。

但是,这也意味着Docker容器只能运行与宿主机操作系统兼容的应用。例如,如果宿主机运行的是Linux,那么你不能在Docker容器中运行Windows应用,因为它们需要Windows内核。

总的来说,Docker通过共享主机系统的内核,实现了轻量级、高效和便捷的容器化解决方案。

docker容器的可移植性

因为Docker容器包含了运行应用所需的所有内容,包括代码、运行时、系统工具、库和设置。这确保了应用在任何Docker安装的环境中都能一致地运行。

例如,你可以在本地机器上构建一个Docker镜像,然后将这个镜像推送到Docker Hub或其他Docker镜像仓库。然后,在服务器或云环境中,你可以从Docker镜像仓库拉取这个镜像,并在那里运行容器。

Docker容器的可移植性主要适用于同一操作系统家族的不同版本之间。例如,你可以在Ubuntu 18.04上构建一个Docker容器,然后在Ubuntu 20.04或者其他版本的Linux系统上运行这个容器。
然而,由于Docker容器共享主机系统的内核,所以在不同操作系统家族之间(例如Linux和Windows)移植Docker容器可能会遇到问题。例如,一个在Linux上构建的Docker容器可能无法在Windows上运行,因为它们使用的是不同的内核。

有一种解决方案可以在Windows上运行Linux容器,那就是使用Windows Subsystem for Linux(WSL)。WSL是一种兼容层,可以在Windows 10和Windows Server 2019上运行Linux二进制可执行文件。

docker容器的隔离性

Docker容器设计为与其他容器和宿主机隔离。每个容器都在自己的环境中运行,拥有自己的文件系统,网络栈和进程空间。这意味着,理论上,一个容器中的病毒不应该能够直接影响到其他容器或宿主机。

然而,这并不意味着Docker容器是完全安全的。如果容器配置不当,例如运行在特权模式下或者与宿主机共享网络或文件系统,那么病毒可能有机会影响到宿主机或其他容器。此外,如果攻击者能够利用内核漏洞,他们可能能够从一个容器逃逸出来,影响到宿主机或其他容器。

每个容器在CPU使用、内存使用和网络带宽等资源上都是隔离的。你可以使用Docker的资源限制功能来控制每个容器可以使用的CPU和内存的数量。

在Docker中,你可以使用--memory(或-m)和--cpus参数来限制容器的内存和CPU使用。

以下是一个示例,它启动一个名为my_container的容器,该容器使用的镜像为my_image,并限制内存使用为100m,CPU使用为0.5核:

docker的资源监控功能

Docker提供了一个命令docker stats,可以用来实时监控正在运行的容器的资源使用情况,包括CPU使用率,内存使用量,网络I/O,磁盘I/O等。

以下是如何使用docker stats命令的基本步骤:

1. 打开一个终端窗口。

2. 输入docker stats命令并按回车键。你将看到一个实时更新的列表,显示所有正在运行的容器的资源使用情况。

如果你只想监控某个特定的容器,你可以在docker stats命令后面加上容器的名字或ID,如docker stats my_container。

注意,docker stats命令显示的是容器的资源使用情况,而不是主机的资源使用情况。如果你想查看主机的资源使用情况,你需要使用主机操作系统提供的工具,如Linux的top或htop命令,或者Windows的任务管理器。

镜像和容器的关系

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。可以将Docker镜像看作是容器的“蓝图”。

Docker 容器通过 Docker 镜像来创建。Docker容器是Docker镜像的一个运行实例。你可以从同一个Docker镜像启动多个独立的容器,每个容器都有自己的状态和文件系统。

docker run -i -t ubuntu /bin/bash

在这个例子中,ubuntu是Docker镜像,而docker run命令创建并启动了一个新的Docker容器。

容器的生命周期

容器的生命周期:创建状态、运行状态、停止状态、暂停状态、删除状态

状态转换说明

镜像仓库

  • Docker镜像仓库是用于存储和分发Docker镜像的地方。
  • 它可以是公开的,也可以是私有的。
  • Docker Hub是最知名的公开Docker镜像仓库,任何人都可以使用。
  • 当你使用docker pull或docker run命令时,所需的镜像会从你配置的镜像仓库中拉取。
  • 当你使用docker push命令时,你的镜像会被推送到你配置的镜像仓库。

 

这种机制使得Docker镜像可以方便地在不同的环境和系统之间共享和移动,从而实现了Docker的高度可移植性

docker hub:

Docker Hub 是一个公开的 Docker 镜像仓库,它是 Docker 镜像的默认存储位置(https://hub.docker.com)。Docker Hub 提供了一个中心化的资源,用于分发和共享 Docker 镜像。它包含了大量的公开镜像,这些镜像可以被任何人拉取和使用。

国内主流的镜像仓库地址:

在中国,由于网络原因,访问 Docker Hub 可能会比较慢。因此,国内有一些公司提供了 Docker 镜像仓库服务,这些镜像仓库通常会定期从 Docker Hub 同步镜像,以提供更快的访问速度。以下是一些国内主流的 Docker 镜像仓库:

- 阿里云 Docker 镜像服务:https://cr.console.aliyun.com/
- DaoCloud 镜像市场:https://hub.daocloud.io/
- 网易云镜像服务:https://hub.163.com/
- 华为云镜像仓库:https://swr.cn-north-4.myhuaweicloud.com/

使用这些镜像仓库时,你需要在 Docker 的配置文件(通常是 /etc/docker/daemon.json)中指定镜像仓库的地址。

{
  "registry-mirrors": ["https://<your-mirror-id>.mirror.aliyuncs.com"]
}

其中,<your-mirror-id> 需要替换为你在阿里云 Docker 镜像服务中创建的镜像加速器的 ID。 

Docker Compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

它可以简化多容器应用的管理,使得开发、测试和部署应用更加方便。

 

docker使用

 

常用总结

退出容器

exit 命令或者使用 CTRL+D 来退出容器

国内镜像源:

镜像源也可以称为镜像仓库

默认下载镜像是从dockerhub(https://hub.docker.com/)上进行下载,但下载速度较慢,所以要配置成国内的镜像源方便快捷下载所需镜像

 

科大镜像:https://docker.mirrors.ustc.edu.cn/

网易:https://hub-mirror.c.163.com/

阿里云:https://<你的ID>.mirror.aliyuncs.com

七牛云加速器:https://reg-mirror.qiniu.com

中国官方镜像源:https://www.docker-cn.com/registry-mirror

 

私有仓库

私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。

如果想要自己搭建私有镜像残酷,官方提供Registry镜像,也可以通过开源项目harbor来部署企业级的私有仓库,在Kubernetes集群中,推荐使用Harbor仓库环境。

 

自动构建

GitLab+Jenkins+Harbor可以实现Docker镜像自动化构建并推送远程仓库,项目一旦有新的提交或者创建了新标签,将会触发自动构建镜像并推送仓库

 

下载镜像为压缩包

 

docker save -o /data/export/test.tar test:4.0

no main manifest attribute, in

docker运行时报上面的错误

项目基于maven pom多模块的开发的,需要设置goal-repackage属性为true,否则打包后文件依赖文件没有一起打包,然后镜像内没有可以运行的程序文件

该plugin修改为如下:

<plugin>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-maven-plugin</artifactId>

           <!--加入下面两项配置-->

           <executions>

             <execution>

               <goals>

                 <goal>repackage</goal>

               </goals>

             </execution>

           </executions>

            <configuration>

                 <includeSystemScope>true</includeSystemScope>

            </configuration>

      </plugin>

 

posted @ 2022-08-06 15:04  星光闪闪  阅读(362)  评论(0)    收藏  举报