Docker知识基础

目录

为什么要用到容器?

docker是什么?

容器与虚拟机的区别?

docker的三个核心概念:

docker容器操作

docker网络模式

bridge

host

container

none

自定义网络

CPU限制

内存限制

磁盘IO限制


为什么要用到容器?

1)容器可以屏蔽底层操作系统的差异性,让业务应用不管在哪里都是使用容器的环境运行,从而保证开发测试环境与生产环境的一致性

2)容器部署起来非常便捷和迅速,缩短开发测试部署的周期时间

容器引擎:docker containered podman rocket

虚拟化软件:Windows VMware Workstation 个人工作站版 VMware Sphere + ESXI 企业版 XEN

Linux KVM (基于linux内核的虚拟机) -> Openstack

docker是什么?

docker是用go语言开发并开源的容器引擎,用来运行容器里的应用。docker也是可用来管理容器和镜像的一种工具。

容器与虚拟机的区别?

容器 虚拟机

所有容器共享宿主机的内核 每个虚拟机都有独立的操作系统和内核

通过namespace实现资源隔离,通过cgroup实现限制资源的最大使用量 完全隔离。每个虚拟机都有独立的硬件资源

秒级启动速度 分钟级启动速度

容器相当于宿主机的进程,性能几乎没有损耗 需要通过hypervisor虚拟机管理程序对宿主机资源虚拟访问,有一定的性能损耗

单机容量能支持成百上千个容器 单机只能支持最多几十个虚拟机

docker的三个核心概念:

镜像:是创建容器的基础,是一个只读的模板文件,里面包含运行容器中的应用程序所需要的所有内容(应用程序文件、配置文件、运行库文件、依赖包等)

容器:是用镜像运行的实例,容器可以被创建、启动、停止、删除,每个容器之间默认是相互隔离的

仓库:是用来集中保存镜像的地方,有公有仓库和私有仓库之分

docker version

docker info

docker镜像操作

docker search 仓库|镜像的关键词

pull 仓库名/镜像名:标签 #如果不指定标签默认使用 :latest 标签

images [-q]

inspect 镜像名|镜像ID

tag 旧镜像名:旧标签 新镜像名:新标签

rmi 镜像名|镜像ID [-f]

save -o 镜像文件 镜像名|镜像ID

load -i|< 镜像文件

login #默认登录官方公有仓库

push 仓库名/镜像名:标签

docker容器操作

docker create [-i -t] [--name 容器名] 镜像名:标签 [容器启动命令]

start 容器名|容器ID

ps [-a -q]

inspect 容器名|容器ID

stop 容器名|容器ID #发送 SIGTERM 信号,默认等待10s

kill 容器名|容器ID #发送 SIGKILL 信号,强制停止容器

rm 容器名|容器ID [-f]

exec -it 容器名|容器ID bash|sh

logs 容器名|容器ID #查看容器中PID=1的主进程的日志

cp 宿主机文件路径 容器名|容器ID:绝对路径

cp 容器名|容器ID:绝对路径 宿主机文件路径

docker export -o 容器模板文件 容器名|容器ID docker export 容器名|容器ID > 容器模板文件

docker import 容器模板文件 -- 镜像名:标签 cat 容器模板文件 | docker import - 镜像名:标签

docker run -d [-i -t --name --rm] 镜像名:标签 [容器启动命令]

-P #使用从32768开始的随机端口映射容器

-p 宿主机端口:容器端口 #使用指定的宿主机端口映射容器

-v 宿主机绝对路径:容器绝对路径[:ro] #将宿主机目标|文件挂载到容器的数据卷

--volumes-from 数据卷容器名 #共享数据卷容器的数据卷

--link 目标容器名:连接别名 #可实现在容器内通过目标容器名或连接别名与目标容器通信

--network bridge|host|none|container:容器名或ID #设置容器的网络模式

docker run 的启动过程:1)检查本地是否有镜像,如果有则直接使用本地镜像创建容器,如果没有则从仓库拉取镜像再创建容器

2)在只读的镜像层上挂载一层可读可写的容器层

3)从docker网桥给容器分配一个虚拟接口和IP

4)使用镜像的默认启动命令或者指定的启动命令启动容器,直到容器中PID=1的主进程退出为止

docker网络模式

bridge

docker的默认网络模式。使用此模式的每个容器都有独立的网络命名空间namespace,即每个容器都有独立的IP、端口范围(每个容器可以用同一个端口)、路由、iptables规则等网络资源。

docker run [--network=bridge] ....

host

容器与宿主机共享网络namespace,即容器和宿主机使用同一个IP、端口范围(容器与宿主机或其它使用host模式的容器不能用同一个端口)、路由、iptables规则等网络资源。

docker run --network=host ....

container

和指定已存在的容器共享网络namespace,即这两个容器使用同一个IP、端口范围(容器与指定的容器不能用同一个端口)、路由、iptables规则等网络资源。

docker run --network=container:容器名|容器ID ....

none

每个容器都有独立的网络namespace,但是容器没有自己的eth0网卡、IP、端口等,只有lo网卡。

docker run --network=none ....

自定义网络

可以用来自定义创建一个网段、网桥、网络模式,从而可以创建容器时自定义容器IP

docker network create --subnet 自定义网段 --opt "com.docker.network.bridge.name"="自定义网桥名" 自定义网络模式名

docker run --network 自定义网络模式名 --ip 自定义容器IP ....

cgroup资源限制(限制容器进程对CPU 内存 磁盘IO 等资源的最大使用量)

CPU限制

设置单个容器进程能够使用的CPU使用率上限

针对新建的容器:

docker run --cpu-period 单个CPU调度周期时间(1000~1000000) --cpu-quota 容器进程能够使用的最大CPU时间(>=1000)

针对已存在的容器:

修改 /sys/fs/cgroup/cpu/docker/容器ID/ 目录下的 cpu.cfs_period_us(单个CPU调度周期时间) cpu.cfs_quota_us(容器进程能够使用的最大CPU时间) 文件的值

设置多个容器的CPU占用份额(只能在多个容器同时运行且CPU资源紧张时生效)

docker run --cpu-shares 容器进程最大占用CPU的份额(值为1024的倍数)

设置容器绑定指定的CPU

docker run --cpuset-cpus CPUID1[,CPUID2,....]

内存限制

设置容器能够使用的内存和swap的值

docker run -m 内存值 --memory-swap 内存和swap的总值

设置 0 或 不设置,表示swap为内存的2倍

设置 -1,表示不限制swap的值,宿主机有多少容器即可使用多少

设置 与 -m 一样的值,表示不使用swap

磁盘IO限制

docker run --device-read-bps 磁盘设备文件路径:速率 #限制容器在某个磁盘上读的速度

--device-write-bps 磁盘设备文件路径:速率 #限制容器在某个磁盘上写的速度

--device-read-iops 磁盘设备文件路径:次数 #限制容器在某个磁盘上读的次数

--device-write-iops 磁盘设备文件路径:次数 #限制容器在某个磁盘上写的速度

相关推荐
云达闲人28 分钟前
Proxmox VE 用户与权限管理命令大全
运维·网络·云原生·容器·proxmox·用户权限管理·命令大全
喆星时瑜44 分钟前
【Docker】运行错误提示 unknown shorthand flag: ‘d‘ in -d ----详细解决方法
运维·docker·容器
David爱编程1 小时前
K8s中Pod 和容器到底啥关系?
云原生·容器
一起屠龙2 小时前
SpringAi+MCP实现sse及stdio服务调用
docker·llm·mcp
极小狐2 小时前
极狐GitLab 功能标志详解
linux·运维·服务器·elasticsearch·gitlab·极狐gitlab
jinan8863 小时前
加密软件的发展:从古典密码到量子安全
大数据·运维·服务器·网络·安全·web安全
MUMUoO3 小时前
Windows平台上安装与使用Docker
docker
越学不动啦3 小时前
十、自动化函数+实战
运维·软件测试·自动化·测试
丑过三八线4 小时前
在Linux下安装Gitlab
linux·运维·gitlab
放情4 小时前
关于k8s的部署
java·docker·kubernetes