docker attach mysql_Docker exec与Docker attach

本文详细介绍了Docker的Dockerexec和Dockerattach两个命令,用于进入并操作容器。Dockerattach可以直接连接到正在运行的容器,但退出会终止容器;而Dockerexec提供更灵活的方式,可以保持容器运行,支持交互式和后台执行。通过-i、-t参数的使用,可以实现不同的操作模式,如命令行交互或后台执行。在需要长时间运行进程时,使用-d参数能够避免阻塞。
摘要由CSDN通过智能技术生成

Docker exec与Docker attach

文章来源:http://blog.csdn.net/halcyonbaby/article/details/46884605

不论是开发者是运维人员,都经常有需要进入容器的诉求。

目前看,主要的方法不外乎以下几种:

1. 使用ssh登陆进容器

2. 使用nsenter、nsinit等第三方工具

3. 使用Docker本身提供的工具

方法1需要在容器中启动sshd,存在开销和***面增大的问题。同时也违反了Docker所倡导

的一个容器一个进程的原则。

方法2需要额外学习使用第三方工具。

所以大多数情况最好还是使用Docker原生方法,Docker目前主要提供了Docker exec和

Docker attach两个命令。

以下在fedora21,docker1.7上验证。

Docker attach

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

/

/ #

Docker exec

关于-i、-t参数

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

返回值都可以正确获取。[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

使用-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

/ # 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

docker exec执行后,会命令执行返回值。(备注Docker1.3似乎有Bug,不能正确返回命令执行结果)

[root@localhost temp]# docker exec -it bb cat /a.sh

echo "running a.sh"

exit 10

[root@localhost temp]# docker exec -t bb /a.sh

running a.sh

[root@localhost temp]# echo $?

10

[root@localhost temp]# docker exec -it bb /a.sh

running a.sh

[root@localhost temp]# echo $?

10

[root@localhost temp]# docker exec -i bb /a.sh

running a.sh

[root@localhost temp]# echo $?

10

关于-d参数

在后台执行一个进程。可以看出,如果一个命令需要长时间进程,使用-d参数会很快返回。

程序在后台运行。[root@localhost temp]# docker exec -d bb2 /a.sh

[root@localhost temp]# echo $?

0

如果不使用-d参数,由于命令需要长时间执行,docker exec会卡住,一直等命令执行完成才返回。

[root@localhost temp]# docker exec  bb2 /a.sh

^C[root@localhost temp]#

[root@localhost temp]#

[root@localhost temp]# docker exec -it  bb2 /a.sh

^C[root@localhost temp]#

[root@localhost temp]# docker exec -i  bb2 /a.sh

^C[root@localhost temp]# docker exec -t  bb2 /a.sh

^C[root@localhost temp]#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值