暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Docker 与 K8S学习笔记(五)—— 容器的操作(上篇)

SET技术干货 2021-09-26
990

上一篇我们介绍了Dockerfile的基本编写方法,这一节我们来看看Docker容器的常用操作。

一、容器的运行方式

容器有两种运行方式,即daemon形式运行与非daemon形式运行,通俗地讲就是长期运行和短暂运行,当我们的容器作为对外服务的时候需要采用damon形式运行,当我们的容器仅仅作为一个临时的工作环境那么使用非daemon形式运行是比较恰当的。

首先先来看看以非daemon形式如何运行容器,比我们启动一个容器然后执行ls -a命令:

    $ sudo docker run ubuntu:18.04 ls -a
    .
    ..
    .dockerenv
    bin
    boot
    dev
    etc
    home
    lib
    ......

    此时我们看看容器状态,我们可以发现此时容器已经退出了,它的状态是Exited。

      $ sudo docker ps -a
      CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
      01932bada339 ubuntu:18.04 "ls -a" 45 seconds ago Exited (0) 44 seconds ago zen_albattani

      很显然这种“一闪而过”的容器运行方式往往不能满足我们部署服务的需求,接下来我们看看如何以daemon形式运行容器。

      我们首先要明确一点:容器的生命周期依赖于容器启动时执行的命令,只要该命令不结束,容器就不会退出理解了这个原理,那我们接下来让容器执行top命令验证一下:

        $ sudo docker run ubuntu:18.04 top -b
        top - 14:32:01 up 5:09, 0 users, load average: 0.01, 0.03, 0.00
        Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
        %Cpu(s): 0.6 us, 0.6 sy, 0.1 ni, 98.6 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
        KiB Mem : 4015800 total, 967180 free, 296536 used, 2752084 buff/cache
        KiB Swap: 4015100 total, 4015088 free, 12 used. 3426824 avail Mem


        PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
        1 root 20 0 36496 2992 2644 R 0.0 0.1 0:00.03 top

        由于当前终端不会退出,所以另起一个终端通过docker ps -a看下容器状态,可见容器仍处于运行状态:

          $ sudo docker ps -a
          CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
          f0adeca308f6 ubuntu:18.04 "top -b" 2 minutes ago Up 2 minutes vigilant_wilbur
          01932bada339 ubuntu:18.04 "ls -a" 7 minutes ago Exited (0) 7 minutes ago zen_albattani

          上面这种方式虽然让容器长期运行,但大家会发现这种方式存在一个确定,那就是他会占用一个终端,因此我们可以通过-d参数以后台方式启动容器:

            $ sudo docker run -d ubuntu:18.04 top -b
            82b049e20195fcbbd0f8a69fb5d11b2a70ad408f2324a750446acae5a269da7f

            这条命令执行后返回了一条字符串,这条字符串就是所启动容器的ID。通过此ID,我们可以对容器进行一系列的操作。


            二、如何进入容器

            我们在实际工作中,往往需要进入到容器内部做一些工作,比如查看日志、调试或启动其它进程等,进入容器有两种方式:attach和exec。接下来分别对这两种方式进行讲解。

            1、attach方式

            attach会让我们进入到容器启动命令的终端,这就意味着我们通过此命令进入容器后是能看到容器当前执行的命令的输出,如果要退出容器使用ctrl + p和ctrl + q即可,如果使用ctrl + c有时会退出容器。

            我们就以刚才后台启动的容器进行演示,当我们attach此容器时,我们便能看到top命令的输出:

              $ sudo docker attach 82b049e20195fcbbd0f8a69fb5d11b2a70ad408f2324a750446acae5a269da7f




              top - 14:46:37 up 5:24, 0 users, load average: 0.00, 0.00, 0.00
              Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
              %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
              KiB Mem : 4015800 total, 962780 free, 297956 used, 2755064 buff/cache
              KiB Swap: 4015100 total, 4015088 free, 12 used. 3426364 avail Mem


              PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
              1 root 20 0 36496 3028 2672 R 0.0 0.1 0:00.18 top

              这个时候细心的你一定发现,此时通过ctrl+p和ctrl+q无法退出容器,这是为什么呢?当启动容器时没有指定-t -i参数时,attach容器后,执行ctrl+p,ctrl+q是无法退出当前容器的

              2、exec方式

              exec方式可以是我们进入到对应容器中,我们可以像操作linux服务器一样操作容器,如果要退出容器直接使用exit命令即可。

                $ sudo docker exec -it 82b049e20195fcbbd0f8a69fb5d11b2a70ad408f2324a750446acae5a269da7f bash
                root@82b049e20195:/# ls
                bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

                这里要注意,我们一定要带上-it参数,这样才能以交互模式打开终端。大家会注意到root@后面跟了一串字符串,这个其实是容器的短ID,我们执行exec时使用的是容器的长ID,对于同一个容器,使用长ID或短ID都可以使我们对于容器进行一系列操作。

                3、attach与exec方式对比

                • attach直接进入容器启动命令的终端,不会启动新的进程;

                • exec则在容器中打开新的终端,并可以启动新的进程;

                • 如果想直接在容器中查看启动命令的输出那就用attach,其他情况使用exec。


                文章转载自SET技术干货,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论