docker run、exec和attach使用和区别

结论

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

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执行的结果

以上可以看出,docker run成功执行一次,必然产生一个新的容器实例。

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,输出结果

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输出访问错误记录
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐