Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中安装 Docker 容器 —— 知识点详解(26)

Ubuntu 22.04 中安装 Docker 容器 ------ 知识点详解


一、引入

在现代软件开发与部署中,环境一致性 是核心挑战。Docker 通过容器化技术,将应用及其依赖打包为轻量、可移植的单元,实现"一次构建,到处运行"。

✅ 本章目标:在 Ubuntu 22.04 上完整部署 Docker,并掌握容器基本操作。


二、Docker 容器技术简介

  • 容器(Container):轻量级、隔离的运行环境,共享宿主机内核。
  • 镜像(Image) :只读模板,用于创建容器(如 nginx:latest)。
  • Docker Engine:核心服务,负责构建、运行和管理容器。
  • 优势:快速启动、资源占用低、版本控制、CI/CD 集成友好。

三、在 Ubuntu 22.04 中安装 Docker 及镜像加速器

1. 安装 Docker 引擎

⚠️ 不建议使用 apt install docker.io(版本旧、功能不全)。推荐使用官方仓库安装。

步骤详解:
bash 复制代码
# 1. 更新系统包索引
sudo apt update

# 2. 安装必要依赖
sudo apt install -y ca-certificates curl gnupg lsb-release

# 3. 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 4. 设置稳定版仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. 再次更新包索引
sudo apt update

# 6. 安装 Docker Engine、CLI 和 Containerd
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 7. 验证安装
sudo docker --version
# 输出示例:Docker version 26.1.4, build ...

# 8. 运行 Hello World 测试
sudo docker run hello-world

✅ 成功标志:输出 "Hello from Docker!" 并显示说明信息。


2. 配置镜像加速器(国内必备)

Docker Hub 在国内访问慢,需配置镜像加速器(如阿里云、中科大)。

以阿里云为例:
bash 复制代码
# 1. 创建或编辑 daemon.json 配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://<你的ID>.mirror.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
EOF

# 注:替换 <你的ID> 为阿里云容器镜像服务 ID(可免费注册获取)
# 或直接使用中科大镜像(无需账号):
# {
#   "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
# }

# 2. 重载配置并重启 Docker 服务
sudo systemctl daemon-reexec
sudo systemctl restart docker

# 3. 验证配置生效
docker info | grep -A 1 "Registry Mirrors"

✅ 输出应包含你配置的镜像地址。


3. 配置用户(避免每次使用 sudo)

默认只有 root 或 docker 组用户可运行 docker 命令。

bash 复制代码
# 1. 创建 docker 用户组(若不存在)
sudo groupadd docker

# 2. 将当前用户加入 docker 组
sudo usermod -aG docker $USER

# 3. 重新登录或刷新组权限
newgrp docker

# 4. 验证(无需 sudo)
docker run hello-world

🔒 安全提示:将用户加入 docker 组等同于赋予 root 权限,请谨慎授权。


四、Docker 容器的使用

1. 查看本地已安装镜像

bash 复制代码
# 列出所有本地镜像
docker images

# 示例输出:
# REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
# nginx         latest    abc123def456   2 weeks ago    142MB

2. 查找 Docker 镜像

bash 复制代码
# 在 Docker Hub 搜索镜像(关键词:nginx)
docker search nginx

# 输出包含:NAME, DESCRIPTION, STARS, OFFICIAL, AUTOMATED

💡 推荐优先选择 OFFICIAL = [OK] 的官方镜像。


3. 拉取镜像

bash 复制代码
# 拉取最新版 Nginx 镜像
docker pull nginx:latest

# 拉取指定版本
docker pull python:3.10-slim

4. 容器的运行与进入

运行一个交互式容器(前台)
bash 复制代码
# 启动 Ubuntu 容器并进入 bash
docker run -it ubuntu:22.04 /bin/bash

# -i: 保持 STDIN 打开(交互)
# -t: 分配伪终端
# 退出容器:输入 exit 或 Ctrl+D
后台运行容器(守护式)
bash 复制代码
# 后台运行 Nginx,并命名容器为 my-nginx
docker run -d --name my-nginx nginx

# -d: 后台运行(detached mode)
# --name: 指定容器名称(便于管理)
进入正在运行的容器
bash 复制代码
# 方法1:使用 exec(推荐)
docker exec -it my-nginx /bin/bash

# 方法2:使用 attach(会绑定到主进程,慎用)
docker attach my-nginx
# 退出 attach:Ctrl+P, Ctrl+Q(不终止容器)

5. 停止容器

bash 复制代码
# 停止指定容器(优雅停止,发送 SIGTERM)
docker stop my-nginx

# 强制停止(发送 SIGKILL)
docker kill my-nginx

6. 启动容器

bash 复制代码
# 启动已停止的容器
docker start my-nginx

# 启动并进入
docker start -ai my-nginx

7. 自启动容器

让容器在 Docker 服务启动时自动运行:

bash 复制代码
# 设置重启策略为 always
docker run -d --restart=always --name redis redis

# 其他策略:
# --restart=no          (默认)
# --restart=on-failure[:max-retries]
# --restart=unless-stopped

✅ 验证:重启系统后,docker ps 应显示该容器正在运行。


8. 删除容器

bash 复制代码
# 删除已停止的容器
docker rm my-nginx

# 强制删除运行中的容器(先 stop 再 rm 更安全)
docker rm -f my-nginx

# 删除所有已停止的容器
docker container prune

9. 容器的状态

bash 复制代码
# 查看所有容器(包括停止的)
docker ps -a

# 查看运行中的容器
docker ps

# 查看容器详细信息(JSON 格式)
docker inspect my-nginx

# 查看容器资源使用(CPU、内存等)
docker stats my-nginx
# 按 q 退出

10. 开启容器的端口(端口映射)

将容器内部端口暴露给宿主机:

bash 复制代码
# 将容器 80 端口映射到宿主机 8080 端口
docker run -d --name web -p 8080:80 nginx

# 访问 http://localhost:8080 即可看到 Nginx 欢迎页

# 多端口映射示例
docker run -d -p 3306:3306 -p 33060:33060 mysql:8.0

📌 语法:-p <宿主机端口>:<容器端口>


11. 与宿主系统共享目录(挂载卷)

实现宿主机与容器文件系统共享:

bash 复制代码
# 创建宿主机目录
mkdir -p ~/html

# 写入测试文件
echo "<h1>Hello from Host!</h1>" > ~/html/index.html

# 启动 Nginx,挂载宿主机目录到容器 /usr/share/nginx/html
docker run -d --name web-vol \
  -p 8080:80 \
  -v ~/html:/usr/share/nginx/html:ro \
  nginx

# :ro 表示只读挂载;省略则为读写(rw)

✅ 修改 ~/html/index.html,刷新浏览器即可看到变化。


12. 在宿主系统与容器之间复制文件

bash 复制代码
# 从容器复制文件到宿主机
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf

# 从宿主机复制文件到容器
echo "custom config" > custom.txt
docker cp custom.txt my-nginx:/tmp/

# 验证
docker exec my-nginx cat /tmp/custom.txt

💡 适用于临时调试,长期使用建议用 -v 挂载卷。


13. 容器的监控

实时监控资源
bash 复制代码
# 监控单个容器
docker stats my-nginx

# 监控所有容器
docker stats
查看日志
bash 复制代码
# 查看容器完整日志
docker logs my-nginx

# 实时跟踪日志(类似 tail -f)
docker logs -f my-nginx

# 查看最近 10 行
docker logs --tail 10 my-nginx

14. 查看帮助

bash 复制代码
# 查看全局帮助
docker --help

# 查看子命令帮助(如 run)
docker run --help

# 查看特定选项说明(如 --restart)
docker run --help | grep -A 2 restart

五、小结

功能 关键命令
安装 Docker apt install docker-ce ...
镜像加速 配置 /etc/docker/daemon.json
用户免 sudo sudo usermod -aG docker $USER
运行容器 docker run -d -p 8080:80 --name web nginx
挂载目录 -v /host/path:/container/path
端口映射 -p 8080:80
文件复制 docker cp src dest
自启动 --restart=always
监控 docker stats, docker logs

最佳实践建议

  • 所有生产容器使用 --restart=always
  • 敏感数据使用 Docker Secrets 或环境变量(-e
  • 日志使用卷挂载或日志驱动(如 json-file, syslog
  • 定期清理无用镜像/容器:docker system prune -a

通过本章学习,您已掌握在 Ubuntu 22.04 上从零部署 Docker熟练操作容器的核心技能,为后续部署 AI 服务、Web 应用、数据库等奠定坚实基础。

相关推荐
开开心心_Every2 小时前
安卓做菜APP:家常菜谱详细步骤无广简洁
服务器·前端·python·学习·edge·django·powerpoint
wdfk_prog2 小时前
WIN11如何可以安装ISO
linux·笔记·学习
Darkershadow2 小时前
蓝牙学习之Provision(2)
学习·蓝牙·ble·mesh
Knight_AL2 小时前
使用 Docker 快速安装 GitLab(CentOS)
docker·centos·gitlab
kitsch0x972 小时前
论文学习_IDFUZZ: Intelligent Directed Grey-box Fuzzing
学习
老前端的功夫2 小时前
TypeScript索引访问类型深度解析:类型系统的动态访问与模式匹配
前端·javascript·ubuntu·架构·typescript·前端框架
dxnb223 小时前
Datawhale26年1月组队学习:Agentic AI+Task1工作流简介
人工智能·学习
oMcLin3 小时前
如何在Ubuntu 20.04上配置并调优Kubernetes集群,确保在多租户环境下的高可用性与资源分配?
linux·ubuntu·kubernetes
Nan_Shu_6143 小时前
学习: Threejs (9)& Threejs (10)
学习