Docker入門系列6 如何打開多個終端進入Docker容器


Docker容器運行后,如何進入容器進行操作呢?起初我是用SSH。如果只啟動一個容器,用SSH還能應付,只需要將容器的22端口映射到本機的一個端口即可。當我啟動了五個容器后,每個容器默認是沒有配置SSH Server的,安裝配置SSHD,映射容器SSH端口,實在是麻煩。 我發現很多Docker鏡像都是沒有安裝SSHD服務的,難道有其他方法進入Docker容器?

有很多種方法,包括使用 docker attach 命令或 nsenter 工具等。

使用 attach 命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。

nsenter 可以訪問另一個進程的名字空間。

為了連接到容器,你還需要找到容器的第一個進程的 PID,可以通過下面的命令獲取。

PID=$(docker inspect --format "{{ .State.Pid }}" <container>) //將<container>換成你的容器id 

通過這個 PID,就可以連接到這個容器:

$ nsenter --target $PID --mount --uts --ipc --net --pid 

更簡單的,建議大家下載 .bashrc_docker,並將內容放到 .bashrc 中。

$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker; $ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc 

這個文件中定義了很多方便使用 Docker 的命令,例如 docker-pid 可以獲取某個容器的 PID;而 docker-enter 可以進入容器或直接在容器內執行命令。

$ echo $(docker-pid <container>) $ docker-enter <container> 

[編輯]

.bashrc_docker文件內容:

# Some useful commands to use docker.# Author: yeasy@github# Created:2014-09-25   alias docker-pid="sudo docker inspect --format '{{.State.Pid}}'"alias docker-ip="sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}'"   #the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enterfunction docker-enter(){if[-e $(dirname"$0")/nsenter ]; then# with boot2docker, nsenter is not in the PATH but it is in the same folderNSENTER=$(dirname"$0")/nsenter     elseNSENTER=nsenter     fi[-z"$NSENTER"]&&echo"WARN Cannot find nsenter"&&return       if[-z"$1"]; thenecho"Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]"echo""echo"Enters the Docker CONTAINER and executes the specified COMMAND."echo"If COMMAND is not specified, runs an interactive shell in CONTAINER."elsePID=$(sudo docker inspect --format"{{.State.Pid}}""$1")if[-z"$PID"]; thenecho"WARN Cannot find the given container"returnfishift           OPTS="--target $PID --mount --uts --ipc --net --pid"           if[-z"$1"]; then# No command given.# Use su to clear all host environment variables except for TERM,# initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,# and start a login shell.#sudo $NSENTER "$OPTS" su - rootsudo$NSENTER--target$PID--mount--uts--ipc--net--pidsu - root         else# Use env to clear all host environment variables.sudo$NSENTER--target$PID--mount--uts--ipc--net--pidenv-i $@fifi}

藝搜參考

http://www.hjue.me/post/docker-nsenter

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


免責聲明!

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



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