1. 程式人生 > >docker exec 與 docker attach 區別

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兩個命令。

以下在docker1.1上及以上驗證。

Docker attach

Docker attach可以attach到一個已經執行的容器的stdin,然後進行命令執行的動作。 
但是需要注意的是,如果從這個stdin中exit,會導致容器的停止。


[[email protected] 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
[
[email protected]
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執行一樣。但是執行結果、命令 
返回值都可以正確獲取。


[[email protected] 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方式,在容器內進行操作。


[[email protected] temp]# docker exec -it bb2 /bin/sh
/ # pwd
/
/ # echo $?
0
/ # dir
/bin/sh: dir: not found
/ # echo $?
127

如果只使用-t引數,則可以看到一個console視窗,但是執行命令會發現由於沒有獲得stdin 
的輸出,無法看到命令執行情況。


[[email protected] temp]# docker exec -t bb2 /bin/sh
/ # pwd

hanging....
[[email protected] temp]# docker exec -t bb2 pwd
/
[[email protected] temp]# echo $?
0
[[email protected] 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
[[email protected] temp]# echo $?
0

docker exec執行後,會命令執行返回值。(備註Docker1.3似乎有Bug,不能正確返回命令執行結果)


[[email protected] temp]# docker exec -it bb cat /a.sh
echo "running a.sh"
exit 10
[[email protected] temp]# docker exec -t bb /a.sh
running a.sh
[[email protected] temp]# echo $?
10
[[email protected] temp]# docker exec -it bb /a.sh
running a.sh
[[email protected] temp]# echo $?
10
[[email protected] temp]# docker exec -i bb /a.sh
running a.sh
[[email protected] temp]# echo $?
10
關於-d引數

在後臺執行一個程序。可以看出,如果一個命令需要長時間程序,使用-d引數會很快返回。 
程式在後臺執行。


[[email protected] temp]# docker exec -d bb2 /a.sh
[[email protected] temp]# echo $?
0

如果不使用-d引數,由於命令需要長時間執行,docker exec會卡住,一直等命令執行完成 
才返回。

相關推薦

docker exec docker attach 區別

Docker exec與Docker attach 不論是開發者是運維人員,都經常有需要進入容器的訴求。  目前看,主要的方法不外乎以下幾種:  1. 使用ssh登陸進容器  2. 使用nsenter、nsinit等第三方工具  3. 使用Docker本身提供的工具

docker savedocker export的區別

docker save與docker export的區別在http://chy940405.blog.51cto.com/11344281/1981804 這篇文章中分享了docker 基本操作Ⅱ(關於鏡像操作),其中有一個問題就是docker save和docker export都能導出鏡像包,咋看起來區別

docker run docker start的區別

ont block content 只需要 bsp min png class AD docker run 只在第一次運行時使用,將鏡像放到容器中,以後再次啟動這個容器時,只需要使用命令docker start 即可。 docker run相當於執行了兩步操

docker importdocker load的區別是什麽?

docker 容器 虛擬化實際上,既可以使用docker load命令來導入鏡像庫存儲文件到本地鏡像庫,也可以使用docker import命令來導入一個容器快照到本地鏡像庫。兩者的區別在於容器快照將會丟棄所有的歷史記錄和元數據信息,而鏡像存儲文件將保存完整記錄,體積也會更大。此外從容器快照文件導入時,也可以

Docker loadDocker import

-m log nta 服務 linux機器 數據 mark 流行 們的 docker load與docker import ? 首先,想要清楚的了解docker load與docker import命令的區別,就必須了解鏡像與容器的區別: 鏡像:用來啟動容器的只讀模板,是

Docker ComposeDocker Stack的不同之處

翻譯原文 Docker引擎在1.12 版本集成了Docker Swarm,  帶來了一些新工具。 現在可以無需安裝 Docker Compose, 就可以利用docker-compose.yml 檔案建立Docker 容器堆疊。 這個命令是 docker stack,  使用方式與d

04 . Docker安全Docker底層實現

Docker安全 --- `Docker安全性時,主要考慮三個方面` ```shell # 1. 由核心的名字空間和控制組機制提供的容器內在安全![](https://img2020.cnblogs.com/blog/1871335/202006/1871335-20200614153954679-167

Docker系列~execattach(四)

Docker exec與Docker attach 不論是開發者是運維人員,都經常有需要進入容器的訴求。  目前看,主要的方法不外乎以下幾種:  1. 使用ssh登陸進容器  2. 使用nsenter、nsinit等第三方工具  3. 使用docker本身提供的工具

Dockerfile Volume指令docker -v的區別

數據 就會 一個 命令 edi nal metadata 指令 功能 在學習Dockerfile的過程中有個VOLUME命令,很多教程或書中說的是用來定義匿名卷的,其作用如下:   容器運行時應該盡量保持容器存儲層不發生寫操作,對於數據庫類需要保存動態數據的應用,其數據庫文

execxargs區別

必須 合成 作文 back 方便 否則 dir name color 沒有哪個更好哪個更不好 復習一下 exec是對每個找到的文件執行一次命令,除非這單個的文件名超過了幾k,否則不會出現命令行超長出報錯的問題。而xargs是把所有找到的文件名一股腦的轉給命令。當文件

Docker簡介搭建

使用 system run idt 進入容器 ges 成功 困難 mnt Docker定義 Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,

容器Docker簡介(三)Docker相關術語——微軟微服務電子書翻譯系列

進程 數據 public 圖像 over 表示 -c ice ner 本節列出了在更加深入Docker之前應該熟悉的術語和定義。 有關詳細的定義,請參閱Docker提供的術語表。 容器鏡像(Container image):具有創建容器所需要的所有依賴和信息的包。 鏡像

Docker江湖】之docker部署理解

保存 關心 apt ice read rail eight ext 用戶 轉載請註明出處:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://

docker安裝操作

進行 ace -1 網站 bcg pms 服務 現在 div 準備和安裝 1.到這個路徑下下載docker engine: https://get.docker.com/rpm/1.7.1/centos-7/RPMS/x86_64/docker-engine-1.7.1-1

Docker入門應用系列(六)Docker私有公共鏡像倉庫

nbsp one 默認 span epo refers 1.8 png list 1.搭建私有鏡像倉庫Docker Hub作為Docker默認官方公共鏡像;如果想搭建自己的私有鏡像倉庫,官方提供registry鏡像,使搭建私有倉庫非常簡單1.1.1下載registry鏡像並

Docker入門應用系列(八)Docker圖形界面管理之Shipyard

tps 數據庫 sock blog ocs body mage 代理 cell Shipyard基於Docker API實現的容器圖形管理系統,支持container、images、engine、cluster等功能,可滿足我們基本的容器部署需求可堆棧的Docker管理基於

Docker入門應用系列(七)Docker圖形界面管理之DockerUI

post 簡單的 技術分享 name mage src 入門 .com 系統 1.dockeruiDockerrUI是一個基於Docker API提供圖形化頁面簡單的容器管理系統,支持容器管理、鏡像管理。1.1 下載鏡像 docker pull abh1nav/doc

docker run和docker exec報錯context deadline exceeded

mem int overlay number mit def back devices plugin 現象描述docker run -d centos:v1 /bin/bash創建容器或者docker exec -it container_name bash進入容器,都會報

Docker簡介安裝

itl 標準 size 文件的 mar 一個 style 系統管理 ati Docker簡介與安裝(一) 1 簡介(1)docker是什麽?Docker 的英文本意是“搬運工”,在程序員的世界裏, Docker 搬運的是集裝箱(Container),docker 是一種用