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

文章目录

  • 前言
  • 容器是什么
    • 虚拟化技术的四个特点
    • 容器也是一种虚拟化技术
    • 容器是怎么实现虚拟化的?
    • 容器对比虚拟机有哪些优势?
    • 容器对比虚拟机有哪些不足?
    • 容器不仅是一种虚拟化技术,更重要的是一种应用打包机制
    • 容器提供的是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详述、缩略词

看这篇文章

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SSH远程访问出现Permission denied(password)解决方法

首先,这个不是密码输错了的问题; 1、在主机先ping一下服务器 ping XXX.XXX.XX.XXX (服务器ip地址) 如果pin成功了,说明可以进行连接 查看服务器的ip ifconfig2、主机连接服务器 (服务器的ip) ssh testXXX.XXX.XX.…

Java中SpringBoot组件集成接入【MQTT中间件】

Java中SpringBoot组件集成接入【MQTT中间件】 1.MQTT介绍2.搭建MQTT服务器1.Windows2.Ubuntu3.Docker4.其他方式3.mqtt可视化客户端MQTTX及快速使用教程4.SpringBoot接入MQTT1、maven依赖2、MQTT配置3、MQTT组件具体代码1.定义通道名字2.消息发布器3.MQTT配置、生产者、消费者4…

线扫相机品牌汇总(国外+国内)

线扫相机品牌汇总(国外+国内) 行者 ​ 热爱生活 22 人赞同了该文章 线扫相机也叫做线阵相机,和面阵相机一样,都是重要的工业相机。 线扫相机正如其名字那样,拍照时像扫描一样,相机和被拍照物体有相对匀速运动。 Perhaps the most common example of line scan imagin…

如何顺滑使用华为云编译构建平台?

这两年平台构建服务需求越来越大,却一直苦于找不到一些指南, 这里特意写了一篇, 对在学习代码阶段和新手程序员朋友也蛮友好, 配置真的也不难, 也特别适合想尝试从0到1做个APP的朋友了。 以华为云的CodeArts Build为例…

Mac/Linux虚拟机CrossOver2024新版下载使用教程

CrossOver不像Parallels或VMware的模拟器,而是实实在在Mac OS X系统上运行的一个软件,该软件可以让用户在mac是上直接运行windows软件,本文为大家带来的是CrossOver Mac版安装教程! CrossOver Mac-安装包下载如下:http…

ubuntu系统(9):ubuntu 20.02安装pydot

目录 警告信息 1、确保安装了Python和pip 2、安装Graphviz软件包 3、pip安装pydot 验证 在gem5中,pydot库用于生成图形化输出,特别是生成.dot文件和相关的图像文件,如PDF、PNG等。它与gem5结合使用的一个常见用途是生成系统结构图、内存…

MFC结合GDI+

MFC结合GDI 创建一个空的MFC界面,在确定按钮函数里进行画图: 1、包含头文件与库 在stdafx.h中加入以下三行代码: #include "gdiplus.h" using namespace Gdiplus; #pragma comment(lib, "gdiplus.lib")2、安装GDI 在…

深度学习 Day25——J4 ResNet与DenseNet结合探索(DPN)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制🚀 文章来源:K同学的学习圈子 文章目录 前言1 我的环境2 pytorch实现DPN算法2.1 前期准备2.1.1 引入库2.1.2 设置GP…

【C++进阶04】STL中map、set、multimap、multiset的介绍及使用

一、关联式容器 vector/list/deque… 这些容器统称为序列式容器 因为其底层为线性序列的数据结构 里面存储的是元素本身 map/set… 这些容器统称为关联式容器 关联式容器也是用来存储数据的 与序列式容器不同的是 其里面存储的是<key, value>结构的键值对 在数据检索时…

MongoDB高级集群架构设计

两地三中心集群架构设计 容灾级别 RPO & RTO RPO&#xff08;Recovery Point Objective&#xff09;&#xff1a;即数据恢复点目标&#xff0c;主要指的是业务系统所能容忍的数据丢失量。RTO&#xff08;Recovery Time Objective&#xff09;&#xff1a;即恢复时间目标&…

赋能软件开发:生成式AI在优化编程工作流中的应用与前景

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;特别是生成式AI模型如GPT-3/4的出现&#xff0c;软件开发行业正经历一场变革&#xff0c;这些模型通过提供代码生成、自动化测试和错误检测等功能&#xff0c;极大地提高了开发效率和软件质量。 本文旨在深入…

ArcGIS中style文件的导入及lyr的文件的使用

地图是地理信息的重要载体&#xff0c;科学的配色方案可以有效地传递地理信息&#xff0c;而美观协调的配色方案也是我们进行地图符号化设计的重要内容。在日常工作中&#xff0c;我们常常苦恼于自带颜色不能满足需要或是希望使用现成的颜色模板&#xff0c;自定义配色方案导入…

一文详解VScode 的远程开发

VS code登录服务器后进行编码和调试&#xff0c;VS code上的所有功能都可以使用&#xff0c;和在本地开发基本无区别。 一、配置免密远程登录 因为是要远程登录&#xff0c;那么需要通过使用ssh进行密钥对登录&#xff0c;这样每次登录服务器就可以不用输入密码了。 先来一句官…

Python综合数据分析_RFM用户分层模型

文章目录 1.数据加载2.查看数据情况3.数据合并及填充4.查看特征字段之间相关性5.聚合操作6.时间维度上看销售额7.计算用户RFM8.数据保存存储(1).to_csv(1).to_pickle 1.数据加载 import pandas as pd dataset pd.read_csv(SupplyChain.csv, encodingunicode_escape) dataset2…

Qt - QML框架

文章目录 1 . 前言2 . 框架生成3 . 框架解析3.1 qml.pro解析3.2 main.cpp解析3.3 main.qml解析 4 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 什么是QML&#xff1f; QML是一种用户界面规范和编程语言。它允许开发人员…

C++类与对象基础(6)

(注&#xff1a;本篇文章介绍部分内容时&#xff0c;需要用到上盘文章中日期类的代码&#xff0c;文章链接如下&#xff1a;C类与对象基础(5)——日期类的实现-CSDN博客​​​​​​&#xff09; 目录 1. 运算符重载的相关补充&#xff1a; 1.1流运算符重载出现的问题&#x…

C语言爬虫程序采集58商铺出租转让信息

为了找到一个好店铺好位置&#xff0c;往往要花费很大精力和财力过去寻找&#xff0c;就有有某些出租平台但是一个个查找下来也是十分麻烦&#xff0c;所以我利用我们的C语言基础&#xff0c;给大家写个商品转租的爬虫程序&#xff0c;让找店铺不在那么费时费力&#xff0c;至少…

图像去噪——CBDNet网络训练自己数据集及推理测试,模型转ONNX模型(详细图文教程)

CBDNet 主要由两个子网络组成&#xff1a;噪声估计子网络和去噪子网络。噪声估计子网络用于估计图像的噪声水平&#xff0c;而去噪子网络用于去除图像中的噪声。 CBDNet 的优势在于&#xff1a; 它采用了更真实的噪声模型&#xff0c;既考虑了泊松-高斯模型&#xff0c;还考虑…

37-数据类型,一元运算符typeof,字符串string,布尔Boolean,未定义undefined,空null,数组Array

<body><script>// 0.1加0.2不等于0.3&#xff0c;正确的运算方法如下console.log(0.10.2);var x 0.1;var y 0.2;console.log((x*10y*10)/10);</script> </body> 简单数据类型&#xff08;5种&#xff09;&#xff1a;数字number&#xff0c;字符串s…

MFC Socket和合信CTMC M266ES 运动控制型PLC通信进行数据交换

前言 1、前两篇文章通过对Snap7和S7-1200/S7-1500PLC的通信进行了详细的介绍。Snap7的优点开源性强、使用方便易于上手&#xff0c;跨平台和可移植性性强。但是Snap7也有个缺点就是只能访问PLC的DB、MB、I、Q区进行数据读写&#xff0c;不能对V区进行读写,有人说可以读写V区&am…