Docker入門

一、Docker 架構

Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。

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 MachineDocker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

二、Docker的安裝(CentOS7)

# yum install docker -y

Docker入門

啟動

[root@node1 ~]# systemctl start docker.service
[root@node1 ~]# systemctl status docker.service

測試運行 hello-world

[root@node1 ~]#docker run hello-world

Docker入門

三、Docker的使用

1.Docker 容器使用

Docker 客戶端

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

# docker

可以通過命令 docker command –help 更深入的了解指定的 Docker 命令使用方法。

例如我們要查看 docker cp?指令的具體使用方法:

# docker cp --help
Docker入門

運行一個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應用

Docker入門

我們也可以指定?-p?標識來綁定指定端口。

# docker run -d -p 5000:5000 training/webapp python app.py

docker ps查看正在運行的容器

Docker入門

容器內部的 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

(0)
nenenene
上一篇 2018-01-18 14:26
下一篇 2018-01-20 16:54

相關推薦

  • Proxmox-Linux下的開源管理平臺

    1)proxmox簡介 Proxmox VE (Proxmox Virtual Environment) 是一個非常棒的集成OPENVZ 支持KVM應用的環境。有方便易用的WEB界面,基于JAVA的UI和內核接口,可以登錄到VM客戶方便的操作,還有易用的模板功能,基本跟老外的商業VPS環境差不多了,支持VT和ISCSI 2)proxmox的安裝與基本配置 安…

    Linux干貨 2016-08-08
  • 重定向

    Linux下定義了三種I/O設備: 標準輸入(STDIN):用0表示,默認的標準輸入設備是鍵盤; 標準輸出(STDOUT):用1表示,默認的標準輸出設備是當前終端; 標準錯誤(STDERR):用2表示,默認的標準錯誤輸出設備是當前終端; I/O重定向即改變默認的位置 1 標準輸出重定向 (1)將標準輸出重定向到其他終端 /dev/pts/1代表偽終端1,在偽…

    Linux干貨 2017-07-31
  • ?磁盤管理、MBR、GPT、分區工具、文件系統、常見分區掛載

    磁盤管理{磁盤結構;MBR;GPT;分區工具;文件系統;分區掛載;}

    Linux干貨 2016-08-29
  • 網絡管理

                                                 網絡基礎 一.網絡的基本概念 什么是網絡…

    2017-09-02
  • 磁盤配額的操作步驟

    磁盤配額 操作步驟: 1、創建一個10G的分區 /dev/sdd1并將其格式化,掛載 2、如果是新硬盤便不存在同步問題。舊硬盤得使用命令partx  -a /dev/sdd1 3、臨時創建掛載文件夾 /mnt/home    4、將/home/*  mv  到 /mnt/home 中,再將/dev/…

    Linux干貨 2016-09-01
  • linux 網路管理路由和team網絡組

    如何實現把linux當路由器來使用,實現不同網段之間的通信訪問,這就是今天所要實現的路由配置   環境準備:4臺虛擬機,兩臺中間兩臺作為路由器來使用(每天主機兩塊網卡),其他兩臺作為終端主機,目的是讓不同網段的兩臺主機之間互相訪問(這里在vmware里面做的實驗,所以網卡的類型都設置為橋接)   拓撲圖:   步驟一:將A、D兩…

    Linux干貨 2017-05-07
欧美性久久久久