目前容器雲非常的成熟,也有很多的使用案例,可以說不是什么高大上的東西了,可以說整個雲計算也不是什么奢侈品,而是基礎設施。但是如何使用,就成了必須的技術。
今天記錄下,基於docker的容器登錄技術。
通常情況下,我們想看看運行中的docker容器的狀態,尤其是想看看容器內部的應用配置,比如tomcat的配置信息,該怎么操作呢?當然了,你會說,直接docker inspect containerId,找到workdir,或者配置文件路徑,然后docker cp從容器中拷貝到宿主機上。這些都是處理靜態問題的辦法,但是能否直接登錄到容器上呢?
答案是有的,比較docker容器如此優秀出色。
准備工作,先啟動一個docker容器,在后台運行,方便講解后面的操作方法。
1.查看當前有些什么鏡像。
2. 然后啟動一個
以后台的方式啟動tomcat:9.0.2,容器主機名login,將宿主機的9999端口映射到容器的8080上,容器的名稱logindocker。
[root@tkwms-web wmsuser]# docker run -it --name logindocker -h login -p 9999:8080 tomcat:9.0.2 /bin/bash
3.查看啟動后的容器信息
有好幾種辦法,可以直接連接上運行中的docker容器。下面就說常用的4種吧:
1. docker attach <ContainerID>
A. 登錄后,就直接看到類似登錄主機的感覺。然后,做什么操作,都可以進行了。另外,這里有一個問題需要注意,那就是如何退出docker attach連上的容器呢?是不是個問題?直接ctrl+c,肯定是不行的,因為有可能會導致容器掛掉, exit呢?也是會導致容器死掉的。有辦法嗎?答案是有的。直接在登錄上的容器命令行下輸入ctrl+p+q,就可以安全退出了。
B. 存在的問題:多人同時attach到同一個容器的時候,大家看到的是相同的內容,其中一個人卡頓,其他人都卡住,也就是相當於是一個人操作(有一個好處喲,就是不同地方的工作協調時,一個人操作,另外一個人可以看到對方在操作啥,就和看直播似的),此模式用於測試環境可以,生產環境不建議使用。
2. docker exec
該命令的幫助文檔:
[root@tkwms-web wmsuser]# docker exec --help Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] Run a command in a running container Options: -d, --detach Detached mode: run command in the background --detach-keys string Override the key sequence for detaching a container -e, --env list Set environment variables -i, --interactive Keep STDIN open even if not attached --privileged Give extended privileges to the command -t, --tty Allocate a pseudo-TTY -u, --user string Username or UID (format: <name|uid>[:<group|gid>]) -w, --workdir string Working directory inside the container
下面看一個案例:
[root@tkwms-web wmsuser]# docker exec -it 8c9dc1aaccad /bin/bash
A. 退出指令可以是exit,也可以是ctrl+p+q
B. 效果和docker attach類似。但是不存在docker attach的安全問題。
3. ssh方式
這里需要說明的是,運行的容器里面要有sshd服務,只有這樣,才可以在遠程的ssh客戶端能夠登陸上去。和普通的ssh使用方式一樣。
4. nsenter命令方式
A. 這個nsenter是第三方的應用,需要自己下載安裝。 wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz。 如何安裝,就不說了,解壓后自己一看就知道。
B. 獲取要登陸的容器的主進程PID docker inspect -f {{.State.PID}} containerID
[root@tkwms-web util-linux-2.24]# docker inspect -f {{.State.Pid}} 886f31e4d385 11625
C. 然后按照下面的指令進行登陸運行的容器
nsenter --target 11625 --mount --uts --ipc --net --pid
案例如下:
[root@tkwms-web ~]# nsenter --target 11625 --mount --uts --ipc --net --pid mesg: ttyname failed: No such file or directory root@login:/# ls bin boot dev docker-java-home etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@login:/#
綜上所述,建議使用docker exec指令,最簡單。