容器是Docker的又一核心概念
簡單的說,容器是獨立運行的一個或一組應(yīng)用,,以及他們的運行太環(huán)境,。對應(yīng)的,虛擬機可以理解為模擬運行的一整套操作系統(tǒng)和運行在上面的應(yīng)用,。接下來記錄一下如何管理一個容器,,包括創(chuàng)建、啟動和停止等
啟動容器
啟動容器有兩種方式,,一是基于鏡像創(chuàng)建一個容器并啟動,,二是將終止狀態(tài)的容器重新啟動。
1,、 新建并啟動:我們可以使用docker run 命令新建一個容器并將其啟動
root@ubuntu:~# docker run ubuntu:16.04 /bin/echo 'Hello World'
Hello World
上面命令輸出了內(nèi)容之后,,立馬停止了容器,以至于我們根本不知道是否啟動了容器,。我們可以使用docker ps -a 命令來查看所有的容器:
root@ubuntu:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e3efbefb34cd ubuntu:16.04 "/bin/echo 'Hello Wo…" 7 seconds ago Exited (0) 5 seconds ago priceless_mcnulty
可以看到,,這就是我們剛剛創(chuàng)建并啟動的容器!我們還可以使用如下命令啟動一個Bash終端,,允許用戶與之交互:
root@ubuntu:~# docker run -it ubuntu:16.04 /bin/bash
root@d52e9924901b:/# date
Sun Jul 1 00:43:09 CST 2018
如此,我們就可以在其上面進行一連串的命令輸入操作了
使用docker run 來創(chuàng)建容器時,,Docker在后臺的操作包括:
- 檢查本地是否存在指定的鏡像,,不存在就從公有倉庫中下載
- 利用鏡像創(chuàng)建并啟動一個容器
- 分配一個文件系統(tǒng),并在只讀的鏡像層外面掛載一層可讀寫層
- 從宿主主機的網(wǎng)橋接口中橋接一個虛擬接口到容器中去
- 從地址池分配一個IP給容器
- 執(zhí)行用戶指定的應(yīng)用程序
- 執(zhí)行完畢后容器被終止
2、 啟動已終止容器:可以使用docker container start 命令,,將一個已經(jīng)停止的容器重新啟動運行
首先我們使用docker ps -a 來獲取當前宿主機上存在的容器:
root@ubuntu:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a148c6fec026 ubuntu:16.04 "bash" 3 minutes ago Exited (0) 10 seconds ago goofy_swanson
然后,,我們獲取到容器的ID,將其傳入到docker container start 命令中,,將此容器啟動起來:
root@ubuntu:~# docker container start d52e9924901b
此時,,我們輸入docker ps 命令,發(fā)現(xiàn)此容器是已啟動狀態(tài)的:
root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a148c6fec026 ubuntu:16.04 "bash" 4 minutes ago Up 2 seconds goofy_swanson
但是,,這僅僅只是將其啟動起來了,,如果我們還需要進入交互式終端,我們可以使用docker exec 命令,,并指定一個Bash,,如下:
root@ubuntu:~# docker exec -it a148c6fec026 /bin/bash
root@a148c6fec026:/#
值得注意的是,docker ps 只會列出正在運行的容器,,而docker ps -a 會列出所有的容器,,包括正在運行的和已經(jīng)停止的容器
后臺運行容器
更多的時候,需要讓Docker在后臺運行,,而不是把當前執(zhí)行的命令的結(jié)果直接輸出在當前宿主機下,,此時我們可以使用docker run 命令,并添加-d 參數(shù)來實現(xiàn):
root@ubuntu:~# docker run -d ubuntu:16.04 /bin/sh -c "while true; do echo hello docker; sleep 1; done"
59a9f0e30fda31c1799f622da6d56d0723c2bab5313f01f50e855fdbea21f00d
此時,,容器會在后臺運行,,不會把輸出的結(jié)果打印到宿主機上面。使用-d 參數(shù)運行容器之后,,會返回一個容器的ID的給我們,,我們可以通過docker container ls 來查看容器的信息:
root@ubuntu:~# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59a9f0e30fda ubuntu:16.04 "/bin/sh -c 'while t…" 2 minutes ago Up 2 minutes inspiring_elion
如果想要知道后臺運行的容器所執(zhí)行的命令輸出的內(nèi)容,我們可以使用docker container logs 命令來查看,。比如,,我們想查看剛剛那個容器所輸出的內(nèi)容,我們在命令后面加上容器的ID即可,,如下:
root@ubuntu:~# docker container logs 59a9f0e30fda
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
...
終止容器
我們可以使用docker container stop 命令來停止一個容器,。例如我們將剛剛那個容器停止,傳入它的容器ID即可,,如下:
root@ubuntu:~# docker container stop 59a9f0e30fda
值得注意的是,,docker container ls 只列出正在運行的容器,我們?nèi)绻枰榭匆呀?jīng)停止的容器,,只需要在結(jié)尾添加-a 參數(shù)即可,。如此并可列出當前宿主機存在的所有容器,包括正在運行與已經(jīng)停止的容器,,如下:
root@ubuntu:~# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59a9f0e30fda ubuntu:16.04 "/bin/sh -c 'while t…" 31 minutes ago Exited (137) 2 minutes ago inspiring_elion
在上面已經(jīng)提到,,對于已經(jīng)停止的容器,,我們可以使用docker container start 命令來重新啟動它!??!另外,我們還需知道另外一個命令:docker container restart 重啟容器的命令,,命令會將一個運行態(tài)的容器停止,,然后重新啟動它!
進入容器
在使用-d 參數(shù)時,,容器會進入后臺,!但是,有的時候我們需要進入其交互式終端,,對其進行一些命令輸入操作,,此時,我們可以使用docker attach 命令或者docker exec 命令來實現(xiàn):
首先,,我們新在后臺啟動一個容器:
root@ubuntu:~# docker run -dit ubuntu:16.04 bash
98ba6098afe1bc1f79893f4f3eca166b091cfeafcb544584b7fd09b7d12f41ef
此時再使用docker container ls 命令來查看容器的信息:
root@ubuntu:~# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98ba6098afe1 ubuntu:16.04 "bash" 52 seconds ago Up 50 seconds cranky_mccarthy
使用docker attach 命令,,進入容器交互式環(huán)境:
root@ubuntu:~# docker attach 98ba6098afe1
root@98ba6098afe1:/#
同樣,新在后臺啟動一個容器:
root@ubuntu:~# docker run -dit ubuntu:16.04 bash
ea0cda7fe8d75b309e6f911a1acb9f062945a58661e8b389979d6ea7960626df
此時再使用docker container ls 命令來查看容器的信息:
root@ubuntu:~# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea0cda7fe8d7 ubuntu:16.04 "bash" About a minute ago Up About a minute quirky_liskov
使用docker exec 命令,,進入交互式環(huán)境,,值得注意的是,須指定-i 與-t 參數(shù)和Shell的名稱,,如下:
root@ubuntu:~# docker exec -it ea0cda7fe8d7
root@ea0cda7fe8d7:/#
使用docker exec 和docker attach 命令時,,應(yīng)注意:docker attach 命令進入交互式環(huán)境時,使用exit 命令退出之后,,容器即可終止,,而docker exec 命令則不會!所以這兩種命令,,更加推薦使用docker exec !
導(dǎo)出和導(dǎo)入容器
- 導(dǎo)出容器:如果要導(dǎo)出某個容器到本地,,我們可以使用
docker export 命令
首先,我們使用docker container ls -a 查看以下當前宿主機上存在的所有容器列表:
root@ubuntu:~# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea0cda7fe8d7 ubuntu:16.04 "bash" 11 minutes ago Up 11 minutes quirky_liskov
下面,,我們將容器ID為ea0cda7fe8d7 的容器導(dǎo)出為test.tar ,,如下:
root@ubuntu:~# docker export ea0cda7fe8d7 > test.tar
此時,會在當前目錄下生成一個test.tar 名稱的容器快照文件
- 導(dǎo)入容器:我們可以使用
docker import 命令導(dǎo)入一個容器快照文件生成一個鏡像
我們將剛剛生成的容器快照文件test.tar 導(dǎo)入,,命令如下:
root@ubuntu:~# cat test.tar | docker import - test/ubuntu:v1.0
sha256:048bcf083eb80925b246e161ed58dd03a3c071ebb6b31961034dacbc8f63efbd
導(dǎo)入成功之后,,會在控制臺中輸出摘要信息。此時我們使用docker image ls 命令來查看當前宿主機上的鏡像列表:
root@ubuntu:~# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1.0 048bcf083eb8 7 seconds ago 85.9MB
ubuntu 16.04 5e8b97a2a082 3 weeks ago 114MB
我們剛剛導(dǎo)入生成的鏡像已經(jīng)顯示在列表之中了,!此外,,我們還可以通過指定URL或者目錄來導(dǎo)入,如下:
docker import http:///exampleimage.tgz example/imagerepo
導(dǎo)入本地容器快照,,我們還可以使用docker load 命令,!
刪除容器
我們可以使用docker container rm 命令來刪除一個處于終止狀態(tài)的容器,,例如:
root@ubuntu:~# docker container rm ea0cda7fe8d7
Error response from daemon: You cannot remove a running container ea0cda7fe8d75b309e6f911a1acb9f062945a58661e8b389979d6ea7960626df. Stop the container before attempting removal or force remove
此時,報了一個錯誤,,說此容器正在運行,刪除容器須先終止掉它,!我們使用docker container stop 命令來終止此容器,,然后再刪除它:
root@ubuntu:~# docker container stop ea0cda7fe8d7
ea0cda7fe8d7
root@ubuntu:~# docker container rm ea0cda7fe8d7
ea0cda7fe8d7
在上面,我們知道可以使用docker container ls -a 來查看當前宿主機上存在的所有容器,,包括正在運行和已經(jīng)停止的容器,。如果當前宿主機上存在很多已經(jīng)停止的容器,一個一個刪除未免太過麻煩,,此時我們可以使用docker container prune 命令來清除所有處于終止狀態(tài)的容器:
root@ubuntu:~# docker container prune
更多命令
命令 | 說明 |
---|
docker container ls | 列出正在運行的容器 | docker ps | 列出正在運行的容器 | docker container ls -a | 列出所有的容器 | docker ps -a | 列出所有的容器 | docker container start | 啟動容器 | docker start | 啟動容器 | docker container stop | 停止容器 | docker stop | 停止容器 | docker container restart | 重啟容器 | docker restart | 重啟容器 | docker container rm | 刪除容器 | docker rm | 刪除容器 | docker container logs | 打印容器的標準輸出 | docker logs | 打印容器的標準輸出 |
分別傳入--help 參數(shù)查看它們的用法,,發(fā)現(xiàn)docker container ls 命令與docker ps 命令效果是一樣的!docker container start 與docker start 效果是一樣的,!docker container stop 與docker stop 效果是一樣的,!docker container restart 與docker restart 效果是一樣的!docker container rm 與docker rm 效果是一樣的,!docker container logs 與docker logs 效果是一樣的,!
|