Docker 入门指南

什么是 Docker?

Docker 是一个开源的容器化平台,允许开发者将应用及其依赖打包到一个轻量级的容器中。这样,应用就可以在任何支持 Docker 的环境中一致地运行,解决了”在我电脑上可以跑”的问题。Docker 容器就像是一个微型的、标准化的虚拟环境,确保了应用在不同系统间的可移植性和一致性。Docker 的概念类似于 Java 虚拟机(JVM):就像 JVM 为 Java 应用提供了一个统一的运行环境,Docker 为各种应用提供了一个标准化的运行环境。

为什么使用 Docker?

  1. 环境一致性:容器可以在不同的操作系统和云平台上保持一致的运行环境。
  2. 资源高效:相比传统虚拟机,Docker 容器更加轻量,启动速度更快。
  3. 便于管理:Docker 提供了易于使用的命令行工具,可以快速部署、更新和删除应用。

安装 Docker

在开始使用 Docker 之前,需要先安装 Docker。可以通过访问 Docker 官方网站 根据你的操作系统进行安装。

测试 Docker 是否安装成功

docker --version
docker run hello-world

创建第一个 Docker 容器

1. 拉取镜像

Docker Hub 是一个公共的镜像库,我们可以从中拉取各种预先构建好的镜像。打开终端,运行以下命令来拉取一个简单的 Nginx 镜像:

docker pull nginx

2. 运行容器

镜像下载完成后,可以使用以下命令启动一个新的 Nginx 容器:

docker run -d -p 8080:80 nginx

3. 访问应用

在浏览器中输入 http://localhost:8080,你应该能看到 Nginx 的欢迎页面。

管理 Docker 容器

查看正在运行的容器

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

docker ps

停止和删除容器

如果需要停止容器,可以使用 docker stop 命令。假设容器 ID 为 abc123,可以运行:

docker stop abc123

要删除容器,可以使用:

docker rm abc123

创建自己的 Dockerfile

除了使用现成的镜像,你还可以创建自己的镜像。以下是一个简单的 Dockerfile 示例,用于创建一个 Node.js 应用:

  1. 比如我们有一个简单的 Node.js 应用,我们希望将它打包成一个 Docker 镜像。
// app.js
const express = require('express');
const app = express();

app
  .get('/', (req, res) => {
    res.send('Hello, Docker!');
  })
  .get('/users', (req, res) => {
    res.send('List of users');
  })
  .get('/users/:id', (req, res) => {
    res.send(`User ${req.params.id}`);
  })
  .listen(3000, () => {
    console.log('Server is running on port 3000');
  });
  1. 创建一个名为 Dockerfile 的文件,内容如下:
FROM node:20

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000
CMD ["node", "app.js"]
  1. 在与 Dockerfile 同一目录下,构建镜像:
docker build -t my-node-app .
  1. 运行容器:
docker run -d -p 3000:3000 my-node-app

multi-stage builds 示例

Multi-stage builds 是 Docker 的一个强大特性,它允许你在一个 Dockerfile 中使用多个阶段来构建你的应用。这种方法可以显著减小最终镜像的大小,因为你可以只保留运行应用所需的文件,而丢弃构建过程中的中间文件。

例如一个纯前端应用的 multi-stage build Dockerfile 示例:

pnpm create vite
# Stage 1: Build the Vue application
FROM node:20 as build-stage

WORKDIR /app

# Copy package.json and package-lock.json
COPY package*.json ./

# Install dependencies
RUN npm install

# Copy project files and build
COPY . .
RUN npm run build

# Stage 2: Serve the app using Nginx
FROM nginx:stable-alpine as production-stage

# Copy built assets from build-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html

# Expose port 80
EXPOSE 80

# Start Nginx server
CMD ["nginx", "-g", "daemon off;"]
docker build -t my-static-app .
docker run -d -p 3000:80 my-static-app

总结

Docker 是一个强大的工具,可以极大地简化应用的部署和管理。通过本文的简单示例,你已经能够创建并管理 Docker 容器。

接下来可以深入学习 Docker Compose 和 Kamal 等工具,进一步提升你的容器化技能。

参考资料