亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Docker 容器操作退出后進(jìn)入解決辦法

 更新時間:2016年10月25日 10:31:55   作者:小白ing  
這篇文章主要介紹了Docker 容器操作退出后進(jìn)入解決辦法的相關(guān)資料,需要的朋友可以參考下

在我們對Docker容器操作的時候,有時候會誤操作或者其他的原因無意間退出了正在操作的容器,也許你會擔(dān)憂你在其中的一些操作未保存下來,無須擔(dān)憂,本文中將會提供各種方法供你參考(我的建議使用最后一種)。在本文,我們將討論五種(4+1)連接Docker容器并與其進(jìn)行交互的方法。例子中所有的代碼都可以在GitHub中找到,你可以親自對它們進(jìn)行測試。

1.nsenter

安裝

nsenter 工具在 util-Linux 包2.23版本后包含。 如果系統(tǒng)中 util-linux 包沒有該命令,可以按照下面的方法從源碼安裝。

你也可以點擊此鏈接進(jìn)行下載  http://pan.baidu.com/s/1FEt8y

$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24; 

$ ./configure --without-ncurses 
$ make nsenter && sudo cp nsenter /usr/local/bin 

使用

nsenter 可以訪問另一個進(jìn)程的名字空間。nsenter 要正常工作需要有 root 權(quán)限。 很不幸,Ubuntu 14.4 仍然使用的是 util-linux 2.20。安裝最新版本的 util-linux(2.24)版,請按照以下步驟:

$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-linux-2.24.tar.gz 
$ cd util-linux-2.24 
$ ./configure --without-ncurses && make nsenter 
$ sudo cp nsenter /usr/local/bin 
 

從util-linux版本2.23開始,nsenter工具就包含在其中。它用來訪問另一個進(jìn)程的名字空間。nsenter要正常工作需要有root權(quán)限。很不幸,Ubuntu 14.4仍然使用的是util-linux版本2.20。安裝最新版本的util-linux(2.24)版,請按照以下步驟:

cd /tmp

為了連接到容器,你還需要找到容器的第一個進(jìn)程的PID,通過這個PID,你就可以連接到這個容器:

$ docker inspect --format "{{ .State.Pid }}" <container-id> 
//or run 'docker inspect -f "{{ .State.Pid }}" <container-id>' 
$ nsenter --target $PID --mount --uts --ipc --net --pid 

2.nsinit

從0.9版本開始,Docker自身就具有一個管理容器的庫,名字為 libcontainer。libcontainer中的nsinit工具允許用戶直接訪問linux名字空間和cgroup內(nèi)核。在安裝nsinit之前,你首先需要安裝Go運行時環(huán)境:

$ apt-get installgit golang-go  
 
$ mkdir-p $HOME/go-dev/binmkdir-p $HOME/go-dev/src 
 
$ echo"export GOPATH=\$HOME/go-dev" >> ~/.profileecho "PATH=\$PATH:\$GOPATH/bin">> ~/.profile  
 
$ source~/.profile 
 

接下來才安裝nsinit:

$ apt-get installgit golang-go  
 
$ mkdir-p $HOME/go-dev/binmkdir-p $HOME/go-dev/src 
 
$ echo"export GOPATH=\$HOME/go-dev" >> ~/.profileecho "PATH=\$PATH:\$GOPATH/bin">> ~/.profile  
 
$ source~/.profile 
 

nsinit讀取的是位于/var/lib/docer/execdriver/native/<Container-id>容器目錄下的配置數(shù)據(jù)。要運行nsinit,你需要切換到容器目錄下。由于/var/lib/docker目錄對于root用戶是只讀權(quán)限,因此你還需要root權(quán)限。通過docker的ps命令,你可以確定容器ID。一旦你進(jìn)入/var/lib/docker目錄,你就可以連接容器了:

nsinit exec /bin/bash 

3.lxc(-attach)

直到Docker 0.8.1版本為止,LXC一直是管理容器的基本工具,Docker一直支持這個工具。但是從0.9.0版本開始,Docker默認(rèn)使用libcontainer管理容器,不再依賴LXC了。因此默認(rèn)情況下,你不能使用lxc-attach了。

如果你仍然希望使用lxc-attach,那么你需要使用-e lxc選項來重新啟動Docker服務(wù)進(jìn)程。使用這個選項,Docker的內(nèi)部將再次使用LXC管理容器了。完成這個任務(wù)最簡單的做法就是創(chuàng)建/etc/default/docker文件(如果這個文件仍然不存在),并添加以下內(nèi)容:

DOCKER_OPTS=" -e lxc" 

現(xiàn)在你可以重新啟動Docker服務(wù)了。要連接容器,你需要知道完整的容器ID:

docker ps --no-trunc  

接下來,你就可以連接這個容器了。要完成下面工作,你還需要root權(quán)限:

lxc-attach -n <container-id> -- /bin/bash 

 4.sshd

上面所有三種方法都要求具有主機系統(tǒng)的root權(quán)限。為了不采用root權(quán)限,通過ssh訪問容器將是一個很好的選擇。

要做到這一點,你需要構(gòu)建一個支持SSH服務(wù)的基礎(chǔ)映像。此時,我們可能遇到這樣的問題:我們是不是用Docker CMD或者ENTRYPOINT運行一條命令就可以了?如果此時有sshd進(jìn)程運行,那么我們就不要再運行其他進(jìn)程了。接下來的工作是創(chuàng)建一個腳本或者使用像supervisord這樣的進(jìn)程管理工具來啟動其它所有需要啟動的進(jìn)程。有關(guān)如何使用supervisord的優(yōu)秀的文檔可以在Docker的web站點上找到。一旦你啟動了具有sshd進(jìn)程的容器,你就可以像以往一樣通過ssh客戶端了連接這個容器了。

結(jié)論

sshd方法可能是最簡單的連接容器的方法,而且大多數(shù)用戶習(xí)慣通過ssh連接虛擬機。另外,連接容器時你也不需要一定使用root權(quán)限。不過,對于是否一個容器是否應(yīng)當(dāng)管理不止一個進(jìn)程仍然存在許多爭議。這種方法最終使得每個容器了多了一個sshd進(jìn)程,這從根本上來說不是進(jìn)程虛擬化的所提倡的。

另外三種方法都需要root權(quán)限。到0.8.1版本為止,Docker都是使用LXC來管理容器的。正是由于這個原因,使用lxc-attach連接容器就非常容易。不過從版本0.9.0開始Docker服務(wù)就必須使用 -e lxc選項啟動才能在內(nèi)部支持LXC管理容器。不過,由于設(shè)置了這個選項,Docker將再次依賴LXC,而LXC可能隨著發(fā)布或者安裝的不同可能被剔除。

nsenter和nsinit總的來說是相同的。這兩個工具的主要區(qū)別是nsinit在本身的容器了建立了一個新的進(jìn)程,而nsenter只是訪問了名字空間。Jerome Petazzoni在Docker博客文章里對這一點說的很透徹。 

上面的幾種方法我也曾試過,他們基本上都是進(jìn)入正在運行中的容器,nsenter還可實現(xiàn)多終端對一個容器的操作。如果進(jìn)入已經(jīng)終止的容器,第一次安裝執(zhí)行的時候是可以的,可以得到PID的值,不過之后再執(zhí)行的時候發(fā)現(xiàn)PID的值為0,如果你接著執(zhí)行

<del>nsenter --target $PID --mount --uts --ipc --net --pid</del> 

你會發(fā)現(xiàn) 切換到了宿主機的超級管理員權(quán)限。

正確的方法會在下面介紹,首先先補充一下一些命令的參數(shù)的含義:

 查看鏡像

    docker images: 列出images

    docker images -a :列出所有的images(包含歷史)

    docker images --tree :顯示鏡像的所有層(layer)

    docker rmi  <image ID>: 刪除一個或多個image

查看容器

    docker ps :列出當(dāng)前所有正在運行的container
    docker ps -l :列出最近一次啟動的container
    docker ps -a :列出所有的container(包含歷史,即運行過的container)
    docker ps -q :列出最近一次運行的container ID

 5.重點來了:

$ docker ps -a 
CONTAINER ID    IMAGE        COMMAND       CREATED       STATUS      PORTS    NAMES 
9cff554fb6d7    ubuntuold:14.04   /bin/bash      About an hour ago  Up About an hour    condescending_blackwell   
e5c5498881ed    ubuntuold:14.04   /bin/bash      About an hour ago  Exited (0) 55 minutes ago backstabbing_bardeen  


    通過以上的信息可以看出兩者之間的差別:前者是正在運行的容器;而后者是已經(jīng)終止的容器(Exited(0))。

    docker start/stop/restart<container> :開啟/停止/重啟container
    docker start [container_id] :再次運行某個container(包括歷史container)
    docker attach [container_id]:連接一個正在運行的container實例(即實例必須為start狀態(tài),可以多個窗口同時attach一個container實例)
    docker start -i <container>:啟動一個container并進(jìn)入交互模式(相當(dāng)于先start,在attach)
 

就以后者e5c5498881ed為例:首先執(zhí)行

$ docker start e5c5498881ed 


//之后再一次查看的時候Exited(0)已經(jīng)沒有了,也就是說明該容器已經(jīng)從終止的狀態(tài)變?yōu)榱苏谶\行的狀態(tài) 
 $docker attach e5c5498881ed 


//你會的發(fā)現(xiàn)已經(jīng)進(jìn)入該容器了,而且之前的操作的文件依然存在 
//如果沒有反應(yīng)的話,再一次點擊回車即可 

    docker run -i -t <image> /bin/bash:使用image創(chuàng)建container并進(jìn)入交互模式, login shell是/bin/bash

    docker run -i -t -p <host_port:contain_port>:映射 HOST 端口到容器,方便外部訪問容器內(nèi)服務(wù),host_port 可以省略,省略表示把 container_port映射到一個動態(tài)端口。

   注:使用start是啟動已經(jīng)創(chuàng)建過得container,使用run則通過image開啟一個新的container。

 附加:

查看root密碼

   docker容器啟動時的root用戶的密碼是隨機分配的。所以,通過這種方式就可以得到容器的root用戶的密碼了。

docker logs 5817938c3f6e 2>&1 | grep 'User: ' | tail -n1 

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • 你可能不知道的docker命令奇淫怪巧

    你可能不知道的docker命令奇淫怪巧

    這篇文章主要介紹了你可能不知道的docker命令的奇淫怪巧,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • 詳解ASP.NET Core 網(wǎng)站在Docker中運行

    詳解ASP.NET Core 網(wǎng)站在Docker中運行

    本篇文章主要介紹了詳解ASP.NET Core 網(wǎng)站在Docker中運行,非常具有實用價值,需要的朋友可以參考下
    2017-05-05
  • jenkins+docker+nginx+nodejs持續(xù)集成部署vue前端項目

    jenkins+docker+nginx+nodejs持續(xù)集成部署vue前端項目

    本文主要介紹了jenkins+docker+nginx+nodejs持續(xù)集成部署vue前端項目,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • kali下對Docker的詳細(xì)安裝教程

    kali下對Docker的詳細(xì)安裝教程

    這篇文章主要介紹了kali下對Docker的詳細(xì)安裝,Docker是滲透測試中必學(xué)不可的一個容器工具,在其中,我們能夠快速創(chuàng)建、運行、測試以及部署應(yīng)用程序,對kali安裝docker相關(guān)知識感興趣的朋友一起看看吧
    2022-05-05
  • Docker系列之使用Docker Compose編排容器

    Docker系列之使用Docker Compose編排容器

    Docker Compose 是 Docker 容器進(jìn)行編排的工具,定義和運行多容器的應(yīng)用,可以一條命令啟動多個容器,這篇文章主要介紹了Docker系列之使用Docker Compose編排容器,感興趣的小伙伴們可以參考一下
    2018-06-06
  • docker-compose部署MySQL8的實現(xiàn)

    docker-compose部署MySQL8的實現(xiàn)

    本文主要介紹了docker-compose部署MySQL8的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • docker添加網(wǎng)橋并設(shè)置ip地址范圍操作

    docker添加網(wǎng)橋并設(shè)置ip地址范圍操作

    這篇文章主要介紹了docker添加網(wǎng)橋并設(shè)置ip地址范圍操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Ubuntu 16.04安裝使用Docker教程

    Ubuntu 16.04安裝使用Docker教程

    本篇文章主要介紹了Ubuntu 16.04安裝使用Docker教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 5分鐘教你實現(xiàn)用docker搭建Redis集群模式和哨兵模式

    5分鐘教你實現(xiàn)用docker搭建Redis集群模式和哨兵模式

    本文主要介紹了5分鐘實現(xiàn)用docker搭建Redis集群模式和哨兵模式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Docker容器化部署嘗試——多容器通信(node+mongoDB+nginx)

    Docker容器化部署嘗試——多容器通信(node+mongoDB+nginx)

    這篇文章主要介紹了Docker容器化部署嘗試——多容器通信(node+mongoDB+nginx),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12

最新評論