容器技术入门之Docker环境部署

一: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 ``` ![](https://i-blog.csdnimg.cn/direct/ddf5c08d4ea44150a0c0a89b3f02890d.png) ### 3、容器的运行 ```bash docker start 5c ``` ![](https://i-blog.csdnimg.cn/direct/d75449cf1a8a41258660e936260cf643.png) ### 4、利用容器执行命令(命令执行完毕后容器会退出) ```bash docker run centos:7 /bin/bash -c "ls /root" ``` ![](https://i-blog.csdnimg.cn/direct/3c221a6adb41403f9b7c7ea34e126793.png) ### 5、在启动容器时持续在后台运行 ```bash docker run -itd centos:7 /bin/bash -c "top" ``` ![](https://i-blog.csdnimg.cn/direct/65a114fbfee74d11a01bee0e5237c146.png) 6、终止容器的运行 ```bash docker stop c4 ``` ![](https://i-blog.csdnimg.cn/direct/80ca86687b8b48f29428dbcc2309d082.png) ### 7、进入容器 ```bash docker exec -it 5c /bin/bash ``` ![](https://i-blog.csdnimg.cn/direct/788f93e6351f40ffb189225631bf0880.png) ### 8、导出容器 ```bash docker export 5c > centos7 ``` ![](https://i-blog.csdnimg.cn/direct/8799ff233ae44d4395875253c48f159c.png) ### 9、导入容器 ```bash docker import centos7 aaa docker images ``` ![](https://i-blog.csdnimg.cn/direct/57b9b7e039c54e4783a745e4c76cd476.png) ![](https://i-blog.csdnimg.cn/direct/810dbd0438cd4785bbf559a5a7dcde36.png) ### 10、删除容器 ```bash #删除 docker rm c4 #强制删除 docker rm 5c -f ``` ![](https://i-blog.csdnimg.cn/direct/51c63f1e18844c7ebcb044855114d202.png)

相关推荐
鬼才血脉17 分钟前
Linux(centos)安装 MySQL 8
linux·mysql·centos
guygg8826 分钟前
ubuntu手动编译VTK9.3 Generating qmltypes file 失败
linux·运维·ubuntu
JeffersonZU1 小时前
Linux/Unix 套接字Socket编程(socket基本概念,流程,流式/数据报socket,Unix domain socket示例)
linux·c语言·tcp/ip·udp·unix·gnu
牧天白衣.1 小时前
Docker相关内容
docker·容器·eureka
先做个垃圾出来………1 小时前
自动化一次通过率
运维·自动化
一切顺势而行1 小时前
k8s 使用docker 安装教程
docker·容器·kubernetes
Andy杨1 小时前
20250707-2-第二章:Kubernetes 核心概念-K8s集群架构,生产部署K8s两_笔记
docker·容器
小安运维日记1 小时前
CKS认证 | Day4 最小化微服务漏洞
安全·docker·微服务·云原生·容器·kubernetes
Two_brushes.2 小时前
【linux网络】网络编程全流程详解:从套接字基础到 UDP/TCP 通信实战
linux·开发语言·网络·tcp/udp
夕泠爱吃糖2 小时前
Linux中的静态库和动态库
linux·运维·服务器