Docker 介绍:初学者入门指南 – wiki基地

Docker 介绍:初学者入门指南

Docker,作为容器化技术的代表,已经彻底改变了软件开发、部署和运维的方式。它允许开发者将应用程序及其依赖项打包到一个标准化的单元中,使其能够在任何支持 Docker 的环境中可靠地运行。对于初学者来说,理解 Docker 的概念和掌握其基本用法是至关重要的。本文将深入浅出地介绍 Docker,帮助你快速入门并掌握其核心技术。

一、 什么是容器化技术?为什么选择 Docker?

在深入了解 Docker 之前,我们先理解一下容器化技术。传统的应用程序部署方式,通常需要在服务器上安装操作系统、配置依赖环境,然后才能运行应用程序。这种方式存在几个问题:

  • 环境不一致性: 不同的服务器环境可能存在差异,导致应用程序在不同环境中运行不稳定。
  • 资源浪费: 每个应用程序都需要独立的操作系统资源,造成服务器资源利用率低下。
  • 部署复杂性: 部署过程繁琐,需要手动配置环境,容易出错。

容器化技术应运而生,它通过虚拟化操作系统层面,将应用程序及其依赖项打包到一个独立的容器中。每个容器都拥有自己的文件系统、进程空间、网络等资源,与宿主机环境隔离。这意味着,应用程序在容器中运行,不再依赖于宿主机的操作系统环境,从而解决了环境不一致性和部署复杂性的问题。

Docker 是目前最流行的容器化技术之一,它具有以下优势:

  • 轻量级: Docker 容器共享宿主机的操作系统内核,相比虚拟机更加轻量级,启动速度更快,资源消耗更低。
  • 可移植性: Docker 容器可以在任何支持 Docker 的环境中运行,实现跨平台部署。
  • 隔离性: Docker 容器之间相互隔离,保证应用程序的安全性和稳定性。
  • 版本控制: Docker 镜像采用分层结构,可以方便地进行版本控制和回滚。
  • 易于管理: Docker 提供了一系列命令行工具和 API,方便用户管理容器。
  • 社区支持: Docker 拥有庞大的社区支持,提供了丰富的镜像资源和技术文档。

总而言之,Docker 通过容器化技术,简化了应用程序的部署和管理,提高了资源利用率,降低了运维成本,是现代软件开发和运维的必备工具。

二、 Docker 的核心概念

理解 Docker 的核心概念是掌握 Docker 的基础。主要有以下几个核心概念:

  • 镜像 (Image): 镜像是一个只读的模板,包含了运行应用程序所需的所有内容:代码、运行时环境、系统工具、系统库、依赖项等。可以将镜像看作是应用程序的 “打包” 版本。
  • 容器 (Container): 容器是镜像的一个运行时实例。它是镜像的可运行副本,包含了应用程序运行所需的所有资源。可以启动、停止、删除容器。一个镜像可以创建多个容器。
  • Dockerfile: Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。它定义了如何构建镜像,例如安装哪些软件、复制哪些文件、运行哪些命令等。
  • Docker Hub: Docker Hub 是一个公共的镜像仓库,类似于 GitHub,可以存储和分享 Docker 镜像。用户可以从 Docker Hub 下载现成的镜像,也可以将自己构建的镜像上传到 Docker Hub。
  • Docker Registry: Docker Registry 是一个存储 Docker 镜像的仓库。Docker Hub 是一个公共的 Docker Registry,用户也可以搭建私有的 Docker Registry。
  • Docker Engine: Docker Engine 是 Docker 的核心组件,负责管理 Docker 镜像和容器。它包括 Docker daemon 和 Docker CLI。
    • Docker Daemon (dockerd): Docker Daemon 是一个后台进程,负责构建、运行和管理 Docker 容器。
    • Docker CLI (docker): Docker CLI 是一个命令行工具,用于与 Docker Daemon 交互,执行各种 Docker 命令,例如构建镜像、运行容器、管理网络等。

三、 Docker 的安装与配置

在开始使用 Docker 之前,需要先安装 Docker。 Docker 提供了适用于各种操作系统的安装包,包括 Linux、macOS 和 Windows。

安装完成后,可以通过以下命令验证 Docker 是否安装成功:

bash
docker --version

如果能够看到 Docker 的版本信息,则表示 Docker 安装成功。

四、 Docker 的基本用法

掌握 Docker 的基本用法是使用 Docker 的关键。以下是一些常用的 Docker 命令:

  • 镜像相关命令:
    • docker pull <image_name>: 从 Docker Hub 或其他 Docker Registry 下载镜像。例如: docker pull ubuntu:latest 下载最新版本的 Ubuntu 镜像。
    • docker images: 列出本地已下载的镜像。
    • docker rmi <image_id>: 删除本地镜像。例如:docker rmi sha256:abcdefg1234567890 删除 ID 为 sha256:abcdefg1234567890 的镜像。
    • docker build -t <image_name>:<tag> .: 根据 Dockerfile 构建镜像。例如:docker build -t my-app:1.0 . 根据当前目录下的 Dockerfile 构建一个名为 my-app,标签为 1.0 的镜像。
    • docker push <image_name>:<tag>: 将镜像推送到 Docker Hub 或其他 Docker Registry。 需要先登录 Docker Hub。
  • 容器相关命令:
    • docker run <image_name>: 创建一个新的容器并运行它。例如:docker run ubuntu 创建并运行一个基于 Ubuntu 镜像的容器。
    • docker run -d <image_name>: 创建一个新的容器并在后台运行。 -d 参数表示 detached mode。例如: docker run -d nginx 创建并在后台运行一个基于 Nginx 镜像的容器。
    • docker ps: 列出正在运行的容器。
    • docker ps -a: 列出所有容器,包括正在运行和已停止的容器。
    • docker stop <container_id>: 停止一个正在运行的容器。例如:docker stop 1234567890abcdef 停止 ID 为 1234567890abcdef 的容器。
    • docker start <container_id>: 启动一个已停止的容器。
    • docker restart <container_id>: 重启一个容器。
    • docker rm <container_id>: 删除一个已停止的容器。
    • docker exec -it <container_id> <command>: 进入一个正在运行的容器。例如:docker exec -it 1234567890abcdef bash 进入 ID 为 1234567890abcdef 的容器,并执行 bash 命令,打开一个交互式终端。
    • docker logs <container_id>: 查看容器的日志输出。
    • docker port <container_id>: 查看容器的端口映射。
  • 网络相关命令:
    • docker network create <network_name>: 创建一个 Docker 网络。
    • docker network connect <network_name> <container_id>: 将容器连接到指定的 Docker 网络。

五、 构建自定义镜像:Dockerfile

Dockerfile 是构建自定义镜像的核心。它是一个文本文件,包含了一系列指令,用于描述如何构建镜像。

以下是一个简单的 Dockerfile 示例,用于构建一个运行 Python Flask 应用的镜像:

“`dockerfile

使用官方 Python 3.9 镜像作为基础镜像

FROM python:3.9-slim-buster

设置工作目录

WORKDIR /app

复制 requirements.txt 文件到工作目录

COPY requirements.txt .

安装依赖

RUN pip install –no-cache-dir -r requirements.txt

复制应用程序代码到工作目录

COPY . .

设置环境变量

ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0

暴露 5000 端口

EXPOSE 5000

启动应用程序

CMD [“flask”, “run”]
“`

解释:

  • FROM python:3.9-slim-buster: 指定基础镜像。这里使用官方的 Python 3.9 精简版镜像。
  • WORKDIR /app: 设置工作目录为 /app。后续的 COPYRUN 指令都会在这个目录下执行。
  • COPY requirements.txt .:requirements.txt 文件从宿主机复制到容器的工作目录。requirements.txt 文件包含了应用程序的依赖项。
  • RUN pip install --no-cache-dir -r requirements.txt: 在容器中安装 requirements.txt 文件中指定的依赖项。--no-cache-dir 参数可以避免缓存,减小镜像的大小。
  • COPY . .: 将当前目录下的所有文件复制到容器的工作目录。
  • ENV FLASK_APP=app.py: 设置环境变量 FLASK_APPapp.py。 Flask 框架会读取这个环境变量来确定应用程序的入口文件。
  • ENV FLASK_RUN_HOST=0.0.0.0: 设置环境变量 FLASK_RUN_HOST0.0.0.0。 这使得 Flask 应用程序可以监听所有网络接口,允许从外部访问。
  • EXPOSE 5000: 声明容器监听的端口。这不会自动将端口映射到宿主机,只是一个声明,需要在运行容器时使用 -p 参数进行端口映射。
  • CMD ["flask", "run"]: 指定容器启动时要执行的命令。这里使用 Flask 框架的 flask run 命令来启动应用程序。

构建镜像:

bash
docker build -t my-flask-app:1.0 .

运行容器:

bash
docker run -d -p 5000:5000 my-flask-app:1.0

-p 5000:5000 表示将容器的 5000 端口映射到宿主机的 5000 端口。

六、 Docker Compose:多容器应用编排

对于复杂的应用程序,通常需要运行多个容器才能协同工作。例如,一个 Web 应用可能需要一个 Web 服务器容器、一个数据库容器和一个缓存容器。 使用 docker run 命令手动管理这些容器非常繁琐。

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

以下是一个简单的 docker-compose.yml 文件示例,用于定义一个包含 Web 服务器和数据库的应用程序:

yaml
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
ports:
- "5432:5432"

解释:

  • version: "3.9": 指定 Docker Compose 文件的版本。
  • services:: 定义应用程序的服务。
    • web:: 定义 Web 服务器服务。
      • image: nginx:latest: 使用 Nginx 官方镜像。
      • ports: - "80:80": 将宿主机的 80 端口映射到容器的 80 端口。
      • volumes: - ./html:/usr/share/nginx/html: 将宿主机的 ./html 目录挂载到容器的 /usr/share/nginx/html 目录。
      • depends_on: - db: 指定 Web 服务器服务依赖于数据库服务。Docker Compose 会先启动数据库服务,然后再启动 Web 服务器服务。
    • db:: 定义数据库服务。
      • image: postgres:13: 使用 PostgreSQL 13 官方镜像。
      • environment:: 设置环境变量。
        • POSTGRES_USER: myuser: 设置 PostgreSQL 用户名为 myuser
        • POSTGRES_PASSWORD: mypassword: 设置 PostgreSQL 密码为 mypassword
        • POSTGRES_DB: mydb: 设置 PostgreSQL 数据库名为 mydb
      • ports: - "5432:5432": 将宿主机的 5432 端口映射到容器的 5432 端口。

使用 Docker Compose 启动应用程序:

bash
docker-compose up -d

-d 参数表示 detached mode。

停止应用程序:

bash
docker-compose down

七、 总结

本文详细介绍了 Docker 的核心概念、安装配置、基本用法以及 Dockerfile 和 Docker Compose 的使用。希望通过本文,你能够对 Docker 有一个初步的了解,并能够开始使用 Docker 构建和部署自己的应用程序。 Docker 的学习是一个持续的过程,建议你多加实践,阅读官方文档,参与社区讨论,不断提升自己的 Docker 技能。 祝你学习愉快!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部