第一讲
系内核中直接进行虚拟化的资源有以下几种
- UTS HOSTNAME
- MOUNT 挂载点,首次登陆Linux(
- IPC 进程间通信
- PID "chroot"进程树
- USER 将本地的虚拟user-id映射到真实的user-id
- NET 网络访问,包括接口(之后的文章会讲到)
全部满足以下条件的至少内核为3.8 至少使用centos7以下的系统
Cgroup = Control Group
对系统资源进行管理的程序
第一个容器化产品 LXC Linux Container = 管理了 Cgroup+namespace + chroot 技术
Docker 和 LXC的区别
角度 | LXC | Docker | |
运行方式 | 使用namespace运行多个进程 | 一个docker只能运行一个进程 | |
安装方式 | 自行现场安装 | 直接从hub下载,无须自行定义 | |
- 大规模使用docker时必须有编排工具,否则相比虚拟机来说是增加了工作量
- docker运行方式 “分层构建 联合挂载” 那么意思是不是docker run时可以挂载两个image镜像呢? (不是那样的,意思是一个运行在centos7.2的nginx镜像已经打包了底层依赖环境,不需要运维人员来操作,可直接挂载使用。)
- 使用docker的思想 一个docker启动一个进程, 他就是一个普通的进程,非常方便,挂再外部目录进行存贮
为什么需要容器编排工具:
1、我们有很多台服务器,为了使资源不滥用或过度空闲 ,就需要将需求(业务端)和资源端(服务器)对接起来,将这个需求放到最合适的服务器上并开始构建,人是不知道那台服务器闲置的(或需要提前查验),编排工具就可以;
2、一些服务启动或关闭有依赖关系(dependent)关系,这些docker本身也无法解决,也需要编排工具来解决。 如lnmp搭配的系统 ;
k8s是谷歌出的 后来捐献给了 CNCF
目前容器领域是 k8s +docker 两种方式,虽然 不论是在编排领域还是容器领域都有替代者,但这两者已经成为事实上的工业标准
第二讲
docker 支持restful风格,所有的资源都是一种资源,支持增删改查的操作 ,如下面的对象
- Image
- Containers
- Networks
- Volumes
- Plugins And Other Object
默认创建的docker 使用的网络为 bridge 桥,除非特别指定了网络
docker inspect host_nginx #检查某一个Container 的参数 情况
[root@vhost-xiaoshancun docker]# docker network ls #显示所有的网桥
NETWORK ID NAME DRIVER SCOPE
59ef2c6e4969 bridge bridge local
f8bd30438a48 host host local
68447dbf6019 none null local
1
docker inspect host_nginx #检查某一个Container 的参数 情况
2
[root@vhost-xiaoshancun docker]# docker network ls #显示所有的网桥
3
NETWORK ID NAME DRIVER SCOPE
4
59ef2c6e4969 bridge bridge local
5
f8bd30438a48 host host local
6
68447dbf6019 none null local
docker 的状态转换及常用命令
第三讲: docker network
docker之间互联使用的是SDN类型的通信
yum install bridge-util
[root@vhost-xiaoshancun ~]# brctl show #显示虚拟交换机上端口的连接情况
1
yum install bridge-util
2
[root@vhost-xiaoshancun ~]# brctl show #显示虚拟交换机上端口的连接情况
docker使用的是 overlay network 类型 叠加网络
意思是 如果两台docker位于两台不同的物理主机上
C1到C2的报文发送顺序为:
1、C1发起tcp请求, 源地址为C1,目标地址为C2
2、C1所在的物理主机上生成的DOCKER逻辑网桥 发现c2不在本物理主机上(ip list show 能看到本机的的设备)
3、C1所的逻辑网络会将次报文转发给物理主机的网卡(nat地址转换),主机会进行二次三层封装,在原来报文基础上增加物理主机的包头 , 源地址为H1主机,目标为H2主机
4、H2主机收到后会解开报文,发现目标地址为C2的报文,然后会转给C2的逻辑网桥,
5、C2所在的逻辑网桥会转发报文给C2的DOCKER 至此完成报文转发过程
如果需要进一步共享的话 最多再共享 UTS NET IPC 三种资源 。
[root@vhost-xiaoshancun ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
0865d189a638 bridge bridge local # 普通的叠加网络效果
f8bd30438a48 host host local # 直接管理宿主机网络,修改会影响宿主机
68447dbf6019 none null local #指定的docker不启用网络功能
1
[root@vhost-xiaoshancun ~]# docker network ls
2
NETWORK ID NAME DRIVER SCOPE
3
0865d189a638 bridge bridge local # 普通的叠加网络效果
4
f8bd30438a48 host host local # 直接管理宿主机网络,修改会影响宿主机
5
68447dbf6019 none null local #指定的docker不启用网络功能
另外默认的还有 macvlan overlay 网络机制 除此之外 还可以自定义网络
第四讲: 容器虚拟化网络概述
docker能使用的网络容器可以分为以下四种
- 无网络接口的 Close container none
- 桥接的 bridged container
- 部分共享名称空间后直联的docker -联盟式容器 (两个容器有独立的MOUNTUSERPID ,但共享netIPCUTS)
- 直接使用宿主机的网络 host
常用命令:
[root@vhost-xiaoshancun ~]#docker inspect host_nginx #最后会docker container名称 可以显示container的详细配置信息
[root@vhost-xiaoshancun ~]# ip link show #显示虚拟网卡情况
[root@vhost-xiaoshancun ~]# brctl show #显示虚拟交换机上端口的连接情况
1
[root@vhost-xiaoshancun ~]#docker inspect host_nginx #最后会docker container名称 可以显示container的详细配置信息
2
[root@vhost-xiaoshancun ~]# ip link show #显示虚拟网卡情况
3
[root@vhost-xiaoshancun ~]# brctl show #显示虚拟交换机上端口的连接情况
4
5
第五讲: docker网络2
docker网络名称空间的 测试方法
使用ip 命令 可以测试设备在不同名称空间的移动效果 ,能确定不同的设备同一时刻只能从属于某一个名称空间
各种容器的创建方法 如果容器里有多个端口需要暴露的话可多次使用-p即可
[root@vhost-xiaoshancun ~]# docker run --name t1 --rm --network bridge -it busybox #bridge桥接方式
[root@vhost-xiaoshancun ~]# docker run --name t1 --rm --network host -it busybox # 创建host方式网卡
[root@vhost-xiaoshancun ~]# docker run --name t1 --rm --network none -it busybox #创建none无网卡主机
root@vhost-xiaoshancun ~]# docker run --name host_nginx -p 81:80 --rm -d nginx
[root@vhost-xiaoshancun ~]# docker port host_nginx #绑定指定端口,所有宿主机IP
80/tcp -> 0.0.0.0:81
[root@vhost-xiaoshancun ~]# docker run --name host_nginx -p 192.168.72.129::80 --rm -d nginx # 第三种是指定IP的
[root@vhost-xiaoshancun ~]# docker port host_nginx
80/tcp -> 192.168.72.129:32768
[root@vhost-xiaoshancun ~]# docker run --name host_nginx -P --rm -d nginx #大写的p 自动暴露容器中所有服务
1
[root@vhost-xiaoshancun ~]# docker run --name t1 --rm --network bridge -it busybox #bridge桥接方式
2
[root@vhost-xiaoshancun ~]# docker run --name t1 --rm --network host -it busybox # 创建host方式网卡
3
[root@vhost-xiaoshancun ~]# docker run --name t1 --rm --network none -it busybox #创建none无网卡主机
4
root@vhost-xiaoshancun ~]# docker run --name host_nginx -p 81:80 --rm -d nginx
5
[root@vhost-xiaoshancun ~]# docker port host_nginx #绑定指定端口,所有宿主机IP
6
80/tcp -> 0.0.0.0:81
7
8
[root@vhost-xiaoshancun ~]# docker run --name host_nginx -p 192.168.72.129::80 --rm -d nginx # 第三种是指定IP的
9
[root@vhost-xiaoshancun ~]# docker port host_nginx
10
80/tcp -> 192.168.72.129:32768
11
12
[root@vhost-xiaoshancun ~]# docker run --name host_nginx -P --rm -d nginx #大写的p 自动暴露容器中所有服务
13
14
创建带IP端口映射的容器
[root@vhost-xiaoshancun ~]# docker run --name host_nginx --rm -p 80 -d nginx #随机端口映射
[root@vhost-xiaoshancun ~]# docker port host_nginx #查看某一个容器的具体映涉信息
80/tcp -> 0.0.0.0:32769
1
[root@vhost-xiaoshancun ~]# docker run --name host_nginx --rm -p 80 -d nginx #随机端口映射
2
[root@vhost-xiaoshancun ~]# docker port host_nginx #查看某一个容器的具体映涉信息
3
80/tcp -> 0.0.0.0:32769
创建 joiner Container 联合容器 第二个容器使用第一个容器的网络
注: 网桥host是一种特殊的joiner模式
[root@vhost-xiaoshancun ~]# docker run --name host1 --rm -itd nginx
[root@vhost-xiaoshancun ~]# docker run --name host2 --network container:host1 --rm -d nginx
1
[root@vhost-xiaoshancun ~]# docker run --name host1 --rm -itd nginx
2
[root@vhost-xiaoshancun ~]# docker run --name host2 --network container:host1 --rm -d nginx
修改docker bridge 的IP地址
默认bridge的网段为172.16.0.0 网段,这个可以修改 ,方法为修改/etc/docker/deamon.json 文件,添加如下内容
"bip":"10.0.0.1/16" # 后面的IP和网段可以修改
1
"bip":"10.0.0.1/16" # 后面的IP和网段可以修改
默认docker命令只能管理运行在本机的docker容器和image ,如果需要将本机的docker分享出来让其他管理器访问并维护管理的话可以修改本机的deamon.json文件 增加以下选项
"hosts":["tcp://192.168.1.2:2375","unix///var/run/docker.sock "]
1
"hosts":["tcp://192.168.1.2:2375","unix///var/run/docker.sock "]
远程服务器调用时 使用 docker -H 192.16.1.2:2375 ps 命令等
自定义网桥(软交换机) 并配置使用
[root@vhost-xiaoshancun ~]# docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" mybr0
docker run --name host2 -it --network mybr0 busybox
1
[root@vhost-xiaoshancun ~]# docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" mybr0
2
docker run --name host2 -it --network mybr0 busybox
按说在同一主机上不同网段的docker是可以通信的,但实际上并没有通信
第六讲 06-Docker存储卷
docker在使用image启动docker时会自动在最上层添加一个读写层 ,叫“写时复制”
通常容器可当做一个进程使用,启动时创建,关闭时自动删除 ,也就是需要加 -rm参数
容器使用存储卷技术实现数据持久化存储 。 -V使用 共享存储实现
常见的服务可以分成有状态的服务和无状态的服务两种,
- 有状态的服务: mysql、redis、tomcat 需要持久存储。
- 无状态的服务: nginx
docker volumn 默认是使用宿主机的存储资源,但如果能结合共享存储的话会实现随意部署 存在的意义
- 实现了运行 运行基础 image和 volumn ,实现了volumn重用
- 实现了 容器和 volumn的分离, 可以让容器部署在任意的主机,不在和某一台主机绑定 为云计算和资源编排打下良好基础;
docker 有两种volume
- bind container volumn 即需要手工指定宿主机和容器内目录的绑定关系
- docker manger volumn 不需要特别指定绑定关系,而由docker管理, 一般绑定的目录为 /var/lib/docker/volumes/contanier id 目录下
实例操作
docker mangager管理方式 此方式创建的文件会在容器删除后自动删除,不能实现真正的持久化
[root@vhost-xiaoshancun ~]# docker run --name node1 --rm -itd -v /data busybox
容器内的/data挂载到了宿主机的 /var/lib/docker/volumes/ca6b361b2398ceb7f11eb2ab131d1f58a52040c18f38f478e0d135e7613b81c2/_data
宿主主内外都可以修改 注意 dockerid目录会在docker删除后会自动删除
[root@vhost-xiaoshancun _data]# docker inspect node1 #查看node1的配置 mount环节 可以看到mount类型为volume
"Mounts": [
{
"Type": "volume",
"Name": "ca6b361b2398ceb7f11eb2ab131d1f58a52040c18f38f478e0d135e7613b81c2",
"Source": "/var/lib/docker/volumes/ca6b361b2398ceb7f11eb2ab131d1f58a52040c18f38f478e0d135e7613b81c2/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
1
[root@vhost-xiaoshancun ~]# docker run --name node1 --rm -itd -v /data busybox
2
容器内的/data挂载到了宿主机的 /var/lib/docker/volumes/ca6b361b2398ceb7f11eb2ab131d1f58a52040c18f38f478e0d135e7613b81c2/_data
3
宿主主内外都可以修改 注意 dockerid目录会在docker删除后会自动删除
4
[root@vhost-xiaoshancun _data]# docker inspect node1 #查看node1的配置 mount环节 可以看到mount类型为volume
5
6
7
"Mounts": [
8
{
9
"Type": "volume",
10
"Name": "ca6b361b2398ceb7f11eb2ab131d1f58a52040c18f38f478e0d135e7613b81c2",
11
"Source": "/var/lib/docker/volumes/ca6b361b2398ceb7f11eb2ab131d1f58a52040c18f38f478e0d135e7613b81c2/_data",
12
"Destination": "/data",
13
"Driver": "local",
14
"Mode": "",
15
"RW": true,
16
"Propagation": ""
17
}
18
19
20
bind 方式创建的目录在容器删除后依旧可以实现持久化存储,不会删除或灭失
绑定时指定的宿主机目录不需要事先创建,会在启动container时自动建立
[root@vhost-xiaoshancun ~]# docker run --name node1 --rm -itd -v /dockers/volumen/node1:/data busybox
在宿主机的/dockers/volumen/node 中修改增加的文件会在容器中体现 ,相反一致
[root@vhost-xiaoshancun _data]# docker inspect node1 #查看node1的配置 mount环节 可以看到mount类型为bind
"Mounts": [
{
"Type": "bind",
"Source": "/dockers/volumen/node1",
"Destination": "/data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
[root@vhost-xiaoshancun node1]# docker inspect -f {{.Mounts}} node1 #只看某一段数据
[{bind /dockers/volumen/node1 /data true rprivate}]
1
绑定时指定的宿主机目录不需要事先创建,会在启动container时自动建立
2
[root@vhost-xiaoshancun ~]# docker run --name node1 --rm -itd -v /dockers/volumen/node1:/data busybox
3
4
在宿主机的/dockers/volumen/node 中修改增加的文件会在容器中体现 ,相反一致
5
[root@vhost-xiaoshancun _data]# docker inspect node1 #查看node1的配置 mount环节 可以看到mount类型为bind
6
"Mounts": [
7
{
8
"Type": "bind",
9
"Source": "/dockers/volumen/node1",
10
"Destination": "/data",
11
"Mode": "",
12
"RW": true,
13
"Propagation": "rprivate"
14
}
15
16
[root@vhost-xiaoshancun node1]# docker inspect -f {{.Mounts}} node1 #只看某一段数据
17
[{bind /dockers/volumen/node1 /data true rprivate}]
18
联合容器 共享同一组 net、IPC、mount
在单机中编排容器时,可以使用docker-compare软件(ebey阮一鸣也讲到了这个软件)
创建nginx1容器时,网络使用node1,存储设备也可以此用
[root@vhost-xiaoshancun ~]# docker run --name nginx1 --rm --network container:node1 --volumes-from node1 nginx
1
[root@vhost-xiaoshancun ~]# docker run --name nginx1 --rm --network container:node1 --volumes-from node1 nginx
第七讲:dockerfile文件详解
dockerfile文件 是一个基于image文件生成container文件的一个描述文件,加载了能够生成container时需要用到的source code
dockfile文件中应该包含的内容及举例子
- 样式是LABEL <key>=<value>
- 使用LABEL标签将元数据添加到image中
- 一个image可以有多个key-value键值对
- add 宿主机的tar.gz文件到容器中时,相当于执行了 -x -C指令,解压并放到指定的目录中
- add 一个url(非宿主机)的tar.gz文件到容器中时,只是添加了文件,并不会解压
- ENV 指令 用于在编译image和生成容器RUN时使用的环境变量,一次定义,两次都可直接使用。
- RUN 用于编译新的image时执行的命令 CMD执令是用户基于新的image生成container时使用的命令
- EXPOSE 暴露出容器对外服务的端口 ,可一次性提供多个端口 在宿主机上绑定时还需要使用-P指令 双向暴露才会真正提供服务
- WORKDIR 指定容器内的当前工作目录
docker build -t xiaoshancun/httpd:V0.1-10 . #编译生成新的image文件
1
docker build -t xiaoshancun/httpd:V0.1-10 . #编译生成新的image文件
docker run --name httpd1 --rm xiaoshancun/httpd:V0.1-7 /bin/httpd -f -h /usr/local/html/ #启动一个带端口的http服务
[root@vhost-xiaoshancun Docker_dockfile]# docker run --name httpd1 --rm -P xiaoshancun/httpd:V0.1-7 /bin/httpd -f -h /usr/local/html
[root@vhost-xiaoshancun Docker_dockfile]# docker port httpd1 #可以看出已经暴露了端口
80/tcp -> 0.0.0.0:32769
1
docker run --name httpd1 --rm xiaoshancun/httpd:V0.1-7 /bin/httpd -f -h /usr/local/html/ #启动一个带端口的http服务
2
[root@vhost-xiaoshancun Docker_dockfile]# docker run --name httpd1 --rm -P xiaoshancun/httpd:V0.1-7 /bin/httpd -f -h /usr/local/html
3
[root@vhost-xiaoshancun Docker_dockfile]# docker port httpd1 #可以看出已经暴露了端口
4
80/tcp -> 0.0.0.0:32769
以下示例Dockerfile文件中常用的一些参数, 已经测试过可以正常使用 对应上面所说的各种情况,可配合使用
# Dockerfile文件示例
FROM busybox:latest
MAINTAINER "likaifeng<likaifeng@126.com>"
ENV DOC_ROOT="/usr/local/html/"
NGINX_VERSION="nginx-1.16.1"
COPY index.html ${DOC_ROOT:-/usr/local/html/}
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/nginx-1.16.1.tar.gz /usr/local/src/
WORKDIR /usr/local/src/
#ADD nginx-1.16.1.tar.gz ./
RUN cd /usr/local/src/ &&
tar -xzvf nginx-1.16.1.tar.gz
VOLUME /data/mysql/
EXPOSE 80/tcp
1
# Dockerfile文件示例
2
FROM busybox:latest
3
MAINTAINER "likaifeng<likaifeng@126.com>"
4
ENV DOC_ROOT="/usr/local/html/"
5
NGINX_VERSION="nginx-1.16.1"
6
COPY index.html ${DOC_ROOT:-/usr/local/html/}
7
COPY yum.repos.d /etc/yum.repos.d/
8
ADD http://nginx.org/download/nginx-1.16.1.tar.gz /usr/local/src/
9
WORKDIR /usr/local/src/
10
#ADD nginx-1.16.1.tar.gz ./
11
RUN cd /usr/local/src/ &&
12
tar -xzvf nginx-1.16.1.tar.gz
13
VOLUME /data/mysql/
14
EXPOSE 80/tcp
第八节 : Dockerfile 详解2
进程运行的几种方式
#COMMAND #运行在当前shell之下的一个子进程
#COMMAND & #放到当前shell之下的一个后台子进程 ,shell中不能这样写
#nohub command & #由当前shell生成一个子进程,但不把依赖关系放给init使用 shell关闭后command进程不会终止
1
#COMMAND #运行在当前shell之下的一个子进程
2
#COMMAND & #放到当前shell之下的一个后台子进程 ,shell中不能这样写
3
#nohub command & #由当前shell生成一个子进程,但不把依赖关系放给init使用 shell关闭后command进程不会终止
docker 运行时可以给出多个cmd指令,但只运行最后一个
在使用docker run 时使用-e参数可传入ENV参数
dockerfile文件中的指令学习
- ARGS 在docker build过程中定义变量
- ENTRYPOINT 指令 为系统服务提供参数 ,本身仅提供参数 默认为/bin/bash -c 来运行
- HEALTHCHECK 容器服务状态监测
- ONBUILD 在dockfile中定义触发器 在这里定义的ONBUILD指令本次不运行,仅在以后别人引用本image时才会触发。 不能嵌套,可以任意指令,但接add,或 copy 时需注意是否有源文件
- USER 容器中使用指定的用户身份来运行
docker启动时及以后需要进行生命检测 HEALTHCHECK
以下为相关参数
- --interval 默认30S 监测间隔时间
- --timeout 默认30S 超时时间
- --start-period = 默认0s 从docker启动完成后多长时间开始检测服务是否正常
- resered 当监测失败后重试次数 默认为3次
状态码 :
0 :监测成功 1: 生命值状态异常 2 resered
信号值 stop 指令是 9 kill信号值为 15
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
1
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
2
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
3
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
4
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
5
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
6
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
7
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
8
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
9
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
10
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
11
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
12
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
13
63) SIGRTMAX-1 64) SIGRTMAX
docker官方有entruypoint.sh示例,可以多阅读。理解docker运行原理
第九节 :使用Harbour 构建docker私有仓库
实际使用docker时由于需要广泛部署docker,并不在一台主机上,所以需要使用私有repo
(需要补充查看)
第十节: Docker的系统资源限制及验正
- 内存
默认情况下的容器可以无限制使用主机的CPU,MEMORY,BLOCK io资源, 为了限制这一切行为,避免容器出现OOME(OUT OF MEMORY EXCEPTION)的情况,就需要对容器使用的 CPU,MEMORY,IO资源进行管理, 而这一切是基于linux 内核的 capabilities 功能
关于内存限制资源的使用说明
要 想限制swap分区,必须要设置物理memory内存的大小; 设置swap分区和物理分区时应当遵守以上原则
--oom-kill-disable 选项 意思是当系统发行oom时是否将此容器kill掉 ,如果这个容器很重要的话要设置成 True
- CPU资源
进程是有优先级的 调度优先级 1-99 20- -12 详细材料
测试
[root@vhost-xiaoshancun ~]# docker run --name stress --rm -m 512MB -it lorel/docker-stress-ng stree --vm 3
限制docker使用512MB内存,使用测试程序进行性能测试,启动vm * 2 单个vm为 256MB 已超过设置,但查看设置时并为超过使用限制
[root@vhost-xiaoshancun ~]# docker stats stress
ONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
6a527d8cc34b stress 252.00% 512MiB / 512MiB 100.00% 586B / 0B 1.59GB / 2.15GB 7
1
[root@vhost-xiaoshancun ~]# docker run --name stress --rm -m 512MB -it lorel/docker-stress-ng stree --vm 3
2
限制docker使用512MB内存,使用测试程序进行性能测试,启动vm * 2 单个vm为 256MB 已超过设置,但查看设置时并为超过使用限制
3
[root@vhost-xiaoshancun ~]# docker stats stress
4
5
ONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
6
6a527d8cc34b stress 252.00% 512MiB / 512MiB 100.00% 586B / 0B 1.59GB / 2.15GB 7
[root@vhost-xiaoshancun ~]# docker run --name stress --rm --cpus 2 -it lorel/docker-stress-ng stree --cpu 3
1
[root@vhost-xiaoshancun ~]# docker run --name stress --rm --cpus 2 -it lorel/docker-stress-ng stree --cpu 3
2
问题集:
1、既然docker客户机和共享宿主机内核的,那么在linux上能运行windows的的docker吗? 或者反过来可以操作吗?
现在好像可以了,以前的版本不行 ,不可以,在linux平台上下载windows的服务,如IIS时,会提示“no matching manifest for linux/amd64 in the manifest list entries”
2、在一台虚拟机上创建两个docker container ,使用不同的网段,如何让他能够互联互通?
3、在dockerfile文件中定义的maintanier项目编译完成后,应该使用那种命令或在那里查看maintainer ?
[root@vhost-xiaoshancun Docker_dockfile]# docker image inspect nginx:latest
1
[root@vhost-xiaoshancun Docker_dockfile]# docker image inspect nginx:latest
4、限制docker的CPU,MEMROY消费需要基于linux kernel 那么,是不是运行在windows环境的docker就无法限制资源使用情况了?