進入Docker容器的幾種方式


在使用Docker創建了容器之后,大家比較關心的就是如何進入該容器了,其實進入Docker容器有好幾多種方式,這里我們就講一下常用的幾種進入Docker容器的方法。

進入Docker容器比較常見的幾種做法如下:

1、使用docker attach進入Docker容器

Docker提供了attach命令來進入Docker容器。

  接下來我們創建一個守護態的Docker容器,然后使用docker attach命令進入該容器。

  1. $ sudo docker run -itd ubuntu:14.04 /bin/bash  

  然后我們使用docker ps查看到該容器信息,接下來就使用docker attach進入該容器

  1. $ sudo docker attach 44fc0f0582d9  


  可以看到我們已經進入到該容器中了。

 

  但在,使用該命令有一個問題。當多個窗口同時使用該命令進入該容器時,所有的窗口都會同步顯示。如果有一個窗口阻塞了,那么其他窗口也無法再進行操作。

因為這個原因,所以docker attach命令不太適合於生產環境,平時自己開發應用時可以使用該命令。

通常情況下,需要看看docker容器內stdout,會使用命令 docker attach CONTAINER-ID 來查看容器輸出.但是不知道如何退出,使用Ctrl+c直接卡死,正確的退出方式應該用一個組合鍵 Ctrl+p Ctrl+q 然后容器會關閉,界面也可恢復。

2、使用SSH 登錄 Docker容器。

在生產環境中排除了使用docker attach命令進入容器之后,第一個想到的就是ssh。在鏡像(或容器)中安裝SSH Server,這樣就能保證多人進入容器且相互之間不受干擾了,相信大家在當前的生產環境中(沒有使用Docker的情況)也是這樣做的。但是使用了Docker容器之后不建議使用ssh進入到Docker容器內。關於為什么不建議使用,請參考如下文章:

為什么不需要在 Docker 容器中運行 sshd

3、

在上面兩種方式都不適合的情況下,還有一種比較方便的方法,即使用nsenter進入Docker容器。關於什么是nsenter請參考如下文章:

https://github.com/jpetazzo/nsenter

在了解了什么是nsenter之后,系統默認將我們需要的nsenter安裝到主機中

如果沒有安裝的話,按下面步驟安裝即可(注意是主機而非容器或鏡像)

具體的安裝命令如下:

  1. $ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz  
  2. $ tar -xzvf util-linux-2.24.tar.gz  
  3. $ cd util-linux-2.24/  
  4. $ ./configure --without-ncurses  
  5. $ make nsenter  
  6. $ sudo cp nsenter /usr/local/bin  

安裝好nsenter之后可以查看一下該命令的使用。

 

  nsenter可以訪問另一個進程的名稱空間。所以為了連接到某個容器我們還需要獲取該容器的第一個進程的PID。可以使用docker inspect命令來拿到該PID。

docker inspect命令使用如下:

  1. $ sudo docker inspect --help   

inspect命令可以分層級顯示一個鏡像或容器的信息。比如我們當前有一個正在運行的容器

 

可以使用docker inspect來查看該容器的詳細信息。

  1. $ sudo docker inspect 44fc0f0582d9  

 

由其該信息非常多,此處只截取了其中一部分進行展示。如果要顯示該容器第一個進行的PID可以使用如下方式

  1. $ sudo docker inspect -f {{.State.Pid}} 44fc0f0582d9  

 

 

在拿到該進程PID之后我們就可以使用nsenter命令訪問該容器了。

  1. $ sudo nsenter --target 3326 --mount --uts --ipc --net --pid  
  1. $ sudo nsenter --target 3326 --mount --uts --ipc --net --pid  

其中的3326即剛才拿到的進程的PID

當然,如果你認為每次都輸入那么多參數太麻煩的話,網上也有許多做好的腳本供大家使用。

地址如下:

http://yeasy.gitbooks.io/docker_practice/content/container/enter.html

http://www.tuicool.com/articles/eYnUBrR

 

4、使用docker exec進入Docker容器

  除了上面幾種做法之外,docker在1.3.X版本之后還提供了一個新的命令exec用於進入容器,這種方式相對更簡單一些,下面我們來看一下該命令的使用:

  1. $ sudo docker exec --help   

 

 

接下來我們使用該命令進入一個已經在運行的容器

  1. $ sudo docker ps  
  2. $ sudo docker exec -it 775c7c9ee1e1 /bin/bash  

xxxxxxxxxx花絮xxxxxxxxxxxxxxxxxxxx

Docker 命令集
  attach   commit   diff     export   history import  insert    kill       login   port    
  pull       restart    rmi     save      start    tag       version  build   cp       events  
  help      images  info     inspect  load     logs     ps         push   rm       run     
  search  stop       top     wait
 
docker help: 
  docker help [COMMAND]
  例: docker help run
   docker version: 顯示Docker版本
   docker info: 顯示Docker信息
 
docker attach: 掛載正在后台運行的容器到前台
  docker attach [OPTIONS]  Container
 
docker run: 在一個新的容器中執行命令 (CTRL-p CTRL-q 退出至后台運行)
  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  例:
1
2
3
sudo  docker run -i -t ubuntu:14.04  /bin/bash          啟動一個新的Ubuntu容器
sudo  docker run -- rm  -i -t ubuntu:14.04 /bin/bash    建議新手測試加上 -— rm
sudo  docker run -i -t --name  "private_container"  ubuntu:14.04  /bin/bash

docker ps: 列出當前容器

  docker ps [OPTIONS]
  命令參數:
1
2
3
4
5
6
7
8
-a, --all= false             顯示所有容器,包括當前沒有運行的容器
-f, --filter=[]               按條件過濾容器, 可選的過濾選項:
exited=<int> 容器的返回值
-l, --latest= false        顯示最新的一個容器
-n num  顯示最新的N個容器
--no-trunc= false        不要截斷輸出
-q, --quiet= false        僅顯示容器ID
-s, --size= false         顯示容器大小

  例:

1
2
3
4
5
docker  ps                               當前正在運行的容器
docker  ps  -a                          當前正在運行或是停止的容器
docker  ps  -a -q --no-trunc    獲得當前所有容器的ID,不截斷輸出
docker  rm  $( echo  $(docker  ps  -q --no-trunc) $(dockerps -a -q--no-trunc) |  sed  's|\s|\n|g'  | sort  uniq  -u)
刪除當前不在運行狀態的容器ID,也可以把前面改成docker  rm

  

 
docker images: 列出當前鏡像
  docker images [OPTIONS] [NAME]
  命令參數:
1
2
3
4
-a, --all= false             顯示所有鏡像,包括中間生成的臨時鏡像
-f, --filter=[]               通過標簽過濾 (i.e.  'dangling=true' )
--no-trunc= false         不要截斷輸出
-q, --quiet= false         僅顯示容器ID

  例子:

1
2
3
docker images                                   顯示當前倉庫中的鏡像
docker images -a                               顯示當前倉庫中的鏡像與臨時鏡像
docker images -a -q --no-trunc        顯示當前倉庫中的鏡像與臨時鏡像的ID,不截斷輸出

  

docker logs: 顯示容器的日志
1
2
3
4
5
docker logs CONTAINER
命令參數:
-f, --follow= false                等待容器后續的輸出(類似  tail  -f)
-t, --timestamps= false      顯示時間戳
-- tail = "all"

  例:

1
2
3
4
5
6
7
sudo  docker logs 7bb0e258aefe
sudo  docker logs --timestamps= true  7bb0e258aefe
sudo  docker logs --timestamps= true  7bb0e258aefe > 7bb0e258aefe.log
終端A:
sudo  docker logs --follow 7bb0e258aefe
終端B:
sudo  docker attach 708cc7ec0f23         (隨便執行一些命令可以看到終端A會有實時輸出)

  

docker inspect: 顯示鏡像或容器的詳細信息

  docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]
  命令參數:
  -f, --format=""                  選擇輸出內容,--format="{{.NetworkSettings.IPAddress}}"
  例子:
1
2
sudo  docker inspect 7bb0e258aefe
sudo  dockerinspect -- format  "{{.State.Pid}}"  7bb0e258aefe

   

docker stop: 停止運行中的容器 (CTRL-d 強制退出, Exited (0))
  Docker stop [OPTIONS] CONTAINER [CONTAINER...]
  命令參數:
  -t, --time=10                    殺掉容器進程之前,等待的時間
  例子:
1
sudo  docker stop 7bb0e258aefe

  

docker kill: 殺掉一個運行中的容器 (Exited (-1))
  docker kill [OPTIONS] CONTAINER [CONTAINER...]
  命令參數:
  - s, --signal="KILL"          選擇向容器發出的Signal
  例子:
  sudo docker kill 7bb0e258aefe
 
docker start: 重啟停止的容器
  Docker start CONTAINER [CONTAINER...]
  命令參數:
  -a,--attach=false         Attach container'sSTDOUT and STDERR and forward allsignals to the process
  -i,--interactive=false   Attach container'sSTDIN
  例子:
1
sudo  docker start 7bb0e258aefe

  

docker restart: 重啟運行中的容器
  d ocker restart [OPTIONS] CONTAINER [CONTAINER...]
  命令參數:
  -t, --time=10                     殺掉容器進程之前,等待的時間
  例子:
1
sudo  docker restart 7bb0e258aefe

   

 
docker cp: 拷貝容器中的文件
  docker cp CONTAINER:PATH HOSTPATH
  例子:
 
1
docker  cp  c3f279d17e0a: /home/hyzhou/answer .txt .  將鏡像中的 /home/hyzhou/answer .txt文件拷貝到當前目錄下

   

docker rm: 刪除容器
  docker rm [OPTIONS] CONTAINER [CONTAINER...]
  命令參數:
  -f, --force=false              強制刪除容器(使用SIGKILL)
  -l, --link=false                 Removethe specified link and not the underlyingcontainer
  -v, --volumes=false        Removethe volumes associated with the container
  例子:
1
2
3
docker  rm  my_ubuntu               刪除容器
docker  rm  708cc7ec0f23           刪除容器
docker  rm  $(docker  ps  -a -q)    刪除所有容器

   

docker top: 查看容器輸出
  docker top CONTAINER [ps OPTIONS]
  例子:
  [ps OPTIONS]的意思是, 你可以在這個命令后面加上使用ps命令時的各種參數
1
2
sudo  docker  top  708cc7ec0f23
sudo  docker  top  708cc7ec0f23 aux

   

docker events: 實時監聽容器的事件
  docker events [OPTIONS]
  命令參數:
  --since=""                      顯示某一個時間戳之后的events
  --until=""                        實時監聽到某個時間戳為止
  例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
A終端:
sudo  docker events                             終端A等待Docker系統信息
sudo  docker events --since 1378216169
sudo  docker events --since  '2013-09-03'
sudo  docker events--since  '2013-09-03 15:49:29'
sudo  docker events --since '2013-09-03 15:49:29 +0200CEST'
sudo  docker events > docker.log &   后台記錄Docker的容器事件
B終端:
sudo  docker restart 708cc7ec0f23     從B終端關閉容器
A終端顯示:
2014-09-06T23:08:21+08:00708cc7ec0f23a5ec898c9d6308e9767edb66b863e96352ca6e030f0a5557f3b2:(fromubuntu:latest) die
2014-09-06T23:08:22+08:00708cc7ec0f23a5ec898c9d6308e9767edb66b863e96352ca6e030f0a5557f3b2:(fromubuntu:latest) start
2014-09-06T23:08:22+08:00708cc7ec0f23a5ec898c9d6308e9767edb66b863e96352ca6e030f0a5557f3b2:(fromubuntu:latest) restart

  

  docker history: 顯示鏡像的歷史記錄
  docker history [OPTIONS] IMAGE
  命令參數:
  --no-trunc=false              不要截斷輸出
  -q, --quiet=false              僅顯示容器ID
 
docker search: 在Docker Hub上尋找鏡像
  docker search TERM
  命令參數:
  --automated=false         使用Github或BitBucket的源代碼自動構建
  --no-trunc=false             不要截斷輸出
  -s, --stars=0                   只顯示Star數量超過N的鏡像
  例子:
  docker search --starts=10 ubuntu
 
docker pull: 從遠程拉取鏡像
  docker pull NAME[:TAG]
  例子:
  docker pull ubuntu:latest
 
docker push: 推送鏡像到遠程倉庫
  docker push NAME[:TAG]
  例子:
  docker push hyzhou/ubuntu:3.2.3
 
docker diff: 列出鏡像中文件和目錄的變化
  docker diff CONTAINER
  命令輸出: 輸出一共有三種
  A- Add
  D- Delete
  C- Change
  例子:
  diff顯示的是鏡像和當前運行的容器之間的區別,所以diff的基礎是IMAGE
  下面例子中的b705fc4f4a50和708cc7ec0f23,內容其實是一樣的
1
2
3
4
5
6
7
8
sudo  docker  ps  -a
CONTAINERID        IMAGE                    COMMAND                CREATED             STATUS
b705fc4f4a50        new:latest                "/bin/bash"             49 seconds ago      Up 49 seconds
708cc7ec0f23        ubuntu:latest             "/bin/bash"             9 minutes ago       Up 9 minutes
sudo  docker  diff  7bb0e258aefe
C /root
A /root/new .txt
sudo  docker  diff  b705fc4f4a50

   

docker commit: 將容器打包成新的鏡像
  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  命令參數:
  -a, --author=""                 作者信息,"John Hannibal Smith <hannibal@a-team.com>"
  -m, --message=""            提交信息
  -p, --pause=true             在提交鏡像時暫停容器
  例子:
1
2
3
4
5
6
7
8
9
sudo  docker  ps
ID                  IMAGE               COMMAND             CREATED             STATUS
c3f279d17e0a        ubuntu:12.04         /bin/bash            7 days ago          Up 25 hours
197387f1b436        ubuntu:12.04         /bin/bash            7 days ago          Up 25 hours
docker commitc3f279d17e0a Hyzhou /my_ubuntu :3.2.3
docker commit -a  "Hyzhou<hyzhou@qq.com>"  -m  "addthe new software"  c3f279d17e0aHyzhou /my_ubuntu :3.2.3
docker images
REPOSITORY                        TAG                 ID                  CREATED             VIRTUAL SIZE
Hyzhou /my_ubuntu                   3.2.3               f5283438590d        16 seconds ago      335.7 MB

  

docker build: 使用Dockerfile構建新鏡像
  docker build [OPTIONS] PATH|URL|-
  命令參數:
  --force-rm=false              移除構建時生成的中間容器
  --no-cache=false             Donot use cache when building the image
  -q, --quiet=false               不顯示容器的輸出
  --rm=true                         構建成功后,移除構建時生成的中間容器
  -t, --tag=""                        構建成功后,新建鏡像的名稱
 
docker tag: 為鏡像加上標簽
  docker tag [OPTIONS] IMAGE[:TAG][REGISTRYHOST/][USERNAME/]NAME[:TAG]
  命令參數:
  -f, --force=false                強制打上標簽?
1
2
3
4
5
6
7
8
9
10
例子:
sudo  docker tag ubuntu:latest hyzhou /my_ubuntu :3.2.3    給ubuntu:latest打上新TAG:hyzhou /my_ubuntu :3.2.3
sudo  dockertag eb601b8965b8 ubuntu:latest             給eb601b8965b8鏡像打上TAG: ubuntu:latest(會轉換原有的TAG指向)
 
docker save: 將image保存為 tar 壓縮文件
docker save [OPTIONS] IMAGE [IMAGE...]
-o, --output= ""                   寫入到一個文件中作為輸出,默認是標准輸出流
例子:
docker save --output ubuntu. tar  ubuntu:latest  將Ubuntu的最新鏡像打包為ubuntu. tar
docker save ubuntu:latest > ubuntu. tar           將Ubuntu的最新鏡像打包為ubuntu. tar

   

docker load: 將tar壓縮文件保存為image
  Docker load [OPTIONS]
  命令參數:
  -i, --input=""                    讀取一個壓縮文件作為輸入,默認是標准輸入流
  例子:
1
2
3
docker load --input ubuntu. tar                   讀取ubuntu. tar 作為鏡像
docker load < ubuntu. tar                         讀取ubuntu. tar 作為鏡像

  

docker export: 把容器系統文件打包並導出來,方便分發給其他場景使用。
  docker export CONTAINER
1
2
3
4
5
6
7
8
例子:
sudo  docker  export  my_ubuntu > ubuntu. tar        將Ubuntu的最新鏡像打包為ubuntu. tar
 
docker  import : 加載容器系統文件
docker  import  URL|- [REPOSITORY[:TAG]]
例子:
sudo  docker  import  http: //example .com /exampleimage .tgz
cat  exampleimage.tgz | sudodocker  import  -exampleimagelocal:new


免責聲明!

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



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