後端開發程序員的docker學習筆記

 

 

概要

  衆所周知,Docker是當前很是火的虛擬化容器技術,對於它的優點以及使用場景網上的資料很是多,這裏我推薦你們去這個網站去學習瞭解docker(點我便可)html

我這裏就寫一下做爲一名後端開發程序員,本身學習docker的筆記以及對docker在實際工做中的應用。python

開發->測試->運維的傳統環境配置問題

  一開始之因此不介紹docker的安裝、語法等基礎知識點,是由於在實際工做中,做爲一名後端開發者,咱們不只要紮實本身代碼與邏輯的基本功,更要弄清楚本身的工做在整個項目流程中所處的位置、跟整個項目負責其餘工做的同事協同合做,確保項目從開發到測試再到上線的順利進行。mysql

環境配置帶來的問題

  在虛擬化技術出現以前,阻擋在開發、測試與運維之間的一道橫坎兒即是「環境配置」了,每臺計算機的環境都不相同,應該如何確保本身的程序換一臺機器能運行起來呢?linux

爲了讓同一程序在不一樣的機器上跑起來,用戶必須確保的是:git

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

若是一些低版本的依賴模塊和當前環境不兼容,那就頭疼了!程序員

環境配置確實是個痛苦的過程,若是實際中換一臺機器,就得從新配置一下,那麼在安裝軟件的時候,就得按照原始環境如出一轍的複製過來。github

網上有一個段子,對這個現象描述的十分生動:web

然而,開發和運維之間聊天通常是這樣的~
sql

虛擬化技術解決環境配置的問題

爲了解決相似這種問題,聰明的人們發明了虛擬化技術。docker

其實就是爲每種開發運行環境配置對應的開發環境,開發作完後將環境遷移到測試工程師那裏,測試完畢後再將同一套環境遷移到實際的生產環境中給運維工程師去維護。

虛擬化技術分爲兩種:一種是虛擬機,另一種就是本文要介紹的docker虛擬化容器技術

docker相比於虛擬機確實有十分強大的優點,下表就是docker與傳統的虛擬機的性能對比:

下面是網上對於docker容器的優點的詮釋:

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

開發->測試->運維基於docker的高效協做流程

有了docker後,開發、測試與運維之間不會再爲環境配置而浪費沒必要要的時間了,咱們能夠把更多的精力放在本身自己的技術工做中!

下圖簡單的詮釋了利用dockerhub(docker鏡像的遠程存儲倉庫)與github程序員、測試員與運維人員之間的協做關係:

docker的三大概念

docker的三大概念是:

  1. 鏡像 image
  2. 容器 container
  3. 倉庫 repository

 docker的整個生命週期就是這三個概念。

鏡像image

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

例如:一個鏡像能夠包含一個完整的CentOS操做系統環境,裏面僅安裝了Apache或用戶須要的其餘應用程序。

鏡像能夠用來建立Docker容器。

Docker提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。

image的分層存儲

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

容器container

imagecontainer的關係,就像面向對象程序設計中的 類和實例同樣,鏡像是靜態的定義(class),容器是鏡像運行時的實體(object)。

容器能夠被建立啓動中止刪除暫停
Docker利用容器來運行應用。 容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、刪除。每一個容器都是相互隔離的,保證安全的平臺。 能夠把容器看作是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。 注意:鏡像是隻讀的,容器在啓動的時候建立一層可寫層做爲最上層。

倉庫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鏡像市場、阿里雲鏡像庫等。

centos7中安裝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 docker-ce
4.啓動關閉docker systemctl start docker

若是你的網速不是很快,也能夠用yum源安裝(注意提早配置好阿里雲的yum源!)

配置阿里雲的yum源參考個人這篇博客:http://www.javashuo.com/article/p-mhpwtfzx-m.html

yum install docker -y 

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加速器

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

這個命令是修改/etc/docker/daemon.json文件,寫入一個json數據以下:

[root@s20 ~]# cat /etc/docker/daemon.json

{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}

注意這裏有一個坑:

運行完加速命令後,會提示你restart docker,而後,你在重啓docker的時候可能會報錯:

這條錯誤的出現,緣由實際上是在執行加速命令的時候,上面的那個json文件多了一個逗號~

把文件中的那個逗號刪除,而後保存退出後再執行 systemctl restart docker 就能夠了~

配置好docker加速器的目的是提升下載docker鏡像的速度!

下載centos的docker鏡像

固然你也能夠下載ubuntu的鏡像,咱們先拿centos的鏡像來舉例:

docker pull centos  

運行docker容器

咱們能夠吧docker的鏡像比做是面向對象的類,而docker容器就是這個「類」實例化出的對象!

查看docker鏡像的命令爲:

# 查看鏡像
docker images

經過鏡像運行出容器實例的命令爲:

docker  run  鏡像名/鏡像id  

查看容器的命令以下:

#查看正在運行的容器進程
docker  ps  
#顯示全部運行過的容器進程(正在運行的,以及掛掉的容器進程)
docker ps -a  
#同上,是舊的命令 
docker container ls -a  

進行docker容器的管理 

管理docker鏡像對於程序開發者來講十分重要,我這裏單獨拿出一個篇幅去詳細介紹docker容器的管理!

docker容器的管理

注意如下3點:

# docker容器中必須有進程在後臺運行,不然容器掛掉!!!
 # docker鏡像每次運行 都會生成新的容器id記錄 # 運行三次同一個鏡像,會出現三次容器新的記錄
docker run hello-world  
docker run hello-world
docker run hello-world

經常使用命令

##獲取鏡像
(1)
docker pull centos  #下載docker鏡像 centos
docker pull hello-world  #獲取一個hello-world鏡像  

(2)從指定的地點pull docker pull 192.168.16.142:5000/s20-hello-world docker pull yuchao163/centos-entrypoint-exec ##查看全部的docker鏡像 docker images 或者 docker image ls ##查看正在運行的docker實例 docker ps ##查看全部的docker實例 docker ps -a ##運行一個交互式的ubuntu容器實例 ##參數解釋 -i 交互式的命令操做 -t 開啓一個終端界面 /bin/bash 指定linux的解釋器 docker run -it ubuntu /bin/bash ##交互式的運行一個centos容器 docker run -it centos /bin/bash ##獲取一個python的flask的鏡像 ## docker run的特色是,若是鏡像不存在,會自動的先去docker pull docker run -d -P training/webapp python app.py -d 後臺運行 -P 端口映射,隨機映射 training/webapp 鏡像名 python app.py 你要執行的命令 ##刪除容器id記錄,只能刪除掛掉的容器 docker rm 容器id

 #刪除本地docker鏡像
  docker rmi 鏡像id或者鏡像名
 #強制刪除鏡像文件
  docker rmi -f 鏡像id

##批量刪除掛掉的容器記錄   
##注意這不是引號,是鍵盤按鍵1左邊的那個符號!
docker  rm  `docker ps -aq`  

##在容器的後臺運行一個進程,運行出活着的容器
docker run -d centos /bin/sh -c "while true;do echo  'naruto'; sleep 1;done"  
    
    -d  就是daemonize 後臺運行的意思
    centos  指定哪一個鏡像
    /bin/sh 指定linux的解釋器
    -c  指定一段shell代碼
    "while true;do echo 'naruto'; sleep 1;done"     每秒打印一個naruto字符串
    
##進入容器空間內
docker exec  -it   運行着的容器id     /bin/bash    

##查看容器日誌
docker logs  容器id
docker logs -f  容器id  #檢測容器內的日誌

倉庫及容器端口映射的相關命令

#運行一個web容器的操做
獲取一個python的flask的鏡像
## 注意 docker run的特色是,若是鏡像不存在,會自動的先去docker pull
docker run -d -P training/webapp python app.py -d 後臺運行 -P 端口映射,隨機映射 training/webapp 鏡像名 python app.py 你要執行的命令 ##docker容器的端口映射 docker port 容器id ##容器的啓停管理 docker start 容器id docker stop 容器id

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及使用製做好的docker鏡像的簡單過程

##1.獲取一個centos基礎鏡像,運行處容器後
    docker run -it  centos /bin/bash  

##2.進入容器空間內,默認沒有python3 和其餘軟件
    進入以後,安裝一個vim
    yum install vim -y 
##3.自定義軟件後,退出容器,提交這個容器,成爲一個新的鏡像 exit退出容器
##4.此時這個鏡像文件,能夠發送給其餘同事了 docker commit 容器id 新的鏡像的名字 docker commit 5c2 s20/centos-vim ##5.查看提交的鏡像文件 docker images ##6.導出這個鏡像文件,指定導出的文件名和後綴 docker save 鏡像名/id > /opt/s20-centos-vim.tar.gz ##7.在本地測試導入這個鏡像 ###### 能夠在本地測試,先刪除本來的鏡像 導入命令 docker load < /opt/s20-centos-vim.tar.gz ##8.給導入的鏡像,修改tag別名 docker tag 舊的鏡像名 以dockerhub倉庫id開頭的/新的鏡像名 ### 以dockerhub倉庫id開頭的是爲了之後在推送的時候,根據這個名字在遠程倉庫找到對應的倉庫名 docker tag 621 yuchao163/s20-centos-vim ##9.執行這個docker鏡像,運行處容器後,查看是否攜帶了vim #語法 關鍵字 關鍵字 參數 鏡像名 你要執行的命令 docker run -it yuchao163/s20-centos-vim /bin/bash

dockerfile***

dockerfile實在是過重要了,我這裏也單獨把它做爲一個篇幅來說。

獲取docker鏡像的三種方式

1.去docker倉庫獲取的方式,一個是公網倉庫,一個是私有倉庫
    docker pull

2.獲取別人發來的鏡像,也就是自定義的鏡像 3.經過dockerfile構建docker鏡像

  你們能夠再返回看一下上面的那張闡述了開發與測試跟運維之間解決環境配置的簡圖,其中最爲重要的一點就是:開發把dockerfile(能夠當作是docker配置環境的文件)上傳至github,運維跟測試依據這個dockerfile去快速的搭建環境!

之因此利用這種方式去構建環境是由於經過dockerfile咱們能夠自定製鏡像。

  鏡像的定製就是定製每一層所添加的配置、文件。若是能夠吧每一層修改、安裝、構建、操做的命令都寫入到一個腳本,用腳原本構建、定製鏡像,這個腳本就是dockerfile。

  Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令 構建一層,所以每一條指令的內容,就是描述該層應當如何構建。

  說白了,這個文件就是定製docker鏡像的一個腳本而已,咱們須要學習裏面的功能性的參數

經過dockerfile構建docker鏡像的說明:

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=「yc_uuu@163.com"

#對於複雜的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」]

經過dockerfile定製一個python flask web程序,運行出容器

配置過程以下:

1.準備一個flask代碼文件

touch whwflask.py
vim whwflask.py

flask的代碼以下:

#coding:utf8
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
return "HELLO NARUTO"
if __name__=="__main__":
app.run(host='0.0.0.0',port=8080)

2.配置python2的包管理,安裝flask

 

easy_install -i https://pypi.tuna.tsinghua.edu.cn/simple flask

 

3.準備Dockerfile,寫入以下內容

FROM centos
COPY CentOS-Base.repo /etc/yum.repos.d/
COPY epel.repo /etc/yum.repos.d/ 
RUN yum clean all 
RUN yum install python-setuptools -y
RUN easy_install -i https://pypi.tuna.tsinghua.edu.cn/simple flask
COPY whwflask.py /opt/
WORKDIR /opt
EXPOSE 8080 #暴露容器內的8080端口
CMD ["python","whwflask.py"] #讓容器執行以下命令

4.準備好齊全的文件,開始構建docker鏡像

[root@s20 s20docker]# ls
CentOS-Base.repo Dockerfile epel.repo whwflask.py

5.構建docker鏡像的命令,這個命令得在Dockerfile的目錄下執行!!!

docker build .

6.構建鏡像完成以後,查看鏡像文件

docker images
# 6f0是docker鏡像的id的前三個字母
docker tag 6f0 whw-flask-docker

7.運行這個鏡像便可

docker run -d -p 7777:8080 6f0

docker倉庫的學習

docker提供了一個相似於github的倉庫dockerhub。

網址是https://hub.docker.com/須要註冊使用。

公有倉庫

公有倉庫的使用比較簡單,基本步驟以下:

#註冊docker id後,在linux中登陸dockerhub
docker login #輸入你的帳號密碼 就能夠成功登陸

#注意要保證image的tag是帳戶名,若是鏡像名字不對,須要改一下tag
docker tag 你的dockerhub帳號名/你的docker鏡像名 本地的鏡像id或名

語法是:docker tag 倉庫名 huoyingwhw/倉庫名

#推送docker image到dockerhub
docker push huoyingwhw/centps-cmd-exec:latest

#在dockerhub中檢查鏡像
https://hub.docker.com/

#刪除本地鏡像,測試下載pull 鏡像文件
docker pull huoyingwhw/centos-entrypoint-exec

私有倉庫

私有倉庫的配置方法以下:

1.下載一個registry 私有倉庫鏡像 # 這個 \ 是換行符的意思 
# -v 是數據文件夾掛載  ,宿主機的數據文件夾:容器內的文件夾

docker run -d \
    -p 5000:5000 \
    -v /opt/data/registry:/var/lib/registry \
    registry
    
2.能夠查看私有倉庫的api數據地址,以下
http://10.0.0.128:5000/v2/_catalog

3.可是此時的私有倉庫還無法使用,它不支持http方式的推送,修改默認的配置文件便可 1.編輯docker的配置文件
    vim /etc/docker/daemon.json  
    2.寫入以下信息,地址改爲你本身的ip
    {"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
        "insecure-registries":["10.0.0.128:5000"]
    }
    3.修改docker的配置文件
vim
/lib/systemd/system/docker.service 添加以下配置,在[Service]的代碼區域塊中,添加以下參數 [Service] EnvironmentFile=-/etc/docker/daemon.json 4.從新加載這個文件 systemctl daemon-reload 5.重啓整個docker服務 systemctl restart docker 6.從新啓動一個私有倉庫 # 外部的9000端口映射到docker容器的5000端口 docker run --privileged=true -d -p 9000:5000 -v /opt/data/registry:/var/lib/registry registry 參數解釋: --privileged=true docker容器的安全機制:設置特權級運行的容器 7.推送本地的鏡像,到私有倉庫中去 docker push 10.0.0.128:5000/whw-hello-world 8.其餘同事就能夠經過這個私有倉庫的鏡像地址獲取你的鏡像了 docker pull 10.0.0.128:5000/whw-hello-world 4.還得修改本地鏡像的名字,以倉庫地址爲開頭 #docker tag 你要修改的鏡像 修改以後的鏡像名 docker tag fce 10.0.0.128:5000/whw-hello-world 5.編寫Dockerfile,文件名固定 touch dockerfile vim dockerfile ...
相關文章
相關標籤/搜索