一、Docker 架構
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。
Docker 容器通過 Docker 鏡像來創建。
容器與鏡像的關系類似于面向對象編程中的對象與類。
Docker | 面向對象 |
---|---|
容器 | 對象 |
鏡像 | 類 |
Docker 鏡像(Images) | Docker 鏡像是用于創建 Docker 容器的模板。 |
Docker 容器(Container) | 容器是獨立運行的一個或一組應用。 |
Docker 客戶端(Client) | Docker 客戶端通過命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 與 Docker 的守護進程通信。 |
Docker 主機(Host) | 一個物理或者虛擬的機器用于執行 Docker 守護進程和容器。 |
Docker 倉庫(Registry) | Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。
Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用。 |
Docker Machine | Docker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
二、Docker的安裝(CentOS7)
# yum install docker -y
啟動
[root@node1 ~]# systemctl start docker.service [root@node1 ~]# systemctl status docker.service
測試運行 hello-world
[root@node1 ~]#docker run hello-world
三、Docker的使用
1.Docker 容器使用
Docker 客戶端
docker?客戶端非常簡單?,我們可以直接輸入?docker?命令來查看到 Docker 客戶端的所有命令選項。
# docker
可以通過命令 docker command –help 更深入的了解指定的 Docker 命令使用方法。
例如我們要查看 docker cp?指令的具體使用方法:
# docker cp --help![]()
運行一個web應用
接下來讓我們嘗試使用 docker 構建一個 web 應用程序。
我們將在docker容器中運行一個 Python Flask 應用來運行一個web應用。
# docker pull training/webapp # 載入鏡像 # docker run -d -P training/webapp python app.py
- -d:讓容器在后臺運行。
- -P:將容器內部使用的網絡端口映射到我們使用的主機上。
查看 WEB 應用容器
使用?docker ps?來查看我們正在運行的容器
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a5642146bb0b training/webapp "python app.py" About a minute ago Up 56 seconds 0.0.0.0:32768->5000/tcp sharp_wescoff
Docker 開放了 5000 端口(默認 Python Flask 端口)映射到主機端口 32768 上。
這時我們可以通過瀏覽器訪問WEB應用
我們也可以指定?-p?標識來綁定指定端口。
# docker run -d -p 5000:5000 training/webapp python app.py
docker ps查看正在運行的容器
容器內部的 5000 端口映射到我們本地主機的 5000 端口上。
網絡端口的快捷方式
通過docker ps?命令可以查看到容器的端口映射,docker還提供了另一個快捷方式:docker port,使用?docker port?可以查看指定 (ID或者名字)容器的某個確定端口映射到宿主機的端口號。
上面我們創建的web應用容器ID為:1fe8bac621b1?名字為:gloomy_borg
我可以使用docker port 1fe8bac621b1?或docker port gloomy_borg來查看容器端口的映射情況
# docker port 1fe8bac621b1 5000/tcp -> 0.0.0.0:5000
# docker port gloomy_borg 5000/tcp -> 0.0.0.0:5000
查看WEB應用程序日志
docker logs [ID或者名字] 可以查看容器內部的標準輸出。
# docker logs -f 1fe8bac621b1
- -f:讓 dokcer logs 像使用?tail -f?一樣來輸出容器內部的標準輸出。
查看WEB應用程序容器的進程
我們還可以使用?docker top?來查看容器內部運行的進程
# docker top gloomy_borg
檢查WEB應用程序
使用?docker inspect?來查看Docker的底層信息。它會返回一個 JSON 文件記錄著 Docker 容器的配置和狀態信息。
# docker inspect gloomy_borg
停止WEB應用容器
# docker stop gloomy_borg
gloomy_borg
重啟WEB應用容器
已經停止的容器,我們可以使用命令 docker start 來啟動。
# docker start gloomy_borg
gloomy_borg
docker ps -l?查詢最后一次創建的容器:
移除WEB應用容器
我們可以使用?docker rm?命令來刪除不需要的容器
# docker rm gloomy_borg
gloomy_borg
刪除容器時,容器必須是停止狀態,否則會報如下錯誤
# docker rm gloomy_borg Error response from daemon: You cannot remove a running container 7a38a1ad55c6914b360b565819604733db751d86afd2575236a70a2519527361. Stop the container before attempting removal or use -f
2.Docker 鏡像使用
當運行容器時,使用的鏡像如果在本地中不存在,docker 就會自動從 docker 鏡像倉庫中下載,默認是從?Docker Hub?公共鏡像源下載。
列出鏡像列表
我們可以使用?docker images?來列出本地主機上的鏡像。
[root@node1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/hello-world latest f2a91732366c 9 weeks ago 1.848 kB docker.io/training/webapp latest 6fae60ef3446 2 years ago 348.7 MB
- REPOSITORY:表示鏡像的倉庫源
- TAG:鏡像的標簽
- IMAGE ID:鏡像ID
- CREATED:鏡像創建時間
- SIZE:鏡像大小
同一倉庫源可以有多個 TAG,代表這個倉庫源的不同個版本,我們使用 REPOSITORY:TAG 來定義不同的鏡像。
如果你不指定一個鏡像的版本標簽,將默認使用?ubuntu:latest?鏡像。
獲取一個新的鏡像
當我們在本地主機上使用一個不存在的鏡像時 Docker 就會自動下載這個鏡像。如果我們想預先下載這個鏡像,我們可以使用?docker pull?命令來下載它。
查找鏡像
我們可以從?Docker Hub?網站來搜索鏡像,Docker Hub?網址為: https://hub.docker.com/
我們也可以使用?docker search?命令來搜索鏡像。比如我們需要一個httpd的鏡像來作為我們的web服務。我們可以通過?docker search?命令搜索?httpd?來尋找適合我們的鏡像。
# docker search httpd
- NAME:鏡像倉庫源的名稱
- DESCRIPTION:鏡像的描述
- OFFICIAL:是否docker官方發布
拖取鏡像
我們決定使用上圖中的httpd 官方版本的鏡像,使用命令 docker pull 來下載鏡像。
# docker pull httpd
下載完成后,我們就可以使用這個鏡像了。
# docker run httpd
創建鏡像
當我們從docker鏡像倉庫中下載的鏡像不能滿足我們的需求時,我們可以通過以下兩種方式對鏡像進行更改。
- 1.從已經創建的容器中更新鏡像,并且提交這個鏡像
- 2.使用?Dockerfile?指令來創建一個新的鏡像
使用 Dockerfile
定義容器
Dockerfile
將在您的容器內定義環境中執行的操作。對網絡接口和磁盤驅動器等資源的訪問在此環境內實現虛擬化,這將獨立于系統的其余部分,因此您必須將端口映射到外部,并具體說明您要“復制”到該環境的文件。但是,在執行此操作后,您可以期望此 Dockerfile
中定義的應用構建的行為在運行時始終相同。
更新鏡像
更新鏡像之前,我們需要使用鏡像來創建一個容器。
# docker run -t -i ubuntu:15.10 /bin/bash
在運行的容器內使用 apt-get update 命令進行更新。
在完成操作之后,輸入?exit命令來退出這個容器。
此時ID為e218edb10161的容器,是按我們的需求更改的容器。我們可以通過命令 docker commit來提交容器副本。
# docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
- -m:提交的描述信息
- -a:指定鏡像作者
- e218edb10161:容器ID
- runoob/ubuntu:v2:指定要創建的目標鏡像名
我們可以使用?docker images?命令來查看我們的新鏡像 runoob/ubuntu:v2:
# docker images
# docker run -t -i runoob/ubuntu:v2 /bin/bash
構建鏡像
我們使用命令 docker build?, 從零開始來創建一個新的鏡像。為此,我們需要創建一個?Dockerfile?文件,其中包含一組指令來告訴 Docker 如何構建我們的鏡像。
# cat Dockerfile FROM centos:7.0 MAINTAINER Fisher "fisher@sudops.com" RUN /bin/echo 'root:123456' |chpasswd RUN useradd runoob RUN /bin/echo 'runoob: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?命令來構建一個鏡像。
# docker build -t runoob/centos:7.0 . Sending build context to Docker daemon 17.92 kB Step 1 : FROM centos:7.0 ---> d95b5ca17cc3 Step 2 : MAINTAINER Fisher "fisher@sudops.com" ---> Using cache ---> 0c92299c6f03 Step 3 : RUN /bin/echo 'root:123456' |chpasswd ---> Using cache ---> 0397ce2fbd0a Step 4 : RUN useradd runoob ......
參數說明:
- -t :指定要創建的目標鏡像名
- . :Dockerfile?文件所在目錄,可以指定Dockerfile?的絕對路徑
使用docker images 查看創建的鏡像已經在列表中存在,鏡像ID為860c279d2fec
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE runoob/centos 7.0 860c279d2fec About a minute ago 190.6 MB runoob/ubuntu v2 70bf1840fd7c 17 hours ago 158.5 MB
我們可以使用新的鏡像來創建容器
# docker run -t -i runoob/centos:7.0 /bin/bash # id runoob uid=500(runoob) gid=500(runoob) groups=500(runoob)
從上面看到新鏡像已經包含我們創建的用戶runoob
設置鏡像標簽
我們可以使用?docker tag?命令,為鏡像添加一個新的標簽。
# docker tag 860c279d2fec runoob/centos:dev
docker tag?鏡像ID,這里是?860c279d2fec ,用戶名稱、鏡像源名(repository name)和新的標簽名(tag)。
使用 docker images 命令可以看到,ID為860c279d2fec的鏡像多一個標簽。
# docker images
docker build -t friendlyname .# 使用此目錄的 Dockerfile 創建鏡像
docker run -p 4000:80 friendlyname # 運行端口 4000 到 90 的“友好名稱”映射
docker run -d -p 4000:80 friendlyname # 內容相同,但在分離模式下
docker ps # 查看所有正在運行的容器的列表
docker stop <hash> # 平穩地停止指定的容器
docker ps -a # 查看所有容器的列表,甚至包含未運行的容器
docker kill <hash> # 強制關閉指定的容器
docker rm <hash> # 從此機器中刪除指定的容器
docker rm $(docker ps -a -q) # 從此機器中刪除所有容器
docker images -a # 顯示此機器上的所有鏡像
docker rmi <imagename> # 從此機器中刪除指定的鏡像
docker rmi $(docker images -q) # 從此機器中刪除所有鏡像
docker login # 使用您的 Docker 憑證登錄此 CLI 會話
docker tag <image> username/repository:tag # 標記 <image> 以上傳到鏡像庫
docker push username/repository:tag # 將已標記的鏡像上傳到鏡像庫
docker run username/repository:tag # 運行鏡像庫中的鏡像
3.Docker 容器連接
前面我們實現了通過網絡端口來訪問運行在docker容器內的服務。下面我們來實現通過端口連接到一個docker容器
網絡端口映射
我們創建了一個 python 應用的容器。
# docker run -d -P training/webapp python app.py 1c742e90359043506e09073f7eee1e55104e717431dbdf60d15cb69455ea5c3f
另外,我們可以指定容器綁定的網絡地址,比如綁定 127.0.0.1。
我們使用 -P 參數創建一個容器,使用 docker ps 來看到端口5000綁定主機端口32768。
runoob@runoob:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a5642146bb0b training/webapp "python app.py" 58 minutes ago Up 58 minutes 0.0.0.0:32768->5000/tcp sharp_wescoff
我們也可以使用 -p 標識來指定容器端口綁定到主機端口。
兩種方式的區別是:
- -P :是容器內部端口隨機映射到主機的高端口。
- -p : 是容器內部端口綁定到指定的主機端口。
# docker run -d -p 5000:5000 training/webapp python app.py e29a4bc8b95d6d16409a0c9dc322917d48e4dff9e80f764ba081b2e82f749272
# docker ps
另外,我們可以指定容器綁定的網絡地址,比如綁定127.0.0.1。
# docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py 473fca33b392af025d1b826a561915d0ef0388c658db12ab6a4e732af11e77fc # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 473fca33b392 training/webapp "python app.py" 21 seconds ago Up 20 seconds 127.0.0.1:5001->5000/tcp pensive_ride 1c742e903590 training/webapp "python app.py" 4 minutes ago Up 4 minutes 0.0.0.0:32769->5000/tcp sharp_bhaskara 1fe8bac621b1 training/webapp "python app.py" 54 minutes ago Up 54 minutes 0.0.0.0:5000->5000/tcp gloomy_borg
這樣我們就可以通過訪問127.0.0.1:5001來訪問容器的5000端口。
上面的例子中,默認都是綁定 tcp 端口,如果要綁定 UDP 端口,可以在端口后面加上 /udp。
# docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py c42ab43c0bf69c5cb5285c68f57d621c5dbd1bea66f6e818d42ee22b07578204 # docker ps
docker port 命令可以讓我們快捷地查看端口的綁定情況。
# docker port pensive_ride 5000 127.0.0.1:5001
Docker容器連接
端口映射并不是唯一把 docker 連接到另一個容器的方法。
docker有一個連接系統允許將多個容器連接在一起,共享連接信息。
docker連接會創建一個父子關系,其中父容器可以看到子容器的信息。
容器命名
當我們創建一個容器的時候,docker會自動對它進行命名。另外,我們也可以使用–name標識來命名容器,例如:
# docker run -d -P --name runoob training/webapp python app.py 263945c7b2a8eb52706de33013940427dc1a5898a1d91837d4d0a407bcba622fv
我們可以使用 docker ps 命令來查看容器名稱。
# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 263945c7b2a8 training/webapp "python app.py" 20 seconds ago Up 18 seconds 0.0.0.0:32770->5000/tcp runoob Docker 資源匯總
Docker官方英文資源
docker官網:http://www.docker.com
Docker windows入門:https://docs.docker.com/windows/
Docker Linux 入門:https://docs.docker.com/linux/
Docker mac 入門:https://docs.docker.com/mac/
Docker 用戶指引:https://docs.docker.com/engine/userguide/
Docker中文資源
Docker中文網站:https://www.docker-cn.com/
Docker安裝手冊:https://docs.docker-cn.com/engine/installation/
原創文章,作者:nene,如若轉載,請注明出處:http://www.www58058.com/91263