Docker的基本概念
镜像(Image),容器(Container)和仓库(Repository)。
- 镜像(Image):Docker 镜像是一个只读的模板,可以用来创建 Docker 容器。它包含一个完整的操作系统环境,里面可以安装运行应用程序所需的所有内容,包括代码、运行时环境、系统工具、系统库和设置。镜像是通过联合文件系统(UnionFS)来实现分层存储的,每一层都是在前一层的基础上进行的修改,这样的设计使得镜像的构建和传输更加高效。
- 容器(Container):容器是从镜像创建的运行实例,可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境及其运行的应用。
- 仓库(Repository):仓库是集中存放镜像文件的场所,可以理解为代码仓库所存储的代码一样。
- 这些基本概念构成了Docker的整个生命周期,从构建镜像,到创建并运行容器,再到将容器存储到仓库,实现应用的快速部署和扩展。
Docker的架构是一个客户端-服务器(C/S)架构
主要由Docker客户端,Docker守护进程,Docker服务器,Docker镜像和Docker容器等组件构成。
- Docker客户端:Docker客户端是用户与Docker交互的主要方式。它提供了一系列命令,用户可以通过这些命令来创建、运行、停止、删除容器等操作。Docker客户端可以与Docker守护进程进行通信,将用户的命令发送给守护进程来执行。
- Docker守护进程(Docker Daemon):Docker守护进程是Docker架构中的核心组件。它是一个后台进程,负责管理Docker容器的生命周期,包括创建、运行、停止、删除容器等操作。同时,它还负责管理Docker镜像和网络。守护进程会与Docker服务器进行通信,执行服务器发来的请求。
- Docker服务器:Docker服务器接收来自Docker客户端的请求,并将这些请求发送给Docker守护进程来处理。服务器还提供了REST API,开发者可以使用这些API来与Docker进行交互。
- Docker镜像:Docker镜像是Docker容器的基础,它是一个只读的模板,包含了运行应用程序所需的所有文件和配置。用户可以使用Dockerfile来定义镜像的内容,然后使用Docker命令来构建镜像。构建完成后,镜像可以被上传到Docker仓库中共享。
- Docker容器:Docker容器是从Docker镜像创建出来的运行实例。当用户运行一个镜像时,Docker守护进程会创建一个新的容器,然后在容器中启动应用程序。每个容器都是相互隔离的,它们拥有自己的文件系统、网络配置和进程空间。容器可以被启动、停止、删除,而且启动速度非常快。
以下是Docker常用的一些命令及其作用:
-
docker build:用于从源代码构建Docker镜像。通常需要指定一个Dockerfile作为构建规范。
-
docker run:该命令用于启动一个新的容器实例。它可以接受许多参数,用于指定容器环境、网络配置、启动命令等。
-
docker ps:这个命令用于列出当前正在运行的Docker容器。可以显示容器的ID、名称、状态、创建时间等信息。
-
docker stop:用于停止一个或多个正在运行的容器。
-
docker rm:用于删除一个或多个容器。删除的容器必须是已经停止的。
-
docker rmi:这个命令用于删除一个或多个Docker镜像。必须先停止和删除使用该镜像的所有容器,才能删除镜像。
-
docker pull:该命令用于从Docker仓库中下载一个或多个镜像。
-
docker push:用于将一个或多个镜像上传到Docker仓库。
-
docker logs:这个命令用于查看容器的日志信息。可以帮助调试容器的运行问题。
-
docker exec:用于在正在运行的容器中执行命令。这个命令可以帮助我们在容器内运行诊断工具、手动启动应用等。
-
docker images:这个命令用于列出主机上的所有镜像。它会显示镜像的仓库名、标签、镜像ID、创建时间等信息。
-
docker search:用于在Docker Hub中搜索镜像。你可以通过关键词搜索感兴趣的镜像,并查看它们的描述和星星数量。
-
docker network:该命令用于管理Docker的网络。它可以创建、列出、删除网络等。Docker容器可以通过这些网络进行通信。
-
docker volume:用于管理Docker的数据卷。数据卷是一个可供容器使用的特殊目录,它可以持久化存储数据,并在多个容器之间共享数据。
-
docker system:这是一个用于管理Docker系统的命令。它可以清理无用的资源,如停止的容器、无用的网络、悬挂的镜像等。
-
docker login/logout:这两个命令用于登录和登出Docker Hub。登录后,你可以使用Docker Hub上的镜像仓库,上传或下载镜像。
-
docker save/load:这两个命令用于将Docker镜像导出为文件并保存到主机上,以及将保存的镜像文件加载回Docker。这对于备份、迁移或在没有直接网络访问的情况下传输镜像非常有用。
- 这些命令都可以通过在命令行终端输入 > docker [command] --help来查看具体的用法和选项。

Dockerfile文件
Dockerfile 是 Docker 的核心概念之一,它是一种可以被 Docker 解释的脚本文件,用于定义如何创建一个 Docker 镜像。
-
基本结构:Dockerfile 由一系列的指令和参数构成,每条指令都对镜像进行一层的构建。Dockerfile 的指令是忽略大小写的,但是通常建议大写。每一条指令都必须以大写字母开头,后面可以跟随多个参数。
-
常用指令:Dockerfile 中包含多种指令,例如:
- FROM:定义基础镜像,每个 Dockerfile 都必须以 FROM 指令开始。
- RUN:在镜像中执行命令,通常用于安装软件包。
- CMD:提供容器启动时的默认命令。
- EXPOSE:声明容器运行时提供的端口。
- ENV:设置环境变量。
- ADD:将文件从宿主机复制到镜像中。
- COPY:将文件从构建上下文复制到镜像中。
-
构建上下文:在 Docker 构建过程中,Docker 会将当前目录下的所有文件(除了.dockerignore排除的路径和文件)发送到 Docker 守护进程,这个目录就称为构建上下文。
-
Dockerfile最佳实践:编写Dockerfile时,有一些最佳实践可以遵循,例如尽量减少镜像层数、清理不必要的文件和缓存、使用基础镜像、列出所有依赖等。
-
构建镜像:使用
docker build命令以及指定的 Dockerfile 文件路径来构建镜像。例如:docker build -t my-image:latest .这个命令使用当前目录下的 Dockerfile 构建一个名为 my-image,标签为 latest 的镜像。
数据卷
数据卷(Volumes)是Docker中一个重要的概念,以下是与数据卷相关的知识:
-
数据卷的定义与作用:数据卷是一个可供一个或多个容器使用的特殊目录,它绕过联合文件系统,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
-
数据卷的使用:数据卷的使用非常简单,可以在
docker run命令中使用-v或--volume参数来创建数据卷并挂载到容器内部,例如:docker run -d -it --name container1 -v /data centos:latest,这个命令会创建一个名为container1的容器,并将宿主机的/data目录挂载到容器内部。 -
数据卷的持久化:数据卷的一个重要特性就是持久化,即使容器被删除,数据卷也不会被删除,这样就可以保证数据的安全性和持久性。
-
数据卷与容器的交互:对数据卷的修改会立即影响到所有使用这个数据卷的容器,这样在多个容器之间共享数据就变得非常简单和高效。
-
最佳实践:为了保持数据的独立性和可移植性,建议将应用程序的数据存储在数据卷中,而不是直接存储在容器的可写层中。这样,即使应用程序的容器被删除或替换,数据也可以保留下来。
- 总的来说,数据卷是Docker提供的一种数据存储机制,它独立于容器的生命周期,可以为持久化存储、共享数据等场景提供很好的支持。
相关命令

网络
Docker中的网络是Docker架构中一个重要的组成部分。
- Docker的四种网络模式:Docker提供了四种网络模式,分别是bridge(桥接)模式、host(主机)模式、none(无网络)模式和container(容器)模式。这四种网络模式提供了不同的网络配置和通信方式,以满足不同场景的需求。
- 桥接模式:桥接模式是Docker的默认网络模式。在桥接模式下,Docker会为每个容器创建一个独立的网络命名空间,并分配一个独立的IP地址。容器之间可以通过IP地址进行通信,但容器与宿主机之间的通信需要通过Docker网桥进行转发。
- 主机模式:在主机模式下,容器共享宿主机的网络命名空间,直接使用宿主机的网络接口进行通信。这种模式下,容器与宿主机之间的网络通信效率较高,但容器之间隔离性较差。
- 无网络模式:无网络模式下,容器没有网络接口,无法与其他容器或宿主机进行网络通信。这种模式下,通常需要通过其他方式(如共享文件、管道等)进行容器间的数据交换。
- 容器模式:容器模式允许容器使用另一个容器的网络命名空间。这样,两个容器可以像在同一网络中一样进行通信,它们可以直接通过对方的IP地址或容器名进行访问。
- Docker的网络驱动:Docker还提供了多种网络驱动,如overlay、macvlan等,用于实现更复杂的网络拓扑和通信模式。这些网络驱动可以根据具体需求进行选择和配置。
桥接模式(bridge模式)是Docker中最常用的网络模式。它是Docker的默认网络模式,适用于大多数场景。在桥接模式下,Docker会为每个容器分配独立的IP地址,并提供容器之间的网络隔离和通信功能。这种模式可以满足大部分应用程序的网络需求,并且具有较好的通用性和灵活性。
此外,为了管理和操作Docker网络,可以使用docker network命令。这个命令可以创建、列出、删除网络等。
Docker compose
Docker Compose是Docker的一个独立工具,用于定义和运行多容器Docker应用程序。以下是与Docker Compose相关的知识:
-
定义多容器应用:Docker Compose允许您使用YAML文件来定义多容器应用。这意味着您可以在单个文件中定义应用程序的服务,每个服务都是Docker容器。
-
简化容器编排:使用Docker Compose,您可以更轻松地编排和管理多个容器。您可以使用单个命令启动、停止和重启整个应用程序,而无需分别管理每个容器。
-
环境隔离:Docker Compose可以帮助您在开发、测试和生产环境中隔离应用程序。您可以使用不同的Compose文件或不同的配置来轻松地在不同环境中切换。
-
扩展性:Docker Compose支持扩展应用程序的规模。您可以使用Compose文件来定义多个实例或复制服务,以满足应用程序的需求。
-
集成持续集成/持续部署(CI/CD):Docker Compose可以很容易地与CI/CD流程集成。这意味着您可以自动化构建、测试和部署多容器应用程序。
-
命令行工具:Docker Compose是一个命令行工具,可以通过运行
docker-compose命令来执行各种操作,如启动、停止、重启、日志查看等。 -
配置文件:默认情况下,Docker Compose使用名为
docker-compose.yml的配置文件。这个文件使用YAML格式,描述了构成应用程序的各个服务以及它们之间的依赖关系。
Docker安全问题
-
镜像安全:
- 基础软件漏洞:由于容器基于基础软件包构建,如果这些软件包存在漏洞,攻击者可能会利用这些漏洞侵入容器,进而影响其他容器或主机安全。
- 镜像仓库漏洞:不论是Docker官方的镜像仓库还是私有镜像仓库,都有可能被攻击者篡改镜像。当使用这些被篡改的镜像时,安全威胁就随之而来。
- 用户程序漏洞:用户自己构建的软件包可能存在安全漏洞,或被植入恶意脚本,这可能导致运行时权限提升,进而影响其他容器或主机安全。
-
内核共享风险:所有在同一宿主机上运行的容器都共享主机内核。如果攻击者利用某些手段导致内核崩溃,那么整个主机以及上面的所有服务都可能受到影响。
-
Docker引擎安全漏洞:Docker作为一款容器引擎,本身也可能存在安全漏洞。例如,CVE(Common Vulnerabilities and Exposures)记录了多项与Docker相关的安全问题,如权限提升、信息泄露等。
-
不安全的默认配置:Docker的某些默认设置可能不安全。例如,默认情况下,Docker容器可以以root用户身份运行,这可能导致潜在的安全风险。
-
敏感数据泄露:如果不正确地配置或管理,Docker容器可能会泄露敏感数据,如密码、API密钥等。
-
网络攻击:不正确的网络配置可能导致容器受到网络攻击,如DoS攻击、端口扫描等。
为了确保Docker环境的安全,建议采取以下措施:
- 定期更新和修补Docker引擎、基础软件包和用户应用程序。
- 只从受信任的源获取和使用Docker镜像。
- 遵循最小权限原则,避免容器以root用户身份运行。
- 使用安全网络和防火墙规则来限制容器的网络访问。
- 加密和备份敏感数据,避免在容器中直接存储这些数据。

