上篇分享中,我們介紹了關于如何建立容器、如何啟動容器、如何停止容器。這篇我們來分享一下如何操作容器。
如何進入容器
可以通過使用-d參數啟動容器後會進入背景運作,使用者無法檢視容器中的資訊,無法對容器中的資訊進行操作。
這個時候如果我們需要進入容器對容器進行操作,那麼就可以通過 attach 或者是 exec指令來進行操作。
attach指令
attach 是Docker自帶的指令,其指令格式如下
docker [container] attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
從指令中可以看到這個指令支援三個參數
- --detach-keys[=[]] :指定退出attach模式的快捷鍵
- --no-stdin=true :是否關閉标準輸入,預設是打開
- --sig-proxy=true:是否代理收到的系統信号給應用程序使用預設是true。
下面我們來看如何使用這個指令。
[root@localhost ~]# docker run -itd ubuntu
83528e7f40943932dfc635501f5d7ac58656b0798cbcbf5d0906371596a9706c
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83528e7f4094 ubuntu "/bin/bash" 5 minutes ago Up 5 minutes eager_lamport
[root@localhost ~]# docker attach eager_lamport
root@83528e7f4094:/#
執行完成之後會看到,底部的指令導航欄中的内容變成了容器内部的路徑,但是使用attach指令有一點不好,就是如果有多個視窗連接配接同一個容器的時候,所有的視窗都會同步進行顯示。當某個視窗阻塞的時候,其他視窗也無法執行指令。
exec 指令
從Docker的1.3.0版本開始,Docker提供了一個exec指令,可以在容器中直接執行任意指令。格式如下
docker [container] exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged]
[-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG……]
其中比較重要的參數
- -d ,--detach:在容器中背景執行指令
- --detach-keys="":指定将容器切換到背景的按鍵
- -e:指定環境變量
- -i:打開标準輸入用于接收使用者指令
- -t:配置設定僞終端
- -u:指定指令的使用者名或者是ID
下面我們來操作一下
[root@localhost ~]# docker run -itd ubuntu
4aa9478d87afecf7f0caf52848e7e41c53dbc7c7e1f6931a2e82c358a35f144a
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4aa9478d87af ubuntu "/bin/bash" 4 seconds ago Up 4 seconds elastic_leakey
[root@localhost ~]# docker exec -it 4aa9478d87af /bin/bash
root@4aa9478d87af:/# w
01:24:05 up 21 min, 0 users, load average: 0.01, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root@4aa9478d87af:/#
删除容器
我們之前也提到過如果要删除一個容器的話可以使用 docker rm 指令來進行操作,這個指令主要是用來删除處于終止或者是退出狀态的容器。指令格式如下
docker [container] rm [-f|--force] [-l|link] [-v|--volumes] CONTAINER [CONTAINER……]
其中需要注意的參數
- -f:表示是否強制終止并删除一個運作中的容器
- -l:表示删除容器的連接配接,但保留容器
- -v: 表示删除容器挂載的資料卷
通過 docker ps -a 指令,可以看到所有的容器狀态
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4aa9478d87af ubuntu "/bin/bash" 5 minutes ago Up 5 minutes elastic_leakey
83528e7f4094 ubuntu "/bin/bash" 21 minutes ago Exited (0) 5 minutes ago eager_lamport
0d611b23bd59 ubuntu "18.04" 21 minutes ago Created pensive_keller
[root@localhost ~]#
在預設情況下使用docker rm指令隻能删除處于終止或者已經退出的容器,但是并不能删除正在處于運作中的容器。如果想要删除則需要添加 -f 參數。
導入和導出容器
在有些情況下,我們會遇到伺服器系統遷移,這個時候就需要将容器從一個系統中遷移到另外的系統中。這個時候我們就可以通過容器的導入導出來實作。
導出容器
容器的導出是指,将一個容器導出到一個檔案的過程,在這個過程中,無論容器是否是運作的,可以使用 docker [container] export 指令,指令格式如下
docker [container] export [-o|--output[=""]] CONTAINER
其中-o選項是用來指定導入的tar名稱。
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4aa9478d87af ubuntu "/bin/bash" 5 minutes ago Up 5 minutes elastic_leakey
83528e7f4094 ubuntu "/bin/bash" 21 minutes ago Exited (0) 5 minutes ago eager_lamport
0d611b23bd59 ubuntu "18.04" 21 minutes ago Created pensive_keller
[root@localhost ~]# docker export -o test_for_stop.tar 83528e7f4094
[root@localhost ~]# ls
anaconda-ks.cfg docker docker-20.10.17.tgz Dockerfile initial-setup-ks.cfg test_for_stop.tar
[root@localhost ~]#
将容器導出之後,可以遷移到其他伺服器上使用導入指令導入
導入容器
将導出的檔案搬遷到正常的機器上,就可以通過docker import 指令進行導入了,指令格式如下
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY[:TAG]]
可以通過-c,--change=[] 來同時執行容器的修改。
[root@localhost ~]# docker import test_for_stop.tar ubuntu:v1.0
sha256:d2718af1a9f22218f3e5cf31b0e31d787a002b2d7a9b64bf2aac2609bd65af3d
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu v1.0 d2718af1a9f2 23 seconds ago 77.8MB
nginx 0.1 56d8d0398d46 5 days ago 126MB
test 0.1 05268b440fd9 5 days ago 63.2MB
ubuntu latest 5a81c4b8502e 4 weeks ago 77.8MB
ubuntu 18.04 f9a80a55f492 2 months ago 63.2MB
[root@localhost ~]#
總結
到這裡,我們關于如何進入檢視容器,如何删除容器,以及如何導入導出容器的相關操作就介紹完成了。後續的分享中,還會帶來更多關于Docker操作相關的内容,請大家多多關注。