容器是 Docker 的另一個核心概念. 簡單來說, 容器是鏡像的一個運行實例. 所不同的是, 鏡像是靜態(tài)的只讀文件, 而容器帶有運行時需要的可寫文件層.
創(chuàng)建容器
新建容器
可以使用 docker create
命令新建一個容器, 例如:
docker create -it centos
//輸出信息
12f1c6f3f33eb80f35d0b0b4afb46745dd0e66f541db2f57f9dea58b45c92a02
我們使用 docker ps
命令可以查看容器, 注意默認(rèn)只能查看運行中的容器. 想要顯示所有容器, 需要指定-a
參數(shù).docker ps參數(shù)
docker ps -a
//輸出信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
12f1c6f3f33e centos "/bin/bash" 12 minutes ago Created serene_jones
使用 docker create
命令新建的容器處于停止?fàn)顟B(tài), 可以使用 docker start
命令來啟動它.
啟動容器
使用 docker start
命令來啟動一個已經(jīng)創(chuàng)建的容器, 例如我們啟動剛剛創(chuàng)建的 centos 容器:
docker start 12f1c6f3f33e
//輸出信息
12f1c6f3f33e
此時, 通過 docker ps
命令查看一個運行中的容器:
docker ps
//輸出信息
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
12f1c6f3f33e centos "/bin/bash" About a minute ago Up 10 seconds brave_khorana
創(chuàng)建并啟動容器
除了創(chuàng)建容器后通過 start
命令來啟動, 也可以直接新建并啟動容器. 所需要的命令主要為 docker run
, 等價于先執(zhí)行 docker create
命令, 再執(zhí)行 docker start
命令.
docker run centos /bin/echo 'Hello Docker'
//輸出信息
Hello Docker
這跟在本地執(zhí)行 /bin/echo 'Hello Docker'
幾乎感覺不出任何區(qū)別.
當(dāng)利用 docker run
來創(chuàng)建并啟動容器時, Docker 在后臺運行的標(biāo)準(zhǔn)包括:
- 檢查本地是否存在指定鏡像, 不存在就從公有倉庫下載.
- 利用鏡像創(chuàng)建一個容器, 并啟動改容器.
- 分配一個文件系統(tǒng)給容器, 并在只讀的鏡像層外面掛載一層可讀寫層.
- 從宿主主機配置的網(wǎng)橋接口中橋接一個虛擬接口到容器中.
- 從網(wǎng)橋的地址池配置一個 IP 地址給容器.
- 執(zhí)行用戶指定的應(yīng)用程序.
- 執(zhí)行完畢后容器被自動終止.
守護(hù)態(tài)運行
更多的時候, 需要讓 Docker 容器在后臺以守護(hù)態(tài)形式運行. 此時可以通過添加 -d
參數(shù)來實現(xiàn).
docker run -d centos /bin/sh -c "while true; do echo Hello world; sleep 1; done"
//輸出信息
936c08c3a4e89a3f156e0025abab28224bf78511ce9d9d1d57dd9706042a5b34
此時, 要獲取容器的輸出信息, 可以使用 docker logs
命令
docker logs 936c08c3a4e
//輸出信息
Hello world
Hello world
Hello world
Hello world
...
終止容器
可以使用 docker stop
來終止一個運行中的容器. 該命令的格式為 docker stop [-t|--time[=10]] [CONTAINER...]
首先向容器發(fā)送 SIGTERM 信號, 等待一段超時時間(默認(rèn)為10秒)后, 在發(fā)送 SIGKILL 信號來終止容器:
docker stop 936c08c3a4e
//輸出信息
936c08c3a4e
docker kill
命令會直接發(fā)送 SIGKILL 信號來強行終止容器.
進(jìn)入容器
在使用 -d
參數(shù)時, 容器啟動后會進(jìn)入后臺, 用戶無法看到容器中的信息, 也無法進(jìn)入操作.
這個時候如果需要進(jìn)入容器進(jìn)行操作, 有多種方法, 包括官方的 attach 或 exec 命令, 以及第三方的 nsenter 工具等.
attach 命令
attach 是Docker 自帶的命令, 命令格式為:
docker attach [OPTIONS] CONTAINER
這里就不做多介紹了, 因為使用 attach
命令有時候并不方便. 當(dāng)多個窗口同時用 attach
命令連接到同一個容器的時候, 所有窗口都會同步顯示. 當(dāng)某個窗口因為命令阻塞時, 其他窗口也無法執(zhí)行操作了.
exec 命令
Docker 從1.3.0 版本起提供了一個更加方便的 exec
命令, 可以在容器內(nèi)直接執(zhí)行任意命令.
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
我們實戰(zhàn)一下進(jìn)入一個容器, 可以先用 docker ps
命令查看一下我們有哪些容器在運行. 然后進(jìn)入容器:
docker exec -it 65712e2397cd /bin/bash
[root@65712e2397cd /]#
可以看到, 一個 bash 終端打開了, 在不影響容器內(nèi)其他應(yīng)用的前提下, 用戶可以很容易與容器進(jìn)行交互.
注意: 通過制定
-it
參數(shù)來保持標(biāo)準(zhǔn)輸入打開, 并且分配一個偽終端. 通過exec
命令對容器執(zhí)行操作是最為推薦的方式.
nsenter 工具
請自行谷歌
刪除容器
可以使用 docker rm
命令來刪除處于終止或退出狀態(tài)的容器, 命令格式為:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
實戰(zhàn)
docker rm 056b99544369
//輸出信息
056b99544369
導(dǎo)入和導(dǎo)出容器
導(dǎo)出容器
導(dǎo)出容器是指導(dǎo)出一個已經(jīng)創(chuàng)建的容器到一個文件, 不管此時這個容器是否處于運行狀態(tài), 可以使用 docker export
命令, 命令格式為:
docker export [OPTIONS] CONTAINER
實戰(zhàn)
//姿勢1
docker export -o test_1.tar 37c0d18cfc09
//姿勢2
docker export 37c0d18cfc09 > test_2.tar
//查看一下
ls
test_1.tar test_2.tar
之后, 可以將導(dǎo)出的 tar 文件傳輸?shù)狡渌麢C器上, 然后再通過導(dǎo)入命令導(dǎo)入到系統(tǒng)中, 從而實現(xiàn)容器的遷移.
導(dǎo)入容器
導(dǎo)出的文件可以使用 docker import
命令導(dǎo)入變成鏡像.
注意: 導(dǎo)出的容器, 再導(dǎo)入的時候編程了鏡像
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
下面將導(dǎo)出的test_1.tar
文件導(dǎo)入到系統(tǒng)中.
docker import -m "測試" test_1.tar test:centos
//輸出信息
sha256:5c95f5df305a4379e9dd0cf0539ab51b8ac0479b474a05d59d7a1495db92e08b
我們查看一下本地鏡像, 看一下是否成功導(dǎo)入了
docker images
//輸出信息
REPOSITORY TAG IMAGE ID CREATED SIZE
test centos 5c95f5df305a About a minute ago 193 MB
之前我們也說過使用 docker load
命令來導(dǎo)入一個鏡像文件, 與 docker import
命令十分相似.
實際上, 既可以使用 docker load
命令來導(dǎo)入鏡像存儲文件到本地鏡像庫, 也可以使用 docker import
命令來導(dǎo)入一個容器快照到本地鏡像庫.
這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時快照狀態(tài)), 而鏡像存儲文件將保存完整記錄, 體積也更大. 此外, 從容器快照文件導(dǎo)入時可以重新指定標(biāo)簽等元數(shù)據(jù)信息.