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

2024-01-08 17:38:55

前言

  • 注:关于容器,其实我有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详述、缩略词

看这篇文章

文章来源:https://blog.csdn.net/cuichongxin/article/details/135461645
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。