找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2940

积分

0

好友

391

主题
发表于 前天 00:36 | 查看: 16| 回复: 0

在 Linux 系统中,Docker 凭借其轻量级容器化特性,成为开发者和运维人员的得力工具。它能将应用及其依赖环境打包成标准化的镜像,实现“一次构建,到处运行”,有效解决了环境不一致的老大难问题。

本文将聚焦于 Linux 系统下 Docker 的实用技能,内容涵盖从基础安装、核心操作到进阶技巧的全过程。无论你是初次接触的新手,还是希望查漏补缺的老用户,都能从中找到提升效率的方法。

一、前置准备:在 Linux 上安装 Docker

Docker 支持绝大多数主流 Linux 发行版,如 CentOS、Ubuntu 和 Debian。不同发行版的安装命令略有差异,以下是两种最常见系统的安装方法。

1. Ubuntu 系统安装

Ubuntu 对 Docker 的支持较为友好,安装步骤简洁明了。在终端中依次执行以下命令即可:

# 1. 更新软件包列表
sudo apt update

# 2. 安装必要的依赖包(允许apt通过HTTPS使用仓库)
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

# 3. 添加Docker官方GPG密钥(验证软件包完整性)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 4. 设置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

# 5. 再次更新软件包列表,安装Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

# 6. 验证安装是否成功(启动Docker并查看版本)
sudo systemctl start docker
sudo docker --version

如果终端成功显示 Docker 版本信息(例如 Docker version 24.0.7),则说明安装成功。

2. CentOS 系统安装

在 CentOS 系统上,安装过程与 Ubuntu 类似:

# 1. 卸载旧版本Docker(若有)
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# 2. 安装必要的依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 3. 设置Docker官方仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 4. 安装Docker Engine
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 5. 启动Docker并设置开机自启(关键,避免重启系统后Docker失效)
sudo systemctl start docker
sudo systemctl enable docker

# 6. 验证安装
sudo docker --version

安装避坑要点

  1. 必须使用 sudo 权限执行安装命令,否则会提示权限不足。
  2. 若安装过程中提示“仓库无法访问”,请检查网络连接,或考虑更换国内镜像源(下文会介绍)。
  3. 安装完成后,如果执行 docker 命令仍需 sudo,可通过配置用户组权限来解决(见下文进阶技巧)。

二、Docker 核心基础操作

Docker 的核心操作围绕 镜像(Image)容器(Container) 展开。镜像是包含应用及其运行环境的只读模板,而容器则是镜像的运行实例。掌握以下操作,能满足日常80%的使用需求。

1. 镜像相关操作

# 1. 搜索镜像(从Docker Hub搜索需要的镜像,如nginx、mysql)
sudo docker search 镜像名
# 示例:sudo docker search nginx

# 2. 拉取镜像(下载镜像到本地,默认拉取最新版本,加:tag指定版本)
sudo docker pull 镜像名:tag
# 示例:sudo docker pull nginx:latest(最新版)、sudo docker pull mysql:8.0(指定8.0版本)

# 3. 查看本地所有镜像
sudo docker images

# 4. 删除本地镜像(需先删除依赖该镜像的容器,否则报错)
sudo docker rmi 镜像ID/镜像名:tag
# 示例:sudo docker rmi nginx:latest

# 5. 查看镜像详细信息
sudo docker inspect 镜像ID/镜像名

2. 容器相关操作

# 1. 启动容器(最常用,-d后台运行,-p端口映射,--name指定容器名)
# 格式:sudo docker run -d -p 主机端口:容器端口 --name 容器名 镜像名
# 示例:启动nginx容器,映射主机80端口到容器80端口,后台运行,命名为my-nginx
sudo docker run -d -p 80:80 --name my-nginx nginx:latest

# 2. 查看正在运行的容器
sudo docker ps

# 3. 查看所有容器(包括停止的)
sudo docker ps -a

# 4. 停止容器
sudo docker stop 容器ID/容器名
# 示例:sudo docker stop my-nginx

# 5. 启动已停止的容器
sudo docker start 容器ID/容器名

# 6. 重启容器
sudo docker restart 容器ID/容器名

# 7. 删除容器(需先停止容器,-f强制删除运行中的容器)
sudo docker rm 容器ID/容器名
# 示例:sudo docker rm my-nginx
sudo docker rm -f 容器ID/容器名
# 强制删除

# 8. 进入容器内部(交互模式,用于调试、修改配置)
sudo docker exec -it 容器ID/容器名 /bin/bash
# 示例:sudo docker exec -it my-nginx /bin/bash
# 退出容器:输入exit即可

# 9. 查看容器日志(排查容器运行异常)
sudo docker logs 容器ID/容器名
# 实时查看日志:sudo docker logs -f 容器ID/容器名

基础操作避坑指南

  1. 端口映射时,确保主机端口未被占用(如80端口若被Apache占用,需更换为 8080:80)。
  2. 删除镜像前,必须先删除所有依赖该镜像的容器,否则会提示“镜像被容器引用”。
  3. 进入容器后,对文件所做的修改仅存在于容器内部,容器重启后会丢失。持久化数据需使用数据卷挂载(下文介绍)。

三、Docker 进阶实用技能

掌握基础操作后,以下进阶技能能帮你解决更复杂的实际场景,例如配置持久化、加速镜像拉取和批量管理等,从而大幅提升 高效运维 能力。

1. 配置 Docker 国内镜像源

默认的 Docker Hub 镜像源位于国外,拉取速度可能较慢。配置国内镜像源(如阿里云、网易云镜像)可以显著提升速度:

# 1. 新建/修改Docker配置文件(若/etc/docker/daemon.json文件不存在,直接创建)
sudo vi /etc/docker/daemon.json

# 2. 输入以下内容(阿里云镜像源,稳定推荐)
{
  "registry-mirrors": [
    "https://docker.mirrors.aliyun.com",
    "https://hub-mirror.c.163.com"
  ]
}

# 3. 保存退出(vi编辑器:按Esc,输入:wq,回车)
# 4. 重启Docker服务,使配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker

# 5. 验证配置是否生效
sudo docker info
# 若看到“Registry Mirrors”中显示配置的国内镜像源,说明配置成功

2. 数据卷挂载(实现容器数据持久化)

容器内的数据默认是临时的,容器删除后数据会丢失。通过数据卷(Volume)挂载,可以将容器内的目录映射到主机目录,实现数据持久化。

# 1. 创建数据卷(可选,也可直接挂载主机目录)
sudo docker volume create nginx-volume

# 2. 挂载数据卷启动容器
# 方式1:挂载自定义数据卷
sudo docker run -d -p 80:80 --name my-nginx -v nginx-volume:/usr/share/nginx/html nginx:latest

# 方式2:直接挂载主机目录(更灵活,推荐)
sudo mkdir -p /root/nginx/html # 主机创建目录
sudo docker run -d -p 80:80 --name my-nginx -v /root/nginx/html:/usr/share/nginx/html nginx:latest

# 说明:挂载后,修改主机/root/nginx/html目录下的文件,容器内对应目录会同步变化,容器删除后,主机目录数据仍保留

3. 配置 Docker 免 sudo 操作

为提升使用便捷性,可以将当前用户加入 docker 用户组,从而无需每次使用 sudo

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

# 2. 重启Docker服务
sudo systemctl restart docker

# 3. 注销当前用户,重新登录(或重启系统),配置生效
# 验证:重新登录后,执行docker ps,无需sudo即可正常显示

注意:该操作仅针对当前用户,其他用户需要重复上述步骤。

4. 容器自启动配置

Linux 系统重启后,Docker 容器默认不会自动启动。配置自启动可以避免手动操作:

# 1. 启动容器时,直接配置自启动(--restart=always)
docker run -d -p 80:80 --name my-nginx --restart=always nginx:latest

# 2. 给已存在的容器配置自启动
docker update --restart=always 容器ID/容器名
# 示例:docker update --restart=always my-nginx

# 3. 取消容器自启动
docker update --restart=no 容器ID/容器名

5. 批量管理容器

当需要管理多个容器时,批量操作命令能极大提升效率:

# 1. 批量停止所有正在运行的容器
docker stop $(docker ps -q)

# 2. 批量删除所有已停止的容器
docker rm $(docker ps -a -q)

# 3. 批量删除所有镜像(谨慎使用,会删除所有本地镜像)
docker rmi $(docker images -q)

# 4. 批量查看所有容器的状态
docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"

四、常见问题与排查技巧

1. 问题:Docker 启动失败,提示“Job for docker.service failed”

排查方法

  • 查看 Docker 启动日志定位错误:sudo journalctl -u docker
  • 常见原因1daemon.json 配置文件语法错误,需确保 JSON 格式正确。
  • 常见原因2:所需端口被占用,需关闭占用端口的服务或更换容器端口。

2. 问题:拉取镜像时提示“timeout”(超时)

排查方法

  • 检查 Linux 系统网络连接。
  • 配置国内镜像源(参考上文“进阶技能1”)。
  • 若仍超时,可尝试手动下载镜像包后导入:docker load -i 镜像压缩包路径

3. 问题:进入容器后,无法使用 vim、ping 等命令

排查方法:容器内部默认未安装这些工具,需要手动安装。

# 进入容器后,执行以下命令安装(Ubuntu容器)
apt update && apt install -y vim iputils-ping

# CentOS容器
yum install -y vim iputils-ping

4. 问题:容器挂载数据卷后,主机目录无法访问(权限不足)

排查方法:为主机目录赋予相应权限。

sudo chmod -R 777 /root/nginx/html
# 或更安全地修改目录所有者,与容器内用户一致
sudo chown -R 101:101 /root/nginx/html # nginx容器内默认用户ID为101

五、实用场景实战

实战1:用 Docker 快速部署 Nginx 服务

# 1. 拉取nginx最新镜像
docker pull nginx:latest

# 2. 创建主机挂载目录(用于存放nginx配置和网页文件)
mkdir -p /root/nginx/{conf,html,logs}

# 3. 复制容器内默认配置到主机(便于修改)
docker run -d --name temp-nginx nginx:latest # 临时启动容器
docker cp temp-nginx:/etc/nginx/nginx.conf /root/nginx/conf/ # 复制配置文件
docker rm -f temp-nginx # 删除临时容器

# 4. 挂载目录启动nginx,配置自启动
docker run -d -p 80:80 --name my-nginx --restart=always \
-v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/logs:/var/log/nginx \
nginx:latest

# 5. 验证:浏览器访问Linux主机IP(如http://192.168.1.100),能看到nginx默认页面即成功

实战2:用 Docker 部署 MySQL 服务(持久化数据)

# 1. 拉取MySQL 8.0镜像
docker pull mysql:8.0

# 2. 创建数据卷(持久化MySQL数据)
docker volume create mysql-data

# 3. 启动MySQL容器,设置密码,配置自启动
docker run -d -p 3306:3306 --name my-mysql --restart=always \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0

# 4. 验证:进入容器,登录MySQL
docker exec -it my-mysql /bin/bash
mysql -u root -p
# 输入密码123456,能成功登录即部署成功。这种 `数据库` 服务的容器化部署,是当前非常流行的实践。

六、总结

在 Linux 系统中使用 Docker,核心在于掌握“镜像管理”与“容器操作”的基本功。在此基础上,结合配置国内镜像源、数据卷挂载、免 sudo 操作和自启动等进阶技能,便能游刃有余地应对绝大多数开发与运维场景。

Docker 的价值在于通过“隔离、高效、可移植”的特性,让开发者摆脱环境配置的困扰,让运维人员实现快速部署和批量管理。对于新手,建议从基础命令入手,逐步尝试进阶功能,并结合类似 Nginx、MySQL 的实战案例进行练习。当你熟悉这些内容后,便可以进一步探索 Docker Compose(编排多容器)或 Docker Swarm(容器集群)等高级特性,以应对更复杂的 云原生 业务场景。如果你对这类 运维 实战技巧感兴趣,欢迎到 云栈社区 与更多开发者交流讨论。




上一篇:MySQL InnoDB的MVCC实现原理:如何解决数据库读写并发冲突
下一篇:WorkBuddy自动化技能配置:一分钟搭建私人知识库管家,告别手动分类归档
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-7 16:41 , Processed in 0.728453 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表