在现代软件开发和部署流程中,容器化技术已成为不可或缺的一环。Docker 作为目前最主流的容器化平台,极大地简化了应用程序的打包、分发和运行过程。本指南将为您介绍 Docker 的核心概念和基本操作,帮助您快速入门容器化部署。

什么是 Docker?

Docker 是一个开源平台,用于自动化应用程序的部署、扩展和管理。它利用操作系统级别的虚拟化技术,将应用程序及其依赖项打包到称为“容器”的轻量级、可移植的单元中。

Docker 的核心概念

  1. 镜像 (Image):

    • Docker 镜像是一个只读的模板,包含了运行一个应用程序所需的所有文件、库、环境变量、配置文件等。
    • 您可以将镜像想象成一个应用程序的“快照”或“蓝图”。
    • 镜像是由一系列的指令构建而成,这些指令定义了如何创建容器。
  2. 容器 (Container):

    • Docker 容器是镜像的运行时实例。当您运行一个镜像时,它就会创建一个容器。
    • 容器是隔离的,拥有自己的文件系统、网络接口和进程空间。这意味着在一个容器中运行的应用程序不会影响到其他容器或宿主机系统。
    • 容器是可写的,您可以在容器中进行修改,但这些修改只存在于当前容器的生命周期内,不会影响到原始镜像。
  3. 仓库 (Registry):

    • Docker 仓库是存储和分发 Docker 镜像的地方。
    • 最著名的公共仓库是 Docker Hub,它包含了大量的官方和社区提供的镜像。
    • 您也可以搭建私有仓库来存储自己的镜像。
  4. Dockerfile:

    • Dockerfile 是一个文本文件,其中包含了一系列指令,用于指示 Docker 如何构建一个镜像。
    • 通过编写 Dockerfile,您可以精确地定义应用程序的环境和依赖。

Docker 的基本操作(命令行)

以下是一些常用的 Docker 命令行操作:

1. 运行一个容器

使用 docker run 命令来基于镜像创建一个新的容器并运行它。

  • 运行一个简单的 Nginx 容器:
    docker run -d -p 80:80 --name my-nginx nginx
    
    • -d: 后台运行容器 (detached mode)。
    • -p 80:80: 将宿主机的 80 端口映射到容器的 80 端口。
    • --name my-nginx: 为容器指定一个名字(可选)。
    • nginx: 要使用的镜像名称。

2. 查看运行中的容器

使用 docker ps 命令来查看当前正在运行的容器。

docker ps

要查看所有容器(包括已停止的),可以使用 docker ps -a

3. 停止和启动容器

  • 停止容器:
    docker stop my-nginx
    
  • 启动已停止的容器:
    docker start my-nginx
    

4. 删除容器

删除不再需要的容器。

docker rm my-nginx

注意:要删除一个正在运行的容器,需要先停止它。也可以使用 docker rm -f my-nginx 强制删除。

5. 查看镜像

使用 docker images 命令来列出本地所有可用的 Docker 镜像。

docker images

6. 拉取镜像

从 Docker Hub 或其他仓库拉取镜像到本地。

docker pull ubuntu:latest

ubuntu:latest 表示拉取名为 ubuntu 的镜像的最新版本。

7. 删除镜像

删除本地不再需要的镜像。

docker rmi nginx

注意:如果要删除一个正在被容器使用的镜像,需要先删除该容器。

8. 构建镜像

使用 docker build 命令来根据 Dockerfile 构建一个新的镜像。

  • 首先,创建一个名为 Dockerfile 的文件,并添加构建指令,例如:
    FROM ubuntu:latest
    RUN apt-get update && apt-get install -y fortune
    CMD ["/usr/games/fortune"]
    
  • 然后在包含 Dockerfile 的目录下执行构建命令:
    docker build -t my-fortune-app .
    
    • -t my-fortune-app: 为新镜像指定一个标签(名称)。
    • .: 表示 Dockerfile 所在的当前目录。

9. 进入容器内部

使用 docker exec 命令在运行中的容器内部执行命令。

  • 进入一个 bash shell:
    docker exec -it my-nginx bash
    
    • -it: 分配一个伪 TTY 并保持 STDIN 打开,这使得您可以交互式地使用 shell。

Docker 的优势总结

  • 一致性: 确保应用程序在开发、测试和生产环境中的行为一致,消除“在我机器上可以运行”的问题。
  • 隔离性: 容器之间相互隔离,互不影响,提高了系统的稳定性和安全性。
  • 快速部署: 极大地缩短了应用程序的部署时间,可以快速地启动、停止和迁移容器。
  • 资源效率: 相比于传统的虚拟机,Docker 容器更加轻量级,启动更快,占用的系统资源更少。
  • 可移植性: Docker 容器可以在任何安装了 Docker 的环境中运行,无论是本地开发机、云服务器还是物理机。

结语

Docker 容器化技术为软件开发和运维带来了革命性的变化。通过掌握 Docker 的基本概念和常用命令,您可以更高效地构建、测试和部署您的应用程序,为现代化的 DevOps 工作流打下坚实的基础。