命名空间 |
系统调用参数 |
隔离内容 |
UTS |
CLONE_NEWUTS |
隔离主机和域名 在UTS这个命名空间创建进程,进程可以看到自己的主机名和域名,与其他进程分隔开 |
IPC |
CLONE_NEWIPC |
隔离信号量、消息队列、共享内存 在IPC这个命名空间之中,进程可以拥有独立的进程间通信资源 |
PID |
CLONE_NEWPID |
每个进程都有自己独立的进程号空间 |
network |
CLONE_NEWNET |
隔离网络设备、网络栈、端口 每个进程都有一个自己独立的网络资源(端口号) |
mount |
CLONE_NEWNS |
隔离挂载点 在mount这个命名空间之中,每个进程或者设备都有自己的文件系统挂载点,相互之间互不干扰 |
user |
CLONE_NEWUSER |
隔离不同的用户和用户组 |
特性 |
docker |
虚拟机 |
启动速度 |
秒级 |
分钟级 |
计算能力损耗(占CPU) |
几乎无 |
损耗50% |
性能 |
接近于原生系统 |
弱于原生系统 |
系统支持量 |
上千个 |
硬件系统来看(几十个) |
隔离性 |
资源隔离 |
完全隔离 |
安全性 |
安全性差 |
安全性高 |
docker-ce |
docker的社区办,免费,面向开发者,小型团队和个人使用 |
docker-ce-cli |
提供docker的命令行工具 |
contarnerd.io |
负责管理容器的生命周期(创建、运行、停止、运行、销毁) |
overlay2:docker使用的文件系统驱动 |
|
overlayFS |
overlay file system:联合文件系统,用于适配宿主机的文件系统,可以自动适配 |
lowerDir |
底层目录,docker的底层文件系统,是一个或者多个镜像文件的根文件系统 |
UpperDir |
可写目录,可以在容器运行时,在容器内进行写操作,实现容器的可写性 |
MergeDir |
合并目录,合并lowerDir和UpperDir,就是容器的文件系统,用户看到的也就是这个合并的视图 |
WorkDir |
工作目录,处理文件系统变更,当在容器内进行写操作时,overlayFS使用WorkDir来跟踪文件系统的变更 |
docker的增删改查 |
|||
查看docker的版本 |
docker version |
||
查看docker的所有信息 |
docker info |
||
停止容器 |
docker stop 容器名/ID |
||
重启容器 |
docker restart 容器名/ID |
||
搜索镜像 |
docker search 镜像名称 |
||
获取镜像(镜像拉取) |
docker pull 镜像名称 docker pull centos docker pull centos:7 |
||
查看下载的镜像 |
docker images |
||
查看镜像的详细信息 |
docker inspect 镜像名称/镜像ID docker inspect centos:7(镜像名) docker inspect 5d0da3dc9764(镜像ID) |
||
给镜像打上不同的标签 |
docker tag centos:latest centos:new (标签—硬链接、复制了源镜像) |
||
删除镜像 |
docker rmi 镜像名称/镜像ID docker rmi centos:new docker rmi -f 5d0da3dc9764(强制删除) |
||
把镜像保存为本地文件 (镜像导出) |
docker save -o /opt/xx.tar 镜像名称/镜像ID docker save -o /opt/centos.tar centos:7 docker save -o /opt/centos1.tar 5d0da3dc9764 |
||
将镜像文件导入到镜像库中(镜像导入) |
docker load -i centos.tar |
||
上传镜像(先添加标签、再上传镜像) |
docker tag centos:latest hydedidi/centos:hyde docker login(登录公用仓库) docker push hydedidi/centos:hyde(上传镜像) |
||
基于镜像创建容器 |
docker create -it centos:7 /bin/bash |
||
查看容器 |
查看正在运行的容器 |
docker ps |
|
查看所有的容器 |
docker ps -a |
||
启动容器 |
docker start 容器名称/ID docker start friendly_bardeen docker start 0d9aef184f4a |
||
进入正在运行的容器 |
docker exec -it 容器名称/ID bash docker exec -it 0d9aef184f4a bash docker exec -it friendly_bardeen bash |
||
同时创建和运行容器(且未创建镜像) |
docker run -itd --name hyde1 nginx /bin/bash |
||
把文件从容器中复制到主机 |
docker cp hyde1:/etc/nginx/nginx.conf /opt/ |
||
把主机的文件复制回容器 |
docker cp /opt/nginx.conf hyde1:/etc/nginx/ |
||
容器导出为快照文件(xx.tar格式的文件名) |
docker export -o nginx.tar hyde1 docker export hyde1 > nginx1.tar (不指定目录,默认是当前目录) docker export -o /opt/data/nginx.tar hyde1 docker export hyde1 > /opt/data/nginx.tar |
||
容器导入(导入为镜像) |
docker import nginx.tar -- nginx:hyde2(镜像名称:标签名) 标签名不能重复,否则会出现none |
||
删除容器 |
删除未在运行的容器 |
docker rm test1(容器名/ID) |
|
删除正在运行的容器 |
docker rm -f test1 |
||
先停止:docker stop test1 |
|||
再删除:docker rm test1 |
|||
批量操作 |
批量停止容器: docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash |
||
批量删除后台停止的容器: docker rm $(docker ps -a -q) |
|||
批量删除所有容器(先停再删、慎用): docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm |
|||
批量删除none镜像(推荐): docker images | grep "none" | awk '{print $3}' | xargs docker rmi -f |
|||
docker的网络模式 |
bridge模式,默认桥接模式,在创建docker时不需要指定网络类型 |
||
host模式,容器将不会虚拟出自己的网卡、IP地址,全部使用宿主机的IP地址和端口 |
|||
container模式,容器和容器之间共用一个ip和端口,不能同时起 |
|||
none模式:没有网卡、ip、路由,只有本地lo回环网络(127.0.0.1),容器不可以联网 |
|||
自定义网络:自定义网络在创建容器时,可以给容器指定ip地址(可以给docker创建一个自己定义的网段) |
|||
随机分配端口 |
docker run -itd --name hyde1 -P nginx /bin/bash |
||
指定分配端口 |
docker run -itd --name hyde4 -p 4300:80 nginx:1.22.0 /bin/bash |
||
查看日志 |
docker run -itd --name hyde3 -P nginx(创建容器时不加/bin/bash) |
||
查看日志 |
docker logs hyde3(容器名/ID) |
||
动态查看 |
docker logs -f hyde3 |
||
从尾部查看10条 |
docker logs --tail=10 hyde3 |
||
动态从尾部查看10条 |
docker logs --tail=10 -f hyde3 |
||
创建host模式 (使用宿主机的ip和端口) |
docker run -itd --name hyde4 --network host(网络模式) nginx /bin/bash |
||
创建container模式 (容器和容器之间共用一个ip和端口) |
docker run -itd --name hyde5 --network=container:hyde1 nginx /bin/bash |
||
创建none模式 |
docker run -itd --name hyde6 --network=none nginx /bin/bash |
||
查看docker的网络 |
docker network ls |
||
删除docker网络 |
docker network rm 网络名称 |
||
创建自定义网段 |
先创建自定义网络: docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork |
||
再在创建容器时指定IP地址: docker run -itd --name hyde3 --network mynetwork --ip 172.18.0.10 nginx /bin/bash |
|||
宿主机和容器实现数据共享 |
创建容器+数据卷(-v): docker run -itd --name hyde1 -v /opt/test1:/opt/test centos:7 /bin/bash |
||
设置容器的挂载目录为只读模式: docker run -itd --name hyde2 -v /opt/test2:/opt/test1:ro centos:7 /bin/bash |
|||
容器和容器之间实现数据共享 |
docker run -itd --name hyde3 -v /opt/data1 -v /opt/data2 centos:7 /bin/bash |
||
创建交互: docker run -itd --volumes-from hyde3 --name hyde4 centos:7 /bin/bash |
|||
容器互联 (两个容器之间实现网络通信,network模式不需要做映射) |
docker run -itd -P --name test11 --network=mynetwork centos:7 /bin/bash docker run -itd -P --name test22 --network=mynetwork centos:7 /bin/bash |
||
指定端口创建数据库容器 |
docker run -itd --name mysql1 -p 33066:3306 -v /log/mysql_log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.20 |
||
cat cpu.cfs_period_us |
100000 |
||
cat cpu.cfs_quota_us |
-1 |
||
CPU的资源控制: |
|||
创建容器时限制占用CPU的时间 |
docker run -itd --name test2 --cpu-quota 40000 centos:7 /bin/bash |
||
设置容器占用cpu的权重比 (多个容器才能生效) |
docker run -itd --name test3 --cpu-shares 512 centos:7 /bin/bash docker run -itd --name test4 --cpu-shares 1024 centos:7 /bin/bash |
||
设置容器绑定cpu |
docker run -itd --name test5 --cpuset-cpus 0,2 centos:7 /bin/bash |
||
内存的资源控制: |
|||
创建容器时限制内存 |
docker run -itd --name test6 -m 512m centos:7 /bin/bash |
||
--(了解): |
|||
docker run -itd --name test7 -m 512m --memory-swap=1g centos:7 /bin/bash |
|||
磁盘I/O的资源限制(了解): |
|||
限制容器在磁盘上的读速度 |
docker run -itd --name test8 --device-read-bps /dev/sda:1M centos:7 /bin/bash |
||
限制容器在磁盘上的写速度 |
docker run -itd --name test9 --device-write-bps /dev/sda:1mb centos:7 /bin/bash |
||
限制容器读取的次数 |
docker run -itd --name test1 --device-read-iops /dev/sda:100 centos:7 /bin/bash(每秒读100次) |
||
限制容器写入的次数 |
docker run -itd --name test2 --device-write-iops /dev/sda:50 centos:7 /bin/bash(每秒写50次) |
||
清理docker占用的磁盘空间 |
docker system prune -a |
||
占用CPU的时间10000,占用CPU的权重256,占用内存1G,只能使用CPU1 CPU1docker run -itd --name centos1 --cpu-quota 10000 --cpu-shares 256 -m 1g --cpuset-cpus 1 centos:7 /bin/bash |
name |
表示镜像名称 |
DESCRIPTION |
描述信息 |
stars |
好评数量 |
OFFICIAL |
表示官方镜像 |
AUTOMATED |
是否是自动化构建 |
4、查看下载的镜像:docker images
REPOSITORY |
镜像所属的仓库 |
TAG |
标签,可以理解为版本,标记一个仓库的不同镜像 |
IMAGE ID |
镜像的唯一标识,不会重复 |
CREATED |
镜像的创建时间 |
SIZE |
镜像的大小 |
5、查看镜像的详细信息:docker inspect 镜像名称/镜像ID
8、把镜像保存为本地文件:docker save -o /opt/xx.tar 镜像名称/镜像ID(镜像导出)
9、将镜像文件导入到镜像库中(镜像导入):docker load -i centos.tar
-i |
表示让容器开启标准输入,用于接受用户的输入命名 |
-t |
给这个容器分配一个终端,这是一个虚拟的伪终端 |
-it |
形成一个宿主机和容器之间的一个可以交互的shell命令行 |
CONTAINER ID |
容器的ID号 |
IMAGE |
加载的镜像 |
COMMAND |
运行的程序 |
CREATED |
创建时间 |
STATUS |
当前的状态 |
PORTS |
端口映射 |
NAMES |
名称 |
-d |
可以让创建的容器以守护进程在后台运行,容器所运行的程序不会结束 |
(2)运行的程序是 /bin/bash,和-d结合,给容器一个持续运行的命令,若后台没有指令,容器没有可运行的程序,将会直接退出 |
|
-it |
形成交互式会话 |
-d |
后台运行 /bin/bash |
--name |
给容器命名 |
nginx:1.22.0 |
镜像名称和标签,如果本地没有,可以自动下载(不指定,默认最新版本) |
(3)批量删除所有容器(先停再删、慎用):docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm
(4)批量删除none镜像(推荐):docker images | grep "none" | awk '{print $3}' | xargs docker rmi -f
hyde1:使用的是宿主机的20.0.0.10:80(宿主机的80端口) |
hyde2:使用的也是宿主机的20.0.0.10:80(宿主机的80端口) |
随机分配端口:docker run -itd --name hyde1 -P nginx /bin/bash 指定分配端口:docker run -itd --name hyde4 -p 4300:80 nginx:1.22.0 /bin/bash |
|
-P:在创建容器时,在宿主机和容器之间做一个端口映射,-P随机分配一个端口给宿主机,容器的端口是不变的 -p:指定端口,人为设置固定的端口映射(指定端口映射,宿主机的端口一定不能被占用 ) |
|
-P 32768开始 |
|
实际上,docker是在宿主机和容器之间做一个iptables的NAT地址转换 |
/bin/bash |
为了让容器后台有一个运行程序,保证容器不会退出 |
-d |
后台守护运行,但时间一长容器可能会自动退出 |
/bin/bash就是容器的标准输出,docker logs捕获的是cmd和entrypoint的标准输出,/bin/bash和捕获日志会冲突 |
查看日志 |
docker logs hyde3(容器名/ID) |
动态查看 |
docker logs -f hyde3 |
从尾部查看10条 |
docker logs --tail=10 hyde3 |
动态从尾部查看10条 |
docker logs --tail=10 -f hyde3 |
7、创建container模式:容器和容器之间共用一个ip和端口
8、创建none模式:没有网卡、ip、路由,只有本地lo回环网络(127.0.0.1)
9、创建自定义网段:基于bridge模式,可以给docker创建一个自己定义的网段
NETWORK ID |
是docker网络唯一的网络id |
NAME |
docker网络的名称 |
DRIVER |
docker网络的驱动程序 |
SCOPE |
表示网络的作用范围 |
--opt “com.docker.network.bridge.name”=”docker1” 可以不加,但是网卡名称会比较难以识别 |
|
--subnet=172.0.0.0/16 |
声明网段 |
mynetwork |
自定义网络的名称 |
(1)新版本(network自定义网络实现网段互ping)
docker run -itd -P --name test11 --network=mynetwork centos:7 /bin/bash docker run -itd -P --name test22 --network=mynetwork centos:7 /bin/bash |
--cpu-period |
设置容器调度CPU的周期 |
|
--cpu-quota |
设置在每个周期内,容器可以使用CPU的时间 |
|
*以上两个可以配合使用 *CFS周期的有效范围:1ms-1s,--cpu-period(1000-1000000) *容器使用CPU的配额时间必须大于1ms,--cpu-quota的值必须是>=1000 |
||
docker stats 容器名/ID |
查看容器的运行、占用宿主机资源的情况 |
|
docker top 容器名/ID |
可以查看容器内PID和宿主机PID的映射关系 |
cat cpu.cfs_period_us |
|
100000 |
* 100毫秒,CFS调度周期的长度(微妙),在每一周期内,容器可以使用指定比例的CPU时间,默认情况都是100毫秒 * 每100毫秒调度一次容器请求CPU的资源,然后内核把CPU资源分配给容器 |
cat cpu.cfs_quota_us |
|
-1 |
* 表示容器使用宿主机CPU的时间没有任何限制 * 调度请求之后,请求配额,内核分配给容器使用cpu的时间 |
--cpu-shares |
指定容器占用cpu的份额,模式权重1024,设置的值只能是1024的倍数 |
--cpu-shares是给每个容器使用cpu设置了相对的权重,权重高的,可以使用cpu的资源更多,但是,如果只有一个容器在运行,即便设置了权重,但是没有其他更高的权重的容器来占用资源,权重低的容器依然不受限 |
6、限制使用swap(了解)
要限制容器使用swap,必须和限制内存一起使用 |
|
-m 512m --memory-swap=1g |
容器实际上能够使用的swap空间是1G-512m=512m |
-m 512m(不限制swap空间) |
器实际上能够使用的swap空间是容器内存限制的2倍,512m*2=1G |
-m 512m --memory-swap=512m |
容器不能使用swap空间 |
-m 512m --memory-swap=-1 |
内存受限还是512m,但是容器使用swap空间不再限制 |