Docker 基础应用与介绍

Docker 基础应用

Docker 是一个开源的应用容器引擎,基于 Go 语言开发。它允许开发者将应用程序及其所有依赖项(如代码、运行时、库、环境变量和配置文件等)打包到一个轻量级、可移植的"容器"中。这个容器可以在任何安装了 Docker 引擎的 Linux 或 Windows 机器上运行,且保证了环境的高度一致性。

Docker 的核心优势

  1. 环境一致性(解决"在我的机器上能运行"的问题)
    Docker 将应用及其依赖打包在一起,确保了开发、测试和生产环境的绝对一致,极大减少了因环境差异导致的 Bug。
  2. 轻量级与高效
    与传统虚拟机(VM)需要模拟完整的操作系统不同,Docker 容器共享宿主机的操作系统内核。因此,容器体积更小(通常为 MB 级别),启动速度极快(秒级甚至毫秒级),且对 CPU 和内存的资源消耗极低。
  3. 卓越的可移植性
    "一次构建,到处运行"。无论是在你的本地笔记本、公有云服务器,还是本地数据中心,只要目标机器安装了 Docker,就可以无缝运行相同的容器。
  4. 快速部署与弹性扩展
    通过 Dockerfile 可以实现镜像构建的自动化。结合 CI/CD(持续集成/持续交付)流程和 Kubernetes 等编排工具,可以实现应用的快速交付和自动化弹性伸缩。
  5. 隔离性与安全性
    每个容器都在独立的命名空间和 cgroups 中运行,彼此隔离。一个容器的崩溃或资源耗尽,通常不会直接影响宿主机或其他容器。

docker 与虚拟机的区别

Docker 容器 虚拟机
共享宿主机内核 每台虚拟机有自己的内核
隔离的是进程视图 虚拟化整台计算机
启动通常很快 需要启动完整操作系统
资源开销较小 资源开销较大
隔离通常弱于虚拟机 隔离通常更强

Docker 的安装

在线安装

Ubuntu和Centos

docker 再安装的时候,可以使用离线安装或者是在线安装两种方式,如果是在线安装的话,推荐使用阿里云开源镜像站的安装方法,他里面提供了docker的加速镜像源

网址:https://developer.aliyun.com/mirror/

打开docker-ce 网站里面一共有两种安装方式、一种是Ubuntu,一种是centos的。

openeuler

我这里使用的是openeuler操作系统,openEuler 官方源中提供了开箱即用的 Docker 及相关组件。直接使用yum安装即可

安装命令如下:

shell 复制代码
# 更新当前系统的yum 源
[root@localhost ~]# yum update
# 安装 Docker 引擎及常用组件
[root@localhost ~]# yum install -y docker docker-compose
# 查看当前安装docker的版本号
[root@localhost ~]# docker  version
Client:
 Version:           18.09.0
 EulerVersion:      18.09.0.351
 API version:       1.39
 Go version:        go1.21.4
 Git commit:        6273e58
 Built:             Wed Apr  8 18:05:59 2026
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.09.0
  EulerVersion:     18.09.0.351
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.21.4
  Git commit:       6273e58
  Built:            Wed Apr  8 18:05:33 2026
  OS/Arch:          linux/amd64
  Experimental:     false
 # 查看docker进程 是否运行
 [root@localhost ~]# systemctl  status  docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled)
     Active: active (running) since Sun 2026-08-02 13:44:57 CST; 13min ago
       Docs: https://docs.docker.com
   Main PID: 25944 (dockerd)
      Tasks: 21 (limit: 31996)
     Memory: 38.3M ()
     CGroup: /system.slice/docker.service
             ├─25944 /usr/bin/dockerd --live-restore
             └─25952 containerd --config /var/run/docker/containerd/containerd.toml --log-level info

daemon.json文件调试

在 Docker 中,daemon.json 是 Docker 守护进程(Docker Daemon)的核心配置文件。通过修改这个文件,可以自定义 Docker 的存储路径、日志大小、镜像加速地址、网络配置等。它的默认路径是:/etc/docker/daemon.json

json 复制代码
[root@localhost docker]# cat /etc/docker/daemon.json
{
    "insecure-registries": ["registry.access.redhat.com", "quay.io"],
    "registry-mirrors": [
        "https://q2gr04ke.mirror.aliyuncs.com",
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"
    ],
    "bip": "192.168.17.1/24",
    "exec-opts": ["native.cgroupdriver=systemd"],
    "live-restore": false,
    "dns": ["114.114.114.114", "8.8.8.8"]
}
配置项 (Key) 值 (Value) 作用说明 (Description)
insecure-registries ["registry.access.redhat.com", "quay.io"] 配置不安全的镜像仓库,允许 Docker 通过 HTTP 而非 HTTPS 访问这些指定的私有仓库。
registry-mirrors ["https://q2gr04ke.mirror.aliyuncs.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"] 配置国内镜像加速器地址,加速从 Docker Hub 拉取镜像的速度(包含阿里云、网易、中科大源)。
bip "192.168.17.1/24" 自定义 Docker 默认网桥(docker0)的 IP 地址和子网掩码,用于避免与宿主机或其他网络发生 IP 冲突。
exec-opts ["native.cgroupdriver=systemd"] 配置容器运行时的 cgroup 驱动。设置为 systemd 能与操作系统的 systemd 更好地集成,是 CentOS/openEuler 等系统的官方推荐配置。
live-restore false 配置 Docker 守护进程重启或停止时的行为。设为 false 表示当 Docker 服务停止时,其管理的容器也会随之停止。
dns ["114.114.114.114", "8.8.8.8"] 为容器配置自定义的 DNS 服务器地址,解决容器内部无法解析域名的问题(配置了国内 114 DNS 和 Google DNS)。

其中bip的配置表示当前系统生成的docker0的网卡的IP地址。默认是172.17.0.1/16,当该网卡使用的IP地址与宿主机的IP地址重复为一个网段时建议将docker0的IP地址进行修改。否则会导致docker容器无法正常使用。

  • 重启服务使daemon.json配置生效

    shell 复制代码
    [root@localhost docker]# systemctl   daemon-reload
    [root@localhost docker]# systemctl  restart docker
    Job for docker.service failed because the control process exited with error code.
    See "systemctl status docker.service" and "journalctl -xeu docker.service" for details.

注意:这里再启动docker的时候报错,我们可以使用journalctl -xeu docker.service 来查看一下报错的原因是什么

journalctl -xeu docker.service >> ./docker.log 把journalctl 输出的日志保存到当前目录的docker.log 文件中

tail -n 200 docker.log 查看docker.log中最后200行的日志

通过日志描述可以看到时我们配置的daemon.json中的live-restore 与 systemd 启动文件(docker.service)中的命令行参数发生了冲突,两个参数重复使用了,那我们把daemon.json中的"live-restore"删除后重新在家启动即可。

  • 修改后的配置

    json 复制代码
    {
    "insecure-registries": ["registry.access.redhat.com", "quay.io"],
    "registry-mirrors": [
        "https://q2gr04ke.mirror.aliyuncs.com",
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"
    ],
    "bip": "192.168.17.1/24",
    "exec-opts": ["native.cgroupdriver=systemd"],
    "dns": ["114.114.114.114", "8.8.8.8"]
    }
  • 重启服务并重新加载配置

    shell 复制代码
    [root@localhost docker]# systemctl daemon-reload
    [root@localhost docker]# systemctl  restart docker
  • 重启完成之后,查看docker0的IP地址是否已经修改了与我们配置文件中的一致

  • 查看docker的镜像仓库与镜像加速地址是否修改

namespace和Cgroup

Namespace 决定容器"能看见什么",cgroup 决定容器"能使用多少资源"。

它们都是 Linux 内核能力,并不是 Docker 自己发明的。Docker 负责配置这些能力,runc 等 OCI Runtime 负责创建。
#mermaid-svg-7XH8EfgCdlpOJ74V{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7XH8EfgCdlpOJ74V .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7XH8EfgCdlpOJ74V .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7XH8EfgCdlpOJ74V .error-icon{fill:#552222;}#mermaid-svg-7XH8EfgCdlpOJ74V .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7XH8EfgCdlpOJ74V .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7XH8EfgCdlpOJ74V .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7XH8EfgCdlpOJ74V .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7XH8EfgCdlpOJ74V .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7XH8EfgCdlpOJ74V .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7XH8EfgCdlpOJ74V .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7XH8EfgCdlpOJ74V .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7XH8EfgCdlpOJ74V .marker.cross{stroke:#333333;}#mermaid-svg-7XH8EfgCdlpOJ74V svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7XH8EfgCdlpOJ74V p{margin:0;}#mermaid-svg-7XH8EfgCdlpOJ74V .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-7XH8EfgCdlpOJ74V .cluster-label text{fill:#333;}#mermaid-svg-7XH8EfgCdlpOJ74V .cluster-label span{color:#333;}#mermaid-svg-7XH8EfgCdlpOJ74V .cluster-label span p{background-color:transparent;}#mermaid-svg-7XH8EfgCdlpOJ74V .label text,#mermaid-svg-7XH8EfgCdlpOJ74V span{fill:#333;color:#333;}#mermaid-svg-7XH8EfgCdlpOJ74V .node rect,#mermaid-svg-7XH8EfgCdlpOJ74V .node circle,#mermaid-svg-7XH8EfgCdlpOJ74V .node ellipse,#mermaid-svg-7XH8EfgCdlpOJ74V .node polygon,#mermaid-svg-7XH8EfgCdlpOJ74V .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7XH8EfgCdlpOJ74V .rough-node .label text,#mermaid-svg-7XH8EfgCdlpOJ74V .node .label text,#mermaid-svg-7XH8EfgCdlpOJ74V .image-shape .label,#mermaid-svg-7XH8EfgCdlpOJ74V .icon-shape .label{text-anchor:middle;}#mermaid-svg-7XH8EfgCdlpOJ74V .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-7XH8EfgCdlpOJ74V .rough-node .label,#mermaid-svg-7XH8EfgCdlpOJ74V .node .label,#mermaid-svg-7XH8EfgCdlpOJ74V .image-shape .label,#mermaid-svg-7XH8EfgCdlpOJ74V .icon-shape .label{text-align:center;}#mermaid-svg-7XH8EfgCdlpOJ74V .node.clickable{cursor:pointer;}#mermaid-svg-7XH8EfgCdlpOJ74V .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-7XH8EfgCdlpOJ74V .arrowheadPath{fill:#333333;}#mermaid-svg-7XH8EfgCdlpOJ74V .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7XH8EfgCdlpOJ74V .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7XH8EfgCdlpOJ74V .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7XH8EfgCdlpOJ74V .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-7XH8EfgCdlpOJ74V .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7XH8EfgCdlpOJ74V .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-7XH8EfgCdlpOJ74V .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7XH8EfgCdlpOJ74V .cluster text{fill:#333;}#mermaid-svg-7XH8EfgCdlpOJ74V .cluster span{color:#333;}#mermaid-svg-7XH8EfgCdlpOJ74V div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7XH8EfgCdlpOJ74V .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-7XH8EfgCdlpOJ74V rect.text{fill:none;stroke-width:0;}#mermaid-svg-7XH8EfgCdlpOJ74V .icon-shape,#mermaid-svg-7XH8EfgCdlpOJ74V .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7XH8EfgCdlpOJ74V .icon-shape p,#mermaid-svg-7XH8EfgCdlpOJ74V .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-7XH8EfgCdlpOJ74V .icon-shape .label rect,#mermaid-svg-7XH8EfgCdlpOJ74V .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7XH8EfgCdlpOJ74V .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-7XH8EfgCdlpOJ74V .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-7XH8EfgCdlpOJ74V :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Linux 宿主机内核
容器 A 的进程
容器 B 的进程
Namespace A:进程、网络、挂载等视图
Namespace B:独立的视图
cgroup A:CPU 1核、内存 512MB
cgroup B:CPU 2核、内存 1GB

Namespace 用于隔离系统资源的"视图"。

容器里的程序看起来像运行在独立系统中,但实际上仍是宿主机上的普通 Linux 进程。Linux 内核为不同进程保存不同的资源对象引用。执行系统调用时,内核根据当前进程所属的 Namespace,访问对应的资源对象。

  • PID Namespace
    隔离进程编号和进程列表。
  • Network Namespace
    隔离网络资源,包括:网卡 IP 地址 路由表 防火墙规则 端口 Socket
    使用下面的参数会共享宿主机网络:docker run --network=host nginx
  • Mount Namespace
    隔离文件系统挂载视图。容器中挂载或卸载文件系统,一般不会影响其他容器。
  • User Namespace
    隔离用户和 UID/GID。启用 User Namespace 后,可以将:容器内 root:UID 0 映射为宿主机普通用户:例如 UID 100000,需要注意:普通 Docker 默认配置下,容器内 root 不一定自动映射成宿主机普通用户。需要配置 userns-remap,或者使用 Rootless Docker。

cgroup

cgroup 全称是 Control Groups,用于统计和限制一组进程能够使用的资源。

现代 Linux 通常使用 cgroup v2,但核心原理相同。

  • 限制内存
    docker run --memory=512m nginx :表示容器最多使用大约 512MB 内存。超过硬限制且无法回收时,内核可能触发 OOM,并终止容器中的进程。
  • 限制 CPU
    docker run --cpus=1.5 nginx:表示容器最多获得约 1.5 个 CPU 核心的计算能力,但不一定固定运行在某个核心上。
  • 限制进程数量
    docker run --pids-limit=100 nginx:防止容器创建过多进程,例如避免 Fork Bomb 耗尽宿主机 PID。
  • 查看资源统计
    docker stats显示的 CPU、内存、网络和 I/O 数据,很多来自 cgroup 统计信息。
对比项 Namespace cgroup
核心作用 隔离资源视图 统计和限制资源
解决的问题 容器能看到什么 容器能使用多少
典型对象 PID、网络、挂载、主机名 CPU、内存、进程数、I/O
是否限制资源 一般不负责
是否隐藏资源 一般不负责

docker 镜像

docker 镜像原理

Linux文件系统由bootfs和rootfs两部分组成

  • bootfs:包含bootloader(引导加载程序)和 kernel(内核)
  • rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev, /proc,/bin,/etc等标准目录和文件
  • 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu ,centos等

docker镜像原理

  • Docker镜像是由特殊的文件系统叠加而成
  • 最底端是 bootfs,并使用宿主机的bootfs
  • 第二层是root文件系统rootfs,称为base image
  • 然后再往上可以叠加其他的镜像文件
  • 统一文件系统(UnionFile System)技术能够将不同的 层整合成一个文件系统,为这些层提供了一个统一 的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在 一个文件系统
  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
  • 当从一个镜像启动容器时,Docker会在最顶层加载一个读 写文件系统作为容器

docker 镜像相关命令

  • 查看docker镜像

    shell 复制代码
    # 查看镜像: 查看本地所有的镜像 
    [root@localhost ~]# docker  images
    镜像名称	  版本号    镜像ID		 镜像存在时间    镜像大小
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    centos       latest    5d0da3dc9764   2 years ago   231MB
    [root@localhost ~]# docker   images -q    #查看所有的镜像ID
    5d0da3dc9764
  • 搜索镜像:从网络中查找需要的镜像

    shell 复制代码
    docker search 镜像名称
    NAME:镜像的名称
    DESCRIPTION:镜像的描述
    STARS:镜像的大小
    OFFICIAL:镜像是否是官方维护  如果至位【ok】则代表,该镜像是官方维护的镜像
    注意:如果需要查看镜像的版本号,则需要到https://hub.docker.com的docker镜像仓库官方网站中去查看
    [root@localhost ~]# docker  search   nginx
    NAME                               DESCRIPTION                                      STARS     OFFICIAL
    nginx                              Official build of Nginx.                         19730     [OK]
    unit                               Official build of NGINX Unit: Universal Web ...   25        [OK]
    nginx/nginx-ingress                NGINX and  NGINX Plus Ingress Controllers fo...   89
    nginxinc/nginx-unprivileged        Unprivileged NGINX Dockerfiles                   144
    nginx/nginx-prometheus-exporter    NGINX Prometheus Exporter for NGINX and NGIN...   39
    nginxinc/nginx-s3-gateway          Authenticating and caching gateway based on ...   6
    nginx/unit                         This repository is retired, use the Docker o...   64
    nginx/nginx-ingress-operator       NGINX Ingress Operator for NGINX and NGINX P...   2
    nginxinc/amplify-agent             NGINX Amplify Agent docker repository            1
    nginx/nginx-quic-qns               NGINX QUIC interop                               1
    nginxinc/ingress-demo              Ingress Demo                                     4
    nginxproxy/nginx-proxy             Automated nginx proxy for Docker containers ...   132
    nginxproxy/acme-companion          Automated ACME SSL certificate generation fo...   131
    bitnami/nginx                      Bitnami nginx Docker Image                       184
    bitnami/nginx-ingress-controller   Bitnami Docker Image for NGINX Ingress Contr...   32
    ubuntu/nginx                       Nginx, a high-performance reverse proxy & we...   112
    nginxinc/nginmesh_proxy_debug                                                       0
    nginxproxy/docker-gen              Generate files from docker container meta-da...   16
    nginxinc/mra-fakes3                                                                 0
    kasmweb/nginx                      An Nginx image based off nginx:alpine and in...   7
    nginxinc/nginmesh_proxy_init                                                        0
    nginxinc/mra_python_base                                                            0
    nginxinc/ngx-rust-tool                                                              0
    rancher/nginx-ingress-controller                                                    12
  • 拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为名称:版本号,如果版本号不指定则是最新的版本。 如果不知道镜像版本,可以去docker hub搜索对应镜像查看

    shell 复制代码
    docker pull 镜像名称
    [root@localhost ~]# docker pull  centos
    Using default tag: latest
    latest: Pulling from library/centos
    a1d0c7532777: Pull complete
    Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
    Status: Downloaded newer image for centos:latest
    docker.io/library/centos:latest
    
    [root@localhost ~]# docker  images
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    centos       latest    5d0da3dc9764   2 years ago   231MB
  • 删除镜像

    shell 复制代码
    docker rmi 镜像id # 删除指定本地镜像
    docker rmi `docker images -q` # 删除所有本地镜
相关推荐
happymagic2 小时前
vmware workstation Pro 虚拟机设定启停的时间段
运维·服务器·windows
一只鹿鹿鹿2 小时前
三甲综合智慧医院信息化总体解决方案(PPT文件)
大数据·运维·物联网·安全·政务
AI的探索之旅2 小时前
BOM管理的AI自动化:从原理图到采购清单,我搭了一套全自动工具链
运维·人工智能·自动化
码上上班3 小时前
JumpServer 企业完整实操手册
容器
PC2005-cloud3 小时前
Windows 下 WSL2 + Docker Desktop + Ubuntu 开发环境搭建指南
windows·ubuntu·docker
Kina_C3 小时前
HAProxy 负载均衡实战:从安装配置到高级参数详解
linux·运维·负载均衡·haproxy
Tyfrank4 小时前
Linux内核收包路径及中断
linux·运维·单片机
阳光九叶草LXGZXJ5 小时前
达梦数据库-报错-11-cmd 13 validate error
linux·运维·数据库·sql·学习
~光~~5 小时前
【嵌入式linux学习_OV8858 bring up】L1_从Sensor到RK3588发生了什么
linux·运维·学习