Skip to content

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.
...

这个过程发生了什么?

  1. Docker 客户端联系 Docker 守护进程
  2. 守护进程从 Docker Hub 拉取 "hello-world" 镜像
  3. 守护进程从镜像创建新容器并运行
  4. 容器输出消息后退出

运行交互式容器

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                 # 版本信息

故障排查

常见问题及解决方案

  1. 容器无法启动

    bash
    # 查看容器日志
    docker logs container_name
    
    # 查看容器详细信息
    docker inspect container_name
  2. 端口冲突

    bash
    # 查看端口使用情况
    netstat -tulpn | grep :8080
    
    # 使用不同端口
    docker run -p 8081:80 nginx
  3. 镜像拉取失败

    bash
    # 检查网络连接
    ping docker.io
    
    # 使用镜像加速器
    docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx:latest
  4. 容器内存不足

    bash
    # 限制容器内存使用
    docker run -m 512m nginx
    
    # 查看容器资源使用
    docker stats

最佳实践提示

  1. 使用具体的镜像标签

    bash
    # 好的做法
    docker run nginx:1.21.6
    
    # 避免使用
    docker run nginx:latest
  2. 及时清理资源

    bash
    # 清理停止的容器
    docker container prune
    
    # 清理未使用的镜像
    docker image prune
    
    # 清理所有未使用资源
    docker system prune -a
  3. 使用有意义的容器名称

    bash
    # 好的做法
    docker run --name web-server nginx
    
    # 避免使用随机名称
    docker run nginx

本章小结

通过本章的学习,你已经掌握了 Docker 的基本操作:

关键要点:

  • 学会了运行第一个 Docker 容器
  • 掌握了基本的 Docker 命令
  • 了解了容器的生命周期管理
  • 学会了端口映射和数据挂载
  • 通过实际例子体验了 Docker 的便利性

你现在可以:

  • 运行各种预构建的容器
  • 管理容器的启动、停止和删除
  • 进行基本的网络和存储配置
  • 排查常见的容器问题

在下一章中,我们将深入学习 Docker 的核心概念,包括镜像、容器、仓库等重要概念的详细原理。

延伸阅读

本站内容仅供学习和研究使用。