docker

基本概念

Docker 是一个用于 构建、运行、传送 应用程序的平台。

将以下这些打包,以便在任何环境中都可以正确地运行:

  • 配置文件、启动命令
  • 应用程序、环境变量
  • 第三方软件库和依赖包
  • 运行时环境
  • 操作系统(OS)

为什么要使用 Docker

  1. 环境一致性: Docker 容器包含应用程序及其依赖项,确保在不同的环境中具有一致的运行结果。这有助于避免”在我的机器上可以运行”这类问题。

  2. 轻量级: Docker 容器与虚拟机相比更轻量,因为它们共享主机操作系统的内核。这使得 Docker 容器更快速启动、占用更少资源,并提供更高的性能。

  3. 快速部署: Docker 容器可以快速部署,几乎可以在任何支持 Docker 的环境中运行。这加速了应用程序的交付流程,使得新版本的应用程序可以更快地投入生产环境。

  4. 易于扩展: Docker 容器可以在分布式环境中轻松扩展,实现负载均衡和高可用性。通过使用 Docker Swarm 或 Kubernetes 等容器编排工具,可以方便地管理多个容器的部署和伸缩。

  5. 隔离性: Docker 容器提供了隔离的运行环境,每个容器之间相互隔离,不会相互影响。这使得应用程序更加安全,同时也更容易管理多个服务或应用。

  6. 版本控制和回滚: Docker 允许将应用程序和其依赖项打包成镜像,并通过版本控制来管理。这样,可以方便地回滚到之前的版本,降低了部署过程中的风险。

  7. 生态系统和社区支持: Docker 拥有庞大的社区,有大量的公开可用的镜像和工具。这使得开发人员可以轻松地获取和分享容器化的应用程序组件,加速了开发和部署过程。

  8. 跨平台: Docker 容器可以在各种操作系统上运行,包括 Linux、Windows 和 macOS 等。这种跨平台性使得开发、测试和部署更加灵活。

Docker 和虚拟机的区别

Docker 容器和虚拟机(VM)是两种不同的虚拟化技术,它们在实现和性能方面存在一些关键的区别。以下是 Docker 容器和虚拟机之间的主要区别:

  1. 架构差异
  • Docker 容器: Docker 容器共享主机操作系统的内核,但在容器中运行的应用程序有自己独立的用户空间。这使得 Docker 容器相对轻量,启动迅速。
  • 虚拟机: 虚拟机通过使用虚拟化层创建独立的虚拟硬件,每个虚拟机都运行一个完整的操作系统实例。这增加了虚拟机的重量和启动时间。
  1. 资源占用
  • Docker 容器: 由于容器共享主机内核,它们占用的资源更少,启动更快。容器可以在同一主机上运行成百上千个实例而不会显著增加资源开销。
  • 虚拟机: 每个虚拟机都需要独立的操作系统和虚拟硬件,因此它们通常占用更多的资源,并且启动时间较长。
  1. 隔离性
  • Docker 容器: 容器提供了一定程度的隔离,但容器共享主机内核,因此在安全性上相对较弱。
  • 虚拟机: 虚拟机提供更强的隔离,因为它们运行独立的操作系统。虚拟机通常在安全性方面更有优势。
  1. 跨平台性
  • Docker 容器: 容器可以在不同操作系统上运行,前提是它们使用相同的 Docker 引擎。这增加了跨平台的灵活性。
  • 虚拟机: 虚拟机通常依赖于特定的虚拟化技术和操作系统,因此在不同平台之间移植性较差。
  1. 镜像大小
  • Docker 容器: Docker 镜像通常比虚拟机镜像小得多,因为它们只包含应用程序及其依赖项,而不包括整个操作系统。
  • 虚拟机: 虚拟机镜像包含完整的操作系统,因此它们通常较大。

根据应用程序的需求和部署场景,选择使用 Docker 容器还是虚拟机取决于具体情况。一些场景中它们也可以结合使用,例如在虚拟机中运行 Docker 容器。

安装配置

  1. 下载 Docker Desktop for Mac:
    访问 Docker 官方网站下载 Docker Desktop for Mac。安装程序将包含 Docker 引擎以及 Docker CLI 等组件。

  2. 安装 Docker Desktop:
    双击下载的 Docker.dmg 文件,将 Docker 图标拖动到 Applications 文件夹中,然后在 Applications 文件夹中运行 Docker。

  3. 运行 Docker Desktop:
    打开 Docker 应用程序,它将启动 Docker 引擎。

  4. 验证 Docker 安装:
    打开终端(Terminal)并运行以下命令检查 Docker 版本

1
docker --version

常用命令

Docker 提供了丰富的命令行工具,用于管理和操作 Docker 容器、镜像等。以下是一些常用的 Docker 命令:

镜像命令:

查看本地镜像列表:

docker images
从 Docker Hub 下载镜像:

docker pull image_name:tag
构建镜像:

docker build -t image_name:tag .
删除本地镜像:

docker rmi image_name:tag

容器命令:

  1. 启动容器:
    docker run image_name:tag
  2. 启动容器并指定名称:
    docker run --name container_name image_name:tag
  3. 查看运行中的容器:
    docker ps
  4. 查看所有容器(包括停止的):
    docker ps -a
  5. 停止容器:
    docker stop container_id/container_name
  6. 删除容器:
    docker rm container_id/container_name
  7. 进入运行中的容器:
    docker exec -it container_id/container_name /bin/bash

日志和信息:

  1. 查看容器日志:
    docker logs container_id/container_name

  2. 查看容器详细信息:
    docker inspect container_id/container_name

网络命令:

  1. 查看网络列表:
    docker network ls
  2. 查看网络详细信息:
    docker network inspect network_name

其他常用命令:

  1. 查看 Docker 版本:
    docker version
  2. 查看 Docker 信息:
    docker info
  3. 清理无用资源(镜像、容器等):
    docker system prune
  4. 查看 Docker 帮助:
    docker --help

构造镜像、运行容器

构建 Docker 镜像是通过定义一个 Dockerfile 文件来描述镜像的构建过程。以下是一个简单的 Dockerfile 示例,演示如何构建一个基于 Node.js 的简单 Web 应用的镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 使用官方Node.js镜像作为基础镜像
FROM node:14

# 设置工作目录
WORKDIR /app

# 将应用程序的依赖项文件拷贝到工作目录
COPY package*.json ./

# 安装应用程序的依赖项
RUN npm install

# 将应用程序文件拷贝到工作目录
COPY . .

# 暴露应用程序监听的端口
EXPOSE 3000

# 定义启动命令
CMD ["node", "app.js"]

上述 Dockerfile 的主要步骤包括:

使用官方 Node.js 14 镜像作为基础镜像。
设置工作目录为/app。
将应用程序的 package.jsonpackage-lock.json 拷贝到工作目录。
运行 npm install 安装应用程序的依赖项。
将应用程序文件拷贝到工作目录。
暴露应用程序监听的端口(这里是 3000)。
定义启动容器时运行的命令。

接下来,可以使用以下命令在 Dockerfile所在的目录中构建镜像:

docker build -t your_image_name:tag .
其中,your_image_name 是你为镜像定义的名称,tag 是版本标签。最后的点.表示 Dockerfile 所在的当前目录。

构建完成后,你可以使用以下命令查看构建的镜像
docker images

然后,你可以使用构建的镜像来运行容器:
docker run -p 3000:3000 -d your_image_name:tag

Docker Compose

特点和用途:

Docker Compose 是 Docker 官方提供的工具,用于定义和运行多容器的 Docker 应用。
使用 YAML 文件定义多容器应用的服务、网络和卷等配置。
主要用于开发和测试环境,以便在本地一次性启动多个相关联的容器。
简化了通过 docker-compose up 一键启动整个应用程序的过程。

基本概念:

  • services: 定义应用中的各个服务,每个服务对应一个容器。
  • networks: 定义服务之间的网络连接。
  • volumes: 定义服务使用的数据卷。

示例 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
version: "3"

services:
web:
image: nginx
ports:
- "8080:80"
app:
image: your_app_image
ports:
- "5000:5000"