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

  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

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

docer run 、docker attach 与 docker exec的区别的更多相关文章

  1. docker attach 和 docker exec

    docker attach docker attach -- Attach to a running container. 常用选项: --sig-proxy=true:Proxy all recei ...

  2. Docker学习之Docker容器基本使用

    Docker学习之Docker容器基本使用 新建容器并启动 命令格式:docker run --options repository:tag 后台运行 命令格式:-d 已存在的容器相关操作 启动:do ...

  3. docker学习:docker命令

    帮助命令 自验证 docker version 详情信息 docker info 获取帮助 docker --help 镜像命令 列出本例主机上的镜像 docker images [OPTIONS] ...

  4. Ubuntu下安装Docker,及Docker的一些常用命令操作

    1.什么是 Docker         Docker 是一个开源项目,Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案.         Docker 的基础是 Linux 容器(LXC ...

  5. Docker exec与Docker attach

    转载博客地址:http://blog.csdn.net/halcyonbaby 新浪微博:@寻觅神迹 内容系本人学习.研究和总结,如有雷同,实属荣幸! ================== Docke ...

  6. docker attach 和 exec 用法区别

    attach 用法 $ sudo docker attach 665b4a1e17b6 #by IDor$ sudo docker attach loving_heisenberg #by Name$ ...

  7. 安装Docker时错误提示 "could not change group /var/run/docker.sock to docker: group docker not found"的解决方案

    安装Dock服务,主要命令是  yum install docker. 但是在启动的时候报错:warning msg="could not change group /var/run/doc ...

  8. Docker attach

    Description Attach local standard input, output, and error streams to a running container Usage dock ...

  9. Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock

    在 Docker 容器里面使用 docker run/docker build? Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择.而在 DevOps 中,我们需要将各种后端/前端 ...

随机推荐

  1. 将jar包发布到maven中央仓库

    将jar包发布到maven中央仓库 最近做了一个swagger-ui的开源项目,因为是采用vue进行解析swagger-json,需要前端支持,为了后端也能方便的使用此功能,所以将vue项目编译后的结 ...

  2. windows下部署.netcore+docker系列四 (部署程序,重点就要来了)

    前面的都是为这章做准备,加油把骚年们 PS:C# 项目可以按照流程一步步来,java 偶然其他的可以找下其他的网上资源 1.在 VS2019中 添加docker 支持 (其实也就是追加一个Docker ...

  3. 数据挖掘入门系列教程(十点五)之DNN介绍及公式推导

    深度神经网络(DNN,Deep Neural Networks)简介 首先让我们先回想起在之前博客(数据挖掘入门系列教程(七点五)之神经网络介绍)中介绍的神经网络:为了解决M-P模型中无法处理XOR等 ...

  4. Xshell下载和连接Linux

    Xshell下载和连接Linux 第一步.Xshell的下载 方法1:从官网下载个人使用时免费的,商业使用是要收费的. http://www.xshellcn.com/ 方法二2:百度云下载Xshel ...

  5. vector和数组

    对于之前没有接触过vector的初学者来说,经常会把vector和数组弄混,因为二者在用的时候比较像,下面就详细的来介绍一下vector和数组的区别. (1) 首先,vector类似于数组,有一段连续 ...

  6. http请求返回的数字代表的含义

    一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务器超时 下面提供 HTTP 状态码的完整列表.点击链接可了解详情.您也可以访问 HTTP 状态码上的 ...

  7. Linux硬盘分区知识

    前言 硬盘使用前,一般要分区,格式化(创建文件系统)<== 存放数据 类比,房子使用前,一般要隔断,装修,买家具,再住人. 分区 一块硬盘: 主分区.扩展分区.逻辑分区 主分区+扩展分区的数量& ...

  8. Next.js 7发布,构建速度提升40%

    Next.js团队发布了其开源React框架的7版本.该版本的Next.js主要是改善整体的开发体验,包括启动速度提升57%.开发时的构建速度提升40%.改进错误报告和WebAssembly支持. \ ...

  9. 利用Mysqlbinlog恢复数据库数据

    关于binlog的详解请参考:http://zlyang.blog.51cto.com/1196234/1833062 binlog日志用于记录所有更新了数据或者已经潜在更新了数据的所有语句.语句以& ...

  10. 解决iframe跨域刷新的问题

    用iframe的location.reload(true); 方法来刷新外部URL会报 Blocked a frame with origin xxxx from accessing a cross- ...