Docker新手教程:从安装到部署你的第一个容器

Docker 新手教程:从安装到部署你的第一个容器

Docker 已经成为现代软件开发和部署中不可或缺的工具。它通过容器化技术,提供了一种轻量级、可移植、自包含的环境,使得应用程序在任何地方都能以相同的方式运行。无论你是开发人员、运维工程师还是技术爱好者,学习 Docker 都将极大地提升你的工作效率和技能。

本教程将从零开始,手把手教你安装 Docker,理解 Docker 的核心概念,并最终部署你的第一个容器。让我们开始 Docker 之旅吧!

1. Docker 是什么?为什么使用 Docker?

在深入安装和使用之前,我们需要先理解 Docker 是什么,以及它为什么如此受欢迎。

1.1. 什么是 Docker?

Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

你可以将 Docker 容器想象成一个轻量级的、独立的“盒子”。这个“盒子”里包含了运行应用程序所需的一切:代码、运行时环境、系统工具、系统库、设置等。无论你将这个“盒子”放在哪里(开发者的笔记本电脑、测试服务器、生产环境的云服务器),它都能以完全相同的方式运行。

1.2. 为什么使用 Docker?

Docker 的优势在于它解决了软件开发和部署中长期存在的一些痛点:

  • 环境一致性: Docker 确保了应用程序在不同环境(开发、测试、生产)中的一致性。不再有“在我机器上可以运行”的问题。
  • 快速部署: Docker 容器启动速度非常快(通常在几秒钟内),远快于传统的虚拟机。
  • 资源隔离: 每个 Docker 容器都有自己的文件系统、进程空间和网络接口,彼此隔离,互不干扰。
  • 轻量级: Docker 容器共享宿主机的操作系统内核,因此比虚拟机更加轻量级,占用资源更少。
  • 可移植性: Docker 容器可以在任何支持 Docker 的平台上运行,无需修改。
  • 版本控制: Docker 镜像可以进行版本控制,方便回滚到之前的版本。
  • 社区支持: Docker 拥有庞大的社区和丰富的生态系统,提供了大量的预构建镜像和工具。

2. Docker 安装

Docker 支持多种平台,包括 Linux、Windows 和 macOS。下面我们将分别介绍在这些平台上的安装方法。

2.1. Linux 平台安装 (以 Ubuntu 为例)

大多数 Linux 发行版都提供了 Docker 的软件包。这里以 Ubuntu 为例,介绍安装步骤:

  1. 更新软件包索引:

    bash
    sudo apt update

  2. 安装依赖包:

    bash
    sudo apt install apt-transport-https ca-certificates curl software-properties-common

  3. 添加 Docker 的官方 GPG 密钥:

    bash
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

  4. 设置 Docker 稳定版仓库:

    bash
    echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

  5. 再次更新软件包索引:

    bash
    sudo apt update

  6. 安装 Docker Engine:

    bash
    sudo apt install docker-ce docker-ce-cli containerd.io

  7. 验证安装:

    bash
    sudo docker run hello-world

    如果看到 "Hello from Docker!" 的输出,说明安装成功。

  8. (可选)将当前用户添加到 docker 用户组,避免每次都输入sudo
    sudo usermod -aG docker $USER
    然后,注销并重新登录,或者重启系统,以使更改生效。

2.2. Windows 平台安装

在 Windows 上安装 Docker,推荐使用 Docker Desktop。Docker Desktop 是一个易于安装的应用程序,它包含了 Docker Engine、Docker CLI 客户端、Docker Compose、Docker Content Trust、Kubernetes 和 Credential Helper。

  1. 下载 Docker Desktop:
    访问 Docker 官网 https://www.docker.com/products/docker-desktop 下载适用于 Windows 的 Docker Desktop 安装程序。

  2. 安装 Docker Desktop:
    双击下载的安装程序,按照提示进行安装。安装过程中可能需要启用 Hyper-V 或 WSL 2(Windows Subsystem for Linux 2)。

  3. 启动 Docker Desktop:
    安装完成后,Docker Desktop 会自动启动。你可以在系统托盘中找到 Docker 图标。

  4. 验证安装:
    打开 PowerShell 或命令提示符,运行以下命令:

    bash
    docker run hello-world

    如果看到 "Hello from Docker!" 的输出,说明安装成功。

2.3. macOS 平台安装

在 macOS 上安装 Docker,同样推荐使用 Docker Desktop。

  1. 下载 Docker Desktop:
    访问 Docker 官网 https://www.docker.com/products/docker-desktop 下载适用于 macOS 的 Docker Desktop 安装程序。

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

  3. 启动 Docker Desktop:
    在 Applications 文件夹中找到 Docker 并启动。

  4. 验证安装:
    打开终端,运行以下命令:

    bash
    docker run hello-world

    如果看到 "Hello from Docker!" 的输出,说明安装成功。

3. Docker 核心概念

在开始使用 Docker 之前,我们需要了解一些核心概念:

  • 镜像 (Image): Docker 镜像是一个只读的模板,它包含了运行应用程序所需的所有内容,例如代码、运行时、库、环境变量和配置文件。你可以将镜像看作是应用程序的“快照”。
  • 容器 (Container): Docker 容器是镜像的运行实例。每个容器都是隔离的、安全的,并且包含了运行应用程序所需的一切。你可以启动、停止、删除和移动容器。
  • 仓库 (Registry): Docker 仓库是用来存储和分享 Docker 镜像的地方。Docker Hub (https://hub.docker.com/) 是官方的公共仓库,包含了大量的预构建镜像。你也可以创建自己的私有仓库。
  • Dockerfile: Dockerfile 是一个文本文件,它包含了一系列指令,用于自动化构建 Docker 镜像。通过 Dockerfile,你可以定义镜像的基础镜像、安装依赖、复制文件、设置环境变量等。
  • Docker Compose: Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件,你可以配置应用程序的服务、网络和卷,然后使用一个命令启动整个应用程序。

4. Docker 基本操作

安装好 Docker 并了解了核心概念后,我们可以开始学习一些基本的 Docker 操作。

4.1. 搜索镜像

可以使用 docker search 命令在 Docker Hub 上搜索镜像。例如,搜索 Nginx 镜像:

bash
docker search nginx

4.2. 拉取镜像

使用 docker pull 命令从 Docker Hub 或其他仓库拉取镜像。例如,拉取官方的 Nginx 镜像:

bash
docker pull nginx

如果不指定tag,默认是latest

4.3. 查看本地镜像

使用 docker images 命令查看本地已有的镜像:

bash
docker images

4.4. 运行容器

使用 docker run 命令从镜像创建并运行一个容器。例如,运行一个 Nginx 容器:

bash
docker run -d -p 8080:80 nginx

  • -d 参数表示在后台运行容器。
  • -p 8080:80 参数表示将容器的 80 端口映射到主机的 8080 端口。

现在,你可以在浏览器中访问 http://localhost:8080,看到 Nginx 的默认欢迎页面。

4.5. 查看正在运行的容器

使用 docker ps 命令查看正在运行的容器:

bash
docker ps

4.6. 查看所有容器(包括已停止的)

使用 docker ps -a 命令查看所有容器,包括已停止的:

bash
docker ps -a

4.7. 停止容器

使用 docker stop 命令停止一个正在运行的容器。你需要指定容器的 ID 或名称:

bash
docker stop <container_id_or_name>

4.8. 启动容器

使用 docker start 命令启动一个已停止的容器:

bash
docker start <container_id_or_name>

4.9. 进入容器

使用 docker exec 命令进入一个正在运行的容器,通常用于调试或执行命令:

bash
docker exec -it <container_id_or_name> bash

或者
bash
docker exec -it <container_id_or_name> /bin/sh

  • -it 参数表示以交互模式进入容器。
  • bash/bin/sh是要在容器中执行的命令(通常是 shell)。

4.10. 删除容器

使用 docker rm 命令删除一个已停止的容器:

bash
docker rm <container_id_or_name>

如果要删除正在运行的容器,需要先停止容器,或者使用-f参数强制删除

4.11. 删除镜像

使用 docker rmi 命令删除一个本地镜像:

bash
docker rmi <image_id_or_name>

注意,如果要删除的镜像有容器正在使用,需要先删除容器

5. 构建你自己的 Docker 镜像

虽然 Docker Hub 上有大量的预构建镜像,但在实际工作中,你通常需要构建自己的镜像,以满足特定的需求。

5.1. 编写 Dockerfile

Dockerfile 是构建 Docker 镜像的关键。它是一个文本文件,包含了一系列指令,用于描述如何构建镜像。

下面是一个简单的 Dockerfile 示例,用于构建一个基于 Python 的 Web 应用镜像:

```dockerfile

使用官方 Python 运行时作为基础镜像

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

暴露端口

EXPOSE 5000

定义启动命令

CMD ["flask", "run"]
```

  • FROM 指令指定基础镜像。
  • WORKDIR 指令设置工作目录。
  • COPY 指令复制文件到容器中。
  • RUN 指令在容器中执行命令。
  • ENV 指令设置环境变量。
  • EXPOSE 指令暴露端口。
  • CMD 指令定义容器启动时执行的命令。

5.2. 构建镜像

在 Dockerfile 所在的目录下,使用 docker build 命令构建镜像:

bash
docker build -t my-python-app .

  • -t 参数指定镜像的名称和标签(例如 my-python-app:latest)。
  • . 表示 Dockerfile 在当前目录下。

5.3. 运行自定义镜像

构建完成后,你可以像运行其他镜像一样运行你的自定义镜像:

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

6. 部署你的第一个容器(示例:Node.js 应用)

现在,让我们来部署一个简单的 Node.js 应用作为你的第一个容器。

6.1. 准备 Node.js 应用

创建一个名为 app.js 的文件,内容如下:

```javascript
const http = require('http');

const hostname = '0.0.0.0';
const port = 3000;

const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello from Dockerized Node.js App!\n');
});

server.listen(port, hostname, () => {
console.log(Server running at http://${hostname}:${port}/);
});
```

创建一个名为 package.json 的文件,内容如下:

json
{
"name": "dockerized-nodejs-app",
"version": "1.0.0",
"description": "A simple Node.js app for Docker demo",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {}
}

6.2. 编写 Dockerfile

创建一个名为 Dockerfile 的文件,内容如下:

```dockerfile

使用官方 Node.js 运行时作为基础镜像

FROM node:16

设置工作目录

WORKDIR /usr/src/app

复制 package.json 和 package-lock.json 文件到容器中

COPY package*.json ./

安装依赖

RUN npm install

复制应用程序代码到容器中

COPY . .

暴露端口

EXPOSE 3000

定义启动命令

CMD [ "npm", "start" ]
```

6.3. 构建镜像

在包含 app.jspackage.jsonDockerfile 的目录下,运行以下命令构建镜像:

bash
docker build -t my-nodejs-app .

6.4. 运行容器

bash
docker run -d -p 3000:3000 my-nodejs-app

现在,你可以在浏览器中访问 http://localhost:3000,看到 "Hello from Dockerized Node.js App!" 的输出。

恭喜你!你已经成功部署了你的第一个容器!

7. 进阶学习

本教程只是 Docker 的入门指南,还有很多高级主题值得学习,例如:

  • Docker Compose: 用于定义和运行多容器应用程序。
  • Docker Volumes: 用于持久化数据,即使容器被删除,数据也不会丢失。
  • Docker Networking: 用于容器之间的通信和连接外部网络。
  • Docker Swarm: Docker 的内置容器编排工具。
  • Kubernetes (K8s): 一个更强大的容器编排平台,与 Docker 兼容。
  • CI/CD 集成: 将 Docker 集成到持续集成和持续交付流程中。

建议你继续深入学习 Docker 的官方文档、教程和最佳实践,不断提升你的 Docker 技能。

希望本教程能帮助你入门 Docker,祝你在容器化的道路上一切顺利!

THE END