Docker入门 | 青训营

114 阅读6分钟

1. Docker简介

Docker是一个开源的应用容器化平台,它允许开发者和系统管理员将应用及其所有依赖项打包到一个称为“容器”的标准化单元中。这种容器化的方法确保了应用在任何环境中的一致性、可靠性和安全性,从开发到测试,再到生产环境。


2. Docker与虚拟机的区别

虽然Docker和传统的虚拟机都提供了资源隔离和分配的功能,但它们在结构和原理上存在明显的区别。

  • 资源占用与性能

    • Docker容器直接在宿主机上运行并共享其内核,但保持隔离。因此,它们非常轻量级且启动迅速。
    • 虚拟机包括完整的操作系统和虚拟硬件集,因此启动时间长且占用更多资源。
  • 隔离级别

    • Docker使用的技术(如命名空间和cgroups)提供了一个安全的环境,但与真正的完全隔离的VM相比,可能略有不足。
    • 虚拟机提供了强隔离,因为它们完全是独立的实体。
  • 磁盘和文件大小

    • Docker的镜像设计为分层的,共享常用的基础层,这有助于节省空间。
    • VM需要为每个实例复制完整的操作系统和应用,通常占用更多的磁盘空间。

3. 基本原理和概念

Docker的核心是容器,但还有许多其他组件和概念:

  • 镜像 (Image) :静态的快照,包含运行应用所需的代码、库、环境变量和配置文件。一旦创建,镜像是不变的,为容器的创建提供了一致的基础。
  • 容器 (Container) :镜像的运行实例,可以启动、停止、删除和管理。每个容器都是独立的,但所有容器都共享宿主机的操作系统内核。
  • Docker Daemon:在宿主机上运行的背景服务,负责构建、运行和管理Docker容器。
  • Docker Client:用户与Docker Daemon交互的主要方式。它接受用户命令,如构建、运行和管理容器,并与Daemon通信。
  • Volume:用于数据持久化和容器间数据共享的机制。Volume独立于容器生命周期,当容器被删除时,Volume的数据仍然存在。
  • Docker Registry:存储Docker镜像的服务。Docker Hub是公开的registry,但也可以设置私有的registry。

4. Windows的安装配置

安装Docker Desktop for Windows比我想象的简单。按照以下步骤操作:

  1. 下载:首先,访问Docker的官方网站,选择适合Windows的Docker Desktop版本进行下载。
  2. 安装:运行下载的安装程序,按照提示步骤完成安装。Windows下的Docker要么在WSL2下运行(推荐),要么需要打开Hyper-V,而Windows家庭版不支持Hyper-V。
  3. 验证:完成安装后,启动Docker Desktop。在任务栏应该可以看到Docker的图标。为进一步验证,打开命令提示符或PowerShell,输入docker --version确认安装的版本。
  4. 配置:在Docker Desktop的设置中,你可以配置CPU、内存、磁盘使用量等资源限制,根据你的开发需要进行调整。

5. 容器化和Dockerfile

容器化是一种技术,它封装应用及其所有的依赖项到一个独立的执行环境中,这确保了应用无论在哪里运行都能得到相同的环境条件。Dockerfile是实现这一目标的关键。

Dockerfile的核心概念:

Dockerfile是一个由一系列指令组成的文本文件,这些指令会被Docker解释并执行,从而逐步构建一个Docker镜像。下面是一些常见的Dockerfile指令:

  • FROM: 定义基础镜像,这通常是一个预构建的操作系统环境,如ubuntu, alpine或特定的应用环境,如python:3.8node:14等。
  • WORKDIR: 设置容器内部的工作目录,所有随后的操作(例如CMD、RUN、COPY等)都在这个目录下进行。
  • COPY: 从宿主机复制文件或目录到容器中。它通常用于将应用的源代码或资源传输到容器中。
  • RUN: 在容器内执行命令。这常用于安装依赖或其他预备操作。
  • CMD: 定义容器启动时要运行的命令,例如应用的启动命令。
  • EXPOSE: 声明容器运行时将使用的端口。

6. Dockerfile实践

  • 编写Dockerfile:Dockerfile是一种简单的脚本语言,指示Docker如何构建镜像。例如下面是一个安装Python应用所需的依赖的Dockerfile:

    FROM python:3.8
    # 设置工作目录
    WORKDIR /app
    # 复制当前目录下所有文件到容器的/app目录
    COPY . /app
    # 安装依赖
    RUN pip install --no-cache-dir -r requirements.txt
    # 定义启动命令
    CMD ["python", "app.py"]
    
  • 构建镜像:使用docker build命令和Dockerfile来创建镜像。在Dockerfile所在的目录,使用以下命令:

    docker build -t my-python-app:latest .
    

    这里-t参数允许我们为镜像命名。my-python-app是镜像的名称,latest是镜像的标签。

  • 运行容器:使用docker run命令从创建的镜像中启动一个新的容器实例:

    docker run -d -p 5000:5000 my-python-app:latest
    

    这里-d参数让容器在后台运行,-p参数则是端口映射,将容器内部的5000端口映射到宿主机的5000端口。


7. DockerDesktop的使用

Docker Desktop是一个完整的Docker开发环境,包括Docker engine、CLI和其他必要的组件。

  • 图形界面:对于那些更喜欢图形界面而不是命令行的用户来说,Docker Desktop提供了一个直观的界面来管理容器、镜像、网络和卷。
  • 集成Kubernetes:Docker Desktop还包括一个本地的Kubernetes集群,使得开发者可以在本地机器上测试Kubernetes应用。
  • Dev Environments:这是Docker Desktop的一个新功能,允许团队定义和分享他们的开发环境,确保一致性和生产力。

8. DockerCompose简介

DockerCompose是一个工具,用于定义和运行使用Docker容器的多服务应用。它使用YAML文件来配置应用的服务、网络和卷,然后提供一系列命令来管理和启动这些服务。

优势

  1. 一致性:通过统一的定义和配置,DockerCompose确保应用的各个部分在任何环境中都以相同的方式启动和运行。
  2. 可复用性:使用DockerCompose,开发者可以在本地构建、测试并调试应用,然后再在生产环境中以完全相同的方式部署它。
  3. 隔离性:每个服务运行在其自己的容器中,确保每个服务独立并互不干扰。

DockerCompose示例

考虑一个Web应用,它包括一个Web服务器和一个数据库。以下是一个docker-compose.yml的示例文件:

version: '3'
services:
  web:
    image: my-web-app:latest
    ports:
      - "5000:5000"
  db:
    image: postgres:9.6
    environment:
      POSTGRES_PASSWORD: mypassword

这里:

  • 我们定义了两个服务:webdb
  • web服务使用my-web-app:latest镜像,并映射端口5000到宿主机。
  • db服务使用官方的postgres镜像,并设置一个环境变量来定义密码。

常用Docker Compose命令

  • 启动所有服务docker-compose up

  • 停止所有服务docker-compose down

  • 查看正在运行的服务docker-compose ps

  • 查看服务日志docker-compose logs


Docker不仅为开发者提供了一种简单、一致的方法来容器化应用,还提供了强大的工具和生态系统来管理和运行这些容器。无论你是开发、测试还是部署应用,Docker都能帮到你。