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

  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. Java 自动拆箱 装箱 包装类的缓存问题--结合源码分析

    都0202 了 java 1.8 已经是主流 自动装箱 .拆箱已经很普遍使用了,那么有时候是不是会遇到坑呢? 我们先来看一段代码: public class TestWraperClass { pub ...

  2. 数据结构(C语言版)---查找

    1.查找表:同一类型的数据元素构成的集合. 2.对查找表进行的操作:查询某特定元素.检索满足条件的元素的属性.插入元素.删除元素. 1)若对查找表进行的操作只涉及前两种,则为静态查找表:需要进行插入和 ...

  3. MySQL数据库缓存操作

    安装: 启动的话: -d:以后台的方式进行: -l:选择监听指定的ip服务地址:-m:给他分配多大的内存:-p:端口号默认的端口为11211的服务端口: 另一个: 安装:telnet 这个可以用来测试 ...

  4. discuz-目录

    由于工作原因,开始学习discuz,0基础开发,学了一会总结了一些

  5. udp协议与tcp协议

    TCP协议与UDP协议支持的应用协议 TCP支持的应用协议主要有:Telnet.FTP.SMTP等: UDP支持的应用层协议主要有:NFS(网络文件系统).SNMP(简单网络管理协议).DNS(主域名 ...

  6. 如何优雅的维护 K8S Worker 节点

    前言 正常维护工作节点的流程 当我们要进行 K8S 节点维护时往往需要执行 kubectl drain, 等待节点上的 Pod 被驱逐后再进行维护动作. 命令行如下: kubectl drain NO ...

  7. hdu3033 I love sneakers! 分组背包变形(详解)

    这个题很怪,一开始没仔细读题,写了个简单的分组背包交上去,果不其然WA. 题目分析: 分组背包问题是这样描述的:有K组物品,每组 i 个,费用分别为Ci ,价值为Vi,每组物品是互斥的,只能取一个或者 ...

  8. 记一次Pinpoint监控工具部署过程

    环境:Centos 7.4 X64IP:192.168.1.11 1.配置环境,先安装jdk 到Oracle官网下载安装JDK https://www.oracle.com/technetwork/j ...

  9. pod setup命令失败解决方法

    最近运行pod setup出现以下问题: remote: Compressing objects: 100% (34/34), done.error: RPC failed; curl 56 SSLR ...

  10. Netty(四):AbstractChannel源码解析

    首先我们通过一张继承关系的图来认识下AbstractChannel在Netty中的位置. 除了Comaprable接口来自java自带的包,其他都是Netty包中提供的. Comparable接口定义 ...