docer run 、docker attach 與 docker exec的區別


進入容器的方式有以下三種:

  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

冒號":"前面的目錄是宿主機目錄,后面的目錄是容器內目錄。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM