首页  /  云原生  /  正文

Docker 基础概念与安装

云原生 2026-10-02📖 13 分钟👁 —
🐳 云原生 · Docker第 1 / 9 页123456789📖 完整导航 →

一、Docker 是干什么的

我学它的第一个理由就是方便,隔离是 docker 的核心思想:几个环境互不干扰地跑在同一台服务器上,资源还能压得更干。它官方文档写得很细,遇到问题先去 docs.docker.com 翻。

开发、测试、上线各一套环境的痛点,下面用 apk 类比带环境的镜像

docker 是 go 语言开发的开源项目,从 dotCloud 这家公司一路做起来的:

Docker 从 dotCloud 到 2013 年开源、2014 年发布 1.0 的历程

二、和传统虚拟机比,差在哪

先看 docker 的隔离长什么样:每个容器里的 APP 和 Lib 都是自己那一份,底下共用宿主机的内核。

每个容器带着自己的 APP 和 Lib,底下共用同一个内核

传统部署是把几个应用堆在同一份 Lib 上,这份 Lib 一出问题就全都拉跨:

三个 APP 共用一份 Lib,Lib 崩了全都挂

传统虚拟机是把硬件虚拟出来,在上面跑一套完整的操作系统,软件再装进这套系统里;容器里的应用是直接跑在宿主机内核上的,容器自己没有内核,也不虚拟硬件,所以整体轻便很多,同一台机器能装的东西更多。再加上每个容器互相隔离、各有各的文件系统,折腾坏了也不容易牵连到别人。

那它凭什么比虚拟机快?下面这张图是关键:

左边虚拟机要多跑一层 Guest OS 和 Hypervisor,右边 Docker 只有 Bins/Libs 加一个 Docker Engine

左边那条路要多虚拟一个 guest os,再在系统里跑服务;docker 没有这一层概念。

Docker 容器、LXC、VM 在虚拟化类型、性能、隔离性、安全性上的对比

总结成两句:

  1. docker 的抽象层比虚拟机少
  2. docker 直接用宿主机的内核,vm 要再搭一套 guest os,docker 省掉了引导这一整套操作

三、DevOps 里它省了什么

更快地交付和部署。传统做法是照着帮助文档一步步安装;docker 是打包镜像、发布测试、一键运行。

升级和扩缩容更省事。用 docker 部署应用跟搭积木一样。升级的时候 SpringBoot 1.5、Redis 5、Tomcat 8 一个个换很麻烦,有 docker 就把整个包一起升级;扩展的时候把项目打成镜像,A 服务器要做水平扩展和负载均衡,B 服务器直接跑 A 的镜像就扩展好了,不需要一台台重新部署。

系统运维更简单。容器化之后开发和测试环境高度一致,底层库之类的差不多,少了一堆"我这能跑你那不能跑"。

计算资源利用更高效。docker 是内核级别的虚拟化,一台物理机能跑很多容器实例,半台云主机跑几十个 redis 也不稀奇。


四、镜像、容器、仓库

先看这张图,从左到右三块分别是客户端、服务器、仓库:

左边客户端、中间 Docker 服务器、右边镜像仓库

image(镜像):镜像是个模板,本身不能启动,把它 run 起来才有东西跑。通过一个镜像可以创建多个容器。

container(容器):独立运行一组应用,由镜像创建出来,可以启动、停止、删除。可以把容器看成一个小号的 linux,里面只有一些基本命令。

repository(仓库):存放镜像的地方,分公有和私有。Docker Hub 是默认的(在国外),阿里云这些国内厂商也有,配上镜像加速才拉得动。

服务器里运行起来的镜像就叫容器,镜像只有一个,对应的容器可以有很多。


五、Docker 是怎么工作的

run 一个容器,中间的过程是这样的:

docker run 的镜像查找流程,本机没有就去 Docker Hub 下,找不到就报错

docker 是 C/S 结构的系统,守护进程跑在宿主机上,客户端通过 socket 连上去操作。

守护进程 dockerd 在后台监听 /var/run/docker.sock 这个 Unix Socket 文件,docker 命令就是通过这个文件给守护进程发请求的。ps aux | grep docker 能看到 dockerd 进程;执行 docker ps 的时候,客户端就是通过这个 Socket 连到守护进程,守护进程再去管理容器。

Socket 说白了就是两个程序之间通信的端点,本质是 IP 地址 + 端口号的组合,用来唯一标识网络里的一个进程。程序 A 往 172.16.0.9:80 发数据,程序 B 在 0.0.0.0:80 监听,两边通过 Socket 建立连接就能互相收发数据,跟打电话要先拨号一样,Socket 就是那个电话号码。

客户端连到 linux 服务器上的后台守护进程,由它管着一个个容器

TCP Socket 用于跨机器通信,Unix Socket 用于本机进程之间通信,Docker 用的是后者,不用走网络协议栈,快一些。这和 Nginx 的 proxy_pass http://后端:8080 是一个道理,Nginx 通过 TCP Socket 转发请求,Docker 客户端通过 Unix Socket 管理容器。


六、装 Docker

环境准备跟着官方文档或者云服务器的安装文档走就行,我这边是 ubuntu 云主机,要 root。

# 1.查看LTS版本
ubuntu@VM-0-9-ubuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 24.04.4 LTS
Release:	24.04
Codename:	noble

# 2.卸载旧的
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)

# 3.用腾讯云的文档参考
# 执行以下命令,添加 Docker 软件源
sudo apt-get update
sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/ \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# 执行以下命令,安装 Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 运行
sudo systemctl enable --now docker
# 执行以下命令,检查安装结果
sudo docker info
Client: Docker Engine - Community
 Version:    29.6.2
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.35.0
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v5.3.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

docker info 会显示 Docker 的版本、运行的容器数量、存储驱动、镜像数量、网络配置这些详细状态。执行成功就说明 Docker 装好了并且正常运行,作用和 nginx -V 看编译参数类似。返回下面这种东西就是装成功了:

docker info 输出的内核版本、操作系统、CPU、内存和 Docker Root Dir

七、配镜像加速

软件源和镜像源是两件事,别搞混:软件源装的是 Docker 这个软件,镜像源加速的是拉 Docker 镜像(容器)。

找国内镜像源直接在浏览器搜"Docker 国内镜像地址"就行,比如这篇:Docker 国内镜像源配置(京东云等)。国内用 Docker 从 Docker Hub 直接拉镜像会很慢,配上国内源能快很多。

推荐的国内镜像源(配完记得重启 systemctl restart docker)

配置镜像加速要写具体的地址,装什么就照着对应厂商的文档抄加速地址,比如腾讯云直接在官网搜 镜像加速

  1. 京东云 镜像地址:*https://hub-mirror.c.163.com* 适用于大部分场景,速度稳定。
  2. 腾讯云 镜像地址:*https://mirror.ccs.tencentyun.com* 推荐用于腾讯云服务器内部。
  3. 阿里云 镜像地址:*https://<你的专属代码>.mirror.aliyuncs.com* 需登录阿里云账号获取专属加速地址。
  4. DaoCloud 镜像站 镜像地址:*https://docker.m.daocloud.io* 免费使用,支持多种环境。
  5. 毫秒镜像 镜像地址:*https://docker.1ms.run* 提供快速、稳定的拉取服务,支持多种 NAS 系统。
# 测试启动
docker run hello-world
root@VM-0-9-ubuntu:~# docker run hello-world
Unable to find image 'hello-world:latest' locally
# 没找到镜像就会去拉镜像,但是不配置镜像源是拉不到的
# 软件源装 Docker 这个软件;镜像源加速拉 Docker 镜像(容器)

# 配置镜像源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com",
"https://docker.m.daocloud.io"
]
}
EOF

# 再拉,需要重启docker
root@VM-0-9-ubuntu:~# systemctl restart docker
root@VM-0-9-ubuntu:~# docker info | grep -A 5 "Registry Mirrors"
 Registry Mirrors:
  https://hub-mirror.c.163.com/
  https://mirror.ccs.tencentyun.com/
  https://docker.m.daocloud.io/
 Live Restore Enabled: false
 Firewall Backend: iptables
 # 成功了
root@VM-0-9-ubuntu:~# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete 
d5e71e642bf5: Download complete 
Digest: sha256:c3cbe1cc1aa588a64951ac6286e0df7b27fe2e6324b1001c619bb358770c0178
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

# 查看下载的镜像
root@VM-0-9-ubuntu:~# docker images
                                                                                                      i Info →   U  In Use
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA
hello-world:latest   c3cbe1cc1aa5       25.9kB         9.49kB    U   

看到 Hello from Docker! 这一段,安装和加速就都通了。


八、卸载

# 1.卸载依赖,和安装时的依赖一样
sudo apt remove -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 2.删除目录(资源)
rm -rf /var/lib/docker

镜像的拉取、查看、搜索和删除放在下一页写。