docker入門


wiki資料

 

 

什么是docker

Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國期間發起的一個公司內部項目,於 2013 年 3 月以 Apache 2.0 授權協議開源,主要項目代碼在 GitHub 上進行維護。
Docker 使用 Google 公司推出的 Go 語言 進行開發實現。

docker是linux容器的一種封裝,提供簡單易用的容器使用接口。它是最流行的Linux容器解決方案。
docker的接口相當簡單,用戶可以方便的創建、銷毀容器。

docker將應用程序與程序的依賴,打包在一個文件里面。運行這個文件就會生成一個虛擬容器。
程序運行在虛擬容器里,如同在真實物理機上運行一樣,有了docker,就不用擔心環境問題了。
而且docker有一個特點,就是秒級別啟動,非常快

docker應用場景

web應用的自動化打包和發布
自動化測試和持續集成、發布
在服務型環境中部署和調整數據庫或其他應用

為什么要用docker?

我們先看看很久很久以前,服務器是怎么部署應用的!

 

由於物理機的諸多問題,后來出現了虛擬機

但是虛擬化也是有局限性的,每一個虛擬機都是一個完整的操作系統,要分配系統資源,虛擬機多道一定程度時,操作系統本身資源也就消耗殆盡,或者說必須擴容

docker與虛擬機的區別

 

 

docker  VS 傳統虛擬機

 

特性

容器

虛擬機

啟動

秒級

分鍾級

硬盤使用

一般為 MB

一般為 GB

性能

接近原生

系統支持量

單機支持上千個容器

一般幾十個

環境配置的難題

讓開發人員最頭疼的麻煩事之一就是環境配置了,每台計算機的環境都不相同,應該如何確保自己的程序換一台機器能運行起來呢?

用戶必須確保的是:

  1. 操作系統的相同
  2. 各種平台庫和組件的安裝
  3. 例如python依賴包,環境變量等

如何一些低版本的依賴模塊和當前環境不兼容,那就頭疼了。。。。。

如果環境配置這么痛苦的話,換一台機器,就得重新配置一下,那么在安裝軟件的時候,帶着原始環境一模一樣的復制過來。

 

然而,開發和運維之間聊天一般是這樣的

解決方案一 虛擬機

 虛擬機也可以制作模板,基於模板創建虛擬機,保證環境問題一致

虛擬機(virtual machine)就是帶環境安裝的一種解決方案。它可以在一種操作系統里面運行另一種操作系統,比如在 Windows 系統里面運行 Linux 系統。應用程序對此毫無感知,因為虛擬機看上去跟真實系統一模一樣,而對於底層系統來說,虛擬機就是一個普通文件,不需要了就刪掉,對其他部分毫無影響。

雖然用戶可以通過虛擬機還原軟件的原始環境。但是,這個方案有幾個缺點。

(1)資源占用多

虛擬機會獨占一部分內存和硬盤空間。它運行的時候,其他程序就不能使用這些資源了。哪怕虛擬機里面的應用程序,真正使用的內存只有 1MB,虛擬機依然需要幾百 MB 的內存才能運行。

(2)冗余步驟多

虛擬機是完整的操作系統,一些系統級別的操作步驟,往往無法跳過,比如用戶登錄。

(3)啟動慢

啟動操作系統需要多久,啟動虛擬機就需要多久。可能要等幾分鍾,應用程序才能真正運行。

解決方案二  Linux容器

現在:自從用上docker容器后,可以實現開發、測試和生產環境的統一化和標准化。

鏡像作為標准的交付件,可在開發、測試和生產環境上以容器來運行,最終實現三套環境上的應用以及運行所依賴內容的完全一致。

 由於虛擬機的諸多問題,Linux發展出了另一種虛擬化技術:Linux容器(Linux Containers,縮寫LXC)

Linux容器不是模擬一個完整的操作系統,而是對進程進行隔離。在正常進程的外面套了一個保護層,對於容器里面進程來說,它接觸的資源都是虛擬的,從而實現和底層系統的隔離。

(1)啟動快

容器里面的應用,直接就是底層系統的一個進程,而不是虛擬機內部的進程。所以,啟動容器相當於啟動本機的一個進程,而不是啟動一個操作系統,速度就快很多。

(2)資源占用少

容器只占用需要的資源,不占用那些沒有用到的資源;虛擬機由於是完整的操作系統,不可避免要占用所有資源。另外,多個容器可以共享資源,虛擬機都是獨享資源。

(3)體積小

容器只要包含用到的組件即可,而虛擬機是整個操作系統的打包,所以容器文件比虛擬機文件要小很多。

總之,容器有點像輕量級的虛擬機,能夠提供虛擬化的環境,但是成本開銷小得多。

 

docker容器的優勢

更高效的利用系統資源
由於容器不需要進行硬件虛擬以及運行完整操作系統等額外開銷,Docker 對系統 資源的利用率更高。
無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳 統虛擬機技術更高效。因此,相比虛擬機技術,一個相同配置的主機,往往可以運 行更多數量的應用。
更快速的啟動時間
傳統的虛擬機技術啟動應用服務往往需要數分鍾,而 Docker 容器應用,由於直接 運行於宿主內核,無需啟動完整的操作系統,因此可以做到秒級、甚至毫秒級的啟 動時間。大大的節約了開發、測試、部署的時間。
一致的運行環境
開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環 境不一致,導致有些 bug 並未在開發過程中被發現。
而 Docker 的鏡像提供了除內 核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 “這段代碼 在我機器上沒問題啊” 這類問題。
持續交付和部署
對開發和運維(DevOps)人員來說,最希望的就是一次創建或配置,可以在任意 地方正常運行。
使用 Docker 可以通過定制應用鏡像來實現持續集成、持續交付、部署。開發人員 可以通過 Dockerfile 來進行鏡像構建,並結合 持續集成(Continuous Integration) 系 統進行集成測試,
而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署。
而且使用 Dockerfile 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環 境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。
更輕松的遷移
由於 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在 很多平台上運行,無論是物理機、虛擬機、公有雲、私有雲,甚至是筆記本,其運 行結果是一致的。
因此用戶可以很輕易的將在一個平台上運行的應用,遷移到另一 個平台上,而不用擔心運行環境的變化導致應用無法正常運行的情況。

工作中的虛擬化和容器

 

docker三大概念

容器三大基本概念
鏡像 image
容器 container
倉庫 repository
docker整個生命周期就是這三個概念。

docker鏡像

Docker鏡像就是一個只讀的模板。

例如:一個鏡像可以包含一個完整的CentOS操作系統環境,里面僅安裝了Apache或用戶需要的其他應用程序。

鏡像可以用來創建Docker容器。

Docker提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那里下載一個已經做好的鏡像來直接使用。

image的分層存儲

因為鏡像包含完整的root文件系統,體積是非常龐大的,因此docker在設計時按照Union FS的技術,將其設計為分層存儲的架構。
鏡像不是ISO那種完整的打包文件,鏡像只是一個虛擬的概念,他不是一個完整的文件,而是由一組文件組成,或者多組文件系統聯合組成。

docker容器(container)

image和container的關系,就像面向對象程序設計中的 類和實例一樣,鏡像是靜態的定義(class),容器是鏡像運行時的實體(object)。
容器可以被創建、啟動、停止、刪除、暫停
Docker利用容器來運行應用。

容器是從鏡像創建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的,保證安全的平台。

可以把容器看做是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。

注意:鏡像是只讀的,容器在啟動的時候創建一層可寫層作為最上層。

docker倉庫(repository)

倉庫是集中存放鏡像文件的場所。有時候把倉庫和倉庫注冊服務器(Registry)混為一談,並不嚴格區分。實際上,倉庫注冊服務器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag)。

倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。

最大的公開倉庫是Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括Docker Pool等,可以提供大陸用戶更穩定快讀的訪問。

當用戶創建了自己的鏡像之后就可以使用push命令將它上傳到公有或者私有倉庫,這樣下載在另外一台機器上使用這個鏡像時候,只需需要從倉庫上pull下來就可以了。

注意:Docker倉庫的概念跟Git類似,注冊服務器可以理解為GitHub這樣的托管服務。

docker Registry

Docker Registry 公開服務是開放給用戶使用、允許用戶管理鏡像的 Registry 服 務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像,並可能提供收費服務 供用戶管理私有鏡像。
最常使用的 Registry 公開服務是官方的 Docker Hub,這也是默認的 Registry,並 擁有大量的高質量的官方鏡像。

除此以外,還有 CoreOS 的 Quay.io,CoreOS 相 關的鏡像存儲在這里;Google 的 Google Container Registry,Kubernetes 的鏡像 使用的就是這個服務。 由於某些原因,在國內訪問這些服務可能會比較慢。
國內的一些雲服務商提供了針 對 Docker Hub 的鏡像服務(Registry Mirror),這些鏡像服務被稱為加速器。常見 的有 阿里雲加速器、DaoCloud 加速器、靈雀雲加速器等。
使用加速器會直接從國內的地址下載 Docker Hub 的鏡像,比直接從官方網站下載速度會提高很多。在后 面的章節中會有進一步如何配置加速器的講解。 國內也有一些雲服務商提供類似於 Docker Hub 的公開服務。比如 時速雲鏡像倉 庫、網易雲鏡像服務、DaoCloud 鏡像市場、阿里雲鏡像庫等。

 

CentOS安裝docker

請遵循官方安裝方式!!!

https://docs.docker.com/install/linux/docker-ce/centos/#upgrade-docker-after-using-the-convenience-script

官方教程如下,最正確安裝docker姿勢, 如果想要安裝官方版本就使用此方法

1.卸載舊版本
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

2.設置存儲庫
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3.安裝docker社區版
sudo yum install -y docker-ce
4.啟動關閉docker
systemctl start docker

選擇yum安裝,yum源,阿里雲源,163源
阿里雲默認也有docker軟件,也可以下載,只是版本較低
為了教學,我們使用阿里雲提供的docker軟件

1 確認阿里雲的yum源文件

vim /etc/yum.repos.d/Centos-7.repo

2 使用yum開始安裝docker

yum install -y docker

3 查看docker安裝版本

rpm -qi docker

docker版本

Docker 是一個開源的商業產品,有兩個版本:社區版(Community Edition,縮寫為 CE)和企業版(Enterprise Edition,縮寫為 EE)。
企業版包含了一些收費服務,個人開發者一般用不到。本文的介紹都針對社區版。

 系統環境准備

docker最低支持centos7且在64位平台上,內核版本在3.10以上

[root@oldboy_python ~ 10:48:11]#uname -r
3.10.0-693.el7.x86_64

Docker鏡像加速器

 

https://www.daocloud.io/mirror#accelerator-doc
# 一條命令加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

# 這條命令其實就是改了docker的一個配置文件里面的注冊鏡像地址, 可以查看一下
cat /etc/docker/daemon.json

 

docker基礎命令注釋

[root@docker ~]# docker --help

Usage:
docker [OPTIONS] COMMAND [arg...]

       docker daemon [ --help | ... ]

       docker [ --help | -v | --version ]

 

A
self-sufficient runtime for containers.

Options:

  --config=~/.docker              Location of client config files  #客戶端配置文件的位置

  -D, --debug=false               Enable debug mode  #啟用Debug調試模式

  -H, --host=[]                   Daemon socket(s) to connect to  #守護進程的套接字(Socket)連接

  -h, --help=false                Print usage  #打印使用

  -l, --log-level=info            Set the logging level  #設置日志級別

  --tls=false                     Use TLS; implied by--tlsverify  #

  --tlscacert=~/.docker/ca.pem    Trust certs signed only by this CA  #信任證書簽名CA

  --tlscert=~/.docker/cert.pem    Path to TLS certificate file  #TLS證書文件路徑

  --tlskey=~/.docker/key.pem      Path to TLS key file  #TLS密鑰文件路徑

  --tlsverify=false               Use TLS and verify the remote  #使用TLS驗證遠程

  -v, --version=false             Print version information and quit  #打印版本信息並退出

 

Commands:

    attach    Attach to a running container  #當前shell下attach連接指定運行鏡像

    build     Build an image from a Dockerfile  #通過Dockerfile定制鏡像

    commit    Create a new image from a container's changes  #提交當前容器為新的鏡像

    cp    Copy files/folders from a container to a HOSTDIR or to STDOUT  #從容器中拷貝指定文件或者目錄到宿主機中

    create    Create a new container  #創建一個新的容器,同run 但不啟動容器

    diff    Inspect changes on a container's filesystem  #查看docker容器變化

    events    Get real time events from the server#從docker服務獲取容器實時事件

    exec    Run a command in a running container#在已存在的容器上運行命令

    export    Export a container's filesystem as a tar archive  #導出容器的內容流作為一個tar歸檔文件(對應import)

    history    Show the history of an image  #展示一個鏡像形成歷史

    images    List images  #列出系統當前鏡像

    import    Import the contents from a tarball to create a filesystem image  #從tar包中的內容創建一個新的文件系統映像(對應export)

    info    Display system-wide information  #顯示系統相關信息

    inspect    Return low-level information on a container or image  #查看容器詳細信息

    kill    Kill a running container  #kill指定docker容器

    load    Load an image from a tar archive or STDIN  #從一個tar包中加載一個鏡像(對應save)

    login    Register or log in to a Docker registry#注冊或者登陸一個docker源服務器

    logout    Log out from a Docker registry  #從當前Docker registry退出

    logs    Fetch the logs of a container  #輸出當前容器日志信息

    pause    Pause all processes within a container#暫停容器

    port    List port mappings or a specific mapping for the CONTAINER  #查看映射端口對應的容器內部源端口

    ps    List containers  #列出容器列表

    pull    Pull an image or a repository from a registry  #從docker鏡像源服務器拉取指定鏡像或者庫鏡像

    push    Push an image or a repository to a registry  #推送指定鏡像或者庫鏡像至docker源服務器

    rename    Rename a container  #重命名容器

    restart    Restart a running container  #重啟運行的容器

    rm    Remove one or more containers  #移除一個或者多個容器

    rmi    Remove one or more images  #移除一個或多個鏡像(無容器使用該鏡像才可以刪除,否則需要刪除相關容器才可以繼續或者-f強制刪除)

    run    Run a command in a new container  #創建一個新的容器並運行一個命令

    save    Save an image(s) to a tar archive#保存一個鏡像為一個tar包(對應load)

    search    Search the Docker Hub for images  #在docker
hub中搜索鏡像

    start    Start one or more stopped containers#啟動容器

    stats    Display a live stream of container(s) resource usage statistics  #統計容器使用資源

    stop    Stop a running container  #停止容器

    tag         Tag an image into a repository  #給源中鏡像打標簽

    top       Display the running processes of a container #查看容器中運行的進程信息

    unpause    Unpause all processes within a container  #取消暫停容器

    version    Show the Docker version information#查看容器版本號

    wait         Block until a container stops, then print its exit code  #截取容器停止時的退出狀態值

Run 'docker COMMAND --help' for more information on a command.  #運行docker命令在幫助可以獲取更多信息
docker --help查看docker基本命令

docker基本命令概覽

 

docker search  hello-docker     # 搜索docker鏡像 ,就是去 docker hub搜索 hello-docker而已
docker pull hello-world         # 下載公網的,docker鏡像
docker  image ls                # 查看本地的鏡像有哪些
docker  images                  # 這兩條命令一樣的,docker進行了很多的命令升級,不用慌
docker run  hello-world         # 運行一個docker鏡像,產生一個容器實例
docker  container  ls           # 列出所有正在運行的容器
docker  ps      -a              # 列出所有曾經運行過的容器記錄,以及正在運行的容器記錄
docker pull  centos             # 下載cnetos鏡像

# 容器是運行應用程序的,所以必須要先有一個操作系統為基礎
# 運行一個在后台的任務
docker run -d centos /bin/sh -c "while true;do echo 愛滴魔力轉圈圈; sleep 1;done"
     -d         # 后台運行容器
     /bin/sh    # 指定使用centos的bash解釋器
     -c         # 運行一段shell命令
    "while true;do echo 愛滴魔力轉圈圈; sleep 1;done"   # 在linux后台,每秒中打印一個 愛滴魔力轉圈圈

docker  logs  -f  容器id        # 不間斷打印容器的日志信息 

# 容器是有自己的微型操作系統的。微型linux
docker exec -it  5f6  /bin/bash
    exec        # 進入容器的參數
    -i          # 交互式的操作容器
    -t          # 開啟一個terminel終端,用於和linux交互
    5f6         # docker容器的id
    /bin/bash   # 指定docker容器,用shell解釋器交互
 
docker run -it centos /bin/bash # 交互式的運行一個容器,且進入容器(也就是開啟並進入一個新的容器)

注意: docker容器必須要有后台進程在運行,如果沒有,容器就會退出

使用docker鏡像

從倉庫獲取鏡像
管理本地主機的鏡像

獲取鏡像

從docker registry獲取鏡像的命令是docker pull。命令格式是:
docker pull [選項][docker registry地址] 倉庫名:標簽
docker register地址:地址的格式一般是 域名:端口,默認地址是docker hub
倉庫名:倉庫名是兩段格式,用戶名/軟件名,如果不寫用戶,默認docker hub用戶名是library,也就是官方鏡像

鏡像文件

docker是把應用程序和其依賴打包在image文件里面,只有通過這個鏡像文件才能生成docker容器。
一個image文件可以生成多個容器實例。
image文件是通用,可以共享的。

列出服務器所有鏡像文件

#列出所有的image文件
docker image ls
#刪除image文件
docker image rm [imagename]

搜索docker鏡像

[root@docker ~]# docker search centos  # 搜索所有centos的docker鏡像

INDEX                NAME(名稱)                  DESCRIPTION(描述)                    STARS(下載次數)OFFICIAL(官方)        AUTOMATED(自動化)

docker.io           docker.io/centos         The official build of CentOS.        1781               [OK]

docker.io   docker.io/jdeathe/centos-ssh     CentOS-6 6.7 x86_64 /             14                                               [OK]

……

獲取docker鏡像

# 可以使用docker pull命令來從倉庫獲取所需要的鏡像。下面的例子將從Docker Hub倉庫下載一個Centos操作系統的鏡像。

[root@docker ~]# docker pull centos  # 獲取centos鏡像

[root@docker ~]# docker run -it centos /bin/bash  # 完成后可以使用該鏡像創建一個容器

 

查看docker鏡像

# 鏡像的ID唯一標識了鏡像,如果ID相同,說明是同一鏡像。

# TAG信息來區分不同發行版本,如果不指定具體標記,默認使用latest標記信息。

[root@docker ~]# docker images  # 查看docker鏡像

REPOSITORY(來自那個倉庫)       TAG(標簽)            IMAGE ID(唯一ID)         CREATED(創建時間)         VIRTUAL SIZE(大小)

docker.io/centos                   latest              60e65a8e4030           5
days ago              196.6 MB

docker.io/nginx             latest              813e3731b203             13
days ago             133.8 MB

刪除Docker鏡像

如果要移除本地的鏡像,可以使用docker rmi命令(在刪除鏡像之前先用docker rm刪除依賴於這個鏡像的所有容器)。注意docker rm 命令是移除容器。

[root@docker ~]# docker rmi imageID  # 刪除docker鏡像

導出docker鏡像

如果要導出鏡像到本地文件,可以使用docker save命令。

[root@docker ~]# docker save centos > /opt/centos.tar.gz  # 導出docker鏡像至本地

[root@docker ~]# ll /opt/

-rw-r--r--.1 root root 204205056 12月 30 09:53 centos.tar.gz

導入docker鏡像

# 可以使用docker load從本地文件中導入到本地docker鏡像庫

[root@docker ~]# docker load < /opt/centos.tar.gz   # 導入本地鏡像到docker鏡像庫

[root@docker~]# docker images  # 查看鏡像導入情況

REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

docker.io/centos     latest              60e65a8e4030        5 days ago          196.6 MB

提交創建自定義的鏡像(docker container commit)

1.我們進入交互式的centos容器中,發現沒有vim命令
  docker run -it centos
2.在當前容器中,安裝一個vim
  yum install -y vim
3.安裝好vim之后,exit退出容器
  exit
4.查看剛才安裝好vim的容器記錄
  docker container ls -a
5.提交這個容器,創建新的image
  docker commit 059fdea031ba tiger/centos-vim
6.查看鏡像文件
[root@master /home]docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tiger/centos-vim   latest              fd2685ae25fe        5 minutes ago       348MB

啟動docker容器的方式

啟動容器有兩種方式,一種是基於鏡像新建一個容器並啟動,另外一個是將在終止狀態(stopped)的容器重新啟動。

因為Docker的容器實在太輕量級了,很多時候用戶都是隨時刪除和新創建容器。

新建容器並且啟動

所需要的命令主要為docker run

例如,下面的命令輸出一個hehe,之后終止容器。

[root@docker ~]# docker run centos /bin/echo "hehe"  # 創建一個只運行一次的容器,這跟在本地直接執行 /bin/echo'hehe' 

hehe

[root@docker ~]# docker run --name mydocker -it centos /bin/bash  # 啟動一個設置了名字的容器並進入bash終端,允許用戶進行交互。

[root@1c6c3f38ea07 /]# pwd

/

[root@1c6c3f38ea07 /]# ls

anaconda-post.log  bindev  etc  homelib  lib64  lost+foundmedia  mnt  optproc  root  runsbin  srv  systmp  usr  var


--name:給容器定義一個名稱

-i:則讓容器的標准輸入保持打開。

-t:讓Docker分配一個偽終端,並綁定到容器的標准輸入上

/bin/bash:執行一個命令

當利用docker run來創建容器時,Docker在后台運行的標准操作包括

檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載

利用鏡像創建並啟動一個容器

分配一個文件系統,並在只讀的鏡像層外面掛在一層可讀寫層

從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去

從地址池配置一個ip地址給容器

執行用戶指定的應用程序

執行完畢后容器被終止

docker與"hello docker"

hello world是程序員啟蒙語言,我們通過最簡單的image文件“hello-world”,來感受一下docker。
# 獲取鏡像 hello-world
docker pull hello-world
# 檢查鏡像
docker images
# 運行image文件,可以用容器id
docker run hello-world
# 檢查docker容器進程
docker ps
# 檢查所有運行過的容器
docker ps -a

運行成功后,可以看到結果

表示你已經成功運行了容器,hello world運行的容器會在完成后,自動終止

 運行一個ubuntu容器 

咱們要在cenots7操作系統下,以docker下載一個ubuntu image文件,然后以image啟動容器

[root@oldboy_python ~ 11:52:22]#docker pull ubuntu
#如圖,烏班圖的鏡像下載,是下載每一層的文件
Trying to pull repository docker.io/library/ubuntu ... 14.04: Pulling from docker.io/library/ubuntu 8284e13a281d: Pull complete 26e1916a9297: Pull complete 4102fc66d4ab: Pull complete 1cf2b01777b2: Pull complete 7f7a2d5e04ed: Pull complete Digest: sha256:4851d1986c90c60f3b19009824c417c4a0426e9cf38ecfeb28598457cefe3f56 Status: Downloaded newer image for docker.io/ubuntu:14.04
下載過程可以看出鏡像是由多層存儲構成的。下載也是一層一層,並非單一的文件。
下載過程中給出每一層的前12位ID。下載結束后會給出sha246的文件一致性校驗值。

運行這個烏班圖容器!

[root@oldboy_python ~ 12:18:53]#docker run -it ubuntu /bin/bash
#此時會進入交互式的shell界面,即可以使用烏班圖操作系統 root@3efbb2749d7c:/# cat /etc/os-release NAME="Ubuntu" VERSION="14.04.5 LTS, Trusty Tahr" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 14.04.5 LTS" VERSION_ID="14.04" HOME_URL="http://www.ubuntu.com/" SUPPORT_URL="http://help.ubuntu.com/" BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
#使用exit退出容器
exit
docker run就是運行容器的命令。
參數
 -it : -i 是交互式操作,-t是終端
 -rm  :   容器退出后將其刪除。也可以不指定參數,手動docker rm,使用-rm可以避免浪費空間。
ubuntu:14.04 這指的是鏡像文件
bash : 指定用交互式的shell,因此需要bash命令

Docker與CentOS

docker允許在容器內運行應用程序,使用docker run命令來在容器內運行應用程序。

#加速docker鏡像下載
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
[root@oldboy_python ~ 15:14:31]#docker pull docker.io/centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
256b176beaff: Pull complete
Digest: sha256:fc2476ccae2a5186313f2d1dadb4a969d6d2d4c6b23fa98b6c7b0a1faad67685
Status: Downloaded newer image for docker.io/centos:latest

運行一個交互式的容器

[root@oldboy_python ~ 15:15:07]#docker run -it centos /bin/bash
#此時進入docker容器 [root@c72e9c40cfe2 /]# cat /etc/redhat-release

參數解析:

  • -t:在新容器內指定一個偽終端或終端。

  • -i:允許你對容器內的標准輸入 (STDIN) 進行交互。

此時就進入了centos系統
可以查看系統相關信息,內核版本信息
cat /proc/version
ls /

此時想要退出容器,使用exit命令

后台模式啟動docker

-d參數:后台運行容器,返回容器ID

[root@oldboy_python ~ 15:58:14]#docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done"
c0283f1077d16a2bf2597e269d51a02815334f7390f18a62ed7a4ba07f351b65
#檢查容器進程 [root@oldboy_python ~ 15:58:22]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c0283f1077d1 centos "/bin/sh -c 'while..." 6 seconds ago Up 5 seconds fervent_turing [root@oldboy_python ~ 15:58:28]#

查看容器內的標准輸出

docker logs c02

停止容器

docker stop c02
#此時容器進程不存在
docker ps

啟動容器

docker start c02
#檢查容器進程
docker ps
刪除容器
docker rm c02

Docker鏡像常用命令

docker images #列出所有本級鏡像
docker pull centos #獲取新的centos鏡像
docker search nginx #搜索nginx鏡像

構建鏡像

1.通過commit修改鏡像
2.編寫dockerfile

進入容器 

使用-d參數時,容器啟動后會進入后台。某些時候需要進入容器進行操作,有很多種方法,包括使用docker attach命令或nsenter工具等。

docker exec -it 容器id
docker attach 容器id

外部訪問容器

容器中可以運行網絡應用,但是要讓外部也可以訪問這些應用,可以通過-p或-P參數指定端口映射。

[root@oldboy_python ~ 16:31:37]#docker run -d -P training/webapp python app.py
    -P 參數會隨機映射端口到容器開放的網絡端口
    # 如果本地沒有這個鏡像,docker run會自動為我們下載鏡像

檢查映射的端口

#宿主機ip:32768 映射容器的5000端口
[root@oldboy_python ~ 16:34:02]#docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cfd632821d7a training/webapp "python app.py" 21 seconds ago Up 20 seconds 0.0.0.0:32768->5000/tcp brave_fermi

查看容器日志信息

# 不間斷顯示log
docker logs -f cfd

也可以通過-p參數指定映射端口

# 指定服務器的9000端口,映射到容器內的5000端口
[root@oldboy_python ~ 16:46:13]#docker run -d -p 9000:5000 training/webapp python app.py
c0b5a6278d0f4f2e9b9eba8680451111d8b911b61de0c37ea64cb337aefb854e

訪問服務器的9000端口

(如果訪問失敗的話,檢查自己的防火牆,以及雲服務器的安全組)

查看指定容器的端口映射

[root@oldboy_python ~ 16:49:01]#docker port c0b
5000/tcp -> 0.0.0.0:9000

查看容器內的進程

[root@oldboy_python ~ 16:49:05]#docker top c0b
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                3926                3912                0                   16:46               ?                   00:00:00            python app.py

發布docker image到倉庫

第一種,docker hub公有鏡像發布

1.docker提供了一個類似於github的倉庫dockerhub,
網址https://hub.docker.com/需要注冊使用
2.注冊docker id后,在linux中登錄dockerhub
docker login

注意要保證image的tag是賬戶名,如果鏡像名字不對,需要改一下tag
docker tag tiger/centos-vim lxh661314/centos-vim
語法是:  docker tag   倉庫名   lxh661314/倉庫名

3.推送docker image到dockerhub
docker push lxh661314/centos-cmd-exec:latest
4.在dockerhub中檢查鏡像
https://hub.docker.com/
5.刪除本地鏡像,測試下載pull 鏡像文件
docker rmi -f d69 docker pull lxh661314
/centos-entrypoint-exec

私有倉庫

但是這種鏡像倉庫是公開的,其他人也是可以下載,並不安全,因此還可以使用docker registry官方提供的私有倉庫

1.官方提供的私有倉庫docker registry用法
https://yeasy.gitbooks.io/docker_practice/repository/registry.html
2.一條命令下載registry鏡像並且啟動私有倉庫容器
docker pull registry 私有倉庫會被創建在容器的
/var/lib/registry下,因此通過-v參數將鏡像文件存儲到本地的/opt/data/registry下 端口映射容器中的5000端口到宿主機的5000端口 docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry 3.檢查啟動的registry容器 docker ps 4.測試連接容器 telnet 192.168.119.10 5000 5.修改鏡像tag,以docker registry的地址端口開頭 docker tag hello-world:latest 192.168.119.10:5000/hello-world:latest 6.查看docker鏡像,找到registry的鏡像 docker images 7.Docker 默認不允許非 HTTPS 方式推送鏡像。我們可以通過 Docker 的配置選項來取消這個限制,這里必須寫正確json數據 [root@master /]# cat /etc/docker/daemon.json {
  "registry-mirrors": ["http://95822026.m.daocloud.io"],   "insecure-registries":["192.168.119.10:5000"] } 寫入到docker服務中,寫入到[Service]配置塊中,加載此配置文件 [root@master home]# grep 'EnvironmentFile=-/etc/docker/daemon.json' /lib/systemd/system/docker.service EnvironmentFile=-/etc/docker/daemon.json 8.修改了docker配置文件,重新加載docker systemctl daemon-reload 9.重啟docker systemctl restart docker # 注意,重啟docker服務,所有的容器都會掛掉 10.重啟了docker,剛才的registry容器進程掛掉了,因此重新啟動它 docker ps -a docker start 容器id 11.推送本地鏡像 docker push 192.168.119.10:5000/hello-world 12.由於docker registry沒有web節目,但是提供了API數據 官網教程:https://docs.docker.com/registry/spec/api/#listing-repositories curl http://192.168.119.10:5000/v2/_catalog 或者瀏覽器訪問http://192.168.119.10:5000/v2/_catalog 13.刪除本地鏡像,從私有倉庫中下載
docker rmi -f `docker images -aq` docker pull
192.168.119.10:5000/hello-world

利用dockerfile定制鏡像

鏡像是容器的基礎,每次執行docker run的時候都會指定哪個鏡像作為容器運行的基礎。我們之前的例子都是使用來自docker hub的鏡像,直接使用這些鏡像只能滿足一定的需求,當鏡像無法滿足我們的需求時,就得自定制這些鏡像。

鏡像的定制就是定制每一層所添加的配置、文件。如果可以把每一層修改、安裝、構建、操作的命令都寫入到一個腳本,用腳本來構建、定制鏡像,這個腳本就是dockerfile。
Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令 構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
1. FROM參數(指定基礎鏡像)
FROM scratch # 制作base image基礎鏡像,盡量使用官方的image作為base image
FROM centos # 以centos為基礎鏡像,進行二次構建鏡像
FROM ubuntu:14.04 # 帶有tag的base image

2. LABEL參數(標簽, 定義作者信息)
LABEL version=“1.0” # 容器元信息,幫助信息,Metadata,類似於代碼注釋
LABEL maintainer=“lxh661314@163.com"

3. RUN參數(是一個萬能指令,執行命令)
#對於復雜的RUN命令,避免無用的分層,多條命令用反斜線換行,合成一條命令!
RUN yum update && yum install -y vim \
    Python-dev # 反斜線換行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”

4. WORKDIR參數(相當於linux的cd命令)
WORKDIR /root # 相當於linux的cd命令,改變目錄,盡量使用絕對路徑!!!不要用RUN cd
WORKDIR /test # 如果沒有就自動創建
WORKDIR demo # 再進入demo文件夾
RUN pwd     # 打印結果應該是/test/demo

5. ADD參數(把宿主機的一個文件,添加到容器空間內)
ADD /opt/django/manage.py /opt/  # 把宿主機的/opt/django/manage.py放到容器空間內的/opt/目錄下
ADD /opt/python3.6.tar.gz /opt/  # ADD的解壓文件作用,將宿主機的/opt/下的python3.6.tar.gz解壓到容器內的/opt/目錄下
ADD and COPY
ADD hello /  #把本地文件添加到鏡像中,吧本地的hello可執行文件拷貝到鏡像的/目錄
ADD test.tar.gz /  #添加到根目錄並解壓

WORKDIR /root
ADD hello test/  # 進入/root/ 添加hello可執行命令到test目錄下,也就是/root/test/hello 一個絕對路徑
COPY hello test/  # 等同於上述ADD效果

6. COPY參數(拷貝指令)
# 將宿主機的文件, 拷貝到容器內,但是沒有解壓縮的命令,盡量使用COPY,不要使用ADD
COPY filename /opt/

ADD與COPY
   - 優先使用COPY命令
    -ADD除了COPY功能還有解壓功能
添加遠程文件/目錄使用curl或wget

7. ENV參數(docker的環境參數指令)
ENV # 環境變量,盡可能使用ENV增加可維護性
ENV MYSQL_VERSION 5.6 # 設置一個mysql常量,這個${MYSQL_VERSION}類似於全局常量
RUN yum install -y mysql-server=“${MYSQL_VERSION}”  # 如果版本號有變更,則只需要改這個常量就可以了
VOLUME and EXPOSE 
存儲和網絡

RUN and CMD and ENTRYPOINT
RUN:執行命令並創建新的Image Layer
CMD:設置容器啟動后默認執行的命令和參數
ENTRYPOINT:設置容器啟動時運行的命令

Shell格式和Exec格式
RUN yum install -y vim
CMD echo ”hello docker”
ENTRYPOINT echo “hello docker”

Exec格式
RUN [“apt-get”,”install”,”-y”,”vim”]
CMD [“/bin/echo”,”hello docker”]
ENTRYPOINT [“/bin/echo”,”hello docker”]


通過shell格式去運行命令,會讀取$name指令,而exec格式是僅僅的執行一個命令,而不是shell指令
cat Dockerfile
    FROM centos
    ENV name Docker
    ENTRYPOINT [“/bin/echo”,”hello $name”]#這個僅僅是執行echo命令,讀取不了shell變量
    ENTRYPOINT  [“/bin/bash”,”-c”,”echo hello $name"]

CMD
容器啟動時默認執行的命令
如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略
如果定義多個CMD,只有最后一個執行

ENTRYPOINT
讓容器以應用程序或服務形式運行
不會被忽略,一定會執行
最佳實踐:寫一個shell腳本作為entrypoint
COPY docker-entrypoint.sh /usr/local/bin
ENTRYPOINT [“docker-entrypoint.sh]
EXPOSE 27017
CMD [“mongod”]

[root@master home]# more Dockerfile
FROm centos
ENV name Docker
#CMD ["/bin/bash","-c","echo hello $name"]
ENTRYPOINT ["/bin/bash","-c","echo hello $name”]
中級知識

使用dockerfile封裝flask鏡像

咱們構建好的鏡像,只要丟給苑昊,說“日天先生,拿去用吧,這個鏡像你直接docker run就能用了,不需要你管環境問題了,有沒有很崇拜我”,日天說,“虎爺真牛逼”

確保app.py和dockerfile在同一個目錄!
1.准備好app.py的flask程序
[root@master home]# cat app.py
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
    return "hello docker"
if __name__=="__main__":
    app.run(host='0.0.0.0',port=8080)
[root@master home]# ls
app.py  Dockerfile

2.編寫dockerfile
[root@master home]# cat Dockerfile
FROM python:2.7
LABEL maintainer="Tiger Lee<lxh661314@163.com>"
RUN pip install flask
COPY app.py /app/
WORKDIR /app
EXPOSE 8080
CMD ["python","app.py"]

3.構建鏡像image
docker build -t tiger163/flask-hello-docker .

4.查看創建好的images
docker image ls

5.啟動此flask-hello-docker容器,映射一個端口供外部訪問
docker run -d -p 8080:8080 tiger163/flask-hello-docker

6.檢查運行的容器
docker container ls

使用Dockerfile封裝Django鏡像

一致的開發環境 

 

 


免責聲明!

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



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