Docker 基础应用
Docker 是一个开源的应用容器引擎,基于 Go 语言开发。它允许开发者将应用程序及其所有依赖项(如代码、运行时、库、环境变量和配置文件等)打包到一个轻量级、可移植的"容器"中。这个容器可以在任何安装了 Docker 引擎的 Linux 或 Windows 机器上运行,且保证了环境的高度一致性。
Docker 的核心优势
- 环境一致性(解决"在我的机器上能运行"的问题)
Docker 将应用及其依赖打包在一起,确保了开发、测试和生产环境的绝对一致,极大减少了因环境差异导致的 Bug。 - 轻量级与高效
与传统虚拟机(VM)需要模拟完整的操作系统不同,Docker 容器共享宿主机的操作系统内核。因此,容器体积更小(通常为 MB 级别),启动速度极快(秒级甚至毫秒级),且对 CPU 和内存的资源消耗极低。 - 卓越的可移植性
"一次构建,到处运行"。无论是在你的本地笔记本、公有云服务器,还是本地数据中心,只要目标机器安装了 Docker,就可以无缝运行相同的容器。 - 快速部署与弹性扩展
通过 Dockerfile 可以实现镜像构建的自动化。结合 CI/CD(持续集成/持续交付)流程和 Kubernetes 等编排工具,可以实现应用的快速交付和自动化弹性伸缩。 - 隔离性与安全性
每个容器都在独立的命名空间和 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 -
搜索镜像:从网络中查找需要的镜像
shelldocker 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搜索对应镜像查看
shelldocker 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 -
删除镜像
shelldocker rmi 镜像id # 删除指定本地镜像 docker rmi `docker images -q` # 删除所有本地镜