docker容器

1.容器的介绍
容器其实是一种沙盒技术。沙盒就是能够像一个集装箱一样,把你的应用"装"起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去。
2.容器的本质
容器的本质是进程。容器镜像就是这个系统里的".exe"安装包.
3.docker和原来的工具区别
传统的部署模式是:安装(包管理工具或者源码包编译)->配置->运行;
Docker的部署模式是:复制->运行
4.docker优势
交付标准化,即交付的都是做好的镜像。
应用隔离,容器和容器之间相互隔离
一次构建,多次交付
5.docker和vm的主要区别
表面区别:
容器占用体积小,虚拟机占用体积大
隔离性:容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。
启动速度:虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短。
容器使用宿主操作系统的内核,而虚拟机使用独立的内核。Docker 的局限性之一是,它只能用在64位的操作系统上。
本质区别:
容器是被隔离的进程
6.docker的安装
下载拓展源 epel源 然后 yum -y install docker
启动
systemctl start docker -ce #社区版
7.查看docker运行状态
docker info
8.拉取镜像
docker pull 镜像
9.docker加速器
可以去阿里下载,免费
10.daocloud里拉取镜像
也可以在这个页面里管理镜像。
11.查看镜像
docker images
12.运行镜像
docker run -itd 镜像 /bin/bash
也可以 --name 指定名字
13.阿里仓库
登录docker login --username=lkky registry.cn-shanghai.aliyuncs.com
Password:
打标记docker tag daocloud.io/library/nginx:latest registry.cn-shanghai.aliyuncs.com/youngfit/nginx:1.1
上传到仓库 docker push registry.cn-shanghai.aliyuncs.com/youngfit/nginx:1.1
14.搜索镜像
docker search centos
#按星级搜索
docker search centos -s 100
docker search centos -f stars=100
15.查看镜像详情
docker inspect 镜像id/名字
16.删除镜像
docker rmi id/名字+版本
参数解释
rm 移除一个或多个容器
rmi删除一个或多个镜像
–force -f 强制删除
删除全部 docker rmi $(docker images -q)
17.只查看镜像的id
docker images -q
18.查看镜像制作过程
docker history
19.创建容器但不启动
docker create -it 镜像
20.创建容器启动
docker run -it --restart=always daocloud.io/library/centos:7 /bin/bash #最常用
-i :标准输入输出
-t:分配一个终端或控制台
–restart=always:容器随docker engine自启动,因为在重启docker的时候默认容器都会被关闭
也适用于create选项
-d 后台运行容器,并返回容器ID
如果执行成功,说明Centos容器已经被启动,并且应该已经得到了bash提示符。
+++++
杠杠rm:默认情况下,每个容器在退出时,它的文件系统也会保存下来,另一方面。也可以保存容器 所产生的的数据。但是当你仅仅需要短暂的运行一个容器,并且这些数据不需要保存,你可能就希望Docker能在容器结束时自动清理其所产生的数据。这个时候就需要–rm参数了。
注意:–rm 和 -d 不能共用
容器名称
为容器分配一个名字,如果没有指定,docker会自动分配一个随机名称是docker run 子命令的参数
–name= Assign a name to the container
#docker run -it --name 名字 daocloud.io/centos:6 /bin/bash #名字自定义
若要断开与容器的链接,并且关闭容器:容器内部执行如下命令
exit
如果只想断开和容器的连接而不关闭容器:
ctrl+p+q
查看容器
只查看运行状态的容器: docker ps
查看所有的容器: docker ps -a
只看所有容器的id: docker -a -q
查看容器的详细配置信息: docker inspect name
启动容器
docker start name # 容器id也可以
关闭容器
docker stop name
docker kill name #强制杀死容器
docker kill $(docker ps -q)
stop和kill的区别
docker stop 命令给容器中的进程发送SIGTERM信号,默认行为是会导致容器退出,当然,容器内程序可以捕获该信号并自行处理,例如可以忽略。docker kill 则是给容器的进程发送SIGKILL信号,该信号将会使容器必然退出。
删除容器
docker rm 容器id或名称
要删除一个运行的容器,需要添加 -f 参数 --慎用。 先stop再删除
根据格式删除所有容器
docker rm $(docker ps -qf status=exited) # -f 过滤
pause :暂停容器中所有的进程
unpause :恢复容器内暂停的进程,与pause对应。
重启容器
docker restart name
让容器运行在后台
docker run -dit 镜像id /bin/bash # -d后台运行必须要加-it
如果在docker run后面追加-d=true或者-d,那么容器将会运行在后台模式。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为容器不再监听你执行docker run的这个终端命令行窗口。但你可以通过执行docker attach来重新附着到该容器的回话中。
docker attach 容器id/名字
注:容器运行在后台模式下,是不能使用–rm选项的(老版是这样的,新版本已经可以同时生效)
修改容器名字
docker rename mytest testmy
stats显示容器资源使用统计信息的实时流
docker stats #当有容器在运行的时候动态显示容器的资源消耗情况,包括:cpu、内存、网络I/O
连接容器
方法1: docker attach 容器id #前提必须指定了交互shell
方法2:交互式 docker exec -it 容器id /bin/bash
后台型 docker exec 容器id touch /testfile
监控容器的运行:
可以使用logs top wait这些子命令
logs:使用logs命令查看守护式容器
可以通过docker logs命令来查看容器运行日志,其中–tail选项可以指定查看最后几条日志,使用-f选项可以跟踪日志的输出,直到手动停止
top:显示一个运行的容器里面的进程信息
docker top nginx #容器id也可以
wait:捕捉容器停止时的退出码
执行此命令后,该命令会“hang”在当前终端,直到容器停止,此时,会打印出容器的退出码
宿主机和容器之间相互copy文件
Usage:
docker cp [OPTIONS] CONTAINER:PATH LOCALPATH --从容器拷贝到本机
docker cp mytest:/usr/local/bin/test.sh /root/
docker cp [OPTIONS] LOCALPATH CONTAINER:PATH --从本机拷贝到容器
docker cp /root/test.sh mytest:/usr/local/bin/
docker容器镜像制作
方式1 :容器文件系统打包。将容器的文件系统打包成tar文件,也就是把正在运行的容器直接导出为tar包的镜像文件
export
Export a container’s filesystem as a tar archive
第一种
docker export -o centos6-1.tar 容器id
第二种
docker export 容器名称 > 镜像.tar
导入镜像归档文件到其他宿主机
docker import centos6-1.tar centos6-1:v1
通过容器创建本地镜像
背景:容器运行起来后,又在里面做了一些操作,并且要把操作结果保存到镜像里
方案:使用docker commit指令,把一个正在运行的容器,直接提交为一个镜像。
commit是提交的意思,类似告诉svn服务器我要生成一个新的版本。
列子:
创建一个新镜像进行修改
然后保存 docker commit 容器id 新镜像的名字
-m #添加注释
-a # 作者
-p,pause=true 提交时暂停容器运行。
容器迁移
保存一台宿主机上的镜像为tar文件,然后可以导入到其他的宿主机上:
save
将镜像打包,与下面的load命令相对应。
docker save -o nginx.tar 镜像
load
导入镜像
docker load < nginx.tar
把容器导出成tar包 export import
把容器做成镜像 commit -a “” -m “”
把镜像保存为tar包 save load
通过Dockerfile创建镜像
docker build 命令用于根据给定的Dockerfile构建Docker镜像
-t 为新镜像起个名字
“.” 用来指明,我们使用的Dockerfile文件为当前目录
docker build -t name .
Dockerfile详见百度。
部署私有仓库应用
私有仓库镜像
拉取镜像
docker pull daocloud.io/library/registry:latest
运行容器
docker run -d -v /home/dockerdata/registry:/var/lib/registry --name “pri_registry” --restart=always -p 5000:5000 daocloud.io/library/registry
参数解释:/home/dockerdata/registry表示为宿主机的目录,如果不存在自动创建
-v映射目录: 宿主机的目录:容器目录
把宿主机的目录挂载到容器中,将数据目录挂载出来就是为了防止docker私有仓库这个容器被删除的时候,仓库里面的镜像也被删除。
-p 端口映射:本地端口:容器端口
注:如果创建容器不成功,报错防火墙,解决方案:
#systemctl stop firewalld
#yum install iptables*
#systemctl start iptables
#iptables -F
#systemctl restart docker
+++++++++++++++++++++++++++++++++
拉取镜像
docker pull daocloud.io/library/busybox
上传前必须给镜像打tag注明IP和端口:
docker tag daocloud.io/library/busybox 192.168.246.141:5000/busybox
注:tag后面可以使用镜像名称也可以使用id,我这里使用的镜像名称,如果使用官方的镜像,不需要加前缀,但是daocloud.io的得加前缀.
修改请求方式为http:
默认为https,不改会报以下错误:
Get https://master.up.com:5000/v1/_ping: http: server gave HTTP response to HTTPS client

[root@docker-server ~]# vim /etc/docker/daemon.json #不存在则创建
{ “insecure-registries”:[“192.168.246.141:5000”] }
重启docker
systemc restart docker
上传镜像到私有仓库
docker push ip:5000/busbox
宿主机查看存放镜像目录
ls /home/dockerdata/registry/docker/registry/v2/repositories/
查看私有仓库里的所有镜像
语法: # curl http://ip:port/v2/repo名字/tags/list
[root@docker-server ~]# curl http://192.168.246.141:5000/v2/busybox/tags/list
{“name”:“busybox”,“tags”:[“latest”]}
查看仓库下所有的镜像
curl http://192.168.246.141:5000/v2/_catalog
部署docker web UI应用
[root@docker-server ~]# docker pull uifd/ui-for-docker
[root@docker-server ~]# docker run -it -d --name docker-web -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock docker.io/uifd/ui-for-docker
浏览器访问9000端口
docker资源限制
在使用 docker 运行容器时,一台主机上可能会运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU、内存和磁盘资源。如果不对容器使用的资源进行限制,那么容器之间会互相影响,小的来说会导致容器资源使用不公平;大的来说,可能会导致主机和集群资源耗尽,服务完全不可用。
系统压力测试工具stress
stress是一个linux下的压力测试工具,专门为哪些想要测试自己系统,完全高负荷和监督这些设备运行的用户。
cpu资源限制----- 限制cpu Share
什么是cpu share
docker 允许用户为每个容器设置一个数字,代表容器的 CPU share,默认情况下每个容器的 share 是 1024。这个 share 是相对的,本身并不能代表任何确定的意义。当主机上有多个容器运行时,每个容器占用的 CPU 时间比例为它的 share 在总额中的比例。docker 会根据主机上运行的容器和进程动态调整每个容器使用 CPU 的时间比例。
例子:
如果主机上有两个一直使用 CPU 的容器(为了简化理解,不考虑主机上其他进程),其 CPU share 都是 1024,那么两个容器 CPU 使用率都是 50%;如果把其中一个容器的 share 设置为 512,那么两者 CPU 的使用率分别为 70% 和 30%;如果删除 share 为 1024 的容器,剩下来容器的 CPU 使用率将会是 100%。
好处:
能保证 CPU 尽可能处于运行状态,充分利用 CPU 资源,而且保证所有容器的相对公平;
缺点:
无法指定容器使用 CPU 的确定值。
设置CPU share 的参数
-c --cpu-shares, 它的值是一个整数
我的机器是4核CPU,因此运行一个stress容器,使用stress启动四个进程来产生计算机压力
[root@docker-server ~]# docker pull progrium/stress
[root@docker-server ~]# yum -y install epel-release
[root@docker-server ~]# yum install -y htop
[root@docker-server ~]# docker run --rm -it progrium/stress --cpu 4
stress: info: [1] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 12000us
stress: dbug: [1] --> hogcpu worker 4 [6] forked
stress: dbug: [1] using backoff sleep of 9000us
stress: dbug: [1] --> hogcpu worker 3 [7] forked
stress: dbug: [1] using backoff sleep of 6000us
stress: dbug: [1] --> hogcpu worker 2 [8] forked
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogcpu worker 1 [9] forked
+++++++++++++++++++++++++++++++++++++++++
在另一个terminal使用htop查看资源的使用情况:
为了比较,另外启动一个share为512的容器
先将没有做限制的命令运行起来
[root@docker-server ~]# docker run --rm -it progrium/stress --cpu 4
在开启一个终端,运行做了CPU限制的命令
[root@docker-server ~]# docker run --rm -it -c 512 progrium/stress --cpu 4
stress: info: [1] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 12000us
stress: dbug: [1] --> hogcpu worker 4 [6] forked
stress: dbug: [1] using backoff sleep of 9000us
stress: dbug: [1] --> hogcpu worker 3 [7] forked
stress: dbug: [1] using backoff sleep of 6000us
stress: dbug: [1] --> hogcpu worker 2 [8] forked
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogcpu worker 1 [9] forked
在开启一个终端执行htop命令
[root@docker-server ~]# htop
限制cpu核数
-c --cpu-shares 参数只能限制容器使用 CPU 的比例,或者说优先级,无法确定地限制容器使用 CPU 的具体核数;从 1.13 版本之后,docker 提供了 --cpus 参数可以限定容器能使用的 CPU 核数。这个功能可以让我们更精确地设置容器 CPU 使用量,是一种更容易理解也因此更常用的手段.
–cpus 后面跟着一个浮点数,代表容器最多使用的核数,可以精确到小数点二位,也就是说容器最小可以使用 0.01 核 CPU。
如果设置的–cpus值大于主机的cpu核数,docker则会报错。
cpu绑定
限制容器运行在某些cpu核
假如主机上有 4 个核,可以通过 --cpuset 参数让容器只运行在前两个核上:
[root@docker-server ~]# docker run --rm -it --cpuset-cpus=0,1 progrium/stress --cpu 2
stress: info: [1] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 6000us
stress: dbug: [1] --> hogcpu worker 2 [6] forked
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogcpu worker 1 [7] forked
mem资源限制
docker默认没有对容器内存进行限制,容器可以使用主机提供的所有内存。
不限制内存带来的问题:
这是非常危险的事情,如果某个容器运行了恶意的内存消耗软件,或者代码有内存泄露,很可能会导致主机内存耗尽,因此导致服务不可用。可以为每个容器设置内存使用的上限,一旦超过这个上限,容器会被杀死,而不是耗尽主机的内存。
限制内存带来的问题:
限制内存上限虽然能保护主机,但是也可能会伤害到容器里的服务。如果为服务设置的内存上限太小,会导致服务还在正常工作的时候就被 OOM 杀死;如果设置的过大,会因为调度器算法浪费内存。
合理做法:
为应用做内存压力测试,理解正常业务需求下使用的内存情况,然后才能进入生产环境使用
一定要限制容器的内存使用上限,尽量保证主机的资源充足,一旦通过监控发现资源不足,就进行扩容或者对容器进行迁移
尽量不要使用 swap,swap 的使用会导致内存计算复杂,对调度器非常不友好
docker限制容器内存的使用量
docker 启动参数中,和内存限制有关的包括参数的值一般是内存大小,也就是一个正数,后面跟着内存单位 b、k、m、g,分别对应 bytes、KB、MB、和 GB):
-m --memory:容器能使用的最大内存大小,最小值为 4m
++++++++++++++++++++++++++++++++++++++++++++++++++++
如果限制容器的内存使用为 64M,在申请 64M 资源的情况下,容器运行正常(如果主机上内存非常紧张,并不一定能保证这一点):
[root@docker-server ~]# docker run --rm -it -m 64m progrium/stress --vm 1 --vm-bytes 64M --vm-hang 0
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogvm worker 1 [6] forked
stress: dbug: [6] allocating 67108864 bytes …
stress: dbug: [6] touching bytes in strides of 4096 bytes …
stress: dbug: [6] sleeping forever with allocated memory

容器可以正常运行。
-m 64m:限制你这个容器只能使用64M
–vm-bytes 64M:将内存撑到64兆是不会报错,因为我有64兆内存可用。
hang:就是卡在这里。
–vm:生成几个占用内存的进程
++++++++++++++++++++++++++++
而如果申请150M内存,则发现容器里的进程被kill掉了。
端口转发
docker run -d --name mysql1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=Qf@123! daocloud.io/library/mysql:5.7
然后可以通过安装一个mysql进行验证。
mysql -uroot -p’Qf@123!’ -h 192.168.246.141 -P 3307
容器卷
把本地宿主机上面的某一个目录挂载到容器里面的目录去。这个目录不用提前存在,会自动创建。
新卷只能在容器创建过程当中挂载
docker run -it --name testnginx -v /test:/test2 daocloud.io/library/nginx /bin/bash # -v
docker网络分类
查看当前网络
docker network list
docker安装后,默认会创建三种网络类型,bridge host none
bridge:网络连接
默认情况下启动、创建容器都是用该模式,所以每次docker容器重启时会按照顺序获取对应ip地址。
none:无指定网络
启动容器时,可以通过–network=none,docker容器不会分配局域网ip
host:主机网络
docker容器和主机共用一个ip地址。
使用host网络创建容器:
[root@docker-server ~]# docker run -it --name testnginx2 --net host 98ebf73ab
[root@docker-server ~]# netstat -lntp | grep 80
tcp6 0 0 :::80 ::

上一篇:shell测试工具框架


下一篇:Docker之docker资源限制