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 磁盘设备文件路径:次数 #限制容器在某个磁盘上写的速度

相关推荐
XIAOHEZIcode17 小时前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220701 天前
如何搭建本地yum源(上)
运维
武子康1 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn864 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化