zoukankan      html  css  js  c++  java
  • docer run 、docker attach 与 docker exec的区别

    进入容器的方式有以下三种:

    1. 使用ssh登陆进容器
    2. 使用nsenter、nsinit等第三方工具
    3. 使用Docker本身提供的工具

    最佳方案为使用Docker本身提供的工具

    • docker run;创建和启动一个新的容器实例,操作对象是镜像,选项较多,如果你要创建和启动一个容器,只能用run;
    • docker exec: 在已运行的容器中,执行命令,操作对象是容器,如果你要进入已运行的容器,并且执行命令,用exec;
    • docker attach: 同样操作的是已运行的容器,可以将本机标准输入(键盘输入)输到容器中,也可以将容器的输出显示在本机的屏幕上,如果你想查看容器运行过程中产生的标准输入输出,用attach;

    1) docker run

    官方命令解释:Run a command in a new container,翻译过来是在一个新的容器中中运行命令,所以主要作用有两点:一是创建和启动一个新的容器,二是启动时通过加选项和参数在容器运行命令;

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
        IMAGE: 镜像名称,run操作的是镜像images
        COMMAND:命令,可选
    
    # docker run -p 80:80 -d  --name=nginx-1 nginx    // 在后台创建和启动容器nginx-1,不执行命令
    
    # docker run -p 81:80 -d  --name=nginx-2 nginx bash -c 'ls & tail -f /dev/null'  // 在后台创建和启动容器nginx-2,同时执行组合命令
    # docker logs nginx-2  // 查看命令输出,可以看到ls执行的结果
    

    2) docker exec

    docker exec [options] CONTAINER COMMAND [ARG...]
        CONTAINER:容器名称或ID,必选,看出exec操作的对象是容器
        COMMAND:命令,必选
    

    官方命令解释:Run a command in a running container,翻译过来就是在一个正在运行的容器中执行命令,exec是针对已运行的容器实例进行操作,在已运行的容器中执行命令,不创建和启动新的容器。

    # docker run -p 82:80 -d  --name=nginx-3 nginx 
    # docker exec -it nginx-3 /bin/bash  // 直接进入容器nginx-3,执行bash
    # docker exec nginx-3 bash -c "ls"   // 在容器中执行命令 ls,输出结果
    

    如果只使用-t参数,则可以看到一个console窗口,但是执行命令会发现由于没有获得stdin
    的输出,无法看到命令执行情况。

    [root@localhost temp]# docker exec -i bb2 /bin/sh
    date
    Tue Jul 14 04:01:11 UTC 2015
    echo $?
    0
    dir
    /bin/sh: dir: not found
    echo $?
    127
    

    可以看出只用-i时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令
    返回值都可以正确获取。

    [root@localhost temp]# docker exec -t bb2 /bin/sh
    / # pwd
     
    hanging....
    [root@localhost temp]# docker exec -t bb2 pwd
    /
    [root@localhost temp]# echo $?
    0
    [root@localhost temp]# docker exec -t bb2 dir
    2015/07/14 04:03:57 docker-exec: failed to exec: exec: "dir": executable file not found in $PATH
    [root@localhost temp]# echo $?
    0
    

    使用-it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致
    整个容器退出。
    这种方式可以替代ssh或者nsenter、nsinit方式,在容器内进行操作。

    [root@localhost temp]# docker exec -it bb2 /bin/sh
    / # pwd
    /
    / # echo $?
    0
    / # dir
    /bin/sh: dir: not found
    / # echo $?
    127
    

    3) docker attach

    docker attach [OPTIONS] CONTAINER
        CONTAINER:容器名称或ID,必选,attach的操作对象也是容器
    

    官方命令解释:Attach local standard input, output, and error streams to a running container,翻译过来,将本机的标准输入(键盘)、标准输出(屏幕)、错误输出(屏幕)附加到一个运行的容器,也就是说本机的输入直接输到容器中,容器的输出会直接显示在本机的屏幕上。

        # docker run -p 83:80 -d  --name=nginx-4 nginx 
        # docker attach nginx-4
        
        // 本机上再打开一个终端,输入以下命令,观察上面终端的输出
        # curl localhost:83   // nginx输出正常访问记录
        # curl localhost:84/index  // nginx输出访问错误记录
    

    Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。
    但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。

    [root@localhost temp]# docker ps
    CONTAINER ID        IMAGE                       COMMAND             CREATED              STATUS              PORTS               NAMES
    2327e7eab0ed        busybox:buildroot-2014.02   "/bin/sh"           About a minute ago   Up About a minute                       bb2
    [root@localhost temp]# docker attach bb2
    / # ls
    bin      dev      etc      home     lib      lib64    linuxrc  media    mnt      opt      proc     root     run      sbin     sys      tmp      usr      var
    / # pwd
    /
    / #
    

    常用参数说明

    这三个参数(-i, -t, -d)是啥意思
    Options Mean
    -i 以交互模式运行容器,通常与 -t 同时使用;
    -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    -d 后台运行容器,并返回容器ID;
    -v 挂载宿主机一个目录至容器目录
    --restart=always 创建容器时添加参数 --restart=always 后,当 docker 重启时,容器自动启动。(若一开始没有加上,可以执行:docker container update --restart=always 容器名字 进行变更)
    --name 容器名称
    -p 宿主机器服务端口:容器机器服务端口

    譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:

    # docker run -it -v /test:/soft centos /bin/bash
    

    冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。

  • 相关阅读:
    周总结6
    河北省重大需求征集系统每日进度8
    《代码整洁之道》读书笔记3
    周总结5
    河北省重大需求征集系统每日进度7
    mybatis 关联查询多个类型相同对象
    thymeleaf 接受字符串类型model值作为js方法参数报错500
    毕业设计(2.17-2.23)周工作计划
    毕业设计记录——2.16
    毕业设计记录——2.15
  • 原文地址:https://www.cnblogs.com/doraman/p/12176888.html
Copyright © 2011-2022 走看看