赞
踩
使用docker run 命令可以运行容器,其底层是docker create 与docker create 两条命令结合。
启动容器并打印当月日历
[root@wangliukun ~]# docker run centos cal
March 2024
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
以上命令可以看出日历但无法看到是否运行了容器
可通过ps观察进程
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c686e1a762fb centos "cal" About an hour ago Exited (0) About an hour ago jolly_lichterman
[root@wangliukun ~]#
实例中可以看到一个docker容器以centos镜像为基础运行,并上传了一个cal命令
除此之外还可以通过指定参数启动一个base交互终端
[root@wangliukun ~]# docker run -it centos_yum
[root@70d34a0a07d3 /]# cal
March 2024
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
[root@70d34a0a07d3 /]# exit
exit
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70d34a0a07d3 centos_yum "/bin/bash" About a minute ago Exited (0) 9 seconds ago romantic_beaver
c686e1a762fb centos "cal" 2 hours ago Exited (0) 2 hours ago jolly_lichterman
1870d6c71860 centos_yum "/bin/bash" 21 hours ago Exited (0) 21 hours ago exciting_aryabhata
1573b8dc6549 centos_yum "/bin/bash" 21 hours ago Exited (0) 21 hours ago vigorous_lamport
6872c6db69a9 1ab761fac3cb "/bin/bash" 24 hours ago Exited (0) 24 hours ago goofy_kepler
b443fa7b5465 centos "/bin/bash" 25 hours ago Exited (0) 25 hours ago practical_mclaren
b9062c6f2de7 centos "/bin/bash" 37 hours ago Exited (0) 37 hours ago angry_black
aa3463140e72 hello-world "/hello" 6 days ago Exited (0) 6 days ago angry_lalande
dde2a8a86205 hello-world "/hello" 6 days ago Exited (0) 6 days ago quizzical_davinci
ff2f54e0a000 feb5d9fea6a5 "/hello" 7 days ago Exited (0) 7 days ago xenodochial_jennings
[root@wangliukun ~]#
以上创建了一个交互式容器,分配了一个伪终端,用户可以通过命令行与容器交互。
执行docker run时 会执行以下步骤:
检测本地是否存在指定的镜像,不存在则默认在docker hub公有仓库下载
使用镜像创建(docker create)并启动(docker run)容器
分配文件系统,并在只读层外面挂在一个可读可写层
从宿主机配置的网桥接口中桥接一个虚拟接口到容器
从地址池分配IP地址给容器
执行用户指定命令
执行之后容器被终止
docker run参数:
#内容太多,输入--help自行查看
[root@wangliukun ~]# docker run --help
下面运行一个容器,使用终端进行操作
[root@wangliukun ~]# docker run -it centos
[root@f05337e8e7ba /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@f05337e8e7ba /]#
-it:-i:表示捕获标准输入输出 -t:表示分配一个终端
下面运行容器并设置一个变量
[root@wangliukun ~]# docker run -d -it -e key=1000 centos
6b1971a229867be02e42ffa51a8492347c138785c609181983c1bf4f128cc3e3
[root@wangliukun ~]#
其中,-e参数在创建容器时为容器配置环境变量。
此时已经成功创建了一个容器,接着查看它的环境变量,示例代码如下:
[root@wangliukun ~]# docker exec -it 6b19 env
#查看ID为6b19的容器变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=6b1971a22986
TERM=xterm
key=1000
HOME=/root
[root@wangliukun ~]#
#设置自动启动
[root@wangliukun ~]# docker run -it --restart=always centos
#退出容器
[root@41b0b52c1670 /]# exit
exit
#查看状态
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41b0b52c1670 centos "/bin/bash" 30 seconds ago
(#此处为up,开启状态)
Up 14 seconds flamboyant_davinci
6b1971a22986 centos "/bin/bash" 17 minutes ago Up 17 minutes bold_dijkstra
f05337e8e7ba centos "/bin/bash" 27 minutes ago
(#其余镜像Exited,未启动)
Exited (127) 17 minutes ago eloquent_haibt
70d34a0a07d3 centos_yum "/bin/bash" 21 hours ago Exited (0) 21 hours ago romantic_beaver
c686e1a762fb centos "cal" 23 hours ago Exited (0) 23 hours ago jolly_lichterman
1870d6c71860 centos_yum "/bin/bash" 42 hours ago Exited (0) 42 hours ago exciting_aryabhata
1573b8dc6549 centos_yum "/bin/bash" 42 hours ago Exited (0) 42 hours ago vigorous_lamport
6872c6db69a9 1ab761fac3cb "/bin/bash" 46 hours ago Exited (0) 45 hours ago goofy_kepler
b443fa7b5465 centos "/bin/bash" 46 hours ago Exited (0) 46 hours ago practical_mclaren
b9062c6f2de7 centos "/bin/bash" 2 days ago Exited (0) 2 days ago angry_black
aa3463140e72 hello-world "/hello" 7 days ago Exited (0) 7 days ago angry_lalande
dde2a8a86205 hello-world "/hello" 7 days ago Exited (0) 7 days ago quizzical_davinci
ff2f54e0a000 feb5d9fea6a5 "/hello" 7 days ago Exited (0) 7 days ago xenodochial_jennings
[root@wangliukun ~]#
在启动时添加 --restart
参数设置容器停止后的重启策略,发现exit退出后仍在运行,这是因为关闭后又被--restart
重新启动
[root@wangliukun ~]# docker run -d --name=test centos
7af54ef126c3b9c03663aba1225ca02c3066ffb193e7ac17b31f86716755720e
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7af54ef126c3 centos "/bin/bash" 6 seconds ago Exited (0) 2 seconds ago test
41b0b52c1670 centos "/bin/bash" 10 minutes ago Up 10 minutes flamboyant_davinci
6b1971a22986 centos "/bin/bash" 27 minutes ago Up 27 minutes bold_dijkstra
f05337e8e7ba centos "/bin/bash" 36 minutes ago Exited (127) 27 minutes ago eloquent_haibt
70d34a0a07d3 centos_yum "/bin/bash" 22 hours ago Exited (0) 22 hours ago romantic_beaver
。。。。
[root@wangliukun ~]#
创建容器时添加了--name=test
名称发生变化
下面创建一个开启80端口容器
#-p参数冒号前是宿主机端口号,后面是容器端口号
[root@wangliukun ~]# docker run -d -p 80:80 nginx
6869ec1ba1c3c8abff64af33abbf7b975dda654363140808c7ee0e9a34d707a4
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6869ec1ba1c3 nginx "/docker-entrypoint.…" 18 seconds ago Up 7 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp elated_carver
[root@wangliukun ~]#
参数冒号前为宿主机端口号,之后为容器端口号,表示宿主机的80端口映射到容器的80端口上
从以上可以看到容器正在运行,开启了端口80
使用curl工具访问容器端口号
[root@wangliukun ~]# curl -I 192.168.10.133:80
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Sun, 24 Mar 2024 03:31:53 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 28 Dec 2021 15:28:38 GMT
Connection: keep-alive
ETag: "61cb2d26-267"
Accept-Ranges: bytes
访问端口返回值为200,说明可以正常访问
将容器终止,并再次开启访问:
[root@wangliukun ~]# docker stop 686
686
[root@wangliukun ~]# curl -I 192.168.10.133:80
curl: (7) Failed connect to 192.168.10.133:80; 拒绝连接
[root@wangliukun ~]#
创建共享文件
[root@wangliukun ~]# mkdir test
[root@wangliukun ~]# touch /root/test/a.txt /root/test/b.txt
[root@wangliukun ~]# ls /root/test/
a.txt b.txt
[root@wangliukun ~]#
创建共享容器
[root@wangliukun ~]# docker run -it -v /root/test/:/root/test/ --privileged centos /bin/bash
#运行容器,并挂载共享目录,冒号前面是宿主机目录,后面是容器目录
[root@2d7b9c1f978b /]# ls /root/test/
a.txt b.txt
[root@2d7b9c1f978b /]#
-v 用来指定文件目录,
–privileged 参数,用来给用户添加操作权限
运行一个名为text-nginx的Nginx容器,将80端口映射到宿主机80端口
[root@wangliukun ~]# docker run -d -p 80:80 --name text-nginx nginx
303b08739d1d11b74e3d749b567ea45d1f49c3a7464d1085d8275a8e0f7fdac5
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
303b08739d1d nginx "/docker-entrypoint.…" 4 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp text-nginx
2d7b9c1f978b centos "/bin/bash" 11 minutes ago Exited (127) 4 minutes ago compassionate_bassi
6869ec1ba1c3 nginx "/docker-entrypoint.…" 34 minutes ago Exited (0) 49 seconds ago elated_carver
[root@wangliukun ~]#
通过命令 docker pause
使容器进入暂停状态
[root@wangliukun ~]# docker pause text-nginx
text-nginx
[root@wangliukun ~]#
查看:
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
303b08739d1d nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes (Paused) 0.0.0.0:80->80/tcp, :::80->80/tcp text-nginx
2d7b9c1f978b centos "/bin/bash" 14 minutes ago Exited (127) 7 minutes ago compassionate_bassi
6869ec1ba1c3 nginx "/docker-entrypoint.…" 37 minutes ago Exited (0) 3 minutes ago elated_carver
[root@wangliukun ~]#
可以看到容器仍是运行状态,但同时也使暂停的
[root@wangliukun ~]# curl -I 192.168.10.133:80
^C
[root@wangliukun ~]#
通过访问测试发现,此时无法访问到容器网页,但是服务器没有拒绝连接,说明暂停容器的本质是暂停容器中的服务。
下面使用docker unpause
命令使暂停状态的容器终止暂停状态
[root@wangliukun ~]# docker unpause 303
303
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
303b08739d1d nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp text-nginx
2d7b9c1f978b centos "/bin/bash" 17 minutes ago Exited (127) 11 minutes ago compassionate_bassi
6869ec1ba1c3 nginx "/docker-entrypoint.…" 40 minutes ago Exited (0) 7 minutes ago elated_carver
#测试是否停止了暂停状态
[root@wangliukun ~]# curl -I 192.168.10.133:80
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Sun, 24 Mar 2024 04:11:30 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 28 Dec 2021 15:28:38 GMT
Connection: keep-alive
ETag: "61cb2d26-267"
Accept-Ranges: bytes
[root@wangliukun ~]#
当不需要某一个业务继续运行时可以用docker stop
终止它
[root@wangliukun ~]# docker stop 303
303
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
303b08739d1d nginx "/docker-entrypoint.…" 9 minutes ago Exited (0) 3 seconds ago text-nginx
2d7b9c1f978b centos "/bin/bash" 20 minutes ago Exited (127) 13 minutes ago compassionate_bassi
6869ec1ba1c3 nginx "/docker-entrypoint.…" 43 minutes ago Exited (0) 9 minutes ago elated_carver
[root@wangliukun ~]#
使用docker sart
唤醒容器
[root@wangliukun ~]# docker start 303
303
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
303b08739d1d nginx "/docker-entrypoint.…" 21 minutes ago Up 3 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp text-nginx
2d7b9c1f978b centos "/bin/bash" 32 minutes ago Exited (127) 25 minutes ago compassionate_bassi
6869ec1ba1c3 nginx "/docker-entrypoint.…" 55 minutes ago Exited (0) 21 minutes ago elated_carver
[root@wangliukun ~]#
docker attach
与 docker exec
在企业中,运维工程师与开发工程师都可能会有进入容器内部的需求。此时不建议使用SSH(SecureShell)登录容器,因为这违背了一个容器里只有一个进程的原则,同时增加了被攻击的风险。建议使用以下两种 Docker原生方式进入容器。
通过 docker attach
命令可以进入一个已经在运行容器的虚拟输入设备,然后执行其他命令。
创建容器
[root@wangliukun ~]# docker run -it -d centos /bin/bash
d84ae08138dc415407a2f7c8f4a8a34e4dedc46fa5141872df9b95f2d1d77d62
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d84ae08138dc centos "/bin/bash" 9 seconds ago Up 8 seconds elastic_thompson
303b08739d1d nginx "/docker-entrypoint.…" 28 minutes ago Exited (0) About a minute ago text-nginx
2d7b9c1f978b centos "/bin/bash" 39 minutes ago Exited (127) 33 minutes ago compassionate_bassi
6869ec1ba1c3 nginx "/docker-entrypoint.…" About an hour ago Exited (0) 29 minutes ago elated_carver
进入容器
[root@wangliukun ~]# docker attach d84
[root@d84ae08138dc /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@d84ae08138dc /]#
直接在容器中使用exit或Ctrl+D退出,会终止容器
Ctrl+P+Q 也可退出,且不会终止容器
[root@d84ae08138dc /]# read escape sequence
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d84ae08138dc centos "/bin/bash" 3 minutes ago Up 3 minutes elastic_thompson
303b08739d1d nginx "/docker-entrypoint.…" 32 minutes ago Exited (0) 4 minutes ago text-nginx
2d7b9c1f978b centos "/bin/bash" 43 minutes ago Exited (127) 37 minutes ago compassionate_bassi
6869ec1ba1c3 nginx "/docker-entrypoint.…" About an hour ago Exited (0) 33 minutes ago elated_carver
[root@wangliukun ~]#
docker attach还有共享功能,两个终端同时进入容器,可观察同步操作
参数:
参数 | 功能 |
---|---|
-detach,-d | 后台运行模式,在后合执行命令 |
-env,-e | 设置环境变量(仅在本次会中生效) |
-interactive,-i | 打开stdin,用于控制台交互 |
–tty,-t | 命令行交互模式 |
-user,-u | 设置用户名 |
通过docker exee命令在宿主机向运行的容器传输命令
[root@wangliukun ~]# docker exec d84 ls
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@wangliukun ~]#
创建一个新容器,并为容器启动一个虚拟终端,使用命令行对容器进行操作
[root@wangliukun ~]# docker exec -it d84 /bin/bash
[root@d84ae08138dc /]# w
04:45:44 up 1:30, 0 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
[root@d84ae08138dc /]# date
Sun Mar 24 04:46:01 UTC 2024
#以上示例通过虚拟终端对容器进行一系列操作。接着使用exit命令退出容器,并查看容器状态
[root@d84ae08138dc /]# exit
exit
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d84ae08138dc centos "/bin/bash" 13 minutes ago Up 13 minutes elastic_thompson
303b08739d1d nginx "/docker-entrypoint.…" 41 minutes ago Exited (0) 13 minutes ago text-nginx
2d7b9c1f978b centos "/bin/bash" 52 minutes ago Exited (127) 46 minutes ago compassionate_bassi
6869ec1ba1c3 nginx "/docker-entrypoint.…" About an hour ago Exited (0) 42 minutes ago elated_carver
[root@wangliukun ~]#
以上示例使用exit命令退出了容器,但容器仍在运行状态。这说明docker exec与docker attach不同,在使用docker exec进入的容器中执行exit命令不会终止容器,只会退出当前bash终端。在工作中,建议使用dockerexec命令进入容器,这样不容易出现操作失误。
在工作中,我们有时会需要将容器暂停,例如,要为容器文件系统做一个快
照时。使用docker pause
与docker unpause
命令可以对容器进行暂停与激活操作,并且暂停状态的容器不会占用宿主机CPU资源。
当不再需要业务运行时,就要将容器关闭,这时可以使用 docker stop
命令。当遇到特殊情况,无法关闭容器时,还可以使用 docker kill
命令强制终止容器
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d84ae08138dc centos "/bin/bash" 13 minutes ago Up 13 minutes elastic_thompson
[root@wangliukun ~]# docker kill d84
d84
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d84ae08138dc centos "/bin/bash" 18 minutes ago Exited (137) 13 seconds ago elastic_thompson
[root@wangliukun ~]#
企业中通常有大量的容器需要操作,一个一个操作会浪费大量的人力及时间成本。在这种情况下,可以将 Docker命令与正则表达式结合起来,实现对容器的批量操作。
查看容器ID
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d84ae08138dc centos "/bin/bash" 20 minutes ago Up 41 seconds elastic_thompson
303b08739d1d nginx "/docker-entrypoint.…" 49 minutes ago Up 34 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp text-nginx
2d7b9c1f978b centos "/bin/bash" About an hour ago Up 22 seconds compassionate_bassi
[root@wangliukun ~]# docker ps -q
d84ae08138dc
303b08739d1d
2d7b9c1f978b
[root@wangliukun ~]#
接着使用正则表达式根据运行状态容器的id号关闭正在运行的容器
[root@wangliukun ~]# docker stop `docker ps -q`
d84ae08138dc
303b08739d1d
2d7b9c1f978b
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d84ae08138dc centos "/bin/bash" 22 minutes ago Exited (0) 4 seconds ago elastic_thompson
303b08739d1d nginx "/docker-entrypoint.…" 51 minutes ago Exited (0) 4 seconds ago text-nginx
2d7b9c1f978b centos "/bin/bash" About an hour ago Exited (0) 4 seconds ago compassionate_bassi
[root@wangliukun ~]#
以上示例运用 docker stop命令与正则表达式批量终止了运行中的容器,该命令还有另一种方式
docker stop `docker ps -a | grep Up|awk '{print $1}'`
使用类似方法还可以对容器进行批量删除、启动等操作
dockersop与 docker kill的区别:
docker stop
执行时,首先给容器发送一个 TERM信号,让容器做一些退出前必须做的保护性,安全性操作,然后让容器自动停止运行。如果在一段时间内容器没有停止运行,再执行 kill -9
强制终止容器。
docker kill
执行时,不论容器是什么状态,在运行什么程序,直接执行 kll -9
强制关闭容器
容器以其轻量级特点受人欢迎,通常一些容器使用不久就会闲置,长期积累会导致资源浪费,所以要及时清理
与docker rmi
不同,docker rm
用于删除容器
结合正则表达式与docker rm
命令,列出处于终止状态的容器斌进行删除
[root@wangliukun ~]# docker rm `docker ps -a | grep Exited`
text3
text2
85a51d0dad15
12896921230d
d84ae08138dc
6869ec1ba1c3
使用docker rm
结合正则表达式,列出所有容器ID,并删除
[root@wangliukun ~]# docker rm `docker ps -a -q`
Error response from daemon: cannot remove container "/determined_pike": container is running: stop the container before removing or force remove
Error response from daemon: cannot remove container "/text-nginx": container is running: stop the container before removing or force remove
[root@wangliukun ~]#
报错因为所删除容器正在运行,可用-f强制删除
[root@wangliukun ~]# docker rm -f `docker ps -a -q`
b9a405d41303
303b08739d1d
[root@wangliukun ~]#
使用docker rm
结合docker ps -q -f status=exited
筛选出处于终止状态的容器ID号,进行删除
[root@wangliukun ~]# docker rm `(docker ps -q -f status=exited)`
0b1bdb8599d3
3cb721b23cfb
[root@wangliukun ~]#
从Docker 1.13版本开始,用户可以使用 docker container prune
命令删除处于终止状态的容器
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93608ef19951 centos_yum "/bin/bash" 3 seconds ago Exited (0) 2 seconds ago text1
3e680ffddc10 centos "/bin/bash" 22 seconds ago Exited (0) 19 seconds ago text
#删除:
[root@wangliukun ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
93608ef1995169ab572a36213a9aac7f66a55c2255e6d5245d705ab447f04172
3e680ffddc1009351a0c83977543f11461f4071e546d8e9d7e0cd9a4252e998a
Total reclaimed space: 0B
[root@wangliukun ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@wangliukun ~]#
默认情况下,Docker对容器没有硬件资源限制,使用Docker 运行容器时,一台主机可能运行成千上百个容器,相互隔离,但底层却用着相同的cpu、内存、磁盘等,如果不加以限制,容器对宿主机消耗可能导致其他容器或进程无法正常使用运行。
在 Linux服务器上,如果内核检测到没有足够的内存( Memory)来执行重要的系统功能,内会提示OOME(Out of Memory Error,内存溢出),并开始终止进程以释放内存,这称为OOM操作任何进程都有可能被终止,包括 Docker和其他重要的应用程序。如果终止了系统关键进程,可能与致整个系统瘫疾。
设置内存上限虽然能保护主机,但是也可能导致容器里的服务运行不畅。如果为服务设置的内存上限太小,服务在正常工作时可能出现资源不足;如果设置过大,则会因为调度器算法浪费内存。因此,合理的做法是遵循以下原则。
为应用做内存压力测试,了解正常业务需求下内存的使用情况,然后再进入生产环境。
限制容器的内存使用上限。
尽量保持机的资源,一通过监控发现资源不足,就进行扩容或者对容器进行迁移
内存资源充足的情况下,尽量不要使用Swap(交换分区),Swap的使用会导致内存计算变得复杂,对调度器造成压力。
下面介绍Docker启动参数中的内存限制参数。
-m, --memory 设置容器可使用的最大内存,最小值是4MB:
–memory-swap 设置容器可使用内存+Swap的最大值。
–memory-swapiness 默认情况下,用户可以设置一个0-100的值,代表允许内存与交换分区置换的比例。
–memory-reservation 设置一个内存使用的soft limit(非强制性限制),如果Docker发现主机内存不足,会执行OOM操作。这个值必须小于-memory设置的值.
–kemel-memory 容器能够使用的内核内存的大小,最小值为4MB。
–oom-kill-disable 设置是否运行OOM的时候终止容器进程。宿主机会在内存不足时,随机关闭一些进程,而该参数会保护容器进程不被关闭。只有通过设置-memory限制容器内存,才可以使用该参数,否则容器会耗尽宿主机内存,而且导致宿主机应用被终止。
注:–memory-swap只有在设置了–memory时才有意义。使用Swap允许容器在耗尽所有可里的内存时,将多余的内存需求写入磁盘。
–memory与-memory-swap
–memory | –memory-swap | 功能描述 |
---|---|---|
正数M | 正数S | 容器可用总空间为S,其中RAM为M,Swap为(S-M),若S=M,则无可用Swap资源 |
正数M | 0 | 相当于未设置Swap |
正数M | unset | 若主机(Docker宿主机)启用了Swap,则容器可用Swap为2×M |
正数M | -1 | 若主机(Docker宿主机)启用了Swap,则容器可以使用主机最大值的Swap资源 |
以上两个参数默认值都为-1,即对容器使用内存和Swap没有限制。
使用progrium/stress
镜像来介绍如何为容器分配内存,该容器可以模拟进行压力测试
[root@wangliukun ~]# docker run -it -m 300M --memory-swap=400M progrium/stress --vm 1 --vm-bytes 380M
Unable to find image 'progrium/stress:latest' locally
latest: Pulling from progrium/stress
[DEPRECATION NOTICE] Docker Image Format v1, and Docker Image manifest version 2, schema 1 support will be removed in an upcoming release. Suggest the author of docker.io/progrium/stress:latest to upgrade the image to the OCI Format, or Docker Image manifest v2, schema 2. More information at https://docs.docker.com/go/deprecated-image-specs/
a3ed95caeb02: Pull complete
871c32dbbb53: Pull complete
dbe7819a64dd: Pull complete
d14088925c6e: Pull complete
58026d51efe4: Pull complete
7d04a4fe1405: Pull complete
1775fca35fb6: Pull complete
5c319e267908: Pull complete
Digest: sha256:e34d56d60f5caae79333cee395aae93b74791d50e3841986420d23c2ee4697bf
Status: Downloaded newer image for progrium/stress:latest
以上示例运行了一个容器,分配可用最大内存为300MB,可用Swap为100MB。其中,-vm 1
参数表示启动一个内存工作线程,--vm-bytes 380M
参数表示每个线程分配380MB内存。可以看到系统不断地给容器分配内存、释放内存,一直循环。由于使用的内存是380MB,在最大使用量(400MB)之内,容器正常运行。
下面测试内存使用超出限额的情况
[root@wangliukun ~]# docker run -it -m 300M --memory-swap=400M progrium/stress --vm 1 --vm-bytes 480M
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 503316480 bytes ...
stress: dbug: [6] touching bytes in strides of 4096 bytes ...
stress: FAIL: [1] (416) <-- worker 6 got signal 9
stress: WARN: [1] (418) now reaping child worker processes
stress: FAIL: [1] (422) kill error: No such process
stress: FAIL: [1] (452) failed run completed in 9s
[root@wangliukun ~]#
Docker为容器设置CPU资源限制的参数是-c
或--cpu-shares
,其值是一个整数。运行两个容器test01与test02,并设置CPU权重
[root@wangliukun ~]# docker run -it -d -c 1000 --name test01 Docker.io/progrium/stress --cpu 2
设置CPU资源限制还可以使用--cpuset-cpus
参数,它能够指定容器使用某一颗CPU。这里使用CPU测试镜像 agileek/cpuset-test
进行测试,其功能是将CPU用满
[root@wangliukun ~]# docker run -d -it --cpuset-cpus=0 Docker.io/agileek/cpus
Block IO指的是磁盘的读写,docker可以通过设置权重以及限制bps(每秒读写数据量)和iops(每秒读写次数)的方式控制容器读写磁盘的带宽。
bps与iops主要参数有:
–-blkio-weight:容器默认磁盘IO的加权值,有效值范围为10-1000。
–-blkio-weight-device: 针对特定设备的IO加权控制。其格式为DEVICE_NAME:WEIGHT
–-device-read-bps:限制此设备上的读速度(bytes per second),单位可以是KB、MB或者GB。
–-device-read-iops:通过每秒读IO次数来限制指定设备的读速度。
–-device-write-bps :限制此设备上的写速度(bytes per second),单位可以是KB、MB或者GB。
–-device-write-iops:通过每秒写IO次数来限制指定设备的写速度。
docker run 命令可以运行容器
其底层是docker create 与docker create 两条命令结合。
docker run参数 通过docker run --help查看
-e key=1000 配置环境变量
--restart 参数设置容器停止后的重启策略
--name=test 自定义姓名
-p 80:80 设置端口映射,参数冒号前为宿主机端口号,之后为容器端口号
-v 指定文件目录,可用于共享容器
--privileged 参数,用来给用户添加操作权限
docker stop 关闭容器
docker start 开启容器
docker pause 暂停容器
docker unpause 恢复容器中所有的进程
docker kill 强制关闭
删除:
批量删除已终止的容器:
docker rm `docker ps -a | grep Exited|awk '{print $1}'`
删除运行状态容器:
docker rm -f `docker ps -a q`
删除终止状态容器:
docker rm `(docker ps -q -f status=exited)`
删除时发出警报,删除终止容器
docker container prune
docker ps -a 查看容器进程
docker attach 进入容器,exit后终止容器
docker exec 进入容器,exit后不终止容器
上一章:Docker镜像
下一章:Docker 底层技术
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。