Docker学习(3) Docker容器

Docker容器

1、容器运行

使用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 ~]# 
1、自动重启容器
#设置自动启动
[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重新启动

2、自定义名称容器
[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名称发生变化

3、开启端口的容器

下面创建一个开启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 ~]# 
4、与宿主机共享目录的容器

创建共享文件

[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 参数,用来给用户添加操作权限

2、进入容器

1、容器三种状态
  • 运行状态

运行一个名为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 ~]# 
2、docker attach docker exec

在企业中,运维工程师与开发工程师都可能会有进入容器内部的需求。此时不建议使用SSH(SecureShell)登录容器,因为这违背了一个容器里只有一个进程的原则,同时增加了被攻击的风险。建议使用以下两种 Docker原生方式进入容器。

  • docker attach

通过 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还有共享功能,两个终端同时进入容器,可观察同步操作

  • docker exec

参数:

参数功能
-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命令进入容器,这样不容易出现操作失误。

3、停止和删除容器

1、停止容器

在工作中,我们有时会需要将容器暂停,例如,要为容器文件系统做一个快
照时。使用docker pausedocker 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强制关闭容器

2、删除容器

容器以其轻量级特点受人欢迎,通常一些容器使用不久就会闲置,长期积累会导致资源浪费,所以要及时清理

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 ~]# 

4、容器资源限制

默认情况下,Docker对容器没有硬件资源限制,使用Docker 运行容器时,一台主机可能运行成千上百个容器,相互隔离,但底层却用着相同的cpu、内存、磁盘等,如果不加以限制,容器对宿主机消耗可能导致其他容器或进程无法正常使用运行。

1、限制内存资源

在 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资源
正数M0相当于未设置Swap
正数Munset若主机(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 ~]# 
2、限制容器cpu资源

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
3、限制容器Block I/O

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次数来限制指定设备的写速度。

5、Docker操作

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 底层技术

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
非常好的选择!Docker 是一个开源的容器化平台,可以帮助开发人员更轻松地构建、打包、交付和运行应用程序。学习 Docker 可以让你更好地理解容器化技术,并且在开发和部署应用程序时提供更高的灵活性和可移植性。 以下是一些学习 Docker 的步骤: 1. 安装 Docker:首先,你需要安装 DockerDocker 提供了适用于不同操作系统的安装程序,如 Docker Desktop for Windows 或 Docker Desktop for Mac。你可以访问 Docker 官方网站(https://www.docker.com/)获取详细的安装指南。 2. 学习 Docker 基本概念:在开始使用 Docker 之前,建议先了解一些基本概念,例如镜像(Image)、容器(Container)、仓库(Repository)等。可以阅读 Docker 官方文档或参考一些在线教程和博客来学习这些概念。 3. 创建和运行容器学习如何使用 Docker 创建和运行容器是非常重要的一步。你可以使用 Docker 命令行工具或者 Docker Compose 来创建和管理容器。尝试使用一些基本的命令,如 docker run、docker build 等,来构建和运行容器。 4. 使用 Docker 镜像:Docker 镜像是容器的基础,它包含了应用程序的运行环境和所有依赖项。学习如何使用 Docker Hub 或者其他镜像仓库来获取和使用现有的镜像,以及如何创建自定义的镜像。 5. Docker 网络和存储:学习如何配置 Docker 网络和存储可以帮助你更好地管理容器之间的通信和数据持久化。了解 Docker 网络模式、网络驱动和存储卷等概念,并尝试在容器之间进行通信和数据共享。 6. Docker Compose 和 Swarm:学习如何使用 Docker Compose 和 Docker Swarm 可以帮助你更好地编排和管理多个容器Docker Compose 可以定义和管理多个容器的配置,而 Docker Swarm 则可以将多个 Docker 主机组成一个集群,实现容器的高可用性和负载均衡。 7. 实践项目:尝试在实际项目中应用 Docker,例如将一个现有的应用程序容器化,或者使用 Docker 构建和部署一个完整的应用栈。通过实践,你可以更深入地理解 Docker 的各种用法和场景。 记得不断练习和探索,参考文档和教程可以帮助你更好地理解 Docker 的使用。祝你学习顺利!如果有任何问题,随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值