Docker 保姆级教程:零基础也能快速上手
引言:容器化时代的必备技能
在云计算和微服务架构日益盛行的今天,Docker 已经成为软件开发、测试和部署过程中不可或缺的工具。它以其轻量、高效、可移植的特性,极大地简化了应用程序的打包、分发和运行过程。无论您是开发人员、运维工程师,还是对新技术充满好奇的爱好者,掌握 Docker 都将为您的职业生涯或技术探索之路增添强大的助力。
本教程旨在为 Docker 零基础的读者提供一份全面、详细且易于理解的入门指南。我们将从 Docker 的基本概念讲起,逐步深入到镜像、容器、数据卷、网络等核心知识点,并通过大量的实例演示,帮助您快速上手 Docker,并将其应用于实际工作中。
第一部分:Docker 基础概念
在开始动手实践之前,我们需要先了解 Docker 的一些核心概念。这些概念是理解 Docker 工作原理的基础。
-
什么是 Docker?
Docker 是一个开源的应用容器引擎,它允许开发者将他们的应用和依赖包打包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。
更通俗地讲,Docker 就像一个“集装箱”,它可以把您的应用程序及其运行所需的全部环境(代码、运行时、库、环境变量和配置文件等)打包在一起。这个“集装箱”可以在任何支持 Docker 的平台上运行,而无需担心环境差异导致的问题。
-
Docker 的优势
- 轻量级: Docker 容器共享宿主机的内核,无需额外的操作系统,因此非常轻量,启动速度快,资源占用少。
- 可移植性: Docker 容器可以在任何支持 Docker 的平台上运行,无需修改,真正实现“一次构建,到处运行”。
- 隔离性: Docker 容器之间相互隔离,互不影响,保证了应用程序运行的稳定性和安全性。
- 可扩展性: Docker 可以轻松地对容器进行扩缩容,以满足应用程序的负载需求。
- 版本控制: Docker 镜像支持版本控制,可以方便地回滚到之前的版本。
- 简化部署: Docker 简化了应用程序的部署流程,提高了开发和运维效率。
-
Docker 的核心组件
- Docker 客户端(Client): 用户与 Docker 交互的命令行工具。
- Docker 守护进程(Daemon): 运行在宿主机上的后台服务,负责构建、运行和管理容器。
- Docker 镜像(Image): 一个只读的模板,包含了应用程序及其运行所需的全部依赖。可以理解为“集装箱”的模板。
- Docker 容器(Container): 镜像的运行实例,是一个可读写的沙盒环境。可以理解为正在运行的“集装箱”。
- Docker 仓库(Registry): 存放 Docker 镜像的仓库,类似于代码仓库。官方仓库是 Docker Hub。
-
Docker 镜像与容器的关系
可以将镜像比作类,容器比作类的实例。 镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除和暂停等。
第二部分:Docker 安装与配置
在了解了 Docker 的基本概念后,我们就可以开始安装 Docker 了。
-
安装 Docker
Docker 支持多种操作系统,包括 Linux、Windows 和 macOS。
-
Linux: 推荐使用官方提供的安装脚本:
bash
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
* 或者使用包管理器安装:
以Ubuntu为例
“`bash
# 更新 apt 包索引
sudo apt-get update# 安装软件包以允许 apt 通过 HTTPS 使用存储库 sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release # 添加 Docker 的官方 GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 设置稳定存储库 echo \ "deb [arch=amd64 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 # 安装 Docker 引擎 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
“`
-
Windows/macOS: 下载并安装 Docker Desktop。
-
-
验证安装
安装完成后,可以通过以下命令验证 Docker 是否安装成功:
bash
docker version如果能够正常输出 Docker 版本信息,则说明安装成功。
-
配置 Docker 镜像加速器(可选)
由于 Docker Hub 在国内访问速度较慢,我们可以配置国内的镜像加速器,以提高镜像下载速度。常用的镜像加速器有:
- 阿里云镜像加速器
- 网易云镜像加速器
- DaoCloud 镜像加速器
配置方法(以阿里云为例):
- 登录阿里云容器镜像服务控制台。
- 在左侧导航栏中,选择“镜像工具”->“镜像加速器”。
- 复制您的专属加速器地址。
-
修改 Docker 配置文件(通常位于
/etc/docker/daemon.json
),添加以下内容:json
{
"registry-mirrors": ["您的阿里云加速器地址"]
} -
重启 Docker 服务:
bash
sudo systemctl restart docker
第三部分:Docker 镜像操作
Docker 镜像是 Docker 的核心组件之一,掌握镜像操作是使用 Docker 的基础。
-
搜索镜像
可以使用
docker search
命令从 Docker Hub 搜索镜像:bash
docker search ubuntu这将列出所有包含 “ubuntu” 关键字的镜像。
-
拉取镜像
使用
docker pull
命令从 Docker Hub 拉取镜像到本地:bash
docker pull ubuntu:latest这将拉取最新版本的 Ubuntu 镜像。
ubuntu
是镜像名称,latest
是标签(tag),用于标识镜像的版本。如果不指定标签,默认拉取latest
标签。 -
查看本地镜像
使用
docker images
命令查看本地已有的镜像:bash
docker images这将列出本地所有镜像的名称、标签、ID、创建时间和大小。
-
删除镜像
使用
docker rmi
命令删除本地镜像:bash
docker rmi ubuntu:latest这将删除
ubuntu:latest
镜像。注意,如果该镜像有正在运行的容器,需要先停止并删除容器,才能删除镜像。可以使用-f
强制删除。 -
构建镜像(重点)
除了从 Docker Hub 拉取镜像外,我们还可以通过 Dockerfile 构建自己的镜像。Dockerfile 是一个文本文件,包含了一系列用于构建镜像的指令。
创建一个名为
Dockerfile
的文件,内容如下:“`dockerfile
使用官方 Node.js 14 作为基础镜像
FROM node:14
设置工作目录
WORKDIR /app
复制 package.json 和 package-lock.json 到工作目录
COPY package*.json ./
安装依赖
RUN npm install
复制应用程序代码到工作目录
COPY . .
暴露端口
EXPOSE 3000
启动应用程序
CMD [ “npm”, “start” ]
“`这是一个简单的 Node.js 应用程序的 Dockerfile。
FROM
指令指定基础镜像。WORKDIR
指令设置工作目录。COPY
指令复制文件到镜像中。RUN
指令执行命令。EXPOSE
指令声明容器运行时监听的端口。CMD
指令指定容器启动时执行的命令。
使用
docker build
命令构建镜像:bash
docker build -t my-node-app:1.0 .
-t
选项指定了镜像的名称和标签。.
表示 Dockerfile 所在的当前目录。
第四部分:Docker 容器操作
Docker 容器是镜像的运行实例,是 Docker 的另一个核心组件。
-
创建并启动容器
使用
docker run
命令创建并启动容器:bash
docker run -d -p 8080:80 nginx:latest-d
选项表示在后台运行容器。-p
选项将宿主机的 8080 端口映射到容器的 80 端口。nginx:latest
是要使用的镜像。
这条命令会创建一个 Nginx 容器,并将容器的 80 端口映射到宿主机的 8080 端口。您可以通过浏览器访问
http://localhost:8080
来查看 Nginx 的欢迎页面。 -
查看正在运行的容器
使用
docker ps
命令查看正在运行的容器:bash
docker ps这将列出所有正在运行的容器的 ID、镜像、命令、创建时间、状态、端口和名称。
使用
docker ps -a
查看所有容器,包括已停止的。 -
停止容器
使用
docker stop
命令停止容器:bash
docker stop <容器ID或容器名称> -
启动已停止的容器
使用
docker start
命令启动已停止的容器:bash
docker start <容器ID或容器名称> -
重启容器
bash
docker restart <容器ID或容器名称> -
进入容器
使用
docker exec
命令进入正在运行的容器:bash
docker exec -it <容器ID或容器名称> bash-it
选项表示以交互模式进入容器,并分配一个伪终端。bash
是要在容器中执行的命令。
这条命令将进入容器的 bash shell,您可以在其中执行命令、查看文件等。
-
删除容器
使用
docker rm
命令删除容器:bash
docker rm <容器ID或容器名称>注意,只有已停止的容器才能被删除。可以使用
-f
强制删除正在运行的容器。 -
查看容器日志
bash
docker logs <容器ID或容器名称>
第五部分:Docker 数据卷
Docker 数据卷用于实现容器数据的持久化和共享。
-
什么是数据卷?
默认情况下,容器中的数据是临时的,当容器被删除时,数据也会丢失。为了解决这个问题,Docker 提供了数据卷。数据卷是一个可供容器使用的特殊目录,它绕过了容器的文件系统,可以实现数据的持久化。
-
创建数据卷
使用
docker volume create
命令创建数据卷:bash
docker volume create my-data -
查看数据卷
使用
docker volume ls
命令查看数据卷:bash
docker volume ls -
使用数据卷
在创建容器时,使用
-v
选项挂载数据卷:bash
docker run -d -v my-data:/data nginx:latest这条命令将创建一个 Nginx 容器,并将
my-data
数据卷挂载到容器的/data
目录。容器中的/data
目录下的数据将会被持久化到my-data
数据卷中。也可以挂载宿主机目录:
docker run -d -v /path/on/host:/path/in/container nginx:latest
-
删除数据卷
使用
docker volume rm
命令删除数据卷:bash
docker volume rm my-data
第六部分:Docker 网络
Docker 网络用于实现容器之间的通信和容器与外部网络的连接。
-
Docker 网络模式
Docker 提供了多种网络模式:
- bridge(桥接模式): 默认的网络模式,容器通过虚拟网桥连接到宿主机网络。
- host(主机模式): 容器共享宿主机的网络命名空间,容器的网络配置与宿主机相同。
- none(无网络模式): 容器没有网络连接。
- container(容器模式): 容器共享另一个容器的网络命名空间。
- overlay(覆盖网络模式): 用于 Docker Swarm 集群中的容器通信。
-
查看网络
使用
docker network ls
命令查看 Docker 网络:bash
docker network ls -
创建网络
使用
docker network create
命令创建自定义网络:bash
docker network create my-network -
连接容器到网络
在创建容器时,使用
--network
选项指定容器连接的网络:bash
docker run -d --network my-network nginx:latest
也可以在容器运行时连接:bash
docker network connect my-network <容器ID或容器名称>
5. 断开网络连接
docker network disconnect my-network <容器ID或容器名称>
第七部分:Docker Compose(进阶)
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件,您可以配置应用程序的服务、网络和数据卷,然后使用一个命令就可以创建和启动所有服务。
-
安装 Docker Compose
Docker Desktop 已经包含了 Docker Compose。对于 Linux 系统,可以使用以下命令安装:
bash
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 文件
创建一个名为
docker-compose.yml
的文件,内容如下:yaml
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:这是一个简单的 Web 应用程序的 Docker Compose 文件。
version
指定 Docker Compose 文件的版本。services
定义了应用程序的服务,包括 web 服务和 db 服务。image
指定服务的镜像。ports
指定端口映射。volumes
指定数据卷。environment
设置环境变量
-
启动应用程序
在
docker-compose.yml
文件所在的目录下,执行以下命令启动应用程序:bash
docker-compose up -d-d
选项表示在后台运行。
这将创建并启动所有服务,包括 web 服务和 db 服务。
-
停止应用程序
bash
docker-compose down -
其他常用命令
docker-compose ps
:查看服务状态。docker-compose logs
:查看服务日志。docker-compose build
:构建服务镜像。docker-compose start
:启动已停止的服务。docker-compose stop
:停止正在运行的服务。docker-compose restart
:重启服务。
总结与展望
本教程详细介绍了 Docker 的基础知识、安装配置、镜像操作、容器操作、数据卷、网络以及 Docker Compose 等内容,并通过大量的实例演示,帮助您快速上手 Docker。
Docker 的学习是一个循序渐进的过程。在掌握了本教程的内容后,您可以进一步学习 Docker 的高级特性,如 Docker Swarm、Kubernetes 等,并将 Docker 应用于实际的开发、测试和部署工作中。
希望本教程能够帮助您开启 Docker 学习之旅!