循序渐进学Docker:从入门到实践

Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及应用的运行环境到一个可移植的容器中。本文将从 Docker 的基本概念开始,逐步介绍 Docker 的安装、使用和实践,帮助读者快速掌握 Docker 的使用。

Docker 简介

Docker 是一个轻量级、可移植的、自给自足的软件运行环境。它使用 Linux 容器技术,将软件和其依赖打包到一个轻量级、可移植的容器中,从而实现“一次构建,到处运行”的目标。

安装 Docker

在开始使用 Docker 之前,需要先安装 Docker。以下是在 Ubuntu 系统上安装 Docker 的步骤:

  1. 更新软件包索引:

    sudo apt-get update
    
  2. 安装 Docker:

    sudo apt-get install docker-ce docker-ce-cli containerd.io
    
  3. 验证 Docker 是否安装成功:

    sudo docker run hello-world
    

Docker 基本概念

在使用 Docker 之前,需要了解一些基本概念,包括镜像(Image)、容器(Container)、仓库(Repository)等。

镜像(Image)

镜像是一个只读模板,包含了运行应用程序所需的所有内容(代码、运行时、库、环境变量和配置文件)。

容器(Container)

容器是镜像的运行实例。它可以被启动、停止、移动和删除。每个容器都是相互隔离的、保证安全的平台。

仓库(Repository)

仓库是集中存放镜像的地方。Docker Hub 是一个公共的仓库服务,允许用户上传和下载镜像。

使用 Docker

创建容器

使用以下命令创建并运行一个容器:

docker run -d -p 5000:5000 --name myapp myimage

其中,-d 表示后台运行,-p 表示端口映射,--name 指定容器名称,myimage 是镜像名称。

停止容器

使用以下命令停止容器:

docker stop myapp

查看容器列表

使用以下命令查看正在运行的容器列表:

docker ps

实践:使用 Docker 部署一个 Web 应用

接下来,我们将使用 Docker 部署一个简单的 Web 应用。假设我们有一个 Flask 应用,其代码如下:

# app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, Docker!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
  1. 编写 Dockerfile:

    # 使用官方 Python 镜像
    FROM python:3.8-slim
    
    # 设置工作目录
    WORKDIR /app
    
    # 复制当前目录下的所有文件到工作目录
    COPY . /app
    
    # 安装依赖
    RUN pip install -r requirements.txt
    
    # 暴露端口
    EXPOSE 5000
    
    # 启动应用
    CMD ["python", "app.py"]
    
  2. 构建镜像:

    docker build -t myflaskapp .
    
  3. 运行容器:

    docker run -d -p 5000:5000 --name myflaskapp myflaskapp
    
  4. 访问 Web 应用:

    打开浏览器,访问 http://localhost:5000,你将看到 "Hello, Docker!" 的欢迎信息。

关系图

以下是 Docker 组件之间的关系图:

erDiagram
    IMAGE ||--o CONTAINER : "实例化"
    CONTAINER ||--o IMAGE : "基于"
    CONTAINER {
        int id number
        string name
    }
    IMAGE {
        int id number
        string name
    }

类图

以下是 Docker 容器的类图:

classDiagram
    class Container {
        +int id
        +string name
        +string status
        +string image
    }
    class Image {
        +int id
        +string name
        +string tag
    }
    Container -- Image: "基于"

结语

Docker 作为一个轻量级、可移植的容器化技术,已经成为软件开发和运维领域的重要工具。通过本文的介绍,希望读者能够对 Docker 有一个基本的了解,并能够将其应用到实际项目中。随着 Docker 生态的不断发展,相信 Docker 将为软件开发带来更多的便利和创新。