欢迎光临
专业Linux运维二十年

Linux如何使用Docker容器?_Linux容器部署与管理流程

如何在系统上高效安装和配置环境?首先确保使用主流linux发行版如ubuntu、debian、或fedora;其次按照步骤更新包索引、安装https、添加gpg密钥、配置仓库并安装docker-ce等核心组件;接着将用户加入docker组以避免sudo操作;然后配置国内镜像加速器提升拉取速度;同时确认存储驱动为overlay2;最后调整防火墙规则确保网络通畅。

在Linux系统上利用Docker容器,核心在于将应用程序及其所有依赖项封装成一个轻量级、可移植的独立单元,极大地简化了软件的部署、运行和管理过程。这就像给你的应用提供了一个自带和运行环境的“小盒子”,无论在哪里,这个盒子都能以同样的方式运行。

解决方案

要在Linux上高效使用Docker容器,你需要先完成Docker引擎的安装,然后掌握一系列核心操作。这并非什么高深莫测的技术,更多的是一种工作流程的转变。

首先,确保你的Linux发行版是主流的,比如Ubuntu、Debian、CentOS或Fedora。以Ubuntu为例,安装Docker通常涉及更新包索引,然后安装必要的HTTPS传输工具,接着添加Docker的官方GPG密钥,将Docker仓库添加到APT源,最后安装

docker-ce

登录后复制 、

docker-ce-cli

登录后复制 和

containerd.io

登录后复制 。

# 更新包索引
sudo apt update
# 安装必要的工具
sudo apt install ca-certificates curl gnupg lsb-release
# 添加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
# 设置Docker仓库
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
# 再次更新包索引
sudo apt update
# 安装Docker引擎
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 验证安装
sudo docker run hello-world

登录后复制

安装完成后,你就可以开始操作容器了。一个典型的流程是:

  1. 拉取镜像:从Docker Hub(或私有仓库)下载预构建的应用镜像。
    sudo docker pull nginx:latest

    登录后复制

  2. 运行容器:基于镜像创建并运行一个容器实例。
    sudo docker run -d -p 80:80 --name my-nginx nginx

    登录后复制

    这里

    -d

    登录后复制 表示后台运行,

    -p 80:80

    登录后复制 将宿主机的80端口映射到容器的80端口,

    --name

    登录后复制 给容器一个易记的名字。

  3. 查看容器:检查正在运行的容器。
    sudo docker ps

    登录后复制

  4. 停止/删除容器:当不再需要时,停止并删除容器。
    sudo docker stop my-nginx
    sudo docker rm my-nginx

    登录后复制

    这只是最基础的几步,但它已经展现了Docker在部署上的便捷性。

如何在Linux系统上高效安装和配置Docker环境?

高效地安装和配置Docker环境,远不止敲几行命令那么简单,它更关乎于后续的便捷性和安全性。在我看来,除了基础安装,有几个细节是值得注意的。

首先是用户权限配置。每次都用

sudo

登录后复制 来运行Docker命令会比较麻烦,也容易养成不好的习惯。将当前用户添加到

docker

登录后复制 用户组是常见的做法:

sudo usermod -aG docker $USER
newgrp docker # 或者直接注销再登录

登录后复制

这样,你就无需

sudo

登录后复制 也能运行Docker命令了,大大提升了日常操作的流畅度。

其次是镜像加速器的配置。如果你在中国大陆,直接从Docker Hub拉取镜像可能会非常慢,甚至超时。配置一个国内的镜像加速器是提升效率的关键。这通常涉及修改Docker的配置文件

/etc/docker/daemon.json

登录后复制 :

{
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}

登录后复制

https://xxxxxx.mirror.aliyuncs.com

登录后复制 替换为你实际获取的加速器地址(例如阿里云、网易云等)。修改后,记得重启Docker服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

登录后复制

这个小小的改动,能让你的镜像拉取速度从龟速变为飞速,那种体验上的提升是实实在在的。

再者,存储驱动的选择。Docker支持多种存储驱动(如

overlay2

登录后复制 、

aufs

登录后复制 、

devicemapper

登录后复制 等)。

overlay2

登录后复制 是目前推荐且性能较好的选择,大多数新安装的Docker默认就是它。不过,如果你遇到一些老旧系统或者特定需求,可能需要手动调整。可以通过

docker info

登录后复制 命令来查看当前的存储驱动。如果不是

overlay2

登录后复制 ,可以考虑在

daemon.json

登录后复制 中明确指定:

{
  "storage-driver": "overlay2"
}

登录后复制

但请注意,更改存储驱动可能导致现有容器,操作前务必备份。

最后,防火墙规则。Docker在运行时会修改iptables规则来处理容器的网络流量。如果你在Linux上使用了UFW或其他防火墙,需要确保Docker所需的端口(如宿主机映射的端口)没有被意外阻断。有时候,一些自定义的防火墙规则可能会和Docker的默认行为产生冲突,导致容器无法访问外部网络或外部无法访问容器。遇到这类问题,检查

iptables -L -n -v

登录后复制 输出,看看Docker相关的链是否正常,或者暂时禁用防火墙进行排查,也是一种思路。

如何为Linux上的Docker容器进行网络配置和数据持久化?

Docker容器的网络和数据持久化是部署生产级应用时不可或缺的两个环节。如果说运行一个简单的容器是入门,那么搞定网络和数据,才是真正掌握了Docker在Linux上的应用精髓。

文档内容对比神器


28

网络配置: Docker默认提供了几种网络模式:

  • bridge

    登录后复制 (桥接模式):这是最常用的默认模式。每个容器都会被分配一个独立的IP地址,并通过Docker宿主机上的一个虚拟网桥(

    docker0

    登录后复制 )连接到宿主机的网络。容器之间可以通过IP地址互相通信,宿主机也可以通过端口映射(

    -p

    登录后复制 )访问容器。例如,我之前运行Nginx的例子就是典型的桥接模式。

    # 显式创建自定义桥接网络,隔离不同应用
    sudo docker network create my_app_network
    # 将容器连接到自定义网络
    sudo docker run -d --network my_app_network --name my-web-app my-image

    登录后复制

    使用自定义桥接网络的好处在于,你可以更好地隔离不同应用的服务,并且容器之间可以通过容器名进行DNS解析,而不是依赖不稳定的IP地址。这对于微服务架构尤其有用。

  • host

    登录后复制 (主机模式):容器直接使用宿主机的网络命名空间,共享宿主机的IP地址和端口。这意味着容器内服务的端口会直接暴露在宿主机上,不再需要端口映射。这种模式性能最好,但隔离性最差。

    sudo docker run -d --network host --name my-perf-app my-image

    登录后复制

    我个人在需要极致性能,或者容器内服务与宿主机服务有特定端口冲突且无法避免时,会考虑使用主机模式,但通常情况下,我更倾向于桥接模式以保持隔离。

  • none

    登录后复制 (无网络模式):容器没有网络接口,完全隔离。这在一些特殊场景下有用,比如只进行数据处理而不需要网络通信的任务。

  • container

    登录后复制 (容器模式):一个容器共享另一个容器的网络命名空间。

实际操作中,自定义桥接网络是我最常用的方式,它兼顾了隔离性和灵活性。

数据持久化: 容器是短暂的,它们可以被创建、停止、删除。但应用程序的数据往往需要长期保存,不能随着容器的生命周期而消失。Docker提供了两种主要的数据持久化方式:

  • Volumes

    登录后复制 (卷):这是Docker官方推荐的数据持久化方式。卷是由Docker管理的文件系统,可以独立于容器存在。即使容器被删除,卷中的数据也不会丢失。

    # 创建一个命名卷
    sudo docker volume create my_data_volume
    # 运行容器时挂载命名卷
    sudo docker run -d -p 80:80 --name my-web-app -v my_data_volume:/app/data my-image

    登录后复制

    这里

    /app/data

    登录后复制 是容器内部的路径。命名卷的优势在于它由Docker管理,路径在宿主机上通常是

    /var/lib/docker/volumes/

    登录后复制 下,你不需要关心具体位置,只需要记住卷的名称。这使得备份和迁移变得非常方便。

  • Bind Mounts

    登录后复制 (绑定挂载):这种方式允许你将宿主机文件系统上的任意目录或文件直接挂载到容器内部。

    # 挂载宿主机当前目录下的html文件夹到容器的/usr/share/nginx/html
    sudo docker run -d -p 80:80 --name my-nginx -v $(pwd)/html:/usr/share/nginx/html nginx

    登录后复制

    绑定挂载的优点是灵活性极高,你可以直接在宿主机上编辑文件,容器内立即生效,这对于开发调试非常方便。但缺点是它依赖于宿主机的特定路径,可移植性不如命名卷。在我日常开发中,绑定挂载是我的首选,因为我可以实时看到代码修改的效果;而在生产环境,我更倾向于使用命名卷,因为它更健壮、更易管理。

选择哪种方式取决于你的具体需求:需要高度可移植性和Docker管理的数据,用卷;需要直接访问宿主机文件系统进行开发或配置,用绑定挂载。

Linux环境下Docker容器的故障排查与日志查看方法?

在Linux上管理Docker容器,遇到问题是常态,关键在于如何快速定位和解决。我个人觉得,掌握一套有效的故障排查和日志查看方法,比背诵所有命令更有价值。这就像医生看病,不是每个病都得过,而是知道如何诊断。

日志查看: 这是排查问题的第一步,也是最重要的一步。Docker容器的日志通常会输出到标准输出(stdout)和标准错误(stderr),Docker引擎会捕获这些输出。

  • docker logs

    登录后复制 :查看容器的日志。

    # 查看特定容器的所有日志
    sudo docker logs my-container
    # 实时跟踪日志输出 (类似tail -f)
    sudo docker logs -f my-container
    # 查看最近N行的日志
    sudo docker logs --tail 100 my-container
    # 查看指定时间范围内的日志
    sudo docker logs --since "2023-01-01T00:00:00" my-container

    登录后复制

    我通常会先用

    docker logs -f

    登录后复制 来实时观察容器启动或运行时发生了什么,这能很快揭示出配置错误、应用崩溃或者依赖缺失等问题。如果日志量太大,我会用

    --tail

    登录后复制 来聚焦最新内容。

容器状态检查

  • docker ps -a

    登录后复制 :查看所有容器,包括已停止的。这能让你看到容器的当前状态(

    Up

    登录后复制 、

    Exited

    登录后复制 等),以及退出码。非零的退出码通常表示容器内部的应用出现了错误。

    sudo docker ps -a

    登录后复制

    如果一个容器反复启动又停止(

    Exited (1) ... Up N seconds

    登录后复制 ),那基本可以断定是应用本身有问题,可能是配置错误,也可能是代码bug。

进入容器内部排查: 有时候,光看日志不足以解决问题,你需要进入容器内部进行更细致的检查。

  • docker exec

    登录后复制 :在运行中的容器内执行命令。

    # 进入容器的shell环境
    sudo docker exec -it my-container bash
    # 如果容器内没有bash,尝试sh
    sudo docker exec -it my-container sh
    # 在容器内执行单个命令,比如查看文件
    sudo docker exec my-container cat /app/config.ini

    登录后复制

    进入容器后,你可以像在普通Linux系统上一样,检查文件是否存在、权限是否正确、环境变量是否设置、网络连通性如何(例如

    ping

    登录后复制 外部地址),甚至运行容器内应用的调试工具。这对于定位配置路径错误、文件缺失或者网络不通等问题非常有效。

资源使用情况

  • docker stats

    登录后复制 :实时查看容器的CPU、内存、网络I/O和磁盘I/O使用情况。

    sudo docker stats

    登录后复制

    如果容器内存或CPU使用率异常高,可能表明存在内存泄漏或无限循环等性能问题。

检查Docker守护进程本身: 如果所有容器都无法启动,或者Docker命令本身出现问题,那可能需要检查Docker守护进程的状态。

  • sudo systemctl status docker

    登录后复制 :检查Docker服务的运行状态。

  • journalctl -u docker

    登录后复制 :查看Docker守护进程的系统日志。

    sudo systemctl status docker
    sudo journalctl -u docker -f

    登录后复制

    这能帮助你发现Docker引擎自身的配置问题、启动失败原因或者与系统资源的冲突。

在我处理过的许多问题中,大部分都是通过

docker logs

登录后复制 和

docker exec

登录后复制 结合来解决的。记住,排查问题就像侦探工作,从表象入手,逐步深入,直到找到根源。

脚本之家
赞(0) 打赏
未经允许不得转载:Linux老运维 » Linux如何使用Docker容器?_Linux容器部署与管理流程

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫