Docker 入门与部署指南
109
类别: 
开发交流

Docker 入门与部署指南

什么是 Docker?

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 操作系统上。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker 的核心概念

  1. 镜像(Image):Docker 镜像是一个只读的模板,用来创建 Docker 容器。
  2. 容器(Container):容器是镜像的运行实例,可以被启动、开始、停止、删除。
  3. 仓库(Repository):仓库是集中存放镜像文件的场所,分为公有和私有两种。

安装 Docker

Windows 系统安装

Windows 用户可以通过以下步骤安装 Docker Desktop:

  1. 访问 Docker 官网 下载 Docker Desktop
  2. 运行下载的安装程序并按照提示完成安装
  3. 启动 Docker Desktop 应用

Linux 系统安装(以 Ubuntu 为例)

# 更新 apt 包索引
sudo apt-get update

# 安装必要的软件包
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    l**-release

# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 设置 repository
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(l**_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 更新 apt 包索引
sudo apt-get update

# 安装 Docker Engine
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Docker 基本命令

镜像操作

# 查看本地镜像
docker images

# 拉取镜像
docker pull nginx

# 删除镜像
docker rmi nginx

容器操作

# 运行容器
docker run -d -p 8080:80 --name mynginx nginx

# 查看正在运行的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 停止容器
docker stop mynginx

# 启动已停止的容器
docker start mynginx

# 删除容器
docker rm mynginx

编写 Dockerfile

Dockerfile 是一个文本文件,其中包含了一系列命令,用户可以调用 docker build 命令创建镜像。

示例 Dockerfile

# 使用官方 Node.js 运行时作为基础镜像
FROM node:16

# 设置工作目录
WORKDIR /usr/src/app

# 复制 package.json 和 package-lock.json
COPY package*.json ./

# 安装依赖
RUN npm install

# 复制应用程序代码
COPY . .

# 暴露端口
EXPOSE 3000

# 定义运行时环境变量
ENV NODE_ENV=production

# 启动应用
CMD ["node", "server.js"]

构建镜像

# 构建镜像
docker build -t my-node-app .

# 运行构建好的镜像
docker run -d -p 3000:3000 --name my-running-app my-node-app

Docker Compose 简介

Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用程序的服务。

docker-compose.yml 示例

version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - redis
    environment:
      REDIS_URL: redis://redis:6379

  redis:
    image: "redis:alpine"

Docker Compose 命令

# 启动所有服务
docker-compose up -d

# 停止所有服务
docker-compose down

# 查看运行中的服务
docker-compose ps

# 查看服务日志
docker-compose logs web

实际部署示例

下面我们以部署一个简单的 Web 应用为例,演示如何使用 Docker 进行部署。

1. 准备应用代码

首先我们有一个简单的 Node.js 应用:

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(`App running on http://localhost:${port}`);
});

2. 创建 Dockerfile

FROM node:16-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["node", "app.js"]

3. 构建并运行容器

# 构建镜像
docker build -t my-web-app .

# 运行容器
docker run -d -p 8080:3000 --name my-web-container my-web-app

现在可以在浏览器中访问 http://localhost:8080 来查看应用。

4. 使用 Docker Compose 部署

如果我们的应用还需要数据库等其他服务,可以使用 Docker Compose:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "8080:3000"
    depends_on:
      - db
    environment:
      DB_HOST: db
      DB_USER: user
      DB_PASS: password
      
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

运行以下命令启动整个应用:

docker-compose up -d

Docker 最佳实践

  1. 使用 .dockerignore 文件:类似于 .gitignore,可以排除不需要添加到镜像中的文件。

  2. 合理利用镜像分层缓存

    # 先复制依赖文件,充分利用缓存
    COPY package*.json ./
    RUN npm install
    
    # 再复制源代码
    COPY . .
    
  3. 使用多阶段构建减小镜像体积

    # 构建阶段
    FROM node:16 AS builder
    WORKDIR /app
    COPY package*.json ./
    RUN npm install
    COPY . .
    RUN npm run build
    
    # 生产阶段
    FROM node:16-alpine
    WORKDIR /app
    COPY --from=builder /app/dist ./dist
    COPY --from=builder /app/package*.json ./
    RUN npm install --production
    CMD ["node", "dist/server.js"]
    
  4. 设置健康检查

    HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
      CMD curl -f http://localhost:3000/health || exit 1
    

总结

Docker 已经成为现代应用开发和部署的重要工具。它提供了轻量级、可移植、自包含的容器,使应用程序可以在几乎任何地方一致地运行。通过本文的学习,你应该掌握了:

  • Docker 的基本概念和架构
  • 如何安装和使用 Docker
  • 如何编写 Dockerfile 并构建镜像
  • 如何使用 Docker Compose 管理多容器应用
  • Docker 的最佳实践

在实际项目中,你可以根据具体需求选择合适的部署方式,从简单的单容器应用到复杂的微服务架构都可以通过 Docker 来实现。

标签:
评论 0
/ 1000
0
0
收藏