天天看點

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.安裝需要的軟體包, yum-utils 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
 2.1設定yum源
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

3.安裝docker社群版
sudo yum install docker-ce
4.啟動并開機啟動docker
systemctl start docker
systemctl enable docker
5.驗證安裝是否成功(有client和service兩部分表示docker安裝啟動都成功了)
docker version


      

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://cr.console.aliyun.com/cn-hangzhou/mirrors

此處需要一個阿裡雲的賬号,沒有的話可以使用支付寶登入

登入進去會跳轉到容器鏡像服務,需要密碼

docker安裝和基本指令

 設定完進入

docker安裝和基本指令

接下來按照裡面的教程進行設定即可

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鏡像

擷取鏡像

從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容器的方式

啟動容器有兩種方式,一種是基于鏡像建立一個容器并啟動,另外一個是将在終止狀态(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      

運作成功後,可以看到結果

docker安裝和基本指令

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

 運作一個ubuntu容器 

咱們要在cenots7作業系統下,以docker下載下傳一個ubuntu image檔案,然後以image啟動容器

[root@oldboy_python ~ 11:52:22]#docker pull ubuntu:14.04
#如圖,烏班圖的鏡像下載下傳,是下載下傳每一層的檔案
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 --rm ubuntu:14.04 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      

送出建立自定義的鏡像(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 chaoyu/centos-vim
6.檢視鏡像檔案
[root@master /home]docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
chaoyu/centos-vim   latest              fd2685ae25fe        5 minutes ago       348MB      

外部通路容器

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

-P 參數會随機映射端口到容器開放的網絡端口
[root@oldboy_python ~ 16:31:37]#docker run -d -P training/webapp python app.py      

檢查映射的端口

#主控端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端口

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

docker安裝和基本指令

檢視指定容器的端口映射

[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      

利用dockerfile定制鏡像

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

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

LABEL version=“1.0” #容器元資訊,幫助資訊,Metadata,類似于代碼注釋
LABEL maintainer=“[email protected]"

#對于複雜的RUN指令,避免無用的分層,多條指令用反斜線換行,合成一條指令!
RUN yum update && yum install -y vim \
    Python-dev #反斜線換行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”

WORKDIR /root #相當于linux的cd指令,改變目錄,盡量使用絕對路徑!!!不要用RUN cd
WORKDIR /test #如果沒有就自動建立
WORKDIR demo #再進入demo檔案夾
RUN pwd     #列印結果應該是/test/demo

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效果

ADD與COPY
   - 優先使用COPY指令
    -ADD除了COPY功能還有解壓功能
添加遠端檔案/目錄使用curl或wget

ENV #環境變量,盡可能使用ENV增加可維護性
ENV MYSQL_VERSION 5.6 #設定一個mysql常量
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”]      

釋出docker image到倉庫

第一種,docker hub公有鏡像釋出

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

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

3.推送docker image到dockerhub
docker push yuchao163/centps-cmd-exec:latest
4.在dockerhub中檢查鏡像
https://hub.docker.com/
5.删除本地鏡像,測試下載下傳pull 鏡像檔案
docker pull yuchao163/centos-entrypoint-exec      

私有倉庫

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

1.官方提供的私有倉庫docker registry用法
https://yeasy.gitbooks.io/docker_practice/repository/registry.html
2.一條指令下載下傳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
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 pull 192.168.119.10:5000/hello-world
      

打包flask程式與dockerfile

超哥建構好的鏡像,隻要丢給武沛奇,說“小沛奇,拿去用吧,這個鏡像你直接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="Chao Yu<[email protected]>"
RUN pip install flask
COPY app.py /app/
WORKDIR /app
EXPOSE 8080
CMD ["python","app.py"]

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

4.檢視建立好的images
docker image ls

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

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