一、Docker 简介
Docker 是一个开源的应用容器引擎,它让开发者能够将应用及其依赖包打包到一个可移植的容器中。这个容器可以发布到任何流行的 Linux 机器上,也能实现虚拟化。而且,容器采用完全的沙箱机制,相互之间不会有任何接口,保证了应用运行环境的独立性和安全性。
借助 Docker,开发者可以确保应用在不同的环境中都能以相同的方式运行,极大地简化了应用的部署和迁移过程,提高了开发和运维的效率。
图解 1:Docker 核心概念关系图

二、Docker 安装步骤
(一)在 Ubuntu 上安装 Docker
1. 首先,更新 apt 包索引并安装必要的依赖,打开终端输入以下命令:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
2. 接着,添加 Docker 官方 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
3. 设置 Docker 稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) 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
4. 安装 Docker Engine:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
5. 验证安装是否成功,运行 hello-world 镜像:
sudo docker run hello-world
如果成功安装,会显示相应的欢迎信息。
图解 2:Ubuntu 安装 Docker 流程

(二)在 CentOS 上安装 Docker
1. 安装必要的依赖:
sudo yum install -y yum-utils
2. 设置 Docker 仓库:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3. 安装 Docker Engine:
sudo yum install docker-ce docker-ce-cli containerd.io
4. 启动 Docker 服务:
sudo systemctl start docker
5. 验证安装是否成功:
sudo docker run hello-world
图解 3:CentOS 安装 Docker 流程

(三)在 Windows 上安装 Docker Desktop
- 访问Docker 官网下载 Docker Desktop for Windows。
- 运行下载好的安装程序,按照向导的提示完成安装过程。
- 安装完成后,启动 Docker Desktop。首次启动可能需要一些时间,耐心等待。
- 打开命令提示符或 PowerShell,输入以下命令验证安装:
docker run hello-world
若出现成功信息,则安装完成。
图解 4:Windows 安装 Docker Desktop 流程

三、Docker 基本配置
(一)配置 Docker 镜像加速器
由于国内访问 Docker 官方仓库可能速度较慢,配置镜像加速器可以提高拉取镜像的速度。
1. 创建或编辑 Docker 配置文件:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://your-mirror-url.mirror.aliyuncs.com"]
}
EOF
其中,https://your-mirror-url.mirror.aliyuncs.com需要替换为实际的镜像加速器地址,比如阿里云、网易等提供的镜像加速器。
2. 重启 Docker 服务使配置生效:
sudo systemctl daemon-reload
sudo systemctl restart docker
图解 5:镜像加速器工作原理

(二)配置 Docker 开机自启
在 Linux 系统中,可以通过以下命令设置 Docker 开机自启:
sudo systemctl enable docker
这样,当系统重启时,Docker 服务会自动启动。
图解 6:Docker 开机自启设置

四、Docker 常用命令
(一)基础信息查看命令
1. 查看 Docker 版本:
docker version
该命令会显示 Docker 客户端和服务器的版本信息。
2. 查看 Docker 详细信息
docker info
可以了解 Docker 的运行状态、镜像和容器数量等信息。
图解 7:docker version 命令输出结构

(二)镜像管理命令
1. 拉取镜像:
docker pull [镜像名]:[标签]
例如,拉取 Ubuntu 20.04 镜像:docker pull ubuntu:20.04。如果不指定标签,默认拉取 latest 标签的镜像。
2. 查看本地镜像:
docker images
会列出所有本地存储的镜像,包括镜像名、标签、ID、创建时间和大小等信息。
3. 删除镜像:
docker rmi [镜像ID/镜像名]
删除镜像时,需要确保该镜像没有被任何容器使用,否则需要先删除相关容器。
图解 8:镜像拉取流程

(三)容器管理命令
1. 运行容器:
docker run [选项] [镜像名] [命令]
常用选项:
- -d:后台运行容器,并返回容器 ID。
- -it:以交互模式运行容器,通常与/bin/bash配合使用,进入容器内部。
- -p:端口映射,将容器的端口映射到主机的端口,格式为主机端口:容器端口。
- --name:为容器指定一个名称。
例如,运行一个名为 my-nginx 的 Nginx 容器,并将主机的 8080 端口映射到容器的 80 端口:
docker run -d -p 8080:80 --name my-nginx nginx
2. 查看运行中的容器:
docker ps
3. 查看所有容器(包括停止的):
docker ps -a
4. 启动容器:
docker start [容器ID/容器名]
5. 停止容器:
docker stop [容器ID/容器名]
6. 重启容器:
docker restart [容器ID/容器名]
7. 删除容器:
docker rm [容器ID/容器名]
删除容器前,需要确保容器处于停止状态。
8. 查看容器日志:
docker logs [容器ID/容器名]
可以加上-f选项实时查看日志:docker logs -f [容器ID/容器名]。
9. 进入容器:
docker exec -it [容器ID/容器名] /bin/bash
进入容器后,可以在容器内部执行命令。
图解 9:容器端口映射示意

(四)镜像构建命令
构建镜像:
docker build -t [镜像名]:[标签] [Dockerfile路径]
例如,在当前目录下根据 Dockerfile 构建一个名为 my-app、标签为 v1 的镜像:
docker build -t my-app:v1 .
图解 10:镜像构建流程

五、Docker 镜像管理
(一)构建自定义镜像
构建自定义镜像需要编写 Dockerfile,Dockerfile 是一个包含构建镜像所有指令的文本文件。
1. 创建 Dockerfile,例如:
# 使用官方镜像作为基础
FROM ubuntu:20.04
# 维护者信息
MAINTAINER Your Name <your@email.com>
# 安装必要的软件
RUN apt-get update && apt-get install -y \
nginx \
&& rm -rf /var/lib/apt/lists/*
# 暴露端口
EXPOSE 80
# 启动命令
CMD ["nginx", "-g", "daemon off;"]
上述 Dockerfile 基于 Ubuntu 20.04 镜像,安装了 Nginx,并暴露 80 端口,启动命令为运行 Nginx。
2. 构建镜像:
在 Dockerfile 所在目录下执行:
docker build -t my-nginx:v1 .
图解 11:Dockerfile 指令执行顺序

(二)推送镜像到仓库
1. 登录到 Docker Hub:
docker login
输入 Docker Hub 的用户名和密码进行登录。
2. 标记镜像:
需要将镜像标记为 Docker Hub 上的仓库格式,即用户名/镜像名:标签。
docker tag my-nginx:v1 username/my-nginx:v1
其中,username 是 Docker Hub 的用户名。
3. 推送镜像:
docker push username/my-nginx:v1
推送完成后,就可以在 Docker Hub 上看到推送的镜像了。
图解 12:镜像推送流程

六、Docker 容器网络
Docker 提供了多种网络驱动,用于实现容器之间、容器与主机之间的通信。
1. 创建自定义网络:
docker network create my-network
默认创建的是 bridge 类型的网络。
2. 查看网络列表:
docker network ls
可以看到所有已创建的网络。
3. 将容器连接到网络:
docker run -d --name container1 --network my-network nginx
这样,container1 容器就加入了 my-network 网络,可以与同一网络中的其他容器通信。
4. 检查网络详情:
docker network inspect my-network
可以查看网络的配置信息,以及连接到该网络的容器等。
图解 13:容器网络通信示意

七、Docker 数据持久化
为了防止容器删除后数据丢失,需要对容器的数据进行持久化存储。Docker 提供了 volumes 和 bind mounts 两种方式。
(一)使用 volumes
1. 创建 volume:
docker volume create my-volume
2. 在运行容器时挂载 volume:
docker run -d -v my-volume:/data --name data-container nginx
将 my-volume 挂载到容器的 /data 目录,容器中的数据写入 /data 目录时,会实际存储在 my-volume 中。
图解 14:volumes 数据持久化示意

(二)使用 bind mounts
直接将主机的目录挂载到容器中:
docker run -d -v /host/path:/container/path --name bind-container nginx
其中,/host/path 是主机上的目录,/container/path 是容器中的目录。主机目录中的文件会同步到容器中,容器中对该目录的修改也会反映到主机上。
图解 15:bind mounts 数据持久化示意

八、Docker Compose
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 YAML 文件配置应用程序的服务,然后使用一个命令创建并启动所有服务。
(一)安装 Docker Compose
在 Linux 上安装:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
验证安装:
docker-compose --version
显示版本信息则安装成功。
(二)使用示例
1. 创建 docker-compose.yml 文件:
version: '3'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- php
php:
image: php:fpm-alpine
volumes:
- ./html:/var/www/html
该配置定义了两个服务:web(Nginx)和 php。web 服务将主机的 80 端口映射到容器的 80 端口,挂载./html 目录到容器的 /usr/share/nginx/html;php 服务挂载./html 目录到 /var/www/html,并且 web 服务依赖于 php 服务。
2. 启动服务:
在 docker-compose.yml 文件所在目录执行:
docker-compose up -d
-d选项表示后台运行。
3. 查看服务状态:
docker-compose ps
可以看到各个服务的运行状态。
4. 停止服务:
docker-compose down
会停止并删除所有服务相关的容器、网络等,但数据卷会保留。
图解 16:Docker Compose 服务关系示意

九、实际应用案例
(一)部署一个简单的 Web 应用
1. 创建项目结构:
首先,创建如下的项目目录结构:
my-webapp/
├── docker-compose.yml
├── nginx/
│ └── nginx.conf
└── app/
├── index.php
└── Dockerfile
2. 编写 app/Dockerfile:
FROM php:fpm-alpine
COPY . /var/www/html
该 Dockerfile 基于 php:fpm-alpine 镜像,将当前目录下的文件复制到容器的 /var/www/html 目录。
3. 编写 nginx/nginx.conf:
server {
listen 80;
server_name localhost;
root /var/www/html;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
此配置文件定义了 Nginx 如何处理请求,对于 PHP 文件会转发到 php 服务的 9000 端口处理。
4. 编写 docker-compose.yml:
version: '3'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
- ./app:/var/www/html
depends_on:
- php
php:
build: ./app
该配置定义了两个服务,nginx 服务使用 nginx:alpine 镜像,映射 80 端口,挂载配置文件和应用目录,依赖 php 服务;php 服务基于 app 目录下的 Dockerfile 构建。
5. 编写 app/index.php:
<?php
echo "Hello, Docker!";
?>
这是一个简单的 PHP 页面,用于展示应用效果。
6. 启动应用:
在 my-webapp 目录下执行以下命令启动应用:
docker-compose up -d
7. 访问应用:
打开浏览器,访问 http://localhost,即可看到页面显示 “Hello, Docker!”。
图解 17:Web 应用部署架构

8. 停止应用:
如果需要停止应用,在 my-webapp 目录下执行:
docker-compose down
十、Docker 常见问题及解决方法
(一)Docker 服务无法启动
- 问题现象:执行 sudo systemctl start docker 后,Docker 服务未启动,使用 sudo systemctl status docker 查看状态显示失败。
- 可能原因:Docker 配置文件错误、依赖服务未启动、端口被占用等。
- 解决方法:
-
- 查看日志文件 /var/log/docker.log 寻找错误信息。
-
- 检查配置文件 /etc/docker/daemon.json 是否有语法错误。
-
- 确保 containerd 等依赖服务正常运行,可执行 sudo systemctl status containerd 查看。
-
- 检查是否有其他程序占用了 Docker 所需的端口。
(二)拉取镜像速度慢或失败
- 问题现象:执行 docker pull 命令时,速度很慢,甚至出现超时失败。
- 可能原因:网络问题、未配置镜像加速器、Docker 官方仓库访问受限。
- 解决方法:
-
- 配置镜像加速器,如前文 “配置 Docker 镜像加速器” 部分所述。
-
- 检查网络连接,确保网络通畅。
-
- 尝试更换网络环境或使用 VPN。
(三)容器无法访问网络
- 问题现象:容器内部无法访问外部网络,或无法与其他容器通信。
- 可能原因:网络配置错误、防火墙限制、容器未加入正确的网络。
- 解决方法:
-
- 检查容器所连接的网络,使用 docker network inspect [网络名] 查看网络详情。
-
- 确保容器已加入正确的网络,若未加入,可使用 docker network connect [网络名] [容器名] 连接。
-
- 检查主机的防火墙设置,是否允许容器访问网络。
-
- 在容器内部执行 ping 命令测试网络连通性,排查容器内部网络问题。
十一、总结
Docker 作为一款强大的容器化工具,为应用的开发、部署和运维带来了极大的便利。通过本文的学习,我们了解了 Docker 的基本概念、安装步骤、配置方法、常用命令,以及镜像管理、容器网络、数据持久化、Docker Compose 等重要内容,并通过实际案例掌握了 Docker 的应用方式。
在实际使用中,还需要不断积累经验,解决遇到的各种问题,进一步深入学习 Docker 的高级特性,如 Docker Swarm 集群管理、多阶段构建等,以更好地发挥 Docker 的优势,提高工作效率。
Docker 详细教程:安装、配置与应用

9万+

被折叠的 条评论
为什么被折叠?



