【hcie-cloud】【20】容器详解【容器介绍,容器工作机制、容器常用命令说明】【上】

news2024/11/24 19:25:33

文章目录

  • 前言
  • 容器是什么
    • 虚拟化技术的四个特点
    • 容器也是一种虚拟化技术
    • 容器是怎么实现虚拟化的?
    • 容器对比虚拟机有哪些优势?
    • 容器对比虚拟机有哪些不足?
    • 容器不仅是一种虚拟化技术,更重要的是一种应用打包机制
    • 容器提供的是PaaS服务
    • 常见容器引擎
    • Docker简介
    • Docker的技术架构
    • Containerd简介
    • iSula简介
    • 容器生态相关术语说明
    • 容器和虚拟机的融合 - 安全容器
    • 总结:容器是什么
    • 容器使用场景
  • 容器是怎么工作的
    • 容器工作机制 - 以Docker为例
    • 容器的关键技术 - Namespace
      • Namespace隔离说明
    • 容器的关键技术 - Cgroup
  • 容器管理
    • 容器生命周期
    • 创建容器
    • 启动容器
    • 创建和启动容器等常用的命令选项
      • 创建、指定端口、进入容器、指定变量
      • 指定容器内工作目录、指定容器名称、指定DNS
      • 限制容器cpu资源
      • 限制容器内存资源
    • 在容器中执行命令
      • 进入容器方式1:attach直接进入
      • 进入容器方式2:exec创建终端【不进入容器执命令】
    • 暂停和恢复容器
    • 列出容器概要信息
    • 查看容器详细信息
    • 查看容器日志
    • 重启容器
    • 删除容器
    • 删除所有容器
  • 容器网络说明、容器存储说明、容器镜像说明、dockerfile详述、缩略词

前言

  • 注:关于容器,其实我有docker和k8s的分栏,里面的介绍更为详细,有需要的可以去前面博客中了解。这里单独放是因为hcie课程里面有。 所以这就跟着课程简单做了笔记。
  • 容器作为云原生的关键技术之一,是云原生应用实现的主要基石,本章将从容器的定义开始,并以Docker为例,介绍容器的基本操作及容器镜像的制作方法。
  • 学完本课程后,您将能够:
    • 了解容器是什么
    • 掌握容器的基本操作
    • 掌握容器镜像的制作

容器是什么

虚拟化技术的四个特点

在这里插入图片描述

  • 分区:每个运行在容器内的应用都有自己的硬件资源
  • 隔离:通过分区所建立的多个容器之间采用逻辑隔离措施,防止相互影响
  • 封装:封装意味着将整个容器储存在独立于物理硬件的一小组文件中
  • 独立:容器可以被运行在相同linux内核的linux发行版内,和硬件无关

容器也是一种虚拟化技术

  • 虚拟化的四个特点,容器都可以实现
    • 使用命令docker run -d nginx创建了三个容器,每个容器都独立运行,拥有着自己的硬件资源
    • 同时,这三个容器既可以运行在本机,也可以运行在其他主机上
[root@localhost docker]# docker run -d nginx
ec5306ec7efec2ddbdd4e538721e3bbdc8ce29b48e6a82383f002547739421e7
[root@localhost docker]# docker run -d nginx
58065b181111e9db49f421893d028d89244764f07ce791639b14d7b0ae05f072
[root@localhost docker]# docker run -d nginx
2a9769bc8ed99191b81a2478853d9f4603b9c6305004ba970bd3bfade1c4bdfc
[root@localhost docker]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS                            PORTS     NAMES
2a9769bc8ed9   nginx     "/docker-entrypoint.…"    14 seconds ago       Up 13 seconds                   80/tcp    affectionate_cerf
58065b181111   nginx     "/docker-entrypoint.…"   15 seconds ago       Up 15 seconds                   80/tcp    bold_solomon
ec5306ec7efe   nginx     "/docker-entrypoint.…"     18 seconds ago       Up 17 seconds                   80/tcp    xenodochial_satoshi
e72612d340ec   nginx     "/docker-entrypoint.…"     About a minute ago   Exited (0) About a minute ago             silly_herschel
  • 虚拟化的四个特点,容器都可以实现
    • 使用命令docker stop ec停止其中一个容器,其他容器仍能正常运行
    • 命令docker run -d nginx中的nginx是创建容器的镜像,相当于是应用被打包后的一个文件
[root@localhost docker]# docker stop ec
ec
[root@localhost docker]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS                             PORTS     NAMES
2a9769bc8ed9   nginx     "/docker-entrypoint.…"    About a minute ago   Up About a minute          80/tcp    affectionate_cerf
58065b181111   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute           80/tcp    bold_solomon
ec5306ec7efe   nginx     "/docker-entrypoint.…"     About a minute ago   Exited (0) 1 second ago              xenodochial_satoshi
e72612d340ec   nginx     "/docker-entrypoint.…"    2 minutes ago        Exited (0) 2 minutes ago             silly_herschel
[root@localhost docker]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    298ec0e28760   14 months ago   133MB

容器是怎么实现虚拟化的?

在这里插入图片描述

  • 容器是怎么实现虚拟化的?
    • 虚拟化是通过hypervisor进行硬件的模拟,从而实现虚拟化的
    • 容器是容器引擎通过namespace和Cgroup对应用进行欺骗,从而实现虚拟化的
  • 虚拟化是通过hypervisor进行硬件的模拟,来实现虚拟化的
  • 容器是容器引擎通过namespace和Cgroup对应用进行欺骗,来实现虚拟化的

容器对比虚拟机有哪些优势?

容器虚拟机
启动速度秒甚至毫秒启动数秒至数十秒
系统内核共享内核不共享内核
实现技术利用Linux内核技术Namespace/Cgroup等实现。依赖虚拟化技术实现,由Hypervisor层实现对资源的隔离
隔离效果进程级别的隔离系统资源级别的隔离
资源消耗(性能)容器中的应用只是宿主机上的一个普通进程使用虚拟化技术,就会有额外的资源消耗和占用
资源调用(敏捷性)应用进程直接由宿主机OS管理应用进程需经过Hypervisor的拦截和处理,才能调用系统资源
运行数量一台服务器上能启动1000+容器一台服务器上一般不超过100台虚拟机
应用DevOps、微服务等用于硬件资源划分
镜像分层镜像非分层镜像

容器对比虚拟机有哪些不足?

  • 容器的实现方式注定了容器无法彻底的隔离,因此带来了一些不如虚拟机的地方
    • 安全性
    • 隔离性
    • 资源限制

容器不仅是一种虚拟化技术,更重要的是一种应用打包机制

  • 应用运行需要依赖包括操作系统在内的库,容器镜像可以将应用及其所有依赖进行打包,使应用在不同平台(开发、测试或者生产)上拥有相同的运行环境

在这里插入图片描述

容器提供的是PaaS服务

有了容器后,传统的应用部署方式发生了变化。以前用户需要先申请一个虚拟机或者安装一台物理机,然后使用脚本或者手动的方式部署应用。由于容器镜像将应用及其依赖进行了打包,部署时,仅需要将镜像解压即可

常见容器引擎

  • Docker
  • 其他
    • Containerd
    • Podman
    • iSula
    • Rocket

Docker简介

  • 容器的精髓在于镜像,而docker是容器镜像标准的制定者,因此,学习容器是绕不开docker的
  • 2013年,dotCloud公司将docker项目开源
  • Docker项目:
    • GitHub上开发的Moby开源项目的一部分
    • 遵循Apache License 2.0许可证协议
    • Go语言编写
  • Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器
  • Docker公司目前推出两个版本:
    -Docker CE(社区版)
    • Docker EE(企业版)

Docker的技术架构

在这里插入图片描述

Containerd简介

  • Containerd是Docker公司于2017年捐赠给CNCF社区的一个项目
  • 2019年2月28日,Containerd从CNCF毕业,是一个符合行业标准的运行时
  • Containerd支持Linux系统和Windows系统

iSula简介

  • 在居住中南美洲亚马逊丛林的巴西原住民眼里,iSula是一种非常强大的蚂蚁,学术上称为“子弹蚁”,因为被它咬一口,犹如被子弹打到那般疼痛,它是世界上最强大的昆虫之一
  • iSula为全量的容器软件栈,包括引擎、网络、存储、工具集与容器OS
  • iSulad作为其中轻量化的容器引擎与子弹蚂蚁“小个头、大能量”的形象不谋而合

容器生态相关术语说明

  • OCI和CNCF
    • OCI是由多家公司共同成立的基金会,以RunC为依据制定的一套容器和镜像的标准和规范
    • CNCF是一个以kubernetes为核心的容器编排开源基金会
  • RunC和Runtime
    • Runtime是对容器运行时的相关状态和操作进行管理的工具,所有的runtime共同遵守的OCI的标准和规范
    • RunC是runtime的一种,由docker公司2015年发布的符合OCI规范的runtime工具
名称内容
bundle.md(Filesystem Bundle )bundle中包含了运行容器所需要的所有信息,主要是config.json文件和rootfs。Runtime根据bundle启动容器
config.md包含对容器实施标准操作所必需的元数据,存放于config.json文件中。如oci版本、rootfs路径、mount目录、process、platform、容器hostname等
config-linux.mdLinux平台上对config.md的扩展,内容也包含在config.json文件中。如namespace、devices、CgroupPath、resources、sysctl、readonlyPaths等
runtime.md定义了3部分内容:容器状态(如status、pid等)、容器相关操作(如create、kill等)、容器生命周期
runtime-linux.md是Linux平台上对runtime.md的补充

容器和虚拟机的融合 - 安全容器

  • 安全容器
    • 安全容器融合了容器和虚拟机的特性
    • 容器之间使用hypervisor隔离,可以达到虚拟机的安全性
    • 轻量级的hypervisor可以使安全容器的启动达到容器级别

在这里插入图片描述

  • 和普通容器相比,安全容器最主要的区别是每个容器(准确地说是pod)都运行在一个单独的微型虚拟机中,拥有独立的操作系统内核,以及虚拟化层的安全隔离。因为云容器实例采用的是共享多租集群,因此容器的安全隔离比用户独立拥有私有Kubernetes集群有更严格的要求。通过安全容器,不同租户之间的容器之间,内核、计算资源、存储和网络都是隔离开的。保护了用户的资源和数据不被其他用户抢占和窃取

总结:容器是什么

容器可以被看成是一种轻量级虚拟化技术,利用namespace和Cgroup等隔离技术,将一个或者一组进程运行在一个相对独立的资源空间内

容器使用场景

  • 部署无状态服务
  • CI/CD、DevOps及微服务的场景
  • 跨Region、跨数据中心的混合云场景
  • 版本变更比较频繁的业务

容器是怎么工作的

容器工作机制 - 以Docker为例

在这里插入图片描述

容器的关键技术 - Namespace

  • Namespace是Linux内核对系统资源进行隔离和虚拟化的特性,这些系统资源包括:
    • PID
    • User
    • UTS
    • IPC
    • Net
    • Mnt

Namespace隔离说明

  • 以交互模式启动一个centos容器,并在其中运行/bin/bash程序。执行ps命令查看到“/bin/bash”是PID=1的进程,即docker将其隔离于宿主机中的其他进程
[root@localhost ~]# docker run -it centos /bin/bash
[root@24b87937f13d /]# ps axf
   PID TTY      STAT   TIME COMMAND
     1 pts/0    Ss     0:00 /bin/bash
    14 pts/0    R+     0:00 ps axf
  • 打开另一个终端,使用docker inspect查看容器进程在宿主机上的真实PID。实际上,该容器上运行的”/bin/bash”在宿主机上是PID=96745的进程
[root@localhost ~]# docker inspect 24b87937f13d | grep Pid
            "Pid": 96745,
            "PidMode": "",
            "PidsLimit": 0,

容器的关键技术 - Cgroup

在这里插入图片描述

  • Cgroups:Linux Control Group
    • 作用:限制一个进程组对系统资源的使用上限,包括CPU、内存、Block I/O等
    • Cgroups还能设置进程优先级,对进程进行挂起和恢复等操作
    • 原理:将一组进程放在一个Cgroup中,通过给这个Cgroup分配指定的可用资源,达到控制这一组进程可用资源的目的
    • 实现:在Linux中,Cgroups以文件和目录的方式组织在操作系统的/sys/fs/Cgroup路径下。该路径中所有的资源种类均可被Cgroup限制

容器管理

容器生命周期

容器是为任务而生的,容器中的任务终止了,容器也就终止了
在这里插入图片描述

创建容器

  • 创建容器命令格式为:docker create 容器镜像
  • 例如:docker create nginx
    • 使用镜像nginx创建一个容器
    • 创建完成后系统会为容器分配一个容器ID,在查看容器时,仅显示前12位,后续对容器操作时,容器ID在不冲突的情况下可简写
    • 创建后的容器状态为Created
[root@localhost ~]# docker create nginx
ad33d31adf5279d49ae6d0a9466a00965790c59067d06d16e5bcce15960baeb6
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS    PORTS     NAMES
ad33d31adf52   nginx     "/docker-entrypoint.…"   10 seconds ago   Created             sweet_hoover

启动容器

  • 启动容器命令格式为:docker start 容器ID
  • 例如:docker start a
    • a为简写后的容器ID,如果还有其他的容器ID也是以a开头,就会发生冲突
    • 启动后的容器状态变为Up
[root@localhost ~]# docker start a
a
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS     NAMES
ad33d31adf52   nginx     "/docker-entrypoint.…"   18 minutes ago   Up 4 minutes   80/tcp    sweet_hoover
  • 也可以使用命令run将容器创建和容器启动合并完成,命令格式为:docker run 容器镜像
    例如:docker run nginx
[root@localhost ~]# docker run nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up

创建和启动容器等常用的命令选项

创建、指定端口、进入容器、指定变量

  • -d 容器启动时放入后台运行,例如:docker run -d nginx
[root@localhost ~]# docker run -d nginx
86b0789d0a3b7b240e5a8f7ddfd477c9560f252e5330bc6edd61bb63167c9f3f
  • -i 交互式执行
  • -t 为容器分配一个终端,在使用该参数时需要为容器分配一个shell,但不是所有的镜像中安装了shell
  • -i-t一般配合使用,可以写作-it
  • 例如:docker run -d -it nginx /bin/bash
[root@localhost ~]# docker run -d -it nginx /bin/bash
f01db67272d10a433f1e0df46fb5d1a6a693f6ea6403cd2e1a20a01d0b8a0380
  • 使用了-it参数并分配了shell后,使用docker attach命令,可以进入容器
[root@localhost ~]# docker attach f0
root@f01db67272d1:/#
  • -p配置宿主机和容器的端口映射,例如:docker run -d -p 8081:80 nginx,其中8081为宿主机的端口,80为容器的端口
[root@localhost ~]# docker run -d -p 8081:80 nginx
53a133352e4b9f08f0425e9c217cd2824f6dac7cdf36dd29c0c5fdb41802c372
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS       PORTS                                   NAMES
53a133352e4b   nginx     "/docker-entrypoint.…"   2 hours ago   Up 2 hours   0.0.0.0:8081->80/tcp, :::8081->80/tcp   quizzical_roentgen
  • 在指定端口时,可以指定端口所使用的协议,例如:docker run -d -p 8081:80/udp nginx
[root@localhost ~]# docker run -d -p 8081:80/udp nginx
cc12f8ccabb74d115f69b723e133b168d342fec0f8aba36bfbcce1353c50890a
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                           NAMES
cc12f8ccabb7   nginx     "/docker-entrypoint.…"   6 seconds ago   Up 5 seconds   80/tcp, 0.0.0.0:8081->80/udp, :::8081->80/udp   competent_napier
  • 在启动容器时,可以一次性指定多个端口映射,例如:docker run -d -p 8081:80 -p 5000:5000 nginx
[root@localhost ~]# docker run -d -p 8081:80 -p 5000:5000 nginx
321f2a5e7e76298575d7a3f7c10e73820920c7bf001007b461bbac3ff9efb864
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                                                              NAMES
321f2a5e7e76   nginx     "/docker-entrypoint.…"   9 seconds ago   Up 8 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp, 0.0.0.0:8081->80/tcp, :::8081>80/tcp  
  • -e 在容器启动时为其配置环境变量,例如:docker run -d -it -e A=100 nginx /bin/bash,在启动容器时,将A设置为100
[root@localhost ~]# docker run -d -it -e A=100 nginx /bin/bash
7ed7285fa56dec468e1db2cf3c20ed410a5878b45d9b27bf878b24580cd09e7e
[root@localhost ~]# docker attach 7e
root@7ed7285fa56d:/# echo $A
100
  • 在创建和启动容器时,可多次使用-e选项来指定多个变量,例如:docker run -d -it -e A=100 -e B=200 nginx /bin/bash
[root@localhost ~]# docker run -d -it -e A=100 -e B=200 nginx /bin/bash
d1a3b533380181168ab9642d5479da2671ed8af45bae925ca67eeea2b3ec4213
[root@localhost ~]# docker attach d1
root@d1a3b5333801:/# echo $A
100
root@d1a3b5333801:/# echo $B
200

指定容器内工作目录、指定容器名称、指定DNS

  • --workdir 指定容器内部的工作目录,例如:docker run -d -it --workdir /tmp nginx /bin/bash,将工作目录修改为/tmp
[root@localhost ~]# docker run -d -it --workdir /tmp nginx /bin/bash
c7d7afdc2d0b9c52c988079c9ccb88cf9637ca32c731bf93448b5e39c38e2a62
[root@localhost ~]# docker attach c7
root@c7d7afdc2d0b:/tmp# pwd
/tmp
  • --name 用于创建和启动容器时,为容器指定一个名称,例如:docker run -d --name test nginx,将容器名称指定为test
[root@localhost ~]# docker run -d --name test nginx
4f830a51df2c72ec342610ca621d609cbe65103c0cd815cd4e6d87ff7a620cbe
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
4f830a51df2c   nginx     "/docker-entrypoint.…"   12 seconds ago   Up 12 seconds   80/tcp    test
  • --dns 为容器指定DNS,例如:docker run -d -it --dns 192.168.38.2 busybox /bin/sh,将容器DNS指定为192.168.38.2
    [root@localhost ~]# docker run -d -it --dns 192.168.38.2 busybox /bin/sh
    F2d1bf4537520808c5d1cc183e933176f28a87f945924307843a8bd80f936bc2
    [root@localhost ~]# docker attach f2
    / # nslookup www.baidu.com
    Server: 192.168.38.2
    Address: 192.168.38.2:53

限制容器cpu资源

  • -c 可以用来限制容器cpu资源,例如:docker run -d --cpus 0.2 progrium/stress --cpu 1中的“–cpus 0.2”表示占用了宿主机20%的cpu资源
[root@localhost Dockerfile]# docker run -d --cpus 0.2 progrium/stress --cpu 1
A7a28c2e3954728fcbe94a68d6f74fd25a982818ff5d5b59805082d269a134f5
[root@localhost Dockerfile]# top
top - 06:56:30 up  2:55,  2 users,  load average: 0.87, 0.57, 0.28
Tasks: 119 total,   2 running, 117 sleeping,   0 stopped,   0 zombie
%Cpu(s):  9.7 us,  0.2 sy,  0.0 ni, 90.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3861300 total,  2343544 free,   445236 used,  1072520 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  3168692 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  5351 root      20   0    7304     96      0     R  19.9        0.0   0:20.84 stress
   662 root      20   0  273008   4752   3656 S   0.3  0.1   0:25.42 vmtoolsd
  1071 root      20   0 1089408  45668  14616 S   0.3  1.2   0:07.91 containerd
  • progrium/stress是一个用来进行压力测试的容器镜像
  • 命令中--cpu 1表示在容器中产生1个进程,用来不停的计算随机数的平方,这样认为把容器所有的计算资源全部占用掉了
  • --cpu-period--cpu-quota配合使用也可以用来限制容器cpu资源,例如:docker run -d --cpu-period 10000 --cpu-quota 3000 progrium/stress --cpu 1 中的“–cpu-period 10000 --cpu-quota 3000”相当于“–cpus 0.3”
[root@localhost Dockerfile]# docker run -d --cpu-period 10000 --cpu-quota 3000 progrium/stress --cpu 1
Fc060bff9b4502021cbb01f262cff05861c0a129eaa04d2d5170c673791ea2c9
[root@localhost Dockerfile]# top
top - 07:11:57 up  3:11,  2 users,  load average: 0.00, 0.04, 0.14
Tasks: 120 total,   2 running, 118 sleeping,   0 stopped,   0 zombie
%Cpu(s): 16.0 us,  0.0 sy,  0.0 ni, 84.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3861300 total,  2341900 free,   446876 used,  1072524 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  3167064 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  5747 root      20   0    7304     96      0 R       29.7  0.0   0:04.10 stress
   662 root      20   0  273008   4752   3656 S   0.8  0.1   0:27.20 vmtoolsd
     1 root      20   0  125504   3936   2572 S   0.0  0.1   0:02.49 systemd
  • --cpu-period--cpu-quota分别指在10000个总时间单位中,分配给该容器3000个时间单位

限制容器内存资源

  • --memory-m 可以用来限制容器的内存资源,例如:docker run -d -m 2000M progrium/stress --vm 1 --vm-bytes 2000M 中的“-m”表示为该容器分配了2000 M内存资源
[root@localhost Dockerfile]# free -m
              total              used        free      shared  buff/cache   available
Mem:           3770        424         2299          11        1047        1480
Swap:             0           0           0
[root@localhost Dockerfile]# docker run -d -m 2000M progrium/stress --vm 1 --vm-bytes 2000M
Ad4647f1657f6ac382d400e12e66aaa23b0ecb428001dbc389078e7bcd8b312f
[root@localhost Dockerfile]# top
top - 07:25:24 up  3:24,  2 users,  load average: 1.14, 0.55, 0.28
Tasks: 123 total,   2 running, 121 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us, 19.2 sy,  0.0 ni, 80.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3861300 total,   327704 free,  2461040 used,  1072556 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1152924 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  6073 root      20   0 2055308   1.9g    244 R 100.0      52.1   1:03.88 stress
  • 命令中的–vm 1 --vm-bytes 2000M表示耗尽所有内存资源
  • 当前宿主机共4G内存,为容器分配了2000M,占用全部内存的进50%

在容器中执行命令

进入容器方式1:attach直接进入

  • attach:进入容器,然后执行命令,因此需要在运行时容器为其提前创建好终端。执行完命令使用exit可退出容器
[root@localhost ~]# docker run -d -it nginx /bin/bash
792497bf8801f008fd9372ca8d44680192447148951f2fcb85bde4a8fd158dfd
[root@localhost ~]# docker attach 79
root@792497bf8801:/# echo "this is a test"
this is a test
root@792497bf8801:/# exit
exit
[root@localhost ~]#

进入容器方式2:exec创建终端【不进入容器执命令】

  • exec:会自动创建新的终端,因此,不进入容器也可以执行命令
[root@localhost ~]# docker run -d nginx
995989fa9dd51d7587a82fa7085059eec78858a7afa0cdcfd5cca2b9f5789533
[root@localhost ~]# docker exec 99 echo "this is a test"
this is a test
  • 在exec后添加-it选项后,也可以进入容器
[root@localhost ~]# docker exec -it 79 /bin/bash
root@792497bf8801:/#

暂停和恢复容器

  • 使用命令docker pause可暂停一个运行中的容器
[root@localhost ~]# docker pause 79
79
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                   PORTS     NAMES
792497bf8801   nginx     "/docker-entrypoint.…"   26 minutes ago   Up 23 minutes (Paused)   80/tcp    dazzling_keller
  • 使用命令docker unpause可将暂停的容器恢复到运行中
[root@localhost ~]# docker unpause 79
79
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
792497bf8801   nginx     "/docker-entrypoint.…"   28 minutes ago   Up 25 minutes   80/tcp    dazzling_keller

列出容器概要信息

  • 使用docker ps可以列出当前容器的概要信息
    • 使用docker ps可以列出当前状态为运行中的容器
    • -a 可列出所有的容器
    • -q 列出容器室时仅显示容器ID
    • -n 列出最近创建的n个容器(包括所有状态)
  • 例如:docker ps -aq,可列出所有的容器
[root@localhost ~]# docker ps -aq
5ed66058457a
634f4c4e9b45
4e0f8a174dad
c545b3d90797
792497bf8801
  • 例如:docker ps -n 2,可列出最近创建的两个容器
[root@localhost ~]# docker ps -n 2
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                     PORTS     NAMES
5ed66058457a   nginx     "/docker-entrypoint.…"   3 minutes ago   Exited (0) 4 seconds ago             elated_neumann
634f4c4e9b45   nginx     "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes               80/tcp    tender_shtern

查看容器详细信息

  • 使用命令docker inspect可查看容器的详细信息,默认情况下,该命令的输出是以go语言的语法显示,如果需要使用其他格式输出,可添--format选项
  • 例如使用命令docker inspect --format=”{{json .NetworkSettings}}“ pedantic_burnell | python -m json.tool可以以json格式输出容器的网络信息

在这里插入图片描述

查看容器日志

使用命令docker logs 容器ID可查看容器的日志,例如docker logs 06即可查看到该容器的日志

[root@localhost ~]# docker logs 06
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up

重启容器

  • 使用docker restart 容器ID可以重启容器
[root@localhost ~]# docker restart 06
06
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS          PORTS     NAMES
0634a706db21   nginx     "/docker-entrypoint.…"   5 hours ago   Up 39 seconds   80/tcp    pedantic_burnell
  • 在创建容器时,使用--restart可以设置容器的自动重启策略【如:--restart=always
    • no 在容器退出时不重启容器,默认使用该策略
    • on-failure 在容器非正常退出时重启容器,后面可以添加尝试重启的次数
    • always 容器退出时总是重启容器
    • unless-stopped 在容器退出时总是重启容器,但是不考虑在docker守护进程启动时就已经停止了的容器

删除容器

  • 使用命令docker rm 容器ID删除容器,该命令只能删除非运行状态的容器,使用-f选项可以强制删除所有状态的容器
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS         PORTS     NAMES
0634a706db21   nginx     "/docker-entrypoint.…"   5 hours ago   Up 7 minutes   80/tcp    pedantic_burnell
[root@localhost ~]# docker rm 06
Error response from daemon: You cannot remove a running container 0634a706db21f8f5637143b770554c595709a17553677e62a5fe8cdb27dffafc. Stop the container before attempting removal or force remove
[root@localhost ~]# docker rm -f 06
06
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
  • 在创建容器时,使--rm选项可以在容器停止后自动删除

删除所有容器

谨慎操作。

docker ps -aq | xargs docker rm -f

容器网络说明、容器存储说明、容器镜像说明、dockerfile详述、缩略词

看这篇文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1369763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSec基础 反射修改Final修饰的属性及绕过高版本反射限制

反射重拾 半年没碰java了 先写点基础回忆一下 反射弹计算器 public class Test {public static void main(String[] args) throws Exception {Class<?> clazz Class.forName("java.lang.Runtime");clazz.getDeclaredMethod("exec", String.cla…

Aging:浙大学者研究发现,多吃这类抗氧化饮食,延缓衰老

撰文 | 宋文法 衰老&#xff0c;是一个复杂、多阶段、渐进的过程&#xff0c;发生在生命的整个过程。随着时间的流逝&#xff0c;人体的器官、肌肉会逐渐衰老&#xff0c;一些疾病也伴随着年龄的增长而发生&#xff0c;包括癌症、糖尿病、心血管疾病等。 衰老过程是由体内自由基…

autoxjs 安卓爬虫自动化

autoxjs 安卓爬虫自动化 我这里只是测试请勿用于违法的 我这里是小红书 文章目录 autoxjs 安卓爬虫自动化前言一、自动刷直播间并且抓取商品已经粉丝数量等&#xff1f;总结 前言 欢迎来到AutoXJS的世界&#xff0c;这是一个充满创新、挑战和技术探索的领域。在这个引领未来的…

【huggingface】【pytorch-image-models】timm框架中使用albumentations库数据增广

文章目录 一、前言二、实操2.1 声明库2.2 定义你的数据增广算子2.3 加入其中 一、前言 问题是这样的&#xff0c;在使用timm框架训练时&#xff0c;发现数据增广不够&#xff0c;想用Albumentations库的数据增广&#xff0c;怎么把后者嵌入到前者的训练中。 其实也是比较简单…

CHS_02.1.4+操作系统体系结构 二

CHS_02.1.4操作系统体系结构 二 操作系统的结构 上篇文章我们只介绍过宏内核 也就是大内核以及微内核分层结构的操作系统模块化是一种很经典的程序设计思想宏内核和微内核外核 操作系统的结构 上篇文章我们只介绍过宏内核 也就是大内核以及微内核 今年大纲又增加了分层结构 模块…

unity编辑器Scene界面输出位置及路径

工程Asset下新建Editor文件夹&#xff1b; Editor文件夹下新建脚本LogPosition using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; public class LogPosition : EditorWindow {//最终输出的数据.static string logtext;//增…

GCF:在线市场异质治疗效果估计的广义因果森林

英文题目&#xff1a;GCF: Generalized Causal Forest for Heterogeneous Treatment Effects Estimation in Online Marketplace 中文题目&#xff1a;GCF&#xff1a;在线市场异质治疗效果估计的广义因果森林 单位&#xff1a;滴滴&美团 时间&#xff1a;2022 论文链接…

[java]JAVA中文版API手册 -jdk_api_1.8

有mac和win版本 链接&#xff1a;https://pan.baidu.com/s/14WGXJYBICeSxgg6OxBVGRQ 提取码&#xff1a;c03p

MCU、MPU、SOC简介

文章目录 前言一、MCU二、MPU三、SOC总结 前言 随着处理器技术的不断发展&#xff0c;CPU(Central Processing Unit)的发展逐渐出现三种分支&#xff0c;分别是MCU(Micro Controller Unit&#xff0c;微控制器单元) 和MPU&#xff08;Micro Processor Unit&#xff0c;微处理器…

软考高级系统架构设计师考试经验分享

文章目录 1. 软考介绍&#xff08;1&#xff09;什么是软考&#xff08;2&#xff09;软考的作用&#xff08;3&#xff09;软考各科目的难度&#xff08;4&#xff09;考试时间&#xff08;5&#xff09;考试形式 2.系统架构设计师备考经验&#xff08;1&#xff09;辅导资料&…

数据结构与算法(十)深度优先搜索与广度优先搜索

广度优先搜索 广度优先搜索&#xff1a;从一个顶点出发&#xff08;由开始时顶点创造顺序优先决定&#xff09;&#xff0c;访问所有没有被访问过的临节点。然后在从被访问过的节点出发&#xff0c;重复之前的操作 如下为一个图 从1出发&#xff0c;先后访问2 3&#xff0c;之后…

String的(toCharArray\split)方法*

题目 class Solution {public int firstUniqChar(String s) {int[] sum new int[26];char[] num s.toCharArray();for(int i0;i<num.length;i) {sum[num[i]-a];}for(int j0;j<num.length;j) {if(sum[num[j]-a] 1) {return j;}}return -1; } }题目 …

我的1827创作纪念日

机缘 习惯性早上打开电脑&#xff0c;看看CSDN上的资讯&#xff0c;了解行业动态、当前新的技术和大佬的分享。自己动手写应该是2019 年 01 月 08 日&#xff0c;当时应该是在用安装和使用Oracle&#xff0c;遇到一些问题&#xff0c;写下第一篇博客 Oracle存储过程常见问题及…

【RK3399 PCIE调试——硬件信息资源获取】

一、1、 硬件接口 二、2、 PCB原理图 三、 官网地址&#xff1a; https://t.rock-chips.com/portal.php 相关资料和固件烧写可参考资料下载菜单

欧拉图及其应用

什么是欧拉图 提到欧拉图就要谈到哥尼斯堡七桥问题&#xff0c;最初有这样的一个问题的&#xff1a;18世纪中叶&#xff0c;东普鲁士哥尼斯堡城有一条贯穿全城的普雷格尔河&#xff0c;河中有两个岛&#xff0c;通过七座桥彼此相连&#xff0c;如下图所示 问题是这样的&…

(非常全面的干货)Python接口自动化测试框架实战开发

一丶叙述 1.项目介绍 整个项目分为四个部分&#xff1a;接口基础丶接口开发丶Unittest与接口测试结合以及接口自动化框架从设计到开发 接口基础包括&#xff1a;HTTP接口 / 常见接口 / 接口工具 / 接口基础知识 接口开发&#xff1a;通过Django来开发get/post接口 Unittes…

“器官短缺”将被打破 基因编辑猪成为人类的“二师兄”

器官移植被称为生命之灯。但是&#xff0c;受制于传统观念及对人体器官捐献意义的不了解&#xff0c;人体器官捐献的数量&#xff0c;还远远达不到需求。目前&#xff0c;全国有近30万的患者在等待器官移植&#xff0c;但每年只有近一万的患者能真正得到器官移植&#xff0c;缺…

银联扫码第三方支付接口申请:开启便捷支付新时代

随着移动支付的普及&#xff0c;越来越多的商家开始接受微信、支付宝等第三方支付平台的付款方式。然而&#xff0c;作为国内最大的银行卡组织&#xff0c;银联也在不断拓展其业务范围&#xff0c;推出了自己的扫码支付接口。本文将为您详细介绍银联扫码第三方支付接口的申请流…

【Azure 架构师学习笔记】- Azure Databricks (5) - Unity Catalog 简介

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (4) - 使用Azure Key Vault 管理ADB Secret 前言 DataBricks Unity Catalog&#xff08;UC&#xff09;是一个统一的对数据资产治理的解决方案…

【算法Hot100系列】有效的数独

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…