当前位置:   article > 正文

Docker实战——容器

Docker实战——容器

目录

Docker 容器的基本概念与操作

Docker 的容器类似操作系统的文件夹,其中包含应用喝应用运行时所需要的依赖环境。每一个Docker 容器都是从 Docker 镜像创建的。
Docker 容器的操作包括:创建容器、停止容器、进入容器、删除容器、导入和导出容器、查看容器等。

1.使用“docker create”创建容器。这里基于Nginx的镜像创建了一个容器,名字为mycontainer。

sudo docker create --name mycontainer nginx
  • 1

在这里插入图片描述

2.使用“docker ps -a”命令查看所有的容器,这时的容器不一定是运行状态。

# 查看所有容器
sudo docker ps -a
# 查看所有运行中的容器
sudo docker ps
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

3.使用 “docker start” 命令可以启动容器。

sudo docker start [CONTAINER ID]
  • 1

在这里插入图片描述

4.使用 “docker run” 命令可以直接创建容器并启动容器。

sudo docker run -d --name mycontainer1 nginx
  • 1

在这里插入图片描述

5.使用 “docker exec” 命令可以进入容器内。

sudo docker exec -it [CONTAINER ID]/[CONTAINER NAMES] /bin/bash
# 其中的参数说明
# -t :为Docker 分配一个伪终端
# -i :为Docker 打开标准输入
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

6.使用 “docker stop” 命令可以停止容器。

sudo docker stop [CONTAINER ID]/[CONTAINER NAMES]
  • 1

在这里插入图片描述

7.使用 “docker rm” 命令可以删除容器。当容器正在运行时,是不能直接将其删除的。但可以使用 -f 参数进行强行删除。

sudo docker rm [CONTAINER ID]/[CONTAINER NAMES]
  • 1

在这里插入图片描述

8.使用 “docker export” 命令导出一个已经创建的容器,不管容器处于什么状态。通过这种方式剋实现容器的迁移。

sudo docker export -o <name.tar> [CONTAINER ID]
  • 1

在这里插入图片描述

9.使用 “docker import” 命令可以将从容器导出生成的文件重新导入容器。

sudo docker import nginx.tar mynginx_imported
# 这里mynginx_imported是一个镜像
  • 1
  • 2

在这里插入图片描述

10.使用 mynginx_imported 镜像来创建一个容器。这里需要注意的是:如果要使用导入的镜像创建并启动容器,则需要在启动时跟上具体的命令,否则就会出现错误。

# 错误写法
sudo docker run -d mynginx_imported
# 正确写法
sudo docker run -d mynginx_imported /bin/bash
# 其中/bin/bash表示在启动容器时需要在容器中执行的指令。
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

Docker 的日志

在 Docker 的整个生命周期中,超过70%的时间我们都是在做 Docker 的运维工作。查看 Docker 日志,是运维工作中非常重要的一个环节。
Docker 日志分为两种类型:Docker 引擎的日志、应用的日志。下面分别对这两种日志进行介绍。

访问Docker引擎日志

Docker 引擎的日志是指,在 Docker 守护进程执行过程中产生的日志信息。如果 Docker 引擎出现了问题,则需要在不同的操作系统的宿主机上使用不同的方式进行查看。

操作系统日志位置
Ubuntu 22.04journalctl -u docker.service在这里插入图片描述

访问Docker应用日志

Docker 将应用运行在容器中,应用输出日志也就输出到容器中了,访问Docker 应哟个的日志也就变成访问 Docker 容器的日志。要访问容器的日志,首先需要了解 Docker 的日志引擎。以下是 Docker 支持的日志引擎。

日志引擎说明
journaldDocker 默认的日志引擎。这种引擎把所有容器的回显日志输出到系统的journald中
json-file把每个容器的回显日志以JSON 文件格式输出到每个容器的内部。如果在实际应用中某些应用产生了大量的日志信息,则可能导致容器的 JSON 日志文件过大而占满宿主机的磁盘
syslog把所有容器的回显日志输出到系统的 syslog 服务中
fluentd把所有容器的回显日志输出到系统的 fluentd 服务中
gelf把所有容器的日志输出到支持 GELF 格式的服务中,如 Logstash
none关闭 Docker 容器的日志。使用这种方式 ,则意味着无法通过 “docker logs” 命令查看任何容器输出的日志

利用以下命令查看 Docker 默认的日志引擎

sudo docker info | grep Logging
  • 1

在这里插入图片描述

并不推荐直接读取 Docker 日志内容,原因是 Docker 提供了 “docker logs” 命令来帮助我们读取日志信息。
以下图片内容由另一台服务器提供(仅供示例参考)

1.查看指定时间后的日志,只显示最后5行。

docker logs -f -t --since='2024-01-01' --tail=5 [CONTAINER ID]
  • 1

在这里插入图片描述

2.查看容器最近30分钟的日志。

docker logs --since 30m [CONTAINER ID]
  • 1

在这里插入图片描述

管理容器的资源

在一台 Docker 宿主机上可以同时启动多个容器。在默认情况,Docker 没有限制其中运行的容器使用硬件资源。而在实际环境中,容器的负载过高会占用宿主机的大量资源。这里的资源是指宿主机的 CPU、内存和 I/O 宽带这三个方面。
本节内容介绍如何使用 Docker 的资源管理给容器的资源使用设置一个阀值,以控制容器对宿主机 CPU、内存和 I/O 贷款的使用。

什么是 Linux CGroup

由于 Docker 构建在Linux 的基础上因此从 Linux 底层来看,Docker 是利用 Linux Control Group(简称:Linux CGroup)来实现对资源使用的控制。因此,要掌握 Docker 容器的资源管理,有必要先了解一下什么是 Linux CGroup。

Linux CGroup 是 Linux 中的一些进程,通过这些进程可以限制应用对资源的使用。并且,通过 Linux CGroup 可以对系统资源做精细化控制。

Linux CGroup 主要提供一下功能。
Resource limitation:限制资源的使用,例如,使用 CPU 及内存的上线。
Prioritization:应用优先级控制,例如,控制任务进度。
Accounting:应用的审计和统计,例如,实现应用的计费。
Control:实现对应用的控制,例如,应用的挂起、恢复和执行等。

要使用 Linux CGroup,则需要先通过执行以下步骤确定Linux 内核是否启用了 Linux CGroup。

1.确定操作系统的发行版本。

在这里插入图片描述

2.根据操作系统的发行版本,可以确定是否启用了 Linux CGroup。

cat /boot/config-5.15.0-92-generic | grep CGROUP
# 其中CGROUP的参数值是 “y”,表示已经启动 Linux CGroup
  • 1
  • 2

在这里插入图片描述

Docker 对内存的使用

利用底层的 Linux CGroup,能够很方便地通过参数 -m 来设定容器所使用的内存

默认情况下,一个容器可以使用主机上的所有内存。

在使用 -m 参数时,可以指定具体的参数值的后缀,如 K、M 或者 G。

下面通过具体的步骤来演示。这里基于CentOS的基础镜像安装压力测试工具 stress 来进行测试。

1.创建一个Dockerfile 文件,输入以下内容。

FROM centos:7
RUN yum install -y epel-release && yum install -y stress
ENTRYPOINT ["stress"]
  • 1
  • 2
  • 3

在这里插入图片描述

2.执行 “docker build” 命令将其编译成镜像,镜像的名称是mycentos。

sudo docker build -t mycentos .
  • 1

在这里插入图片描述

3.以下语句使用了 mycentos 来进行测试。

sudo docker run -it --rm -m 256m mycentos --vm 1 --vm-bytes 128M --vm-hang 0
# 其中参数说明如下:
# -m 256m:限制容器使用内存的大小。
# --vm-bytes 128M:压力测试工具stress每次分配大小为128M的内存空间。
# --vm-hang 0:压力测试工具stress 分配完内存后立即释放分配的内存;如果该值为100,则表示分配内存后,等待100秒后再释放分配的内存。
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

4.使用 “docker stats” 命令观察容器占用的内存,会发现容器占用的内存被限定在256MB。

在这里插入图片描述

Docker 对 I/O 宽带的使用

要在 Docker 中对容器使用 I/O 带宽进行限定,则需要先了解 Docker I/O 管理相关的参数。

1.执行以下命令可以获取这些参数机器含义。

sudo docker help run | grep -E 'bps|IO'
  • 1

在这里插入图片描述

2.Docker I/O 管理相关参数。

参数名称说明
–blkio-weight可以通过–blkio-weight修改容器 blkio 的权重,权重值为10~1000
–blkio-weight-device指定某个设备的权重
–device-read-bps按每秒读取设备的数据量设定上限
–device-read-iops按照每秒读操作的次数设定上限
–device-write-bps按每秒写入块设备的数据量设定上限
–device-write-iops按照每秒写操作次数设定上限

3.下面通过两个示例来演示如何在启动了的 Docker 容器中使用上面的参数来对容器使用的 I/O 带宽进行限定

示例一
1.使用 --device-read-bps 和 --device-write-bps 参数限定容器的读写速率。
sudo docker run -it --rm --device-write-bps /dev/sda:1mb centos /bin/bash
  • 1

在这里插入图片描述

2.在容器中执行以下命令。其中,oflag=direct 表示读写数据采用直接 I/O 方式。
dd if=/dev/zero of=test.out bs=1M count=200 oflag=direct
  • 1

在这里插入图片描述

3.在宿主机上使用 iotop 命令观察容器的写入速度,会发现容器的写入速度被限定在1035kb/s(即 1 MB/s 左右)。

在这里插入图片描述

4.以下语句将限制容器的读取速度为 1MB/s。
sudo docker run -it --rm --device-read-bps /dev/sda:1mb centos /bin/bash
  • 1
示例二 使用 --device-read-iops 和 --device-write-iops 参数限定容器的读写次数。

参数 --device-read-iops 和 --device-write-iops 的格式如下,其中,limit必须是正整数。

--device-read-iops <device-path>:<limit>
--device-write-iops <device-path>:<limit>
  • 1
  • 2

以下是操作步骤。

1.为了观察结果,先在宿主机上安装 sysstat 软件包。
sudo apt-get install sysstat
  • 1

在这里插入图片描述

2.创建并启动容器,通过使用 --device-write-iops 参数将容器写数据的速率设定为每秒5次。
sudo docker run -it --rm --device-write-iops /dev/sda:5 centos /bin/bash
  • 1

在这里插入图片描述

3.在容器中执行以下命令,其中,oflag=direct 表示读写数据采用直接 I/O 方式。
dd if=/dev/zero of=test.out bs=1M count=200 oflag=direct
  • 1

在这里插入图片描述

4.在宿主机上使用以下命令观察输出结果,这个命令每个1秒刷新1次。
iostat 1
  • 1

在这里插入图片描述

5.以下语句会将容器读取数据的速率设定为每秒5次
sudo docker run -it --rm --device-read-iops /dev/sda:5 centos /bin/bash
  • 1

管理Docker容器中的数据

在生产环境中使用 Docker,一方面,需要对数据进行保存或者在多个容器之间进行数据共享;另一方面,在 Docker 的容器被删除后,并不会涉及容器的数据管理。。
那么如何现实信息的持久化呢?这必然涉及容器的数据管理。

在 Docker 容器中实现数据管理的两种方式

1.数据卷(Data Volumes)

数据卷本质上是一个挂载目录,类似使用 Linux 的 mount 命令挂载的目录。数据卷可以供容器使用,并且可以在不同的容器之间共享和重用数据卷。对数据卷的修改会立即生效。数据卷与容器彼此独立,对数据卷的更新不会影响镜像

即使容器被删除,容器卷默认也会一直存在,直到数据卷被删除为止。
在 Docker 中可以使用 -mount 和 -v 两种方式给容器挂载数据卷。

2.数据卷容器(Data Volume Containers)

数据卷容器是一种特殊的容器,用来维护数据卷。它可以在多个容器之间共享数据信息。利用数据卷容器可以很方便的完成数据迁移。

使用数据卷管理 Docker 容器中的数据

下面通过具体实战来演示。

1.创建一个名为 “myvolume” 的数据卷。

sudo docker volume create myvolume
  • 1

在这里插入图片描述

2.查看所有的数据卷。

sudo docker volume ls
  • 1

在这里插入图片描述

3.使用 “docker inspect volume” 命令查看数据卷的详细信息。

sudo docker inspect myvolume
  • 1

在这里插入图片描述

4.启动一个容器,并使用 myvolume 数据卷。这里使用 Nginx 镜像创建一个容器,并将容器的 80 端口映射到宿主机的 1234 端口,容器名称为 “mynginx”

sudo docker run -d -p 1234:80 --name mynginx --mount type=volume,source=myvolume,target=/usr/share/nginx/html/ nginx
  • 1

其中的参数说明如下:
–mount:指定在容器启动时挂载数据卷
type:指定数据卷挂载的方式,它有三个值,看下表。

type的取值说明
volume普通数据卷,这是默认的type类型。其函数映射到主机 “、var/lib/docker/volumes” 目录下
bind绑定数据卷。使用这种类型可以在挂载数据卷时将其映射到主机的指定目录下
tmpfs临时数据卷,只将容器的目录挂载到宿主机的内存中。一般在实际环境中不会使用这种方式

source:指定宿主机上的目录或者数据卷。这里使用在第一步所创建的数据卷myvolume
target:将容器中的 “/usr/share/nginx/html/” 目录挂载到主机
在这里插入图片描述

通过宿主机的 “/var/lib/docker/volumes/myvolume/_data” 目录可以访问容器内部的 “/usr/share/nginx/html/” 目录。

5.切换到 “/var/lib/docker/volumes/myvolume/_data” 目录下,并修改 Nginx的首页 index.html 文件的内容

cd /var/lib/docker/volumes/myvolume/_data
echo "<h1>New Nginx Home Page</h1>" > index.html
  • 1
  • 2

在这里插入图片描述

6.通过浏览器访问宿主机的 1234 端口,打开Nginx的主页会看到显示的就是新修改的Nginx主页。

在这里插入图片描述

7.在挂载数据卷时,也可以使用 -v 参数。以下命令是将宿主机的 “/root” 目录挂载到了容器内的 “/root/container/mydatavolume” 目录下。下图表示挂载成功了。

sudo docker run -it -v /root:/root/container/mydatavolume centos bash
  • 1

在这里插入图片描述
在这里插入图片描述
需要说明的是,使用这样的方式挂载的数据卷默认的权限是“读写”(rw),用户也可以通过 ro 将其指定为 “只读” 。

sudo docker run -it -v /root:/root/container/mydatavolume:ro centos bash
  • 1

使用数据卷容器管理 Docker 容器中的数据,暂时不写了。有需要的可以留言。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/195519
推荐阅读
相关标签
  

闽ICP备14008679号