Docker容器的使用和連接


在上一篇文章《Docker從安裝部署到Hello World》介紹了如何在CentOS7上安裝Docker。這篇文章主要介紹一下Docker容器的使用和連接。

vDocker 容器使用

1.0 Docker客戶端命令集合

docker 客戶端非常簡單 ,我們可以直接輸入 docker 命令來查看到 Docker 客戶端的所有命令選項。

Docker容器的使用和連接

可以通過命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。比如我們要查看 docker pull --help 指令的具體使用方法:

Docker容器的使用和連接

1.1 在docker中運行web應用

使用docker模擬一個web app, 我們將通過 docker run -d -P training/webapp python app.py 在docker容器中運行一個Python flask應用來run web app。

Docker容器的使用和連接

參數說明:

  • -d :讓容器在后台運行。
  • -P :將容器內部使用的網絡端口映射到我們使用的主機上。

1.2 瀏覽器訪問web應用

使用 docker ps 來查看我們正在運行的容器

Docker容器的使用和連接

Docker 開放了 5000 端口(默認 Python Flask 端口)映射到主機端口 32768 上。可以根據機器(虛擬機)IP訪問web應用。

Docker容器的使用和連接

也可以指定 -p 標識來綁定指定端口。 docker run -d -p 5000:5000 training/webapp python app.py

Docker容器的使用和連接

容器內部的 5000 端口映射到我們本地主機的 5000 端口上。

1.3 網絡端口的快捷方式

通過 docker ps 命令可以查看到容器的端口映射,docker還提供了另一個快捷方式: docker port ,使用 docker port 可以查看指定 (ID或者名字)容器的某個確定端口映射到宿主機的端口號。

上面我們創建的web應用容器ID為: 07f76b9440e0 名字為: gifted_lovelace

Docker容器的使用和連接

我可以使用 docker port 07f76b9440e0 docker port gifted_lovelace 來查看容器端口的映射情況

Docker容器的使用和連接

1.4 查看web app日志

docker logs -f [ID或者名字] 可以查看容器內部的標准輸出。

Docker容器的使用和連接

-f :讓 dokcer logs 像使用 tail -f 一樣來輸出容器內部的標准輸出。從上面,我們可以看到應用程序使用的是 5000 端口並且能夠查看到應用程序的訪問日志。

1.5 查看WEB應用程序容器的進程

使用 docker top [ID或者名字] 來查看容器內部運行的進程

Docker容器的使用和連接

1.6 檢查WEB應用程序

使用 docker inspect [ID或者名字] 來查看Docker的底層信息。它會返回一個 JSON 文件記錄着 Docker 容器的配置和狀態信息。

Docker容器的使用和連接

JSON文件詳情如下:

[
    {
        "Id": "07f76b9440e0394f60459deada7054119201985ccea16c3de445ccac5336ab15",
        "Created": "2019-05-14T02:39:00.371684234Z",
        "Path": "python",
        "Args": [
            "app.py"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 22625,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2019-05-14T02:39:01.258594246Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557",
        "ResolvConfPath": "/var/lib/docker/containers/07f76b9440e0394f60459deada7054119201985ccea16c3de445ccac5336ab15/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/07f76b9440e0394f60459deada7054119201985ccea16c3de445ccac5336ab15/hostname",
        "HostsPath": "/var/lib/docker/containers/07f76b9440e0394f60459deada7054119201985ccea16c3de445ccac5336ab15/hosts",
        "LogPath": "",
        "Name": "/gifted_lovelace",
        "RestartCount": 0,
        "Driver": "overlay2",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "journald",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "5000/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "5000"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "docker-runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": -1,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Name": "overlay2",
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/0c824ed7be43849857b3d81953e8a82c4b0df9a50c703c53e3da8e7bcac8b77c-init/diff:/var/lib/docker/overlay2/9eff7651dc75a63a5c6243eca14063f4ef766a57b76fc62f94eb0c258af0fb00/diff:/var/lib/docker/overlay2/f79cef924accdcf0421516f0523e4c40bcbfc76916ac24b9b4d108bce4a6d99a/diff:/var/lib/docker/overlay2/785c916ec6a256ed77ace6f995a67d18072d455382773c48aea989a9beda338a/diff:/var/lib/docker/overlay2/f238b66c1b47708f5c273d5fc3e7d14bf52dc05dbda21b7b5a4b3de953c42f58/diff:/var/lib/docker/overlay2/f8711f1331d01ae0e6f0725f0f5cf8aa497f5ebb1dc8f4ad1d9e8f69495c2a59/diff:/var/lib/docker/overlay2/e89f60204d0d6f68ed0460fcbb008e4c72aad6e5556860577325058967171c9a/diff:/var/lib/docker/overlay2/6676db9e6207469b67544c4b6bfb67750f43ac38ccd355b60acd607452fd4b98/diff:/var/lib/docker/overlay2/5535a46e9b1274c656b73ea54754b7a61a9ef91101657aaa1041db71a559098f/diff:/var/lib/docker/overlay2/e027a779b0efb0e8e875b2da7a63fd56a9a5ceaf617c593869c2d6f53872ec7c/diff:/var/lib/docker/overlay2/c9d47fb8428a576b59e6573749aa58c99000d00a41b5469158f30d29aba48a0b/diff:/var/lib/docker/overlay2/3a7eb8730a21876cfbdbcbe341e21449ff309642d39089cf2c12882c587cf773/diff:/var/lib/docker/overlay2/3b887f6f6933df5e2b1cb85ba23a38a2ed49b30bf31c583de9b33aab102bf633/diff:/var/lib/docker/overlay2/4f8367a65b99ce182e12598321f1637177cbf023ebd508ecd4142058eaa7b81f/diff",
                "MergedDir": "/var/lib/docker/overlay2/0c824ed7be43849857b3d81953e8a82c4b0df9a50c703c53e3da8e7bcac8b77c/merged",
                "UpperDir": "/var/lib/docker/overlay2/0c824ed7be43849857b3d81953e8a82c4b0df9a50c703c53e3da8e7bcac8b77c/diff",
                "WorkDir": "/var/lib/docker/overlay2/0c824ed7be43849857b3d81953e8a82c4b0df9a50c703c53e3da8e7bcac8b77c/work"
            }
        },
        "Mounts": [],
        "Config": {
            "Hostname": "07f76b9440e0",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "5000/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "python",
                "app.py"
            ],
            "Image": "training/webapp",
            "Volumes": null,
            "WorkingDir": "/opt/webapp",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "d59cfca49db6f6c5affe022950192d2a5905a62357e213ceded91048a19aa419",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "5000/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "5000"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/d59cfca49db6",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "0f3d0758603b40b9aac59db3c747f44ba5392d89907647ad6141129584c34ba8",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.3",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:03",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "e9bebe59ae09f285b4fcf65177b356042c89f5ed2223ce4e1c3b40a817c02149",
                    "EndpointID": "0f3d0758603b40b9aac59db3c747f44ba5392d89907647ad6141129584c34ba8",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03"
                }
            }
        }
    }
]

1.7 開始/停止/停止/移除WEB應用容器

開始: docker start [ID或者名字]

停止: docker stop [ID或者名字]

重啟: docker restart [ID或者名字]

刪除: docker rm [ID或者名字]

注意:刪除容器時,容器必須是停止狀態,否則會報如下錯誤

vDocker 鏡像使用

2.0 獲取鏡像列表

當運行容器時,使用的鏡像如果在本地中不存在,docker 就會自動從 docker 鏡像倉庫中下載,默認是從 Docker Hub 公共鏡像源下載。

使用 docker images 來列出本地主機上的鏡像。

Docker容器的使用和連接

各列列頭說明:

  • REPOSTITORY:表示鏡像的倉庫源
  • TAG:鏡像的標簽
  • IMAGE ID:鏡像ID
  • CREATED:鏡像創建時間
  • SIZE:鏡像大小

同一倉庫源可以有多個 TAG,代表這個倉庫源的不同個版本,如ubuntu倉庫源里,有15.10、14.04等多個不同的版本,我們使用 REPOSTITORY:TAG 來定義不同的鏡像。

所以,我們如果要使用版本為15.10的ubuntu系統鏡像來運行容器時,命令是: docker run -t -i ubuntu:15.10 /bin/bash

如果要使用版本為13.10的ubuntu系統鏡像來運行容器時,命令是: docker run -t -i ubuntu:13.10 /bin/bash

2.1 獲取一個新的鏡像

當我們在本地主機上使用一個不存在的鏡像時 Docker 就會自動下載這個鏡像。如果我們想預先下載這個鏡像,我們可以使用 docker pull 命令來下載它。

下載完成后,我們可以直接使用這個鏡像來運行容器。

Docker容器的使用和連接

2.2 查找鏡像

可以從 Docker Hub 網站來搜索鏡像,Docker Hub 網址為:https://hub.docker.com/

也可以使用 docker search 命令來搜索鏡像。比如我們需要一個httpd的鏡像來作為我們的web服務。我們可以通過 docker search 命令搜索 httpd 來尋找適合我們的鏡像。

Docker容器的使用和連接

NAME:鏡像倉庫源的名稱;DESCRIPTION:鏡像的描述;OFFICIAL:是否docker官方發布

拖取鏡像

使用上圖中的 httpd 官方版本的鏡像,使用命令 docker pull 來下載鏡像。

Docker容器的使用和連接

下載完成后,我們就可以通過 docker run httpd 使用這個鏡像了。

2.3 創建鏡像

如果從docker鏡像倉庫中下載的鏡像不能滿足我們的需求時,我們可以通過以下兩種方式對鏡像進行更改。

  • 從已經創建的容器中更新鏡像,並且提交這個鏡像
  • 使用 Dockerfile 指令來創建一個新的鏡像

2.4 更新鏡像

更新鏡像之前,我們需要使用 docker run -t -i ubuntu:15.10 /bin/bash 鏡像來創建一個容器。

在運行的容器內使用 apt-get update 命令進行更新。

Docker容器的使用和連接

在完成操作之后,Ctrl+D或者輸入 exit 命令來退出這個容器。

此時ID為3be2238c418a的容器,是按我們的需求更改的容器。我們可以通過命令 docker commit -m="has update" -a="toutou" 3be2238c418a cnblogs/ubuntu:v2 來提交容器副本。

Docker容器的使用和連接

各個參數說明:

  • -m:提交的描述信息
  • -a:指定鏡像作者
  • 3be2238c418a:容器ID
  • cnblogs/ubuntu:v2:指定要創建的目標鏡像名

2.5 構建鏡像

我們使用命令 docker build , 從零開始來創建一個新的鏡像。為此,我們需要創建一個Dockerfile文件,其中包含一組指令來告訴 Docker 如何構建我們的鏡像。

FROM    centos:7.6
MAINTAINER      Toutou "toutou@126.com"
RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd toutouge
RUN     /bin/echo 'toutouge:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" > /etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

注意:郵箱和密碼為測試數據。

每一個指令都會在鏡像上創建一個新的層,每一個指令的前綴都必須是大寫的。第一條FROM,指定使用哪個鏡像源RUN 指令告訴docker 在鏡像內執行命令,安裝了什么。。。然后,我們使用 Dockerfile 文件,通過 docker build -t toutouge/centos:6.7 . 命令來構建一個鏡像。

Docker容器的使用和連接

參數說明:

  • -t :指定要創建的目標鏡像名
  • . :Dockerfile 文件所在目錄,可以指定Dockerfile 的絕對路徑

2.6 刪除鏡像

docker rmi [鏡像ID]

Error response from daemon: conflict: unable to delete 500fc5b96d71 (must be forced) - image is being used by stopped container aedfe41307f4

錯誤解析:這是由於要刪除的目標鏡像中有容器存在,故無法刪除鏡像

解決辦法:先刪除鏡像中的容器,再刪除該鏡像。

Docker容器的使用和連接

2.7 設置鏡像標簽

使用 docker tag cc191ecfb9c1 cnblogs/ubuntu:v3 命令,為鏡像添加一個新的標簽。

Docker容器的使用和連接

vDocker 容器連接

3.1 網絡端口映射

上文中實現了通過網絡端口來訪問運行在docker容器內的服務。下面來實現通過端口連接到一個docker容器

創建了一個 python 應用的容器 docker run -d -P training/webapp python app.py

另外,我們可以指定容器綁定的網絡地址,比如綁定 127.0.0.1。我們使用 -P 參數創建一個容器,使用 docker ps 來看到端口5000綁定主機端口32768。

我們也可以使用 -p 標識來指定容器端口綁定到主機端口。

兩種方式的區別是:

  • -P :是容器內部端口隨機映射到主機的高端口。
  • -p : 是容器內部端口綁定到指定的主機端口。

另外,我們可以指定容器綁定的網絡地址,比如綁定127.0.0.1。

Docker容器的使用和連接

上面的例子中,默認都是綁定 tcp 端口,如果要綁定 UPD 端口,可以在端口后面加上 /udp

Docker容器的使用和連接

docker port 命令可以讓我們快捷地查看端口的綁定情況。

Docker容器的使用和連接

3.2 docker容器連接

端口映射並不是唯一把 docker 連接到另一個容器的方法。docker有一個連接系統允許將多個容器連接在一起,共享連接信息。docker連接會創建一個父子關系,其中父容器可以看到子容器的信息。

當我們創建一個容器的時候,docker會自動對它進行命名。另外,我們也可以使用--name標識來命名容器,例如: docker run -d -P --name demo training/webapp python app.py

Docker容器的使用和連接

v源碼地址

https://github.com/toutouge/javademo/tree/master/hellospringboot


作  者:請叫我頭頭哥
出  處:http://www.cnblogs.com/toutou/
關於作者:專注於基礎平台的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回復。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!


免責聲明!

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



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