一:Docker 概述
因为 Docker 轻便、快速的特性,可以使应用达到快速迭代的目的。每次小的变更,马上就可以看到效果,而不用将若干个小变更积攒到一定程度再变更。每次变更一小部分其实是一种非常安全的方式,在开发环境中能够快速提高工作效率。
Docker 容器能够帮助开发人员、系统管理员、质量管理和版本控制工程师在一个生产环节中一起协同工作。制定一套容器标准能够使系统管理员更改容器的时候,程序员不需要关心容器的变化,而更专注自己的应用程序代码。从而隔离开了开发和管理,简化了开发和部署的成本。

1、什么是 Docker
如果要方便的创建运行在云平台上的应用,必须要脱离底层的硬件,同时还需要任何时间地点可获取这些资源,这正是 Docker 所能提供的。Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。通过这种容器打包应用程序,意味着简化了重新部署、调试这些琐碎的重复工作,极大的提高了工作效率。
docker 是目前较为主流的容器技术。容器技术是一种轻量级的虚拟化技术,它可以让应用程序及其依赖项打包在一个独立的单元中运行,从而实现应用的隔离、可移植性和资源的高效利用。以下从概念、原理、与传统虚拟化技术的对比、优势、应用场景等方面详细介绍容器技术。
容器就像是一个独立的 "盒子",这个 "盒子" 里装着运行某个应用所需要的所有东西,包括代码、运行时环境、系统工具、系统库等。不同的容器之间相互隔离,每个容器都有自己独立的文件系统、进程空间、网络接口等,就好像它们是在不同的机器上运行一样,但实际上它们是共享宿主机的操作系统内核。
2、Docker 的优势
Docker 容器运行速度很快,启动和停止可以在秒级实现,比传统虚拟机要快很多;Docker 核心解决的问题是利用容器来实现类似虚拟机的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。因此,Docker 容器除了运行其中的应用之外,基本不消耗额外的系统资源,在保证应用性能的同时,又减小了系统开销,使得一台主机上同时运行数千个 Docker 容器成为可能。
传统虚拟化技术(如 VMware、VirtualBox 等)是通过虚拟机管理程序(Hypervisor)在物理服务器上创建多个虚拟机(VM),每个虚拟机都包含完整的操作系统。而容器技术是在操作系统层面进行虚拟化,多个容器共享宿主机的操作系统内核。
对比维度 | 传统虚拟机 | 容器 |
---|---|---|
资源占用 | 为每个虚拟机分配独立操作系统,占用大量系统资源 | 共享宿主机内核,仅包含应用及其依赖项,资源占用相对少,启动速度更快 |
隔离性 | 每个虚拟机有独立操作系统,隔离程度高 | 隔离性相对弱,多数应用场景下足够,可通过合理配置管理增强 |
性能 | 存在额外虚拟化层,有性能开销 | 直接运行在宿主机内核,性能损耗小,更接近原生应用性能 |
[容器技术和传统虚拟化的主要区别在] |
特性 | Docker 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗 50% 左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源限制 | 完全隔离 |
特性 | 说明 |
---|---|
隔离性 | 容器间相互隔离,一个容器故障不影响其他,提升应用稳定性与安全性 |
可移植性 | 将应用及依赖打包成独立单元,可在开发、测试、生产等不同环境无缝迁移运行,避免环境适配问题 |
资源高效利用 | 共享宿主机操作系统内核,无需为每个应用运行独立系统,减少资源浪费,提升服务器利用率 |
快速部署和扩展 | 启动速度快(通常几秒),可按需快速创建、销毁,便于应用快速部署与弹性扩展 |
[优势] |

3、docker应用场景
应用场景 | 作用说明 |
---|---|
开发环境管理 | 用容器创建一致开发环境,保障团队环境一致,提升开发效率 |
持续集成和持续部署(CI/CD) | 助力应用快速打包、测试、部署,实现自动化软件开发流程 |
微服务架构 | 适配微服务架构,每个微服务打包成独立容器,独立开发、测试、部署,增强系统可伸缩性与容错性 |
云计算 | 云服务提供商借容器技术,为用户提供更高效、灵活计算资源;用户可按需快速创建、管理容器化应用 |
4、核心概念
4.1、镜像
镜像、容器、仓库是 Docker 的三大核心概念。其中 Docker 的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。例如:一个镜像可以是一个完整的 CentOS 操作系统环境,称为一个 CentOS 镜像;也可以是一个安装了 MySQL 的应用程序,称之为一个 MySQL 镜像等等。
Docker 提供了简单的机制来创建和更新现有的镜像,用户也可以从网上下载已经创建好的镜像直接使用。
4.2、容器
Docker 的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证安全性的平台。可以将容器看作是一个简易版的 Linux 环境,Docker 利用容器来运行和隔离应用。
4.3、仓库
Docker 仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用 push 命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
仓库注册服务器(Registry)是存放仓库的地方,其中包含了多个仓库。每个仓库集中存放某一类镜像,并且使用不同的标签(tag)来区分它们。目前最大的公共仓库是 docker Hub,存放了数量庞大的镜像供用户下载使用
二、安装部署
1、基础环境
bash
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
2、下载 Docker 的 repo 文件
bash
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
cd /etc/yum.repos.d/
sed -i 's/$releasever/8/g' docker-ce.repo
sed -i 's/$basearch/x86_64/g' docker-ce.repo
dnf clean all
dnf makecache
dnf -y install docker-ce
3、指定docker镜像仓库
bash
cd /etc/docker/
vim daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.imgdb.de",
"https://docker-0.unsee.tech",
"https://docker.hlmirror.com"
]
}
4、重载守护进程,并启动服务
bash
systemctl daemon-reload
systemctl start docker
systemctl enable docker
5、优化内核参数
net.ipv4.ip_forward=1
是 Docker 网络功能正常运行的前提,它允许内核转发容器与外部网络、容器与容器之间的数据包,是实现容器通信、端口映射等核心功能的基础
bash
vim /etc/sysctl.conf
###编辑内容###
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
sysctl -p

6、设置监听(生产环境中不允许)
bash
vim /lib/systemd/system/docker.service
###编辑内容###
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service time-set.target
Wants=network-online.target containerd.service
Requires=docker.socket
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always
# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3
# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
OOMScoreAdjust=-500
[Install]
WantedBy=multi-user.target

三、镜像操作
1、拉取镜像
bash
##语法##
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull nginx:1.24.0
类别 | 参数 / 元素 | 说明 |
---|---|---|
OPTIONS(可选参数) | -a, --all-tags |
拉取指定仓库中的所有标签的镜像 |
OPTIONS(可选参数) | --disable-content-trust |
默认值为true ,用于禁用镜像内容验证,即不验证镜像的签名 |
NAME[:TAG@DIGEST] |
NAME |
要拉取的镜像的名称,可包含仓库地址和命名空间信息;Docker Hub 上官方镜像直接写镜像名(如nginx ),用户或组织镜像格式为用户名/镜像名 (如dockerlibrary/redis ) |
NAME[:TAG@DIGEST] |
TAG (可选) |
指定要拉取的镜像的具体标签,区分同一镜像不同版本;不指定时默认拉取latest 标签的镜像 |
NAME[:TAG@DIGEST] |
DIGEST (可选) |
通过镜像的摘要信息精确指定要拉取的镜像版本,确保拉取特定哈希值对应的精确镜像,避免标签指向不同版本产生混淆,格式如nginx@sha256:abcdef123456... |
2、查看镜像信息
2.1、docker images
命令功能概述
docker images
是 Docker 中基础且常用命令,用于列出本地 Docker 主机上的镜像信息,展示镜像的仓库名、标签、镜像 ID、创建时间和大小等基本信息,帮助了解本地镜像存储情况。
2.2、显示信息解读
- REPOSITORY:镜像所属仓库
- TAG:镜像标签信息,标记同一仓库中不同镜像
- IMAGE ID:镜像唯一 ID 号,唯一标识一个镜像
- CREATED:镜像创建时间
- VIRTUAL SIZE:镜像大小
2.3、命令语法
docker images [OPTIONS] [REPOSITORY[:TAG]]
2.4、参数说明
2.4.1、OPTIONS(可选参数)
-a, --all
:显示所有镜像(含中间层镜像),默认仅显示顶层镜像--digests
:显示镜像摘要信息-f, --filter filter
:按指定条件过滤输出,如dangling=true
显示虚悬镜像(无标签镜像 )--format string
:用 Go 模板语法自定义输出格式--no-trunc
:不截断输出,完整显示镜像 ID 等长字段-q, --quiet
:仅显示镜像 ID
2.4.2、REPOSITORY [:TAG](可选)
- REPOSITORY:指定要显示的镜像仓库名称
- TAG:指定要显示的镜像标签,不指定则默认显示所有标签镜像
bash
docker images

3、查看镜像的详细信息
bash
docker inspect 95

4、修改镜像标签
bash
docker tag nginx:latest nginx:v1
docker images

5、删除镜像
5.1、用镜像名删除
bash
docker -rmi nginx:v1

5.2、用ID删除
bash
docker -rmi 95 -f

6、镜像导出
bash
docker save -o nginx nginx:latest

7、镜像导入
bash
docker load<nginx

四、docker容器操作
1、创建与启动
bash
##命令语法:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker create -it centos:7

docker create 是 Docker 中的一个重要命令,它的主要作用是基于指定的镜像创建一个新的容器,但并不立即启动该容器。下面将对 docker create 命令进行详细解释。
参数说明:
OPTIONS(可选参数):docker create 支持众多可选参数,这些参数可以帮助你对创建的容器进行各种配置,以下是一些常用的参数:
- -i, --interactive:保持标准输入打开,即使没有附加到容器上,常用于需要交互的应用程序。
- -t, --tty:分配一个伪终端,通常与 -i 一起使用,模拟一个交互式的终端环境,如 docker create -it。
- -p, --publish list:将容器内的端口映射到宿主机的端口,格式为 宿主机端口:容器端口,例如 -p 8080:80 表示将容器的 80 端口映射到宿主机的 8080 端口。
- -v, --volume list:挂载数据卷,将宿主机的目录或文件挂载到容器内,格式为 宿主机路径:容器路径,例如 -v /host/data:/container/data。
- --name string:为创建的容器指定一个自定义的名称,方便后续管理和识别。
- -e, --env list:设置容器内的环境变量,格式为 变量名 = 变量值,例如 -e DB_HOST=localhost。
- --network string:指定容器要加入的网络,例如 --network my_network。
IMAGE
- 指定用于创建容器的镜像名称和标签,如 nginx:latest。如果本地没有该镜像,Docker 会尝试从 Docker Hub 等镜像仓库中拉取。
COMMAND\] \[ARG...\](可选) * 指定容器启动时要执行的命令及其参数。如果不指定,将使用镜像的默认启动命令。 docker create 命令主要用于提前准备好容器的配置,创建一个处于停止状态的容器实例,之后可以在需要的时候使用 docker start 命令启动该容器,这种方式在一些场景下非常有用,例如: * 批量创建多个配置好的容器,在需要时逐个启动,提高部署效率。 * 对容器进行预配置,进行多次测试或验证不同的启动参数。 注意事项 * 创建容器时,要确保指定的镜像存在于本地或者可以从镜像仓库中拉取。 * 使用 docker create 创建的容器处于停止状态,需要使用 docker start 命令启动。 * 对于复杂的容器配置,要仔细检查参数的正确性,避免出现配置错误导致容器无法正常工作。 ### 2、查看所有容器 ```bash docker ps -a ```  ### 3、容器的运行 ```bash docker start 5c ```  ### 4、利用容器执行命令(命令执行完毕后容器会退出) ```bash docker run centos:7 /bin/bash -c "ls /root" ```  ### 5、在启动容器时持续在后台运行 ```bash docker run -itd centos:7 /bin/bash -c "top" ```  6、终止容器的运行 ```bash docker stop c4 ```  ### 7、进入容器 ```bash docker exec -it 5c /bin/bash ```  ### 8、导出容器 ```bash docker export 5c > centos7 ```  ### 9、导入容器 ```bash docker import centos7 aaa docker images ```   ### 10、删除容器 ```bash #删除 docker rm c4 #强制删除 docker rm 5c -f ``` 