zoukankan      html  css  js  c++  java
  • 【Docker】第三篇 Docker容器管理

    一、Docker容器概述:

    • 简单理解容器是镜像的一个实例。
    • 镜像是静态的只读文件,而容器的运行需要可写文件层。

    二、创建容器

    [root@web130 ~]# docker create -it ubuntu:latest    #-i打开标准输入,-t是打开一个伪终端
    17c54a92a4e83503e329c3c80e4d10bf298516edffa56b2cea8fa2aa73d4c00c

    #我们要了解一下容器标识符:如上显示的CONTAINER ID作为容器的唯一标识。
    #CONTAINER ID 默认是128位,但是一般16位就足以保证其在本机的唯一性。所以默认我们使用简约形式即可(id的前16位)。
    #当然我们也可以根据自己情况选择适当的位数,来代表容器启停

    [root@web130 ~]# docker ps -a  #显示所有容器,#docker ps 显示正在运行的容器。#docker ps --no-trunc输出信息不截断显示,可以看到完整id

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17c54a92a4e8 ubuntu:latest
    "/bin/bash" 8 seconds ago Created quizzical_bhabha

    1、查看docker运行的进程:

    [root@web130 ~]# docker container ls  #新命令等价与下边ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    [root@web130 ~]# docker ps #可以看到已经启动的容器、每个容器的ID、所使用的镜像、创建时间、当前状态、监听的端口和容器的名字
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    [root@web130 ~]# 

    2、启动容器:

    #我们可以通过容器ID不同的前几位id号来代表指定在容器,也可以用全部ID号

    [root@web130 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
    17c54a92a4e8        ubuntu:latest       "/bin/bash"         6 minutes ago       Created                                       quizzical_bhabha
    [root@web130 ~]# docker start 17
    17
    [root@web130 ~]# docker ps    #可以看到已经启动的容器、每个容器的ID、所使用的镜像、创建时间、当前状态、监听的端口和容器的名字
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    17c54a92a4e8        ubuntu:latest       "/bin/bash"         8 minutes ago       Up About a minute                       quizzical_bhabha
    [root@web130 ~]# 

    3、新建并启动一个容器

    **docker run在创建容器的时候,在后台运行的标准操作如下:

    1. 检查本地是否有指定镜像,如果没有直接从公有仓库下载;
    2. 利用镜像创建一个容器,并启动该容器;
    3. 分配一个文件系统,并在只读的镜像层外边挂载一层可读写层;
    4. 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
    5. 执行用户指定的应用程序;
    6. 执行完毕后容器制动终止。
    [root@web130 ~]# docker run ubuntu /bin/echo 'hello world'
    hello world
    [root@web130 ~]# docker ps 
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    17c54a92a4e8        ubuntu:latest       "/bin/bash"         13 minutes ago      Up 6 minutes                            quizzical_bhabha
    [root@web130 ~]#
    #**启动一个bash终端,允许用户交互
    [root@web130 ~]# docker run -it ubuntu:14.04 /bin/bash
    root@041941f24d3d:/# ls
    bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@041941f24d3d:/# pwd
    /
    root@041941f24d3d:/# ps     #可以看到容器只运行了一个bash应用,并没有运行其他无关进程
       PID TTY          TIME CMD
         1 pts/0    00:00:00 bash
        15 pts/0    00:00:00 ps
    root@041941f24d3d:/# exit   #退出容器,或者Ctrl+d
    exit
    [root@web130 ~]# 
    #我们可以加上--rm选项,--name选项,容器退出时,自动删除容器
    [root@web130 ~]# docker run -it --rm ubuntu:14.04 /bin/bash
    [root@web130 ~]# docker run --name t1 -it --rm ubuntu:14.04 /bin/bash  #指定容器名
    
    某些情况下,docker run 容器执行错误,默认情况下常见错误码:
    #125:Docker daemon执行错误,例如指定不支持的Docker命令参数;
    #126:所指定命令无法执行,例如权限出错;
    #127:容器内命令无法找到。
    命令执行错误会返回错误码

    4、容器守护态(Daemonized)运行

    #一些时候让容器在后台运行,用参数-d 来实现
    [root@web130 ~]# docker run -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
    da81dbb0e2dadde799ca4d40189c3d14911ea269f76ce7843f9d585d7efbcd6a
    [root@web130 ~]# 
    
    [root@web130 ~]# docker ps     #可以看到运行的容器,当然我们也可以上条命令中--name 指定容器名字,便于识别
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    da81dbb0e2da        ubuntu              "/bin/sh -c 'while t…"   14 seconds ago      Up 12 seconds                           festive_mirzakhani
    17c54a92a4e8        ubuntu:latest       "/bin/bash"              42 minutes ago      Up 34 minutes                           quizzical_bhabha
    [root@web130 ~]# docker logs da8
    hello world
    hello world
    hello world
    ....省略....

    三、终止容器

    stop和kill命令的区别:
    *stop是首先发送SIGTERM信号,等一段时间(默认10秒),在发送SIGKILL信号终止容器
    *kill直接发送SIGKILL终止容器,强制终止容器
    [root@web130 ~]# docker stop da8  #可以-t 指定等待时间,
    da8
    [root@web130 ~]# docker ps      #查看启动的容器
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    17c54a92a4e8        ubuntu:latest       "/bin/bash"         45 minutes ago      Up 38 minutes                           quizzical_bhabha
    [root@web130 ~]# docker ps -a   #查看所有容器
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
    da81dbb0e2da        ubuntu              "/bin/sh -c 'while t…"   4 minutes ago       Exited (137) 13 seconds ago                       festive_mirzakhani
    041941f24d3d        ubuntu:14.04        "/bin/bash"              19 minutes ago      Exited (0) 19 minutes ago                         nervous_jepsen
    439157f8ea55        ubuntu              "/bin/echo 'hello wo…"   33 minutes ago      Exited (0) 33 minutes ago                         vigorous_boyd
    [root@web130 ~]# docker ps -qa  #查看所有容器ID
    da81dbb0e2da
    041941f24d3d
    439157f8ea55
    [root@web130 ~]# docker start da8   #启动指定容器
    [root@web130 ~]# docker restart da8 #将一个运行的容器先终止,然后在重启启动它

    四、进入容器

    #前文-d我们将容器放在后台运行,无法操作也无法看到容器中的信息,如何进入一个后台运行的容器,方法如下:

    1、attach命令
    [root@web130 ~]# docker run --name ylt -itd ubuntu   #创建一个名字为ylt的容器
    7058cf192514f4a6de3340d86d61d6f2dbea0503f85ae35634fb2511cc026f6d  
    [root@web130 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NMES
    7058cf192514        ubuntu              "/bin/bash"         6 seconds ago       Up 6 seconds                            ylt
    [root@web130 ~]# docker attach ylt   #进入后台运行的容器
    root@7058cf192514:/# ls
    bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@7058cf192514:/# 
    
    注:当多窗同时通过attach命令连到容器的时候,所有窗口会同步显示。当某个窗口阻塞的时候,其他窗口无法执行命令
    当一个窗口exit容器的时候另个也会退出。
    2、exec命令,最推荐的一种方式
    #docker从1.3.0版本起提供了更加方便的exec命令,可以在容器内直接执行任意命令,同时如果多窗口执行,不会出现attach的问题:
    [root@web130 ~]# docker start ylt      #启动容器
    ylt
    [root@web130 ~]# docker exec -it 7058cf192514  /bin/bash   #进入容器,可以多窗口执行
    root@7058cf192514:/# ls
    bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
    boot  etc  lib   media  opt  root  sbin  sys  usr
    root@7058cf192514:/# exit
    [root@web130 ~]# 
    3、nsenter工具需要安装,此处不详细介绍

    五、删除容器

    #docker rm 删除一个终止的容器
    #docker rm -f 可以强制删除一个正在运行容器

    [root@web130 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                           PORTS               NAMES
    7058cf192514        ubuntu              "/bin/bash"              19 minutes ago      Up 7 minutes                                         ylt
    da81dbb0e2da        ubuntu              "/bin/sh -c 'while t…"   41 minutes ago      Exited (137) 37 minutes ago                          festive_mirzakhani
    041941f24d3d        ubuntu:14.04        "/bin/bash"              About an hour ago   Exited (0) About an hour ago                         nervous_jepsen
    [root@web130 ~]# docker rm 041941f24d3d 
    [root@web130 ~]# docker ps     #我们可以看到刚才启动的容器
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    7058cf192514        ubuntu              "/bin/bash"         22 minutes ago      Up 10 minutes                           ylt
    17c54a92a4e8        ubuntu:latest       "/bin/bash"         About an hour ago   Up About an hour                        quizzical_bhabha
    [root@web130 ~]# docker rm ylt #运行中的容器无法删除
    Error response from daemon: You cannot remove a running container 7058cf192514f4a6de3340d86d61d6f2dbea0503f85ae35634fb2511cc026f6d. Stop the container before attempting removal or force remove
    [root@web130 ~]# docker rm -f ylt   #可以强制删除运行中的容器,直接发送的是SIGKILL信号
    ylt
    [root@web130 ~]# 
    [root@web130 ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    17c54a92a4e8        ubuntu:latest       "/bin/bash"         About an hour ago   Up About an hour                        quizzical_bhabha
    [root@web130 ~]# 

    六、导入和导出容器

    #其实就是一个容器迁移的过程,不用考虑容器是否为运行状态

    1、导出容器可以使用-o,或者输出重定向“>”
    [root@web130 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                           PORTS               NAMES
    da81dbb0e2da        ubuntu              "/bin/sh -c 'while t…"   About an hour ago   Exited (137) 44 minutes ago                          festive_mirzakhani
    041941f24d3d        ubuntu:14.04        "/bin/bash"              About an hour ago   Exited (0) About an hour ago                         nervous_jepsen
    [root@web130 ~]# docker export -o test_docker_run.tar da8 #-o
    [root@web130 ~]# ls |grep test_docker*
    test_docker_run.tar
    [root@web130 ~]# docker export 041 >test_docker_stop.tar  #输出重定向
    [root@web130 ~]# ls |grep test_docker
    test_docker_run.tar
    test_docker_stop.tar
    [root@web130 ~]# 
    2、导入容器
    #导出的文件可以使用docker import 命令导入变成镜像,该命令格式为:
    [root@web130 ~]# cat test_docker_run.tar |docker import - test/ubuntu:v1.0
    sha256:7528eea6db23ec008244e9f65205421fcaa164748054b25dbae1a00f84582b66
    [root@web130 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    test/ubuntu         v1.0                7528eea6db23        13 seconds ago      69.8MB
    #通过指定 URL 或者某个目录来导入
    [root@web130 ~]#docker import http://example.com/exampleimage.tgz test/ubuntu:v1.0
  • 相关阅读:
    张旭升20162329 2006-2007-2 《Java程序设计》第一周学习总结
    预备作业03——20162329张旭升
    预备作业02 : 体会做中学-20162329 张旭升
    预备作业01——20162329
    FPGA的软核与硬核
    网页调用vlc并播放网络视频
    vue视频插件VLC
    vue+vue-video-player实现弹窗播放视频
    【面向对象程序设计】作业三
    【面向对象程序设计】作业二
  • 原文地址:https://www.cnblogs.com/yangleitao/p/9687486.html
Copyright © 2011-2022 走看看