Docker 快速上手
本章将通过实际操作让你快速体验 Docker 的核心功能,运行你的第一个容器,并了解基本的 Docker 命令。
运行第一个容器
Hello World 容器
让我们从最简单的例子开始:
bash
# 运行 Hello World 容器
docker run hello-world输出示例:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...这个过程发生了什么?
- Docker 客户端联系 Docker 守护进程
- 守护进程从 Docker Hub 拉取 "hello-world" 镜像
- 守护进程从镜像创建新容器并运行
- 容器输出消息后退出
运行交互式容器
bash
# 运行 Ubuntu 容器并进入交互模式
docker run -it ubuntu:20.04 /bin/bash参数说明:
-i:保持 STDIN 开放-t:分配一个伪终端ubuntu:20.04:镜像名称和标签/bin/bash:要执行的命令
在容器内操作:
bash
# 现在你在 Ubuntu 容器内
root@container_id:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
# 查看系统信息
root@container_id:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
...
# 安装软件包
root@container_id:/# apt update && apt install -y curl
# 退出容器
root@container_id:/# exit基本 Docker 命令
镜像相关命令
bash
# 列出本地镜像
docker images
# 或
docker image ls
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
# 删除镜像
docker rmi hello-world
# 查看镜像详细信息
docker image inspect nginx容器相关命令
bash
# 列出运行中的容器
docker ps
# 列出所有容器(包括已停止的)
docker ps -a
# 启动容器
docker start container_name
# 停止容器
docker stop container_name
# 重启容器
docker restart container_name
# 删除容器
docker rm container_name
# 查看容器日志
docker logs container_name
# 进入运行中的容器
docker exec -it container_name /bin/bash实战示例:运行 Web 服务器
运行 Nginx 服务器
bash
# 运行 Nginx 容器
docker run -d -p 8080:80 --name my-nginx nginx:latest参数说明:
-d:后台运行(守护进程模式)-p 8080:80:端口映射,将主机的 8080 端口映射到容器的 80 端口--name my-nginx:为容器指定名称
验证服务:
bash
# 检查容器状态
docker ps
# 访问 Web 服务
curl http://localhost:8080
# 或在浏览器中访问 http://localhost:8080自定义 Nginx 内容
bash
# 创建自定义 HTML 文件
mkdir -p ~/docker-demo
echo "<h1>Hello Docker!</h1>" > ~/docker-demo/index.html
# 运行 Nginx 并挂载自定义内容
docker run -d -p 8081:80 -v ~/docker-demo:/usr/share/nginx/html --name custom-nginx nginx:latest
# 访问自定义内容
curl http://localhost:8081容器生命周期管理
创建和管理容器
bash
# 创建但不启动容器
docker create --name my-ubuntu ubuntu:20.04
# 启动已创建的容器
docker start my-ubuntu
# 停止运行中的容器
docker stop my-ubuntu
# 重启容器
docker restart my-ubuntu
# 暂停容器
docker pause my-ubuntu
# 恢复暂停的容器
docker unpause my-ubuntu
# 删除容器
docker rm my-ubuntu容器状态查看
bash
# 查看容器详细信息
docker inspect container_name
# 查看容器资源使用情况
docker stats container_name
# 查看容器进程
docker top container_name
# 查看容器端口映射
docker port container_name数据管理基础
数据卷 (Volumes)
bash
# 创建数据卷
docker volume create my-volume
# 列出数据卷
docker volume ls
# 使用数据卷运行容器
docker run -d -v my-volume:/data --name data-container ubuntu:20.04
# 查看数据卷详细信息
docker volume inspect my-volume绑定挂载 (Bind Mounts)
bash
# 将主机目录挂载到容器
docker run -d -v /host/path:/container/path ubuntu:20.04
# 只读挂载
docker run -d -v /host/path:/container/path:ro ubuntu:20.04网络基础
端口映射
bash
# 映射单个端口
docker run -p 8080:80 nginx
# 映射多个端口
docker run -p 8080:80 -p 8443:443 nginx
# 映射到随机端口
docker run -P nginx
# 查看端口映射
docker port container_name容器网络
bash
# 列出网络
docker network ls
# 创建自定义网络
docker network create my-network
# 在指定网络中运行容器
docker run --network my-network nginx
# 连接容器到网络
docker network connect my-network container_name实战练习:搭建开发环境
练习 1:运行数据库
bash
# 运行 MySQL 数据库
docker run -d \
--name mysql-db \
-e MYSQL_ROOT_PASSWORD=mypassword \
-e MYSQL_DATABASE=testdb \
-p 3306:3306 \
mysql:8.0
# 连接到数据库
docker exec -it mysql-db mysql -u root -p练习 2:运行 Redis 缓存
bash
# 运行 Redis
docker run -d --name redis-cache -p 6379:6379 redis:latest
# 连接到 Redis
docker exec -it redis-cache redis-cli练习 3:运行 Node.js 应用
bash
# 创建简单的 Node.js 应用
mkdir node-app && cd node-app
# 创建 package.json
cat > package.json << EOF
{
"name": "docker-node-app",
"version": "1.0.0",
"main": "app.js",
"dependencies": {
"express": "^4.18.0"
}
}
EOF
# 创建 app.js
cat > app.js << EOF
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello Docker from Node.js!');
});
app.listen(port, () => {
console.log(\`App listening at http://localhost:\${port}\`);
});
EOF
# 运行 Node.js 容器
docker run -d \
--name node-app \
-p 3000:3000 \
-v $(pwd):/usr/src/app \
-w /usr/src/app \
node:16 \
sh -c "npm install && node app.js"常用命令速查
镜像操作
bash
docker images # 列出镜像
docker pull <image> # 拉取镜像
docker rmi <image> # 删除镜像
docker build -t <name> . # 构建镜像
docker tag <image> <new_name> # 标记镜像容器操作
bash
docker run <image> # 运行容器
docker ps # 列出运行中容器
docker ps -a # 列出所有容器
docker stop <container> # 停止容器
docker start <container> # 启动容器
docker rm <container> # 删除容器
docker exec -it <container> bash # 进入容器
docker logs <container> # 查看日志系统操作
bash
docker system info # 系统信息
docker system df # 磁盘使用情况
docker system prune # 清理未使用资源
docker version # 版本信息故障排查
常见问题及解决方案
容器无法启动
bash# 查看容器日志 docker logs container_name # 查看容器详细信息 docker inspect container_name端口冲突
bash# 查看端口使用情况 netstat -tulpn | grep :8080 # 使用不同端口 docker run -p 8081:80 nginx镜像拉取失败
bash# 检查网络连接 ping docker.io # 使用镜像加速器 docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx:latest容器内存不足
bash# 限制容器内存使用 docker run -m 512m nginx # 查看容器资源使用 docker stats
最佳实践提示
使用具体的镜像标签
bash# 好的做法 docker run nginx:1.21.6 # 避免使用 docker run nginx:latest及时清理资源
bash# 清理停止的容器 docker container prune # 清理未使用的镜像 docker image prune # 清理所有未使用资源 docker system prune -a使用有意义的容器名称
bash# 好的做法 docker run --name web-server nginx # 避免使用随机名称 docker run nginx
本章小结
通过本章的学习,你已经掌握了 Docker 的基本操作:
关键要点:
- 学会了运行第一个 Docker 容器
- 掌握了基本的 Docker 命令
- 了解了容器的生命周期管理
- 学会了端口映射和数据挂载
- 通过实际例子体验了 Docker 的便利性
你现在可以:
- 运行各种预构建的容器
- 管理容器的启动、停止和删除
- 进行基本的网络和存储配置
- 排查常见的容器问题
在下一章中,我们将深入学习 Docker 的核心概念,包括镜像、容器、仓库等重要概念的详细原理。