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

相关推荐
VirusVIP37 分钟前
Windows CMD通过adb检查触摸屏Linux驱动是否被编译
linux·运维·adb
chennalC#c.h.JA Ptho40 分钟前
ubuntu studio 系统详解
linux·运维·服务器·经验分享·ubuntu·系统安全
东方未明01082 小时前
docker(一)前言:高并发服务端技术架构的演进
docker·性能优化·高并发·虚拟化·容器化
yt948325 小时前
Docker-基础(数据卷、自定义镜像、Compose)
运维·docker·容器
Hfc.5 小时前
docker-daemon.json
docker·容器·json
和计算机搏斗的每一天5 小时前
k8s之探针
云原生·容器·kubernetes
水银嘻嘻7 小时前
web 自动化之 KDT 关键字驱动详解
运维·自动化
Vone_667 小时前
node.js 邮箱验证服务器搭建
运维·服务器·node.js
丢丢丢丢丢丢~8 小时前
apache2的默认html修改
linux·运维·服务器
wusam8 小时前
Linux系统管理与编程20:Apache
linux·运维·服务器·apache·shell编程