Docker管理案例
例如:我要新建一個(gè)abcdocker的容器叠聋,它的鏡像是centos.他有三個(gè)參數(shù)临梗,第一個(gè)是給容器起一個(gè)名稱蠢沿,-t 分配一個(gè)偽終端(tty)-i標(biāo)準(zhǔn)輸入打開肩榕,我要在里面輸入命令
[root@linux-node1~]#docker run--name abcdocker-t-i centos/bin/bash
--name容器的名稱
-t讓docker分配一個(gè)偽終端
-i讓docker的標(biāo)準(zhǔn)輸入打開{input}
提示:最后的/bin/bash可以省略,但是最后一個(gè)如果不是命令氏捞,那就是鏡像的名稱
輸入上方的命令之后會(huì)直接進(jìn)入到容器里面
[root@f8c8c8156e26/]#ps aux
USER? ? ? ? PID%CPU%MEM? ? VSZ? RSS TTY? ? ? STAT START? TIME COMMAND
root10.00.1117521920?Ss19:380:00/bin/bash
root180.00.0474241660?R+21:320:00ps aux
[root@f8c8c8156e26/]#
溫馨提示:容器不是一個(gè)虛擬機(jī)碧聪,因?yàn)樗褪且粋€(gè)進(jìn)程,如果我們退出液茎,這個(gè)進(jìn)程就退出了逞姿。
如果我們執(zhí)行創(chuàng)建容器的時(shí)候,里面沒有我們指定的鏡像捆等,那么他會(huì)從dockerhub上進(jìn)行下載然后在啟動(dòng)
容器啟動(dòng)
我們通過(guò)docker ps -a可以查看到?jīng)]有啟動(dòng)的容器
使用docker start [名稱或PORTS]
docker run --name nginx -d -p 4001:80 nginx
[root@linux-node1~]#docker ps-a
CONTAINER ID? ? ? ? IMAGE? ? ? ? ? ? ? COMMAND? ? ? ? ? ? CREATED? ? ? ? ? ? STATUS? ? ? ? ? ? ? ? ? ? ? PORTS? ? ? ? ? ? ? NAMES
f8c8c8156e26? ? ? ? centos"/bin/bash"2hours agoExited(0)34minutes ago? ? ? ? ? ? ? ? ? ? ? abcdocker
bcededa4b82c? ? ? ? centos"/bin/echo hello"2hours agoExited(0)2hours ago? ? ? ? ? ? ? ? ? ? ? ? ? awesome_dijkstra
[root@linux-node1~]#docker start abcdocker
abcdocker
[root@linux-node1~]#docker start bcededa4b82c
bcededa4b82c
進(jìn)入容器
[root@linux-node1~]#docker ps-a
CONTAINER ID? ? ? ? IMAGE? ? ? ? ? ? ? COMMAND? ? ? ? ? ? CREATED? ? ? ? ? ? STATUS? ? ? ? ? ? ? ? ? ? ? PORTS? ? ? ? ? ? ? NAMES
f8c8c8156e26? ? ? ? centos"/bin/bash"2hours agoUp24minutes? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? abcdocker
bcededa4b82c? ? ? ? centos"/bin/echo hello"3hours agoExited(0)23minutes ago? ? ? ? ? ? ? ? ? ? ? awesome_dijkstra
[root@linux-node1~]#docker attach abcdocker
[root@f8c8c8156e26/]#ps aux
USER? ? ? ? PID%CPU%MEM? ? VSZ? RSS TTY? ? ? STAT START? TIME COMMAND
root10.00.1117761872?Ss22:090:00/bin/bash
root140.00.0474241660?R+22:330:00ps aux
這樣進(jìn)入容器的缺點(diǎn)就是如果在開一個(gè)窗口就會(huì)同步操作滞造,類似于單用戶模式(windows遠(yuǎn)程桌面)
提示:生產(chǎn)場(chǎng)景是不使用docker attach的,需要我們使用nsenter這個(gè)工具栋烤,這個(gè)工具包含在util-linux軟件包里面
[root@linux-node1~]#yum install util-linux-y
Centos7默認(rèn)最小化已經(jīng)安裝
我們通過(guò)nsenter就可以進(jìn)入容器谒养,但是nsenter是通過(guò)pid進(jìn)入容器里,所以我們需要知道容器的pid明郭。我們可以通過(guò)docker inspect來(lái)獲取到pid
[root@linux-node1~]#docker start abcdocker
abcdocker
[root@linux-node1~]#docker inspect-f"{{ .State.Pid }}"abcdocker
37434
[root@linux-node1~]#nsenter-t37434-m-u-i-n-p
docker inspect -f {{.State.Pid}}容器名或者容器id
#每一個(gè)容器都有.State.Pid买窟,所以這個(gè)命令除了容器的id需要我們根據(jù)docker ps-a去查找,其他的全部為固定的格式
nsenter --target上面查到的進(jìn)程id --mount --uts --ipc --net --pid#輸入該命令便進(jìn)入到容器中
解釋nsenter指令中進(jìn)程id之后的參數(shù)的含義:
*–mount參數(shù)是進(jìn)去到mount namespace中
*–uts參數(shù)是進(jìn)入到uts namespace中
*–ipc參數(shù)是進(jìn)入到SystemV IPC namaspace中
*–net參數(shù)是進(jìn)入到network namespace中
*–pid參數(shù)是進(jìn)入到pid namespace中
*–user參數(shù)是進(jìn)入到user namespace中
更多參數(shù)我們可以通過(guò)nsenter --help進(jìn)行獲取
我們進(jìn)入容器中查看進(jìn)程
以下是以nsenter啟動(dòng)的進(jìn)程
[root@f8c8c8156e26/]#ps aux
USER? ? ? ? PID%CPU%MEM? ? VSZ? RSS TTY? ? ? STAT START? TIME COMMAND
root10.00.0117761664?Ss+Oct180:00/bin/bash
root270.00.1133761984?SOct180:00-bash
root400.00.0490241808?R+00:110:00ps aux
/bin/bash是我們運(yùn)行容器產(chǎn)生的進(jìn)程
-bash是我們使用nsenter產(chǎn)生的薯定,這樣如果我們退出容器始绍,容器就不會(huì)退出,因?yàn)?bash還在運(yùn)行
[root@f8c8c8156e26/]#exit
logout
[root@linux-node1~]#docker ps
CONTAINER ID? ? ? ? IMAGE? ? ? ? ? ? ? COMMAND? ? ? ? ? ? CREATED? ? ? ? ? ? STATUS? ? ? ? ? ? ? PORTS? ? ? ? ? ? ? NAMES
f8c8c8156e26? ? ? ? centos"/bin/bash"4hours agoUp48minutes? ? ? ? ? ? ? ? ? ? ? ? ? abcdocker
因?yàn)槊看芜M(jìn)入容器都需要輸入那兩條命令话侄,所以我們可以寫一個(gè)腳本來(lái)獲取亏推。
腳本內(nèi)容如下:
[root@linux-node1~]#cat docker_in.sh
#!/bin/bash
# Use nsenter to access docker
docker_in(){
NAME_ID=$1
PID=$(docker inspect-f"{{ .State.Pid }}"$NAME_ID)
nsenter-t $PID-m-u-i-n-p
}
docker_in $1
執(zhí)行結(jié)果如下:
[root@linux-node1~]#chmod+x docker_in.sh
[root@linux-node1~]#./docker_in.sh abcdocker
[root@f8c8c8156e26/]#ps-ef
UID? ? ? ? PID? PPID? C STIME TTY? ? ? ? ? TIME CMD
root100Oct18?00:00:00/bin/bash
root540000:23?00:00:00-bash
root6754000:23?00:00:00ps-ef
[root@f8c8c8156e26/]#
我們也可以不進(jìn)入容器進(jìn)行查看
[root@linux-node1~]#dockerexecabcdocker ps-ef
UID? ? ? ? PID? PPID? C STIME TTY? ? ? ? ? TIME CMD
root100Oct18?00:00:00/bin/bash
root850000:28?00:00:00ps-ef
[root@linux-node1~]#dockerexecabcdocker ls/
anaconda-post.log
bin
dev
提示:可以使用exec參數(shù),不進(jìn)入容器查看內(nèi)容
我們還可以使用exec進(jìn)入docker容器中
[root@linux-node1~]#dockerexec-it abcdocker/bin/bash
但是最好還是少使用exec年堆,有可能會(huì)對(duì)容器造成一些意外的影響