Docker的容器


容器是一個打包了應用和服務的環境,是一個輕量級的虛擬機,每一個容器都由一組特定的應用和必要的依賴庫組成。

容器的管理操作

容器常見的命令:查看、創建、啟動、終止和刪除

創建容器

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命令輸入解釋:

  1. CONTAINER ID :唯一標識容器的ID,是一個64位的十六進制數
  2. IMAGE:創建容器時使用的鏡像
  3. COMMAND:容器最后運行的命令
  4. CREATED:創建容器的時間
  5. STATUS:容器的狀態。如果是運行狀態,則類似Up 16 seconds 

如果是停止狀態,則是類似Exited (0) About a minute ago,其中0是容器退出的錯誤代碼,0為正常退出,其他數字則表示容器內部出現錯誤

  1. PORTS:對外開放的端口
  2. 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 ~]#
View Code

容器內執行命令

[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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM