前言

容器技术已经彻底改变了软件开发和部署的方式!!!作为一名开发者,如果你还没有接触过Docker,那么你真的需要尽快了解这项技术了(非常重要)。

在我刚开始学习Docker时,曾被各种概念和命令搞得晕头转向。“镜像”、“容器”、"仓库"这些术语听起来很陌生,但当我真正用起来后,才发现它解决了我开发中的许多痛点。

这篇文章将带你从零开始了解Docker,无需任何容器化经验,只要你有基础的命令行操作能力就可以轻松上手。

Docker是什么?

简单来说,Docker是一个开源的容器化平台,它让应用程序可以在隔离的环境中运行。这个"隔离的环境"就是我们所说的容器。

想象一下,如果你能把应用程序和它所有的依赖打包成一个标准单元,然后在任何支持Docker的系统上运行,而不用担心"在我机器上能运行"的问题,这就是Docker的魅力所在!

Docker的核心优势包括:

  • 一致的运行环境 - 开发、测试和生产环境保持一致
  • 轻量级 - 容器共享主机系统内核,比虚拟机更高效
  • 快速部署 - 秒级启动,比传统虚拟机快得多
  • 版本控制 - 镜像可以版本化,便于回滚和管理
  • 隔离性 - 应用程序在容器中运行,互不干扰

Docker的核心概念

在深入学习Docker之前,我们需要理解三个基本概念:

1. 镜像(Image)

Docker镜像就像是一个只读的模板,用于创建容器。它包含了运行应用程序所需的一切:代码、运行时环境、库、环境变量和配置文件等。

镜像是分层构建的,每一层都是只读的。当你修改一个镜像时,实际上是在原有镜像的基础上添加新的层。

2. 容器(Container)

容器是镜像的运行实例。如果把镜像比作类,那么容器就是对象。你可以创建、启动、停止、删除容器,而且容器之间是彼此隔离的。

容器在镜像的基础上添加了一个可写层,应用程序运行过程中的所有变更都保存在这个可写层中。

3. 仓库(Repository)

仓库是用来存储和分发Docker镜像的地方。Docker Hub是Docker官方维护的公共仓库,你可以在那里找到各种各样的镜像。

当然,企业通常会搭建私有仓库来存储内部使用的镜像。

Docker安装指南

接下来,让我们看看如何在不同的操作系统上安装Docker:

Windows 安装

  1. 下载 Docker Desktop for Windows
  2. 双击安装包进行安装
  3. 安装完成后,启动Docker Desktop
  4. 打开命令提示符,输入docker --version验证安装是否成功

macOS 安装

  1. 下载 Docker Desktop for Mac
  2. 将下载的.dmg文件拖到Applications文件夹
  3. 启动Docker Desktop
  4. 打开终端,输入docker --version验证安装

Linux (Ubuntu) 安装

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

# 安装必要的包
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 设置Docker仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

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

# 安装Docker CE
sudo apt-get install docker-ce

# 验证安装
sudo docker --version

Docker基本命令

安装完Docker后,让我们学习一些基本命令:

镜像相关命令

# 查看本地镜像列表
docker images

# 从Docker Hub拉取镜像
docker pull ubuntu:20.04

# 搜索镜像
docker search nginx

# 删除镜像
docker rmi image_id

容器相关命令

# 创建并启动容器
docker run -it ubuntu:20.04 /bin/bash

# 查看运行中的容器
docker ps

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

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

# 停止容器
docker stop container_id

# 删除容器
docker rm container_id

# 查看容器日志
docker logs container_id

实战案例:部署一个Web应用

现在,让我们通过一个实际案例来学习如何使用Docker部署一个简单的Web应用。

步骤1:创建一个简单的Node.js应用

首先,创建一个目录并初始化一个Node.js应用:

mkdir docker-demo
cd docker-demo
npm init -y

创建一个简单的Express服务器 (app.js):

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

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

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

安装依赖:

npm install express

步骤2:创建Dockerfile

在项目根目录创建一个名为Dockerfile的文件(没有扩展名):

# 使用官方Node.js镜像作为基础
FROM node:14

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

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

# 安装依赖
RUN npm install

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

# 暴露端口
EXPOSE 3000

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

步骤3:构建镜像

在项目目录下运行:

docker build -t my-node-app .

这个命令会根据Dockerfile构建一个名为my-node-app的镜像。

步骤4:运行容器

构建完成后,运行以下命令启动容器:

docker run -p 3000:3000 -d my-node-app

这个命令会在后台(-d)运行容器,并将容器的3000端口映射到主机的3000端口(-p 3000:3000)。

步骤5:测试应用

打开浏览器,访问http://localhost:3000,你应该能看到"Hello from Docker!"的消息。

Docker Compose:多容器应用管理

在实际项目中,应用通常由多个相互关联的服务组成。Docker Compose是一个工具,用于定义和运行多容器Docker应用。

安装Docker Compose

在Windows和macOS上,Docker Compose已经包含在Docker Desktop中。

在Linux上,可以使用以下命令安装:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

创建docker-compose.yml

让我们扩展前面的例子,添加一个MongoDB数据库服务。创建一个docker-compose.yml文件:

version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - mongo
    environment:
      - MONGO_URL=mongodb://mongo:27017/myapp
  
  mongo:
    image: mongo
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db

volumes:
  mongo-data:

启动应用

在项目目录下运行:

docker-compose up -d

这个命令会启动docker-compose.yml中定义的所有服务。

停止应用

要停止所有服务,运行:

docker-compose down

Docker最佳实践

在使用Docker的过程中,有一些最佳实践值得注意:

  1. 使用官方镜像作为基础 - 官方镜像通常更安全、更稳定

  2. 构建轻量级镜像 - 使用Alpine等轻量级基础镜像,减少不必要的包

  3. 多阶段构建 - 使用多阶段构建减小最终镜像大小

  4. 不要在容器中存储数据 - 使用卷(Volume)或绑定挂载来持久化数据

  5. 合理设置资源限制 - 为容器设置CPU和内存限制,避免单个容器消耗过多资源

  6. 使用.dockerignore文件 - 类似.gitignore,排除不需要的文件

  7. 定期更新基础镜像 - 保持基础镜像更新,获取安全补丁

  8. 使用非root用户运行应用 - 减少潜在的安全风险

常见问题与解决方案

在使用Docker的过程中,你可能会遇到一些常见问题:

1. 容器无法访问网络

检查防火墙设置,确保Docker网络没有被阻止。可以尝试:

# 重启Docker服务
sudo systemctl restart docker

2. 磁盘空间不足

Docker镜像和容器可能会占用大量磁盘空间。清理未使用的资源:

# 删除所有停止的容器
docker container prune

# 删除未使用的镜像
docker image prune -a

# 删除未使用的卷
docker volume prune

3. 容器启动失败

查看容器日志:

docker logs container_id

确保Dockerfile中的指令正确,所有必要的依赖都已安装。

结语

Docker已经成为现代软件开发的重要工具。通过容器化,我们可以更轻松地构建、测试和部署应用,无需担心"在我的机器上能运行"的问题。

希望这篇教程能够帮助你理解Docker的基本概念和工作流程。容器化技术的学习曲线可能有些陡峭,但一旦掌握,它将极大地提高你的开发效率和应用部署的可靠性。

记住,学习Docker的过程就像学习任何技术一样,需要实践和耐心。从简单的项目开始,逐步尝试更复杂的场景,你会发现Docker带来的便利远超过学习的成本!

你还在等什么?现在就开始你的Docker之旅吧!

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐