ithuang
ithuang
发布于 2026-06-02 / 10 阅读
0

容器技术

岗位:容器运维工程师

【了解】docker相关背景

【了解】容器底层原理

【掌握】容器相关命令

【掌握】docker的网络模式

【掌握】镜像相关的操作

  1. 容器技术概述

​ 容器技术是一种轻量级的虚拟化技术,它通过操作系统级别的隔离机制(Linux namespace),将应用程序及其依赖环境(如代码、运行时、系统工具、库等)打包成一个独立、可移植的单元(称为容器),从而实现快速部署、跨环境一致运行和资源高效利用,是一种进程级别的虚拟化。

  1. 容器的诞生和发展历程

  2. 容器技术诞生的背景 —— 为什么会有 Docker?

在 Docker 之前,软件交付和部署有几个痛点:

  1. 开发环境和生产环境不一致
    1. 开发在 Windows,部署在 Linux,经常出现 “我本地能跑,线上跑不起来”。
  2. 传统虚拟机太重
    1. 虚拟机(VMware、VirtualBox)需要跑完整的操作系统(几十 GB),启动慢,资源浪费大。
  3. 应用依赖管理复杂
    1. 一个应用可能依赖不同版本的库(PHP 7.4 vs PHP 8.1),在同一台服务器上难以共存。

➡️ 于是人们需要一种 轻量、隔离、可移植 的解决方案 —— 这就是 容器化(Container)。

  1. Docker 的诞生(2013 年)

01_容器技术1.png

  • 2013 年,dotCloud 公司(一家 PaaS 提供商)开源了 Docker。
  • 基于 Linux 的 cgroups + namespace 技术(实际上 Linux 已有容器化基础,但门槛高)。
  • Docker 提供了:
    • 镜像(Image):打包应用和依赖,就是启动容器最基本的环境,只读层
    • 容器(Container):镜像的运行实例,可写层
    • 仓库(Registry):镜像的分发(如 Docker Hub)

一句话解读Docker的作用:

Docker 把应用及其运行环境一起打包,实现环境即代码,解决了开发、测试、生产环境不一致的问题。

  1. Docker 的发展历程

  2. 2013 - 2014

    1. Docker 开源,迅速走红,成为 DevOps 的明星项目。
  3. 2015

    1. Docker 公司成立,围绕生态打造 Docker Engine、Docker Hub。
    2. 容器编排问题开始被关注(Swarm、Mesos、Kubernetes 出现)。
  4. 2017

    1. Kubernetes(K8s)成为事实上的容器编排标准,Swarm 渐渐被边缘化。
    2. Docker 更多专注于开发者工具。
  5. 2019 - 2020

    1. Kubernetes 默认容器运行时改用 containerd(从 Docker 剥离出的核心)。
    2. 业界出现“Kubernetes 不再使用 Docker 运行时”的新闻,但实际 Docker 生态依旧繁荣。
  6. 现在(2025)

    1. Docker 仍是最流行的容器开发工具。
    2. Kubernetes 主导容器编排(多容器管理、跨主机的容器管理),Docker 常用作开发、打包、测试(单机版)。
    3. 镜像格式(OCI 标准)已经统一,Docker 只是其中的实现之一。
    4. 现在Kubernetes 可以使用一切支持 CRI(Container Runtime Interface,容器运行时接口)的容器运行时,而这些运行时通常又遵循 OCI 标准。
  7. Docker 的价值

  • 一次打包,到处运行
  • 轻量:容器比虚拟机快、占用资源少
  • 标准化:镜像规范化,交付更容易
  • 生态完善:Docker Compose、Docker Hub、与 CI/CD 系统集成

总结:docker就是目前最火热的能实现容器技术的软件,使用go(golang)语言开发。

参考官方文档地址:https://www.docker.com/

  1. 未来趋势

  2. 云原生生态(Cloud Native)

    1. Docker 已成为 开发者工具,而生产部署更多依赖 Kubernetes + containerd/cri-o。
  3. 无服务器化(Serverless)

    1. 结合容器技术,应用无需关心底层运行环境。
  4. 轻量化运行时

    1. 如 Podman、CRI-O、Firecracker(AWS Lambda 用)正在兴启
  5. 容器原理和运行机制

  6. 容器技术实现的底层原理

容器原理的核心技术:

Cgroups(control groups)----资源控制组

Namespace----名称空间(命名空间)对系统资源的隔离技术(7大名称空间,命名空间)

Union Filesystem(联合文件系统)

  1. Namespace(命名空间)

Namespace(命名空间)是 Linux 内核提供的核心隔离机制,允许进程、用户、网络等系统资源被分割成多个独立的视图,使得每个 Namespace 中的进程只能看到该 Namespace 内的资源,从而实现容器之间的隔离。容器技术正是基于 Namespace 实现了轻量级的虚拟化。

  1. 进程隔离(PID Namespace):每个容器有自己的进程 ID 编号,看不到宿主机或其他容器的进程。

  2. 网络隔离(Net Namespace):每个容器有独立的网络栈(IP、端口、路由表、防火墙规则等)。

  3. 文件系统隔离(Mount Namespace):容器可以有自己的 / 根文件系统,不影响宿主机。

  4. 主机名隔离(UTS Namespace):容器可以设置自己的主机名(hostname)。

  5. 用户隔离(User Namespace):容器内可以使用不同的用户 ID 映射,提升安全性。

  6. 进程间通信隔离(IPC Namespace):隔离 System V IPC 和 POSIX 消息队列。

  7. 时间(Time Namespace)(Linux 5.6+):允许容器使用独立的时间设置

  8. Cgroups(控制组)

Linux Cgroups(Control Groups) 实现容器的资源隔离与限制,包括 CPU、内存、磁盘 I/O 等资源的分配和管理,避免单一容器耗尽宿主机资源(稳定性)、防止安全攻击(安全性)。

启动示例:启动容器时限制cpu和内存使用量

docker run -d \
  --name=my_nginx \
  --cpus=1.5 \          # 限制使用 1.5 个 CPU 核心
  --memory=512m \       # 限制内存为 512MB
  -p 80:80 \            # 映射端口 80
  nginx:latest
  1. Union Filesystem(联合文件系统)

Union Filesystem(联合文件系统)是 Docker 镜像和容器分层存储的核心技术,它允许多个文件系统(或目录)透明叠加(overlay),形成一个统一的视图

(1) 分层(Layers)结构

  • 镜像层(Image Layers):Docker 镜像由多个只读层组成,每层代表一次修改(如安装软件、添加文件)。
  • 容器层(Container Layer):容器启动时,在镜像层之上添加一个可写层(存储运行时修改的数据)。

(2) 联合挂载(Union Mount)

  • 将多个目录(镜像层 + 容器层)合并挂载到一个虚拟目录,用户看到的是最终叠加结果。
  • 写时复制(Copy-on-Write, CoW): 当容器修改文件时,联合文件系统会从底层的只读层复制文件到可写层,再修改(避免直接修改镜像层)。

01_容器技术2.png

(3) 常见实现技术

Docker支持多种联合文件系统驱动,不同驱动实现细节略有差异:

文件系统类型特点Linux 内核要求OverlayFS性能高,实现简单(Docker 默认推荐)≥ 3.18AUFS早期 Docker 默认驱动,兼容性好但未合并到内核主线需额外安装模块Device Mapper基于块设备,适合旧内核(如 CentOS 6)通用Btrfs/ZFS支持高级功能(快照、压缩),但配置复杂需特定文件系统支持

01_容器技术3.png

2.1.4【掌握】面试题:容器和(传统)虚拟化的区别

在docker环境中,没有操作系统,容器就是一个进程

虚拟化:虚拟机、每一个虚拟机可以装独立的操作系统

容器:不需要独立的操作系统,只有一个docker进程和宿主机共享操作系统,启动容器就像启动一个进程,简单高效

01_容器技术4.png

3.三大组将与Docker的安装

Docker 的三大组件

容器、镜像,和仓库;

01_容器技术5.png

Docker-CE版本

Docker企业版(EE):专为企业的发展和IT团队建立。docker-ee为企业提供最安全的容器平台。

Docker社区版(CE):

  • Docker CE 的核心特点【掌握】
    • 特性说明免费开源无需付费,代码公开(部分组件基于 Apache 2.0 许可证)。跨平台支持支持 Linux、Windows 10/11(需 WSL2)、macOS(基于虚拟机)。核心功能完整包含镜像构建、容器运行、网络管理、存储卷等基础功能。定期更新每季度发布稳定版(Stable),每月发布边缘版(Edge,含实验性功能)。社区驱动依赖开发者社区贡献和反馈,无企业级技术支持。
  • Docker CE 的组件
    • 组件作用Docker Daemon后台服务(dockerd),管理容器生命周期和镜像。Docker CLI命令行工具(docker),用于与 Daemon 交互。Docker Compose工具(docker-compose),通过 YAML 文件定义多容器应用。Docker Engine包含 Daemon + CLI 的核心运行时。Containerd默认的底层容器运行时(从 Docker 剥离,符合 OCI 标准)。

01_容器技术6.png

  1. 服务器环境准备

  2. 操作系统

CentOS Stream 9

  1. 修改主机名和hosts

[root@node1 ~]# dnf -y install vim bash-completion net-tools  #装包修改主机名


# hostnamectl set-hostname web01.itcast.cn

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.88.101    web01    web01.itcast.cn
  1. 关闭防火墙与SELinux

扩展:CentOS Stream 9 => systemctl

关闭防火墙与SELinux:

[root@web01 ~]# systemctl stop firewalld
[root@web01 ~]# systemctl disable firewalld
[root@web01 ~]# systemctl is-enabled firewalld.service
disabled


[root@web01 ~]# setenforce 0
[root@web01 ~]# getenforce
Disabled

[root@web01 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
等价于
# vim /etc/selinux/config
22: SELINUX=disabled
  1. 配置清华yum源 (了解)

帮助手册:https://mirrors.tuna.tsinghua.edu.cn/help/centos-stream/

yum或者dnf => 系统/etc/yum.repos.d目录,找到镜像仓库配置文件 => 请求远程仓库

配置方案:阿里镜像站、腾讯镜像站、华为镜像站、清华镜像站(推荐)

CentOS Stream 9 默认启用了包管理工具 dnf,其是 yum 包管理工具的替代品。dnf 与 yum 大部分的命令都是通用的,dnf 也使用 /etc/yum.repos.d/ 进行镜像配置。

CentOS Stream 9 中源被整合入两个文件 centos.repo 和 centos-addons.repo,由于文件中不包含 baseurl 字段,需要手动插入,通过文本替换修改源的方法较为复杂,也可以选择直接复制最后的替换结果覆盖源文件。

将这段代码保存为一个文件,例如 update_mirror.pl

#!/usr/bin/perl

use strict;
use warnings;
use autodie;

my $mirrors = 'https://mirrors.tuna.tsinghua.edu.cn/centos-stream';

if (@ARGV < 1) {
    die "Usage: $0 <filename1> <filename2> ...\n";
}

while (my $filename = shift @ARGV) {
    my $backup_filename = $filename . '.bak';
    rename $filename, $backup_filename;

    open my $input, "<", $backup_filename;
    open my $output, ">", $filename;

    while (<$input>) {
        s/^metalink/# metalink/;

        if (m/^name/) {
            my (undef, $repo, $arch) = split /-/;
            $repo =~ s/^\s+|\s+$//g;
            ($arch = defined $arch ? lc($arch) : '') =~ s/^\s+|\s+$//g;

            if ($repo =~ /^Extras/) {
                $_ .= "baseurl=${mirrors}/SIGs/\$releasever-stream/extras" . ($arch eq 'source' ? "/${arch}/" : "/\$basearch/") . "extras-common\n";
            } else {
                $_ .= "baseurl=${mirrors}/\$releasever-stream/$repo" . ($arch eq 'source' ? "/" : "/\$basearch/") . ($arch ne '' ? "${arch}/tree/" : "os") . "\n";
            }
        }

        print $output $_;
    }
}

然后,在命令行中使用以下命令来执行它:

dnf install perl-autodie -y

perl ./update_mirror.pl /etc/yum.repos.d/centos*.repo

最后,更新软件包缓存:

# 使用 dnf
dnf clean all && dnf makecache

# 使用 yum
yum clean all && yum makecache
  1. 设置网络

[root@web01 ~]# ls /etc/NetworkManager/system-connections/

[root@web01 ~]# sudo vi /etc/NetworkManager/system-connections/ens160.nmconnection
------------------------------------------------------  设置片段开始 -------------------------------------------------------------
[ipv4]
method=manual
addresses=192.168.88.101/24
gateway=192.168.88.2
dns=8.8.8.8;

[ipv6]
method=ignore
------------------------------------------------------  设置结束 -------------------------------------------------------------

[root@web01 ~]# nmcli connection show

[root@web01 ~]# nmcli connection reload

[root@web01 ~]# nmcli connection up ens160
  1. ntpdate时间同步

centos镜像源有很多种,centos-base.repo基础源,epel-release扩展源

ntpdate手工同步操作 => 人为实现时间同步

[root@web01 ~]# dnf install epel-release -y
[root@web01 ~]# dnf install ntpsec -y
[root@web01 ~]# ntpdate cn.ntp.org.cn

-----------------------------------------

[root@web01 ~]# yum install chrony -y
[root@web01 ~]# systemctl enable chronyd --now
[root@web01 ~]# systemctl status chronyd

自行配置chrony时间同步
  1. Docker软件安装

01_容器技术7.png

  1. yum源

docker-ce的yum源下载(任选其一)

  • **方式一:**下载docker官方ce版(国外服务器),速度很慢,不推荐
[root@web01 ~]# yum install wget -y

[root@web01 ~]# wget https://download.docker.com/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
  • **方式二:**使用aliyun的docker-ce源(中国服务器)
[root@web01 ~]# yum install wget -y

[root@web01 ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

yum仓库路径:ls /etc/yum.repos.d/
  1. 版本选择和安装

[root@web01  ~]# dnf list docker-ce --showduplicates | sort -r  # 查看可安装的版本

[root@web01  ~]# dnf install docker-ce -y

PS: 注意要安装docker-ce版,不要安装docker(否则可能安装1.13老版本)

  1. 启动服务

[root@web01 ~]# systemctl start docker

[root@web01 ~]# systemctl enable docker

[root@web01 ~]# systemctl status docker

01_容器技术8.png

  1. 查看版本信息

[root@web01 ~]# docker -v
Docker version 28.0.1, build 068a01e

[root@web01  ~]# docker info

01_容器技术9.png

4.【重点】Docker镜像管理操作

4.1 先配置代理拉取镜像

  • 因国内已经无法正常访问hub.docker.com官方镜像仓库,需要使用代理进行访问,要进行代理配置
添加代理配置
[root@web01 /]#  vim /etc/docker/daemon.json 
{
  "registry-mirrors":[ 
    "https://docker.1panelproxy.com",
    "https://hub.openeeds.com",
    "https://dockerproxy.1panel.live",
    "https://docker.1panel.live",
    "https://proxy.1panel.live",
    "https://docker.m.daocloud.io",
    "https://noohub.ru",
    "https://huecker.io",
    "https://dockerhub.timeweb.cloud",
    "https://0c105db5188026850f80c001def654a0.mirror.swr.myhuaweicloud.com",
    "https://5tqw56kt.mirror.aliyuncs.com",
    "https://docker.1panel.live",
    "http://mirrors.ustc.edu.cn/",
    "http://mirror.azure.cn/",
    "https://hub.rat.dev/",
    "https://docker.ckyl.me/",
    "https://docker.chenby.cn",
    "https://docker.hpcloud.cloud",
    "https://docker.m.daocloud.io"
   ]
 }
   
   重新加载系统服务
   [root@web01 /]# systemctl daemon-reload
   
   重启服务
   [root@web01 /]# systemctl restart docker

4.2 镜像管理命令

镜像管理命令说明docker images查看本机镜像docker pull 镜像名称:标签下载镜像docker save 镜像名称:标签 -o 文件名备份镜像为tar包(导出镜像)docker load -i 备份文件名称导入备份的镜像文件docker history 镜像名称:标签查看镜像的制作历史

docker如何标识一个镜像:名称:标签 镜像的id

busybox:latest 是一个集成了数百个常用 Linux 命令的精简工具集,它以极小体积提供了一个轻量级的 Linux 环境,被誉为“Linux 系统的瑞士军刀”

pull、images、histroy

# 下载 busybox:latest 镜像
[root@docker ~]# docker pull busybox:latest
# 下载 nginx 镜像
[root@web01 ~]# docker pull nginx:latest
# 查看本机镜像
[root@docker ~]# docker images
IMAGE                  ID          DISK USAGE    CONTENT SIZE   EXTRA
busybox:latest   fd8d9aa63ba2       6.74MB         2.23MB

# 查看镜像的制作历史

[root@web01 ~]# docker history nginx:latest
IMAGE          CREATED       CREATED BY                                       SIZE      COMMENT
5aca99593157   9 days ago    CMD ["nginx" "-g" "daemon off;"]                 0B        buildkit.dockerfile.v0
<missing>      9 days ago    STOPSIGNAL SIGQUIT                               0B        buildkit.dockerfile.v0
<missing>      9 days ago    EXPOSE map[80/tcp:{}]                            0B        buildkit.dockerfile.v0
<missing>      9 days ago    ENTRYPOINT ["/docker-entrypoint.sh"]             0B        buildkit.dockerfile.v0
<missing>      9 days ago    COPY 30-tune-worker-processes.sh /docker-ent…   8.19kB    buildkit.dockerfile.v0
<missing>      9 days ago    COPY 20-envsubst-on-templates.sh /docker-ent…   4.1kB     buildkit.dockerfile.v0
<missing>      9 days ago    COPY 15-local-resolvers.envsh /docker-entryp…   4.1kB     buildkit.dockerfile.v0
<missing>      9 days ago    COPY 10-listen-on-ipv6-by-default.sh /docker…   4.1kB     buildkit.dockerfile.v0
<missing>      9 days ago    COPY docker-entrypoint.sh / # buildkit           4.1kB     buildkit.dockerfile.v0
<missing>      9 days ago    RUN /bin/sh -c set -x     && groupadd --syst…   85.7MB    buildkit.dockerfile.v0
<missing>      9 days ago    ENV DYNPKG_RELEASE=1~trixie                      0B        buildkit.dockerfile.v0
<missing>      9 days ago    ENV PKG_RELEASE=1~trixie                         0B        buildkit.dockerfile.v0
<missing>      9 days ago    ENV ACME_VERSION=0.4.1                           0B        buildkit.dockerfile.v0
<missing>      9 days ago    ENV NJS_RELEASE=1~trixie                         0B        buildkit.dockerfile.v0
<missing>      9 days ago    ENV NJS_VERSION=0.9.9                            0B        buildkit.dockerfile.v0
<missing>      9 days ago    ENV NGINX_VERSION=1.31.1                         0B        buildkit.dockerfile.v0
<missing>      9 days ago    LABEL maintainer=NGINX Docker Maintainers <d…   0B        buildkit.dockerfile.v0
<missing>      2 weeks ago   # debian.sh --arch 'amd64' out/ 'trixie' '@1…   85.9MB    debuerreotype 0.17

save,load

# 备份 rockylinux:8.5 镜像为 tar 包
[root@docker ~]# docker save busybox:latest -o busybox.tar
# 使用备份文件恢复镜像
[root@docker ~]# docker load -i nginx.tar.gz

5.【重点】容器管理的相关命令

器管理命令说明docker run -it(d) 镜像名称:标签创建容器docker ps查看正在运行容器的信息docker inspect 镜像名称|容器名称查询(容器/镜像)的详细信息docker [start|stop|restart] 容器id启动、停止、重启容器docker exec -it 容器ID 启动命令在容器内执行命令docker cp 源路径1 目标路径2实现容器内文件和宿主机(真机)文件的相互拷贝

选项的含义:-i 交互式 -t tty终端 -it 打开一个可交互的终端 -d 在后台运行(起一个nginx,httpd,php服务类型的容器需要加-d选项)

容器隔离的验证(结合前面底层原理验证)

[root@web01 ~]# docker run -it --name minlinux busybox:latest
/ # hostname
5925be3d5673
/ # pwd
/
/ # ls /
bin    dev    etc    home   lib    lib64  proc   root   sys    tmp    usr    var
/ # cat /etc/shells
cat: can't open '/etc/shells': No such file or directory
/ # cat /etc/passwd | wc -l
9
/ # ps -ef
PID   USER     TIME  COMMAND
    1 root      0:00 sh
   12 root      0:00 ps -ef
/ # date
Mon Jun  1 02:47:11 UTC 2026
/ # exit
[root@web01 ~]# 

5.1 run、itd、-p、--name

[root@web01 ~]# docker run -it --name my-nginx1 -p 8080:80 nginx:latest  #前台启动占用当前终端,ctrl + c 结束一下
[root@web01 ~]# docker run -itd --name my-nginx2 -p 8080:80 nginx:latest 
参数说明:
-i # 交互、可以与容器交互、输入命令等
-t (--tty):分配一个终端(TTY)

-d:后台运行容器(守护模式)。

--name my-nginx:为容器命名(替代自动生成的ID)。
-p 8080:80:将宿主机的 8080 端口映射到容器的 80 端口。
nginx:latest:使用官方 Nginx 镜像的最新版本。

可通过浏览器访问http://宿主机IP:8080测试

5.2 -v 卷映射,挂载自定义配置与静态文件

注意:文件映射到文件、目录映射到目录

创建两个需要挂载的宿主机目录
[root@web01 ~]# mkdir -p /opt/nginx/{conf,html}

从nginx容器把conf.d及里面的文件复制到/opt/nginx/conf目录下面
[root@web01 ~]# docker cp nginx:/etc/nginx/conf.d  /opt/nginx/conf
Successfully copied 3.58kB to /opt/nginx/conf
[root@web01 ~]# ls /opt/nginx/conf/
conf.d
[root@web01 ~]# ls /opt/nginx/conf/conf.d/
default.conf

在/opt/nginx/html创建一个测试页面
[root@web01 ~] echo "this is the test web01 server" > /opt/nginx/html/index.html
[root@web01 ~]# tree /opt/nginx/
/opt/nginx/
├── conf
│   └── conf.d
│       └── default.conf
└── html
    └── index.html

3 directories, 2 files
[root@web01 ~]#

运行my-nginx2026容器
[root@web01 ~] docker run  -d \
  --name my-nginx2026 \
  -p 2026:80 \
  -v /opt/nginx/conf/conf.d:/etc/nginx/conf.d \
  -v /opt/nginx/html:/usr/share/nginx/html \
  nginx:latest
  
  参数说明:
  
  新增参数:
      -v /opt/nginx/conf/conf.d:/etc/nginx/conf.d:挂载自定义 Nginx 配置文件。
      -v /opt/nginx/html:/usr/share/nginx/html:挂载静态网页文件目录。
      
  客户端访问测试、能看到自定义的页面内容

5.3 -e、--cpus、--restart设置环境变量与资源限制并实现故障自动恢复

[root@web01 ~] docker run -d \
  --name my-nginx01 \
  -p 2027:80 \
  -v /opt/nginx/conf/conf.d:/etc/nginx/conf.d \
  -v /opt/nginx//html:/usr/share/nginx/html \
  -e "TZ=Asia/Shanghai" \
  --memory="512m" \
  --cpus="1" \
  --restart=always \
  nginx:latest
  
参数解释:
     -e  "TZ=Asia/Shanghai":设置容器时区。(environment )
     --memory="512m":限制内存为 512MB。
     --cpus="1":限制使用 1 个 CPU 核心。
     --restart=unless-stopped 容器退出时自动重启(除非手动停止) 
              =always:无论容器退出状态如何(包括正常退出),无限次重启(不含docker stop)
              =on-failure[:max-retries]:当容器 非正常退出(返回非0状态码) 时自动重启,
              可选的 :max-retries 限制最大重启次数(如 on-failure:3)
触发 always 的场景:
进程崩溃: 比如 Nginx 内部由于代码或配置错误 OOM(内存溢出)挂了。
强制杀死: 比如你在宿主机用 kill -9 杀掉了容器进程,而没告诉 Docker 守护进程。
系统重启: 如果宿主机重启了,由于设置了 always,Docker 服务启动后会自动把这个容器拉起来。
注:正常优雅的docker stop 是不会触发always的

# 启动一个完全不挂载任何目录、不限制 CPU 的纯净容器
docker run -d --name test-restart --restart always nginx:latest

# 确认它跑起来了
docker ps | grep test-restart

重启服务器测试always自动触发

5.4 network create 使用自定义网络

手动创建要使用的网络并在启动的时候进行网络指定

注意:容器名称和端口不要冲突、/opt/nginx/html目前权限要设置成755

# 创建自定义网络
[root@web01 ~] docker network ls 
NETWORK ID     NAME      DRIVER    SCOPE
268687e3a7e3   bridge    bridge    local
52b1ef9978da   host      host      local
d9e3001e730a   none      null      local
[root@web01 ~]# docker network create my-network
f3623c616725e95e27bc668f203f50caf20f0b53a64278827e8791c1374a17a6
[root@web01 ~]# docker network ls
NETWORK ID     NAME         DRIVER    SCOPE
4c4c0eb4e1b7   bridge       bridge    local
52b1ef9978da   host         host      local
f3623c616725   my-network   bridge    local
d9e3001e730a   none         null      local
[root@web01 ~]#

# 启动容器并加入网络
[root@web01 ~] docker run -d \
  --name my-nginx02 \
  -p 2028:80 \
  -v /opt/nginx/conf/conf.d:/etc/nginx/conf.d \
  -v /opt/nginx//html:/usr/share/nginx/html \
  -e "TZ=Asia/Shanghai" \
  --memory="512m" \
  --cpus="1" \
  --restart=unless-stopped \
  --network=my-network \
  nginx:latest

5.5 容器日常管理

查看容器启动、停止、重启、和详细信息 start stop restart inspect

#查看运行的容器
[root@web01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS          PORTS                                     NAMES
4139c3d3ec6d   nginx:latest   "/docker-entrypoint.…"   37 minutes ago      Up 37 minutes   0.0.0.0:2028->80/tcp, [::]:2028->80/tcp   my-nginx02
7a4f9144738c   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up 40 minutes   80/tcp                                    test-restart
aaedccb3cf2d   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up 40 minutes   0.0.0.0:2027->80/tcp, [::]:2027->80/tcp   my-nginx01
[root@web01 ~]#

#查看所有的容器包括退出和停止的容器
[root@web01 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS                      PORTS                                     NAMES
4139c3d3ec6d   nginx:latest   "/docker-entrypoint.…"   37 minutes ago      Up 37 minutes               0.0.0.0:2028->80/tcp, [::]:2028->80/tcp   my-nginx02
7a4f9144738c   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up 40 minutes               80/tcp                                    test-restart
aaedccb3cf2d   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up 40 minutes               0.0.0.0:2027->80/tcp, [::]:2027->80/tcp   my-nginx01
61a7e3da0b16   nginx:latest   "/docker-entrypoint.…"   3 hours ago         Exited (0) 41 minutes ago                                             my-nginx2026
44dc9e141520   nginx:latest   "/docker-entrypoint.…"   3 hours ago         Exited (0) 41 minutes ago                                             my-nginx2
bb5a9d0bda56   nginx:latest   "/docker-entrypoint.…"   3 hours ago         Exited (0) 3 hours ago                                                my-nginx1
3987ca3bb6ce   nginx:latest   "/docker-entrypoint.…"   4 hours ago         Exited (0) 4 hours ago                                                nginx
[root@web01 ~]#

#容器启动、重启、停止、删除,通过容器名称或者容器ID,删除容器必须先停止容器
[root@web01 ~]# docker start my-nginx1
my-nginx1
[root@web01 ~]# docker stop my-nginx1
my-nginx1
[root@web01 ~]# docker ps | grep my-nginx1
[root@web01 ~]# docker ps -a | grep my-nginx1
bb5a9d0bda56   nginx:latest   "/docker-entrypoint.…"   4 hours ago         Exited (137) 37 seconds ago                                             my-nginx1


[root@web01 ~]# docker restart my-nginx1
my-nginx1
[root@web01 ~]# docker ps | grep my-nginx1
bb5a9d0bda56   nginx:latest   "/docker-entrypoint.…"   4 hours ago         Up 1 second     0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   my-nginx1
[root@web01 ~]# 


#删除容器之前先要停止容器
[root@web01 ~]# docker stop my-nginx1
my-nginx1
[root@web01 ~]# docker rm my-nginx1
my-nginx1
[root@web01 ~]# docker ps -a | grep my-nginx1
[root@web01 ~]#

#查看容器的详细信息,可以看到容器运行状态,挂载目录,网络地址,宿主机对应一个的PID号等
[root@web01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS          PORTS                                     NAMES
4139c3d3ec6d   nginx:latest   "/docker-entrypoint.…"   41 minutes ago      Up 41 minutes   0.0.0.0:2028->80/tcp, [::]:2028->80/tcp   my-nginx02
7a4f9144738c   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up 44 minutes   80/tcp                                    test-restart
aaedccb3cf2d   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up 44 minutes   0.0.0.0:2027->80/tcp, [::]:2027->80/tcp   my-nginx01
[root@web01 ~]# docker inspect my-nginx01

[root@web01 ~]#

#查看容器的日志,可以通过日志进行问题排查,查看最新的20行
[root@web01 ~]# docker logs --tail 20 my-nginx01
2026/03/26 16:58:46 [notice] 1#1: signal 29 (SIGIO) received
2026/03/26 16:58:46 [notice] 1#1: signal 17 (SIGCHLD) received from 23
2026/03/26 16:58:46 [notice] 1#1: worker process 23 exited with code 0


#查看容器时时输出日志
[root@web01 ~]# docker logs -f my-nginx01
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
^C[root@web01 ~]#

5.6 登录容器并交互式操作

可以登录一个正常运行的容器并在里面交互的执行系统命令

[root@web01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS          PORTS                                     NAMES
4139c3d3ec6d   nginx:latest   "/docker-entrypoint.…"   55 minutes ago      Up 55 minutes   0.0.0.0:2028->80/tcp, [::]:2028->80/tcp   my-nginx02
7a4f9144738c   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up 58 minutes   80/tcp                                    test-restart
aaedccb3cf2d   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up 58 minutes   0.0.0.0:2027->80/tcp, [::]:2027->80/tcp   my-nginx01
[root@web01 ~]# docker exec -it my-nginx01 /bin/bash
root@aaedccb3cf2d:/# ls
bin   docker-entrypoint.d   home   media  proc  sbin  tmp
boot  docker-entrypoint.sh  lib    mnt    root  srv   usr
dev   etc                   lib64  opt    run   sys   var
root@aaedccb3cf2d:/#

#容器运行时必须指定-it参数,-i (--interactive):保持标准输入(STDIN)打开,允许输入。-t (--tty):分配一个伪终端(TTY),提供类似 Shell 的交互体验。

5.7 容器和宿主机之间文件拷贝

从容器内部复制文件到宿主机
[root@web01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS             PORTS                                     NAMES
4139c3d3ec6d   nginx:latest   "/docker-entrypoint.…"   56 minutes ago      Up 56 minutes      0.0.0.0:2028->80/tcp, [::]:2028->80/tcp   my-nginx02
7a4f9144738c   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up About an hour   80/tcp                                    test-restart
aaedccb3cf2d   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:2027->80/tcp, [::]:2027->80/tcp   my-nginx01
[root@web01 ~]# docker cp my-nginx01:/etc/nginx/nginx.conf ./
Successfully copied 2.56kB to /root/./
[root@web01 ~]# ls
nginx.conf


[root@web01 ~]# cat nginx.conf

user  nginx;
worker_processes  auto;
... ....

[root@web01 ~]#



从宿主机复制文件到容器内部
[root@web01 ~]# docker cp /etc/fstab my-nginx01:/opt
Successfully copied 2.56kB to my-nginx01:/opt
[root@web01 ~]# docker exec -it my-nginx01 /bin/bash
root@aaedccb3cf2d:/# ls /opt
fstab
root@aaedccb3cf2d:/# cat /opt/fstab
... ....

5.8 批量删除停止的容器和僵尸容器

#筛选出状态异常的容器(Exited、Dead、Created)
[root@web01 ~]# docker ps -a --filter "status=exited" --filter "status=dead" --filter "status=created"
CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS                         PORTS     NAMES
61a7e3da0b16   nginx:latest   "/docker-entrypoint.…"   3 hours ago   Exited (0) About an hour ago             my-nginx2026
44dc9e141520   nginx:latest   "/docker-entrypoint.…"   4 hours ago   Exited (0) About an hour ago             my-nginx2
3987ca3bb6ce   nginx:latest   "/docker-entrypoint.…"   4 hours ago   Exited (0) 4 hours ago                   nginx
[root@web01 ~]#

#直接使用以下命令强制清理
[root@web01 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS                         PORTS                                     NAMES
4139c3d3ec6d   nginx:latest   "/docker-entrypoint.…"   59 minutes ago      Up 59 minutes                  0.0.0.0:2028->80/tcp, [::]:2028->80/tcp   my-nginx02
7a4f9144738c   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up About an hour               80/tcp                                    test-restart
aaedccb3cf2d   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up About an hour               0.0.0.0:2027->80/tcp, [::]:2027->80/tcp   my-nginx01
61a7e3da0b16   nginx:latest   "/docker-entrypoint.…"   3 hours ago         Exited (0) About an hour ago                                             my-nginx2026
44dc9e141520   nginx:latest   "/docker-entrypoint.…"   4 hours ago         Exited (0) About an hour ago                                             my-nginx2
3987ca3bb6ce   nginx:latest   "/docker-entrypoint.…"   4 hours ago         Exited (0) 4 hours ago                                                   nginx
[root@web01 ~]# docker ps -aq --filter "status=exited" --filter "status=dead" --filter "status=created" | xargs -r docker rm -f
61a7e3da0b16
44dc9e141520
3987ca3bb6ce
[root@web01 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS             PORTS                                     NAMES
4139c3d3ec6d   nginx:latest   "/docker-entrypoint.…"   59 minutes ago      Up 59 minutes      0.0.0.0:2028->80/tcp, [::]:2028->80/tcp   my-nginx02
7a4f9144738c   nginx:latest   "/docker-entrypoint.…"   About an hour ago   Up About an hour   80/tcp                                    test-restart
aaedccb3cf2d   nginx:latest   "/docker-entrypoint.…"   2 hours ago         Up About an hour   0.0.0.0:2027->80/tcp, [::]:2027->80/tcp   my-nginx01
[root@web01 ~]#


补充说明:xargs  -r  选项的意思是前面结果为空的时候,自动退出不执行后面的命令

6.【掌握】面试题:Docker网络模型

五大网络驱动

Docker 的网络子系统采用可插拔的驱动架构,默认提供 5 种核心网络驱动:

  1. bridge - 默认网络驱动(单机桥接网络)

默认网络模式 
 容器拥有独立 IP 
 同一 bridge 网络内的容器可以互相通信 
 访问外网依赖 NAT 转换 
 最常用的网络模式

01_容器技术10.png

  1. host - 直接使用宿主机网络栈

特点:
没有独立 IP 
 没有 NAT 
 没有端口映射 
 网络性能最好
  1. overlay - 用于跨主机容器网络(Swarm集群)

特点:
通过 VXLAN 等封装技术,(vlan)
将多个主机上的容器连接到同一个逻辑网络。
  1. macvlan - 为容器分配MAC地址使容器看起来像网络中的一台真实主机(container容器,复用已有的容器的网络)

特点:
 容器拥有独立 MAC 
 容器拥有局域网真实 IP 
 交换机可直接看到容器
  1. none - 禁用所有网络

特点:
 没有 eth0 
 没有 IP 
 没有网关 
 无法访问外网 
 无法与其他容器通信
 
类似于只有127.0.0.1的回环网络

Bridge 模式和Host模式对比

操作Bridge 模式Host 模式容器访问宿主机 IP需通过 docker0 网关(172.17.0.1)。直接使用 127.0.0.1 或宿主机 IP。外部访问容器端口需 -p 8080:80 映射端口。直接访问宿主机端口(如 80)。性能测试(延迟/吞吐量)较低(经过网桥/NAT)。接近原生进程

7.作业与参考答案

必做:注册一个阿里云账号、并登录完成和实名认证

  1. 容器运行Mysql、Redis、Mongodb

参考答案

  1. MySQL 容器

docker run -d \
  --name mysql8-none \
  -e MYSQL_ROOT_PASSWORD=xxxxxxxx \     # 改成自己的密码
  -v mysql_none_data:/var/lib/mysql \
  mysql:8.0
  1. Redis 容器

docker run -d \
  --name redis7-none \
  -v redis_none_data:/data \
  redis:7.0-alpine \
  redis-server --save 60 1 --loglevel warning
  1. MongoDB 容器

docker run -d \
  --name mongodb7-none \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=your_secure_password \
  -v mongodb_none_data:/data/db \
  mongo:7.0
  1. 验证与访问

你可以 进入容器内部 或通过 Docker Exec 执行命令来操作。

# 1. 查看容器状态
docker ps --filter "network=none"

# 2. 操作容器内部(示例:MySQL)
docker exec -it mysql8 mysql -p

# 3. 在宿主机执行容器内命令(示例:Redis)
docker exec redis7 redis-cli ping

# 4. MongoDB 内部操作
docker exec -it mongodb7 mongosh -u admin -p

8.【了解】拓展资料

镜像拉取【扩展】

网站推荐

渡渡鸟镜像

地址:https://docker.aityp.com/

01_容器技术11.png

轩辕镜像

轩辕镜像 https://xuanyuan.cloud/

01_容器技术12.png

毫秒镜像

毫秒镜像

01_容器技术13.png