zoukankan      html  css  js  c++  java
  • docker 9 docker的容器命令

    有镜像才能创建容器,这是根本的前提

    下面我们以下载一个centos镜像来做演示。

    [root@t-docker chenzx]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    [root@t-docker chenzx]# docker pull centos
    Using default tag: latest
    latest: Pulling from library/centos
    256b176beaff: Already exists 
    Digest: sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf
    Status: Downloaded newer image for centos:latest
    [root@t-docker chenzx]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos              latest              5182e96772bf        3 weeks ago         200MB
    

    以交互式方式启动容器 

        功能:新建并启动容器 

        参数

     --name='容器新名字':为容器指定一个别名;
     -d:后台运行容器,并返回容器ID,也就是启动守护式容器;
     -i:以交互式模式运行容器,通常与-t同时使用;
     -t:tty,为容器重新分配一个伪终端,通常与-i同时使用;
     -P:随机端口映射;
     -p:指定端口映射,有以下四种格式:
         ip:hostPort:containerPort
         ip::containerPort
         hostPort:containerPort
         containerPort
    

     运行一个容器

    [root@t-docker chenzx]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos              latest              5182e96772bf        3 weeks ago         200MB
    [root@t-docker chenzx]# 
    [root@t-docker chenzx]# docker run -it 5182e96772bf  ##这句话就是说我以centos镜像为模板,生成一个23c6bc378d16这样的一个容器
    [root@23c6bc378d16 /]# 
    [root@23c6bc378d16 /]# ls ##这时已经进入容器的centos里面了
    anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

        再开另外一个窗口,在宿主机上执行如下命令,看到启动的容器: 

    [root@t-docker chenzx]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    7da6063256a0        centos              "/bin/bash"         6 seconds ago       Up 5 seconds                            practical_ardinghelli
    

     [root@t-docker chenzx]# docker run -it --name mycentos0115 centos 

    [root@ 0ecd4b9f8895 /]# #看到我们又生成了一个以centos镜像为模板,id为 0ecd4b9f8895的新容器。

    画外音:一个镜像可以生成多个容器

    [root@t-docker chenzx]# docker ps

    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

    0ecd4b9f8895        centos              "/bin/bash"         3 minutes ago       Up 3 minutes                            mycentos0115

    docker ps

        功能:查看有哪些容器在跑,在宿主机上执行该命令。 

        参数:

    -a:列出当前所有正在运行的容器+历史上运行过的;
    -l:last,显示最近创建的容器;
    -n:显示最近n个创建的容器;
    -q:静默模式,只显示容器编号
    --no-trunc:不截断输出
    
    [root@t-docker chenzx]# docker ps ##不加任何参数,表示当前正在运行的容器
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    7da6063256a0        centos              "/bin/bash"         6 seconds ago       Up 5 seconds                            practical_ardinghelli

    退出容器 

    exit:容器停止退出

    ctrl+P+Q:容器不停止退出

    启动容器

    先查出最近启动的容器,看到它们是关闭的状态:

    [root@t-docker chenzx]# docker ps -n 2
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
    0ecd4b9f8895        centos              "/bin/bash"         7 minutes ago       Exited (137) 16 seconds ago                       mycentos0115
    7da6063256a0        centos              "/bin/bash"         23 minutes ago      Exited (130) 4 minutes ago                        practical_ardinghelli
    

     启动容器

    [root@t-docker chenzx]# docker start 0ecd4b9f8895  ##注意加的是上面ps查出的容器id
    0ecd4b9f8895
    [root@t-docker chenzx]# docker ps #查看当前正在运行的容器
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    0ecd4b9f8895        centos              "/bin/bash"         8 minutes ago       Up 5 seconds                            mycentos0115

    重启容器

    [root@t-docker chenzx]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    0ecd4b9f8895        centos              "/bin/bash"         10 minutes ago      Up 2 minutes                            mycentos0115
    [root@t-docker chenzx]# docker restart 0ecd4b9f8895
    0ecd4b9f8895

    停止容器

    [root@t-docker chenzx]#  docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    0ecd4b9f8895        centos              "/bin/bash"         12 minutes ago      Up About a minute                       mycentos0115
    [root@t-docker chenzx]# 
    [root@t-docker chenzx]# docker stop 0ecd4b9f8895 
    0ecd4b9f8895

    强制停止容器

    [root@t-docker chenzx]#  docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    0ecd4b9f8895        centos              "/bin/bash"         13 minutes ago      Up 2 seconds                            mycentos0115
    [root@t-docker chenzx]# 
    [root@t-docker chenzx]# docker kill 0ecd4b9f8895
    0ecd4b9f8895

    删除已经停止的容器 

    docker rm:删除容器 

    docker rmi: 删除镜像

    [root@t-docker chenzx]#  docker ps -n 2
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
    0ecd4b9f8895        centos              "/bin/bash"         15 minutes ago      Exited (137) About a minute ago                       mycentos0115
    7da6063256a0        centos              "/bin/bash"         31 minutes ago      Exited (130) 11 minutes ago                           practical_ardinghelli
    [root@t-docker chenzx]# docker rm 0ecd4b9f8895  删除已经关闭的容器
    0ecd4b9f8895
    [root@t-docker chenzx]# docker rm  -f 0ecd4b9f8895  强制删除正在运行中的容器
    0ecd4b9f8895

    一次性删除多个容器:

    docker rm -rf $(docker ps -a -q)

    docker ps -a -q |xargs docker rm

    以守护式方式启动容器 

        命令格式:docker run -d 容器名

        参数说明:

             -d:以守护式方式启动容器: 

             -it:以交互式方式启动容器;

    [root@t-docker chenzx]# docker run -d centos
    fa80295c878acdf30531ecbf58be87b00427e4f941d10edf93b5d066ba40d000
    [root@t-docker chenzx]# docker ps 没有输出,奇怪吗
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

       题:上面我们看到通过docker run -d ceonts方式(即守护式启动容器)启动容器后,再通过docker ps -a进行查看,会发现容器已经退出。很重要的说明一点: Docker容器后台运行,就必须有一个前台进程。

        容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。 

        这个是docker机制的问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动相应的service即可。例如service nginx start。但是,这样做,nginx为后台模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事情可做了。所以, 最佳的解决方案是,将你要运行的程序以前台进程的形式运行。

    [root@t-docker chenzx]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    tomcat              latest              690cb3b9c7d1        7 days ago          463MB
    centos              latest              5182e96772bf        3 weeks ago         200MB
    [root@t-docker chenzx]# 
    [root@t-docker chenzx]# docker run -it centos
    [root@50fffecec77f /]# exit
    exit
    [root@t-docker chenzx]# docker run -it centos /bin/bash ##这个表示使用镜像centos:latest以交互式模式启动一个容器,并在容器内执行/bin/bash命令
    [root@4eeeb44eef56 /]# exit
    exit
    [root@t-docker chenzx]# docker run -it centos /bin/bash
    

    上面例子是用-it以交互式启动的容器。 

        那么你可能要问了,用-d以守护式启动容器有什么用呢。 

    查看容器日志

        命令格式:docker logs -f -t --tail 容器id 

        参数说明: 

            -t是加入时间戳 

            -f是跟随最新的日志打印 

            --tail是Linux命令,表示显示最后多少条

    [root@t-docker chenzx]# docker run -d centos /bin/sh  -c "while true;do echo hello zzyy;sleep 2;done"
    b118747a68bbfc6698f9ef9e5d817c037c6ecb9835b86964f6a8b90683dcd178
    [root@t-docker chenzx]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    b118747a68bb        centos              "/bin/sh -c 'while t…"   5 seconds ago       Up 4 seconds                            elegant_euclid
    

       说明:上面命令的意思是用-d以后台方式运行容器centos,并在容器里面运行命令/bin/bash -c "while true;do echo hello zzyy;sleep 2;done"。最后我们通过docker ps看status是up状态,说明我们虽然以后台的方式启动了,但是这次容器并没有退出。

    通过如下日志可以证明后台-d方式运行的容器没有停止:

    [root@t-docker chenzx]# docker logs -t -f --tail 3 b118747a68bb
    2018-08-30T01:47:55.198597337Z hello zzyy
    2018-08-30T01:47:57.199661966Z hello zzyy
    2018-08-30T01:47:59.200811444Z hello zzyy
    2018-08-30T01:48:01.202114367Z hello zzyy
    2018-08-30T01:48:03.203363568Z hello zzyy

    查看容器内的进程

        命令格式:docker top 容器id

    [root@t-docker chenzx]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    b118747a68bb        centos              "/bin/sh -c 'while t…"   8 minutes ago       Up 8 minutes                            elegant_euclid
    [root@t-docker chenzx]# docker top b118747a68bb
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                2952                2934                0                   09:43               ?                   00:00:00            /bin/sh -c while true;do echo hello zzyy;sleep 2;done
    root                3410                2952                0                   09:52               ?                   00:00:00            sleep 2

    查看容器内的细节 

        命令格式:docker inspect 容器id 

        该命令会以json形式返回

    [root@t-docker chenzx]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    b118747a68bb        centos              "/bin/sh -c 'while t…"   13 minutes ago      Up 13 minutes                           elegant_euclid
    [root@t-docker chenzx]# docker inspect b118747a68bb
    [
        {
            "Id": "b118747a68bbfc6698f9ef9e5d817c037c6ecb9835b86964f6a8b90683dcd178",
            "Created": "2018-08-30T01:43:24.433793568Z",
            "Path": "/bin/sh",
            "Args": [
                "-c",
                "while true;do echo hello zzyy;sleep 2;done"
       .....

    进入正在运行的容器并以命令行交互 

        重新进入容器的两个命令:

            docker exec -it 容器id bash shell 

            docker attach 容器id

        上面两个命令的区别: 

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

            exec:是在容器中打开新的终端,并且可以启动新的进程。

    [root@t-docker chenzx]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    [root@t-docker chenzx]# docker run -it centos
    [root@3d6cf42834fa /]# 启动一个容器实例并进入容器里面
    [root@3d6cf42834fa /]# pwd
    /
    [root@3d6cf42834fa /]# exit
    exit
    [root@t-docker chenzx]# docker run -it centos /bin/bash
    [root@3cb3babb797f /]# pwd
    /

       说明:docker run -it centos和docker run -it centos /bin/bash是一样的。也就是说docker run -it centos,就等价于

    docker run -it centos /bin/bash。

        继续我们的实验

    [root@t-docker chenzx]# docker run -it centos
    [root@04b568f7ee84 /]# ctrl+P+Q:容器不停止退出
    [root@t-docker chenzx]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    04b568f7ee84        centos              "/bin/bash"         29 seconds ago      Up 28 seconds              
    [root@t-docker chenzx]# docker attach 04b568f7ee84
    [root@04b568f7ee84 /]# ls /tmp
    ks-script-Lu6hIQ  yum.log
    [root@t-docker chenzx]# docker exec -it f188fac12d4f ls /tmp
    ks-script-Lu6hIQ  yum.log
    说明: -t表示--tty 

    上面我们的实验,可以看到以attch方式进入运行中的容器,是需要在容器里面的命令行里面执行ls /tmp操作;而exec方式进入运行中的容器,是直接在exec命令后面写ls /tmp的操作,并把结果返回到宿主机的界面上。不好意思,表达的可能有点绕,看上面例子就会明白。 

        不过,exec也有进入容器执行命令的功能(和attach功能一样),如下:

    [root@t-docker chenzx]# docker exec -it f188fac12d4f /bin/bash
    [root@f188fac12d4f /]# ls /tmp
    ks-script-Lu6hIQ  yum.log

        所以,exec的功能比attach功能强大,建议只学exec的方式进入容器。 

    从容器内拷贝文件到宿主机上 

        应用场景:当我们以前台交互式方式运行容器后,如果在容器里面执行exit操作,容器就会停止,此时容器中运行的数据也就没有了。这时我们就需要把运行中的容器数据拷贝到宿主机上来保留。 

        命令格式:docker cp 容器id或容器名:容器内路径 目的宿主机路径

    [root@t-docker tmp]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    f188fac12d4f        centos              "/bin/bash"         25 minutes ago      Up 25 minutes                           heuristic_nightingale
    [root@t-docker tmp]# docker cp f188fac12d4f:/tmp/yum.log /tmp/
    [root@t-docker tmp]# ls
    yum.log 

    从宿主机上拷贝文件到容器内

        命令格式:docker cp 宿主机路径  容器id或容器名:容器内路径

    容器的导入和导出

    [root@localhost ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    726de1ae4720        centos              "/bin/bash"         39 minutes ago      Exited (0) 25 seconds ago                       mycentos0115
    ba507e4553aa        1e                  "/bin/bash"         45 minutes ago      Up 32 minutes                                   practical_burnell

     #将镜像导出到文件

    [root@localhost ~]# docker export ba507e4553aa > centosm.tar

     # 创建一个新镜像从导出的文件导入

    [root@localhost ~]# docker import - centosm < centosm.tar
    sha256:4555525043489ebeaab1976d4d6a7cfdaf1bb7f50d131707e8f3a0ce1cf24038
    [root@localhost ~]# docker images 
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centosm             latest              455552504348        8 seconds ago       202MB
    centos              latest              1e1148e4cc2c        2 months ago        202M 

    其他容器命令

        还有其他一些docker容器常用命令,比如diff等等,平时基本不用,就先不学了。

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28916011/viewspace-2213013/,如需转载,请注明出处,否则将追究法律责任。 

  • 相关阅读:
    C++ tinyXml直接解析XML字符串
    留言板小程序开发笔记3
    如何去除 gvim 的 acp和 "option omnifunc is not set" 的问题
    如何修改bootstrap模态框的backdrop蒙版区域的颜色?
    Windows下卸载软件时提示 等待先前的卸载完成? 终止 dllhost.exe 进程
    thinkphp中的__DIR__ __ROOT__ __APP__ __MODULE__ APP_PATH LIB_PATH MODULE_PATH 等是在哪里定义的?
    thinkphp中的Ueditor的使用, 以及如何传递编辑器内容到后台?
    留言板小程序开发笔记2
    分页器的js实现代码 bootstrap Paginator.js
    windows的gvim总是报错: +iconv fencview.vim
  • 原文地址:https://www.cnblogs.com/charon2/p/10425060.html
Copyright © 2011-2022 走看看