本文目录导航:
docker exec 和 docker attach的区别
Docker exec与Docker attach不论是开发者是运维人员,都经常有须要进入容器的诉求。
目前看,重要的方法不外乎以下几种: 1. 经常使用ssh登陆进容器 2. 经常使用nsenter、nsinit等第三方工具 3. 经常使用docker自身提供的工具方法1须要在容器中启动sshd,存在开支和攻打面增大的疑问。
同时也违犯了Docker所提倡 的一个容器一个进程的准则。
方法2须要额外学习经常使用第三方工具。
所以大少数状况最好还是经常使用Docker原生方法,Docker目前重要提供了Docker exec和 Docker attach两个命令。
以下在fedora21,docker1.7上验证。
Docker attachDocker attach可以attach到一个曾经运转的容器的stdin,而后启动命令口头的举措。
但是须要留意的是,假设从这个stdin中exit,会造成容器的中止。
[root@localhost temp]# docker psConTAINER IDIMAGE COMMAND CREATEDSTATUSPORTS NAMES2327e7eab0edbusybox:buildroot-2014.02 /bin/sh about a minute ago Up about a minute bb2[root@localhost temp]# docker attach bb2/ # lsbindevetchome liblib64linuxrcmediamntoptproc root runsbin systmpusrvar/ # pwd// #Docker exec对于-i、-t参数可以看出只用-i时,由于没有调配伪终端,看起来像pipe口头一样。
但是口头结果、命令 前往值都可以正确失掉。
[root@localhost temp]# docker exec -i bb2 /bin/shdateTue Jul 14 04:01:11 UTC 2015echo $?0dir/bin/sh: dir: not foundecho $?127经常使用-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假设只经常使用-t参数,则可以看到一个console窗口,但是口头命令会发现由于没有取得stdin 的输入,不可看到命令口头状况。
[root@localhost temp]# docker exec -t bb2 /bin/sh/ # pwdhanging....[root@localhost temp]# docker exec -t bb2 pwd/[root@localhost temp]# echo $?0[root@localhost temp]# docker exec -t bb2 dir2015/07/14 04:03:57 docker-exec: failed to exec: exec: dir: executable file not found in $PATH[root@localhost temp]# echo $?0docker exec口头后,会命令口头前往值。
(备注Docker1.3仿佛有Bug,不能正确前往命令口头结果)[root@localhost temp]# docker exec -it bb cat / running 10[root@localhost temp]# docker exec -t bb / [root@localhost temp]# echo $?10[root@localhost temp]# docker exec -it bb / [root@localhost temp]# echo $?10[root@localhost temp]# docker exec -i bb / [root@localhost temp]# echo $?10对于-d参数在后盾口头一个进程。
可以看出,假设一个命令须要长期间进程,经常使用-d参数会很快前往。
程序在后盾运转。
[root@localhost temp]# docker exec -d bb2 /[root@localhost temp]# echo $?0假设不经常使用-d参数,由于命令须要长期间口头,docker exec会卡住,不时等命令口头实现 才前往。
[root@localhost temp]# docker execbb2 /^C[root@localhost temp]#[root@localhost temp]#[root@localhost temp]# docker exec -itbb2 /^C[root@localhost temp]#[root@localhost temp]# docker exec -ibb2 /^C[root@localhost temp]# docker exec -tbb2 /^C[root@localhost temp]#
如何进入docker容器
如何进入docker容器
要进入Docker容器,可以经常使用`docker exec`命令或许经过容器外部网络经常使用SSH衔接。
经常使用docker exec命令进入容器
1. 首先,确保你知道要进入的容器的称号或ID。
2. 经常使用以下命令格局进入容器:
docker exec -it <容器称号或ID> /bin/bash
这里的`-it`参数是交互式的意思,使你能够和容器内的bash shell启动交互。
`/bin/bash`是要在容器内启动的shell程序。
口头此命令后,你将间接进入容器的命令行界面。
经常使用SSH衔接进入容器
假设你的容器性能了SSH服务,还可以经过SSH衔接到容器外部。步骤如下:
1. 确保你的Docker容器在创立时曾经装置了SSH服务,并且开启了SSH端口映射。
例如,在Docker启动命令中可以添加`-p 22:22`来映射容器的SSH端口到服务器的22端口。
2. 经常使用SSH客户端衔接到容器:
ssh 用户名@服务器IP地址 -p 映射的端口号
例如,假设容器的IP是`172.17.0.2`并且你在容器中创立了用户名为`user`的用户,那么你可以经常使用以下命令衔接:
ssh user@172.17.0.2 -p 映射的端口号
输入正确的明码后,就可以经过SSH进入容器外部了。
但是,此方法理论须要额外性能容器中的SSH服务,并且须要保障容器的安保性失掉妥善解决。
因此,理论介绍经常使用第一种方法来进入容器。
假设是开发测试环境且信赖特定的网络,可以按需性能和经常使用SSH衔接方法。
不过,在消费环境中经常使用时务必审慎解决安保疑问。
docker中的exec和attach命令的区别?
在Docker环境中,exec和attach命令的重要区别在于它们如何与容器交互。
当经常使用docker attach时,用户只能与一个shell实例互动。
若要启动容器中的新终端窗口,须要经常使用docker exec。
这象征着attach提供了间接访问容器终端的方便模式,而exec则用于在运转的容器上启动新的进程。
假设Docker容器在启动时经常使用/bin/bash,attach命令就能间接访问容器外部的bash环境。
但是,假设容器经常使用了不同的启动命令,attach将不可间接进入容器外部。
此时,须要经过exec命令在容器外部创立bash实例。
attach的重要性能是附着到已运转的容器,而不会在容器中创立新的进程口头额外的命令。
它仅提供了一个间接与容器外部环境启动交互的通道。
相比之下,exec命令不只准许在容器上创立新进程,而且口头用户指定的命令,这使得它成为在容器中口头特定义务的弱小工具。