Docker
Docker是一种开源的容器化平台,它允许开发者将应用程序及其所有依赖项打包到一个标准化的单元(容器)中,从而实现快速、一致的环境部署。
本教程将详细指导你完成从环境配置到使用Docker的完整流程。
一、Docker核心概念与环境准备
在开始操作前,理解Docker的几个核心概念至关重要:
| 概念 | 解释 | 类比说明 |
|---|---|---|
| 镜像 (Image) | 一个只读的模板,包含了运行应用程序所需的代码、运行时、库、环境变量和配置文件。 | 类似于面向对象编程中的"类",或者一个安装光盘的ISO文件。 |
| 容器 (Container) | 镜像的运行实例。容器可以被创建、启动、停止、删除,每个容器都是相互隔离的。 | 类似于由类创建的"对象实例",或者从ISO文件安装好的操作系统。 |
| 仓库 (Repository) | 集中存放镜像文件的地方,分为公共仓库(如Docker Hub)和私有仓库。 | 类似于GitHub,但存放的是Docker镜像。 |
| Dockerfile | 一个文本文件,包含了一系列指令,用于自动化构建Docker镜像。 | 类似于Makefile或构建脚本,定义了如何从基础镜像开始构建你的应用镜像。 |
系统要求与环境检查
Docker支持多种操作系统,包括Linux、Windows和macOS。以下以CentOS 7为例,其他系统步骤类似。
- 检查系统版本:
cat /etc/redhat-release确保系统是64位,内核版本3.10以上。
- 卸载旧版本Docker(如果已安装):
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine二、Docker安装与初始配置
2.1 在线安装Docker(推荐)
这是最常用的安装方式,适合有网络连接的环境。
- 安装必要的软件包:
sudo yum install -y yum-utils- 设置稳定的仓库:
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo- 安装Docker引擎:
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin- 启动Docker服务并设置开机自启:
# 启动Docker服务 sudo systemctl start docker # 设置开机自动启动 sudo systemctl enable docker # 验证安装是否成功 sudo docker version2.2 离线安装Docker
适用于没有网络连接或网络环境受限的场景。
- 在有网络的环境中下载Docker安装包:
# 创建下载目录 mkdir docker-offline cd docker-offline # 使用yum下载所有依赖包(不安装) sudo yum install --downloadonly --downloaddir=. docker-ce docker-ce-cli containerd.io- 将下载的RPM包复制到目标机器,然后安装:
# 进入包含RPM包的目录 cd docker-offline # 安装所有RPM包 sudo rpm -ivh *.rpm --nodeps --force- 启动服务(同上):
sudo systemctl start docker sudo systemctl enable docker2.3 配置镜像加速器
由于Docker Hub在国内访问较慢,建议配置镜像加速器。
- 创建或修改Docker配置文件:
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] } EOF- 重新加载配置并重启Docker:
sudo systemctl daemon-reload sudo systemctl restart docker- 验证配置是否生效:
docker info | grep -A 1 "Registry Mirrors"三、Docker界面与命令行详解
Docker主要通过命令行界面(CLI)进行操作,这是最常用且功能最全的操作方式。
3.1 Docker命令结构
Docker命令采用docker [OPTIONS] COMMAND [ARG...]的结构,主要分为以下几类:
| 命令类别 | 主要命令 | 功能描述 |
|---|---|---|
| 镜像管理 | docker images,docker pull,docker rmi | 查看、拉取、删除镜像 |
| 容器生命周期 | docker run,docker start/stop,docker rm | 创建、启动、停止、删除容器 |
| 容器操作 | docker exec,docker attach,docker cp | 进入容器、执行命令、复制文件 |
| 信息查看 | docker ps,docker logs,docker inspect | 查看容器状态、日志、详细信息 |
| 网络管理 | docker network,docker port | 管理容器网络、端口映射 |
3.2 镜像管理命令详解
- 搜索镜像:
# 从Docker Hub搜索镜像 docker search nginx # 搜索特定标签的镜像 docker search ubuntu:20.04- 拉取镜像:
# 拉取最新版本的nginx镜像 docker pull nginx # 拉取指定版本的ubuntu镜像 docker pull ubuntu:20.04 # 拉取指定架构的镜像(如ARM64) docker pull --platform linux/arm64 nginx- 查看本地镜像:
# 查看所有镜像 docker images # 查看镜像的详细信息 docker image inspect nginx:latest # 查看镜像历史(构建层) docker history nginx- 删除镜像:
# 删除单个镜像 docker rmi nginx:latest # 强制删除镜像(即使有容器使用) docker rmi -f nginx # 清理所有未使用的镜像 docker image prune -a3.3 容器生命周期管理
- 运行容器:
# 最基本的运行命令 docker run nginx # 后台运行并指定名称 docker run -d --name my-nginx nginx # 运行并映射端口(主机端口:容器端口) docker run -d -p 8080:80 --name web nginx # 运行并挂载数据卷 docker run -d -v /host/data:/container/data --name app nginx # 运行并设置环境变量 docker run -d -e "ENV_VAR=value" --name app nginx # 运行并限制资源 docker run -d --memory="512m" --cpus="1.5" --name app nginx参数详解:
-d:后台运行(detached mode)-p:端口映射(格式:主机端口:容器端口)-v:数据卷挂载(格式:主机目录:容器目录)-e:设置环境变量--name:为容器指定名称--memory:限制内存使用--cpus:限制CPU使用
- 查看运行中的容器:
# 查看正在运行的容器 docker ps # 查看所有容器(包括已停止的) docker ps -a # 查看容器占用资源 docker stats # 查看容器详细信息 docker inspect my-nginx- 启动、停止、重启容器:
# 启动已停止的容器 docker start my-nginx # 停止运行中的容器 docker stop my-nginx # 强制停止容器(发送SIGKILL) docker kill my-nginx # 重启容器 docker restart my-nginx # 暂停容器(冻结进程) docker pause my-nginx # 恢复暂停的容器 docker unpause my-nginx- 删除容器:
# 删除已停止的容器 docker rm my-nginx # 强制删除运行中的容器 docker rm -f my-nginx # 删除所有已停止的容器 docker container prune3.4 容器交互与操作
- 进入容器:
# 使用exec进入运行中的容器(推荐) docker exec -it my-nginx /bin/bash # 使用attach附加到容器(会显示所有输出) docker attach my-nginx参数详解:
-i:保持标准输入打开-t:分配伪终端-it:通常一起使用,实现交互式操作
- 在容器中执行命令:
# 在容器中执行单条命令 docker exec my-nginx ls -la /etc/nginx # 在容器中执行交互式命令 docker exec -it my-nginx python3- 查看容器日志:
# 查看最新日志 docker logs my-nginx # 实时查看日志(类似tail -f) docker logs -f my-nginx # 查看最近10行日志 docker logs --tail 10 my-nginx # 查看特定时间后的日志 docker logs --since 2024-01-01T00:00:00 my-nginx- 文件复制:
# 从主机复制文件到容器 docker cp local_file.txt my-nginx:/container/path/ # 从容器复制文件到主机 docker cp my-nginx:/container/file.txt ./local_path/3.5 网络与端口管理
- 查看网络配置:
# 查看所有网络 docker network ls # 查看网络详细信息 docker network inspect bridge- 端口映射查看:
# 查看容器的端口映射 docker port my-nginx # 查看所有端口映射 docker ps --format "table {{.Names}}\t{{.Ports}}"- 创建自定义网络:
# 创建桥接网络 docker network create my-network # 在自定义网络中运行容器 docker run -d --network my-network --name app1 nginx docker run -d --network my-network --name app2 nginx # 容器间可以通过容器名直接通信 docker exec app1 ping app23.6 Docker Compose界面与使用
对于多容器应用,Docker Compose提供了更便捷的管理方式。
- 安装Docker Compose:
# 对于较新版本的Docker,Compose已包含在安装包中 # 如果需要单独安装 sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose- 编写docker-compose.yml:
version: '3.8' services: web: image: nginx:latest container_name: my-web ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html networks: - app-network db: image: mysql:8.0 container_name: my-db environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: mydb volumes: - db-data:/var/lib/mysql networks: - app-network volumes: db-data: networks: app-network: driver: bridge- Compose常用命令:
# 启动所有服务(在docker-compose.yml所在目录) docker-compose up -d # 查看服务状态 docker-compose ps # 查看服务日志 docker-compose logs -f # 停止所有服务 docker-compose down # 停止并删除所有资源(包括卷) docker-compose down -v # 重新构建并启动服务 docker-compose up -d --build四、实践案例:部署一个简单的Web应用
让我们通过一个完整的例子来巩固所学知识:部署一个包含Nginx Web服务器和MySQL数据库的应用。
4.1 创建项目结构
# 创建项目目录 mkdir my-webapp cd my-webapp # 创建网页文件 mkdir html echo "<h1>Welcome to My Web App</h1><p>This is running in Docker!</p>" > html/index.html # 创建Dockerfile cat > Dockerfile << 'EOF' FROM nginx:alpine COPY html /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] EOF4.2 创建docker-compose.yml
version: '3.8' services: web: build: . container_name: web-app ports: - "8080:80" depends_on: - db networks: - app-net restart: unless-stopped db: image: mysql:8.0 container_name: mysql-db environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: myapp MYSQL_USER: user MYSQL_PASSWORD: userpass volumes: - mysql-data:/var/lib/mysql networks: - app-net restart: unless-stopped command: --default-authentication-plugin=mysql_native_password volumes: mysql-data: networks: app-net: driver: bridge4.3 构建并运行应用
# 构建并启动所有服务 docker-compose up -d # 查看运行状态 docker-compose ps # 查看Web服务日志 docker-compose logs -f web # 进入MySQL容器 docker-compose exec db mysql -u root -p # 输入密码: secret # 在MySQL中创建表 CREATE TABLE users (id INT, name VARCHAR(50)); INSERT INTO users VALUES (1, 'Alice'), (2, 'Bob'); SELECT * FROM users;4.4 访问应用与验证
- 打开浏览器访问
http://localhost:8080,应该能看到欢迎页面 - 验证容器运行状态:
# 查看所有容器 docker ps # 查看容器资源使用 docker stats # 查看容器网络 docker network inspect my-webapp_app-net4.5 清理资源
# 停止并删除所有容器、网络 docker-compose down # 删除数据卷(如果需要) docker-compose down -v # 删除所有未使用的资源 docker system prune -a五、高级功能与最佳实践
5.1 数据持久化策略
容器本身是临时性的,数据持久化至关重要:
- 绑定挂载(Bind Mounts):
# 将主机目录挂载到容器 docker run -d -v /host/data:/container/data --name app nginx- 数据卷(Volumes):
# 创建数据卷 docker volume create my-volume # 使用数据卷 docker run -d -v my-volume:/container/data --name app nginx # 查看数据卷信息 docker volume inspect my-volume- 临时文件系统(tmpfs):
# 将内存挂载为临时文件系统 docker run -d --tmpfs /tmp --name app nginx5.2 资源限制与监控
# 限制CPU使用(1.5个CPU核心) docker run -d --cpus="1.5" --name app nginx # 限制内存使用(512MB内存,1GB交换空间) docker run -d --memory="512m" --memory-swap="1g" --name app nginx # 限制进程数 docker run -d --pids-limit 100 --name app nginx # 监控资源使用 docker stats --all --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"5.3 安全最佳实践
- 不要以root用户运行容器:
# 在Dockerfile中指定非root用户 FROM nginx:alpine RUN addgroup -g 1000 -S appgroup && \ adduser -u 1000 -S appuser -G appgroup USER appuser- 定期更新基础镜像:
# 拉取最新安全更新 docker pull nginx:latest- 扫描镜像安全漏洞:
# 使用Docker Scan(需要登录Docker Hub) docker scan nginx:latest5.4 常用调试技巧
- 检查容器内部进程:
docker top my-container- 查看容器元数据:
docker inspect my-container | grep -A 10 "State"- 查看容器文件系统变化:
docker diff my-container- 保存容器状态为镜像:
docker commit my-container my-snapshot:latest通过本教程,你应该已经掌握了Docker从环境配置到实际使用的完整流程。
记住,Docker的核心优势在于环境一致性、快速部署和资源隔离。
在实际工作中,建议从简单的单容器应用开始,逐步过渡到使用Docker Compose管理多容器应用,最终学习Docker Swarm或Kubernetes进行容器编排。
参考来源
- docker的下载与安装
- docker基本操作
- Docker-Compose