一、創建容器
容器是Docker另一個核心的概念,簡單來說,容器是鏡像的一個運行實例,所不同的是,鏡像是靜態的只讀文件,而容器帶有運行時需要的可寫文件層
1.1. 新建容器
使用docker create命令來新建容器
[root@rsync131 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/centos latest 5182e96772bf 6 weeks ago 200 MB [root@rsync131 ~]# docker create centos b9dd06b5dcba561b178b1892631cd318f0babd4a9a3f067761963a6ab61fe078 [root@rsync131 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b9dd06b5dcba centos "/bin/bash" 9 seconds ago Created sleepy_sammet
1.2. 啟動容器
使用docker start命令來啟動容器
[root@rsync131 ~]# docker start b9dd06b5dcba b9dd06b5dcba [root@rsync131 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b9dd06b5dcba centos "/bin/bash" About a minute ago Exited (0) 4 seconds ago sleepy_sammet
PS:不知道為什么我使用這樣的方式是啟動不了容器的,待解釋
1.3. 新建並啟動容器
一般在創建容器的是我們不會使用上面的兩步的方式來進行創建,有個更簡單的方式就是在創建的時候直接啟動
使用docker run 命令,創建並啟動容器
[root@rsync131 ~]# docker run -it -d --name test_centos centos 159a08c11fece853626516ab94b401464efd85d69c1f88706ec17a29178fee54 [root@rsync131 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 159a08c11fec centos "/bin/bash" 3 seconds ago Up 3 seconds test_centos docker run:死命令 -i:讓容器的標准輸入保持打開 -t:分配個偽終端 -d:守護狀態運行 --name:指定容器名字參數 test_centos:容器名字 centos:鏡像名或者鏡像ID
這里我們說一下docker run執行的時候都干了什么
檢查本地鏡像是否存在,不存在則會自動去公有倉庫去下載
利用鏡像創建容器,並啟動容器
分配一個文件系統給容器,並在只讀的鏡像層外面掛載一層可讀寫層
從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中
從網橋的地址池配置一個IP給容器
執行用戶指定的應用程序
1.4. 查看容器運行日志
使用命令docker logs 來查看日志
[root@rsync131 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 159a08c11fec centos "/bin/bash" 21 minutes ago Up 21 minutes test_centos [root@rsync131 ~]# docker logs 159a08c11fec
二、終止容器
2.1. 終止容器
使用docker stop 來終止正在運行的容器
語法格式: docker stop 容器名 常用選項: -t,--time[=10] : 10秒后發送終止信號
使用docker kill 命令可以直接終止容器
docker kill 命令會直接發送SIGKILL信號來強行終止容器
[root@rsync131 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 159a08c11fec centos "/bin/bash" 29 minutes ago Up 29 minutes test_centos [root@rsync131 ~]# docker stop 159a08c11fec [root@rsync131 ~]# docker kill 159a08c11fec
2.2. 查看終止的容器
使用docker ps 只是可以查看正在運行的容器
使用docker ps -a 則可以看到所有的容器包括正在運行的和已經終止的容器
[root@rsync131 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 159a08c11fec centos "/bin/bash" 30 minutes ago Up 30 minutes test_centos [root@rsync131 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 159a08c11fec centos "/bin/bash" 30 minutes ago Up 30 minutes test_centos b9dd06b5dcba centos "/bin/bash" 36 minutes ago Exited (0) 9 minutes ago sleepy_sammet
2.3. 啟動和重啟已經終止的容器
已經終止的容器我們可以使用docker start 命令來啟動
也可以使用docker restart 命令將一個正在運行的容器先stop后start
[root@rsync131 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 159a08c11fec centos "/bin/bash" 30 minutes ago Up 30 minutes test_centos b9dd06b5dcba centos "/bin/bash" 36 minutes ago Exited (0) 9 minutes ago sleepy_sammet [root@rsync131 ~]# docker start b9dd06b5dcba b9dd06b5dcba [root@rsync131 ~]# docker restart 159a08c11fec 159a08c11fec
三、進入容器
在使用 -d 選項來運行容器的時候,容器會在后台運行,用戶是無法看到容器的信息的,也無法進入操作
這個時候如果我們要進入容器進行操作,應該怎么辦呢?在docker 中進入docker中的方法有很多種,比如官方的attach和exec命令,以及第三方的nsenter工具(這個沒有用過 最常用的還是exec)等
3.1. attach 命令
attach命令是docker自帶的命令 語法格式: docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER 支持的常用主要選項: --detach-keys[=[]]:指定退出attach模式的快捷鍵序列,默認是CTRL+p CTRL-q --no-stdin=true|false :是否關閉標准輸入,默認true --sig-proxy=true|false : 是否代理收到的系統信號給應用程序,默認是true
[root@rsync131 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 159a08c11fec centos "/bin/bash" 41 minutes ago Up 10 minutes test_centos [root@rsync131 ~]# docker attach 159a08c11fec [root@159a08c11fec /]#
PS:使用attach命令進入容器是很不方便的,就是這個命令只允許一個人使用容器,在開多個窗口同時用attach進入容器的時候,窗口執行的命令會同步,當一個窗口阻塞了,其他窗口就不能玩了,所有不用這個命令,太坑了
3.2. exec 命令
為了解決上面的坑,docker在1.3.0版本提供了exec這個命令解決了attach命令的坑
語法格式: docker exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG....] 主要選項參數: -i, --interactive=true|false: 打開標准輸入接收用戶輸入的命令,默認false --privileged=true|false :是否給執行命令以高權限,默認false -t,--tty=true|false:分配偽終端 默認false -u,--user="" : 執行命令的用戶或者ID
[root@rsync131 ~]# docker exec -it 159a08c11fec bash [root@159a08c11fec /]# ls anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@159a08c11fec /]#
可以看到,一個bash終端打開了,在不影響容器內其他應用的前提下,用戶可以很容易的與容器進行交互
PS:通過制定 -it 參數保持標准輸入,並且分配個偽終端,是很推薦的方式哦
四、刪除容器
使用docker rm 命令來刪除處於終止或者退出狀態的容器
語法格式: docker rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER.....] 主要選項參數: -f,--force=false:是否強行終止並刪除運行中的容器 -l,--link=false:刪除容器的鏈接,但是保留容器 -v,--volumes=false:刪除容器掛載的數據卷
[root@rsync131 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 159a08c11fec centos "/bin/bash" 2 hours ago Up About an hour test_centos b9dd06b5dcba centos "/bin/bash" 2 hours ago Exited (0) About an hour ago sleepy_sammet [root@rsync131 ~]# docker rm b9dd06b5dcba b9dd06b5dcba [root@rsync131 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 159a08c11fec centos "/bin/bash" 2 hours ago Up About an hour test_centos
默認情況下,docker rm命令只能刪除已經終止的容器,不能刪除運行中的容器,想要刪除運行中的容器可以使用 -f 參數,來強制的刪除
五、容器的導入與導出
在做容器遷移的時候我們就要先把容器導出,然后在導入到其他的地方
5.1. 導出容器
使用命令docker export 命令來導出容器
語法格式: docker export [-o|--output[=""]] CONTAINER 主要選項參數: -o,--output:指定導出的tar文件名
[root@rsync131 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 159a08c11fec centos "/bin/bash" 2 hours ago Up About an hour test_centos [root@rsync131 ~]# docker export -o centos_test.tar.gz 159a08c11fec 或者 [root@rsync131 ~]# docker export 159a08c11fec > centos_test.tar.gz [root@rsync131 ~]# ll 總用量 273536 -rw-------. 1 root root 1513 8月 20 20:25 anaconda-ks.cfg -rw------- 1 root root 280093696 9月 23 11:51 centos_test.tar.gz
5.2. 導入容器
使用命令docker import 導入變成鏡像
語法格式: docker import [-c|--change[=[]]] [-m|--messge[=MESSAGE]] file|URL|- [REPOSITORY[:TAG]] 用戶可以通過-c 選項在導入的同時執行對容器進行修改的Dockerfile指令
[root@rsync131 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@rsync131 ~]# ll 總用量 273536 -rw-------. 1 root root 1513 8月 20 20:25 anaconda-ks.cfg -rw-r--r-- 1 root root 280093696 9月 23 11:52 centos_test.tar.gz [root@rsync131 ~]# docker import centos_test.tar.gz centos:1.0 sha256:f54ee7febeda5d3d8af11cc4756c1e6661feb84b2af6280654ef07ddf8bdead2 [root@rsync131 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 1.0 f54ee7febeda 5 seconds ago 271 MB docker.io/centos latest 5182e96772bf 6 weeks ago 200 MB