容器是一個打包了應用和服務的環境,是一個輕量級的虛擬機,每一個容器都由一組特定的應用和必要的依賴庫組成。
容器的管理操作
容器常見的命令:查看、創建、啟動、終止和刪除
創建容器
docker create
docker run
二者的區別在於docker create創建的容器處於停止狀態,docker run 創建的容器處於啟動狀態
用docker create創建一個停止狀態的容器
[root@docker ~]# docker create centos:6.7 Unable to find image 'centos:6.7' locally 6.7: Pulling from centos 3690474eb5b4: Pull complete 3624df1f7cf0: Pull complete 505dff91e9c8: Pull complete 2352e8cfa843: Pull complete a8b4df3be85c: Pull complete Digest: sha256:1fbc7ab8bd38dcb1c5b9608ac5358dbc1d3718b8e85c69bf5224d72e5f6d2e22 Status: Downloaded newer image for centos:6.7 a4cca9f1f77695ef11912963ec60b15e2fb4663c50792583c2e4fe2c375a35b6 [root@docker ~]# [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a4cca9f1f776 centos:6.7 "/bin/bash" 10 seconds ago clever_pasteur [root@docker ~]#
創建成功后,Docker會返回容器的ID,如上述中的:a4cca9f1f77695ef11912963ec60b15e2fb4663c50792583c2e4fe2c375a35b6。ID是可以唯一標識一個容器,每個容器的ID都是唯一的。
指定系統直接加centos,如果想要設置版本則需要centos:6.7
提示:Unable to find image 'centos:6.7' locally,則是因為當執行docker run命令后,docker現在本地找指定的系統的鏡像,如果找不到就會到共有的倉庫Docker Hub中繼續搜索,找到后下載並保存在本地
容器的文件系統是在只讀的鏡像文件上增加一層可讀寫的文件層,這樣可以保證鏡像不變而只記錄改變的數據,這對容器的共享和傳輸都非常有利。
docker ps 可以查看正在運行的容器
docker ps –a 可以查看所有容器
docker run 相當於docker create 然后在使用docker start啟動容器
使用docker run 命令可以創建兩種類型的容器:
后台型、交互型容器
交互型容器:運行在前台,通常會指定有交互的控制台,給容器輸入,也可以得到容器的輸出。創建該容器的終端被關閉,在容器內部使用exit命令或者調用了doker stop/docker kill命令后,容器會變成停止狀態
后台型容器:運行在后台,創建啟動之后就與終端無關。即便終端關閉了,該后台容器也依然存在,只有調用docker stop 或docker kill命令后,容器會變成停止狀態
創建交互型容器
[root@docker ~]# docker run -i -t --name=inspect_shell centos:6.7 /bin/bash [root@285ee5d386cf /]#
參數說明:
1、-i用於打開容器的標准輸入(STDIN)
2、-t表示建立一個命令行終端
上述的兩個標志就表示創建了一個交互shell,是創建交互容器的基本設置
3、--name表示為容器指定一個名字,如果不指定系統將隨機產生一個名字
4、centos表示要使用的鏡像,:6.7表示要用的linux版本
這樣創建的交互容器通過ctrl+d或者exit命令退出該容器
容器只是停止並沒有銷毀,只是不再是運行狀態
創建后台型容器
通過參數-d 既可以實現創建后台型容器
[root@docker ~]# docker run --name daemon_while -d centos:6.7 /bin/bash -c "while true;do echo hello world;sleep 1;done" 35872eb5410af88fca93ab37aa38b79dfea1badbac91c90907bbbfa01e61f24e [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 35872eb5410a centos:6.7 "/bin/bash -c 'while 15 seconds ago Up 14 seconds daemon_while [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 35872eb5410a centos:6.7 "/bin/bash -c 'while 17 seconds ago Up 16 seconds daemon_while 285ee5d386cf centos:6.7 "/bin/bash" 9 minutes ago Exited (0) About a minute ago inspect_shell a4cca9f1f776 centos:6.7 "/bin/bash" About an hour ago clever_pasteur [root@docker ~]#
這里也可以驗證docker ps 以及docker ps –a的區別
docker ps 顯示的為正在運行的容器
docker ps –a 顯示所有的容器
docker ps的其他參數:
docker ps –l 顯示最后創建的容器
docker ps –n=x顯示最后創建的x個容器
docker ps –a –q 顯示所有的容器名並只顯示id
關於docker ps命令輸入解釋:
- CONTAINER ID :唯一標識容器的ID,是一個64位的十六進制數
- IMAGE:創建容器時使用的鏡像
- COMMAND:容器最后運行的命令
- CREATED:創建容器的時間
- STATUS:容器的狀態。如果是運行狀態,則類似Up 16 seconds
如果是停止狀態,則是類似Exited (0) About a minute ago,其中0是容器退出的錯誤代碼,0為正常退出,其他數字則表示容器內部出現錯誤
- PORTS:對外開放的端口
- NAMES:容器名。和容器ID一樣都可以唯一標識一個容器,同一台宿主主機上不允許有相同的容器存在,否則會沖突
啟動容器
docker start 容器名/ID
容器運行過程中,總會有各種問題導致容器異常退出。默認情況下容器是不會重啟的,為了讓容器能夠自動重啟需要用—restart參數
--restart標志會檢查容器的退出碼,並決定是否需要重啟
--restart=always:表示不管返回什么代碼,Docker都會嘗試重啟容器
--restart=on-failure:5 :表示接收到一個非0的返回代碼時最多可以重啟5次
終止容器
交互型容器退出容器的方法:
ctrl+d
exit
交互型容器以及后台型容器都可以通過stop命令退出
docker stop 容器名/ID
強制退出:docker kill
刪除容器
刪除容器:docker rm 容器名 注意:這個命令無法刪除正在運行的容器
強制刪除:docker rm –f 容器名
如果想要刪除所有的容器,可以:
docker rm `docker ps –a -q`
容器內信息獲取和命令執行
依附容器
先啟動交互型容器:docker start 容器名
然后從宿主機進入到容器中
docker attach 容器名
注意:這里執行過docker attach 容器名 后,需要多按一次回車才會進入到容器的shell交互界面
這里切記:attach是無法進入到后台型容器的
后台型容器本身就不接受用戶交互輸入
查看容器日志
docker logs –f 容器名 可以查看容器的日志
參數:
-tail 可以查看輸入日志的行數
-f 將只需輸入最新的日志
查看容器進程
docker top 容器名 可以查看容器中的進程
查看容器信息
docker inspect用於查看容器的配置信息,包含容器名、環境變量、運行命令,主機配置、網絡配置合數據卷配置等

[root@docker ~]# docker inspect centos [ { "Id": "18a2b5dd12c14efb63e27ad2af35240ee4eb27bbe40fe4ebfbdeb81e220df358", "Created": "2016-12-05T08:24:26.525587402Z", "Path": "/bin/bash", "Args": [], "State": { "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 8174, "ExitCode": 0, "Error": "", "StartedAt": "2016-12-05T08:25:19.214428588Z", "FinishedAt": "2016-12-05T08:25:06.506871439Z" }, "Image": "a8b4df3be85c08ad6b8331c700fc6d2f389795f6ad64a6b139775ff6592d5fa2", "NetworkSettings": { "Bridge": "", "EndpointID": "51415b7ddc2d36af63108f39d51afcc46736cbf9e7659daa4813be6f389896e3", "Gateway": "172.17.42.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "HairpinMode": false, "IPAddress": "172.17.0.7", "IPPrefixLen": 16, "IPv6Gateway": "", "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:07", "NetworkID": "c5fda424aba3566c01770cb53d21e94269c431daeb879936f52a236d2541d82d", "PortMapping": null, "Ports": {}, "SandboxKey": "/var/run/docker/netns/18a2b5dd12c1", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null }, "ResolvConfPath": "/var/lib/docker/containers/18a2b5dd12c14efb63e27ad2af35240ee4eb27bbe40fe4ebfbdeb81e220df358/resolv.conf", "HostnamePath": "/var/lib/docker/containers/18a2b5dd12c14efb63e27ad2af35240ee4eb27bbe40fe4ebfbdeb81e220df358/hostname", "HostsPath": "/var/lib/docker/containers/18a2b5dd12c14efb63e27ad2af35240ee4eb27bbe40fe4ebfbdeb81e220df358/hosts", "LogPath": "/var/lib/docker/containers/18a2b5dd12c14efb63e27ad2af35240ee4eb27bbe40fe4ebfbdeb81e220df358/18a2b5dd12c14efb63e27ad2af35240ee4eb27bbe40fe4ebfbdeb81e220df358-json.log", "Name": "/centos", "RestartCount": 0, "Driver": "devicemapper", "ExecDriver": "native-0.2", "MountLabel": "", "ProcessLabel": "", "Volumes": {}, "VolumesRW": {}, "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LxcConf": [], "Memory": 0, "MemorySwap": 0, "CpuShares": 0, "CpuPeriod": 0, "CpusetCpus": "", "CpusetMems": "", "CpuQuota": 0, "BlkioWeight": 0, "OomKillDisable": false, "Privileged": false, "PortBindings": {}, "Links": null, "PublishAllPorts": false, "Dns": null, "DnsSearch": null, "ExtraHosts": null, "VolumesFrom": null, "Devices": [], "NetworkMode": "bridge", "IpcMode": "", "PidMode": "", "UTSMode": "", "CapAdd": null, "CapDrop": null, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "SecurityOpt": null, "ReadonlyRootfs": false, "Ulimits": null, "LogConfig": { "Type": "json-file", "Config": {} }, "CgroupParent": "" }, "Config": { "Hostname": "18a2b5dd12c1", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "PortSpecs": null, "ExposedPorts": null, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "centos:6.7", "Volumes": null, "VolumeDriver": "", "WorkingDir": "", "Entrypoint": null, "NetworkDisabled": false, "MacAddress": "", "OnBuild": null, "Labels": { "License": "GPLv2", "Vendor": "CentOS" } } } ] [root@docker ~]#
容器內執行命令
[root@docker ~]# docker exec -d centos touch /home/fan.txt
通過docker attach centos進入容器可以查看創建的文件是否存在
如果想要交互型的執行命令可以通過
[root@docker ~]# docker exec -t -i centos /bin/bash
然后就可以交互性的執行命令
容器的導入和導出
Docker的導入和導出分別由import命令和export命令完成
導出
[root@docker ~]# docker export centos>my_centos.tar [root@docker ~]# ls anaconda-ks.cfg install.log install.log.syslog my_centos.tar [root@docker ~]#
導入
[root@docker ~]# cat my_centos.tar|docker import - imported:centos 4ef3250d4123fea1bb6c01b2436479889f90b434cee23ac62aad7a75a2956fa5 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE imported centos 4ef3250d4123 47 seconds ago 190.6 MB centos 6.7 a8b4df3be85c 3 months ago 190.6 MB
res和tag分別表示生成的鏡像和標記
同時可以通過網絡導入鏡像
docker import url res:tag