docker 學習(一)鏡像和鏡像的構建Dockerfile

docker學習

概述

  • 誕生時間:2013年
  • 編寫語言:go
  • 目標:實現輕量級操做系統虛擬化解決方案。
  • 基礎是Linux容器(LXC)等技術。
  • 與傳統虛擬化的區別:
![Alt text](./1530091149104.png) ![Alt text](./1530091153149.png)

在任何地方開發、部署和運行任何應用

Docker是一款針對程序開發人員和系統管理員來開發、部署、運行應用的一款虛擬化平臺。Docker 可讓你像使用集裝箱同樣快速的組合成應用,而且能夠像運輸標準集裝箱同樣,儘量的屏蔽代碼層面的差別。Docker 會盡量的縮短從代碼測試到產品部署的時間。css

docker 組件

  • docker engine 基於虛擬化技術的輕量級而且功能強大的開源引擎管理工具。
  • docker hub 分享管理images盡享的SaaS服務

爲何選擇docker

  • 快速交付應用程序
    • 部署快
    • 依賴少
    • 易遷移
    • 省資源
  • 快速構建輕鬆管理

鏡像

鏡像概述

  • docker 鏡像又文件系統疊加而成,低端是一個引導文件系統bootfs,用戶不會跟引導文件系統又交互,當容器啓動後,就會被移到內存中,引導文件系統就會被卸載。
  • 第二層是rootfs,能夠是操做系統。docker裏rootfs永遠是隻讀狀態
  • 鏡像存在只讀層,不會改變
  • 父鏡像:每一個鏡像均可能依賴有一個或多個下層組成的一個鏡像,下層就是上層的父鏡像
  • 基礎鏡像:沒有父鏡像的鏡像就是基礎景象
  • 鏡像id:全部鏡像都經過一個64位十六進制字符串內部是256bit的值來標識,爲了簡化使用,前12個字符組成短id。

獲取鏡像

docker pull命令從倉庫獲取鏡像,默認倉庫源是docker官方源,爲了加快速度,可使用其它源地址:mysql

docker pull  http://localhost:5000/ubuntu:18.04

最經常使用的是更換docker默認源爲國內源:
vim /etc/docker/daemon.jsonnginx

{
      "registry-mirrors": [ "https://registry.docker-cn.com" ] }

重啓docker便可使用git

列出本地鏡像

docker imagesweb

REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
192.168.100.52:5000/centos        latest              7a5530ef979d        5 days ago          4.75 GB
centos                            lnmp2               7a5530ef979d        5 days ago          4.75 GB
127.0.0.1:5000/centos             latest              7a5530ef979d        5 days ago          4.75 GB
192.168.100.52/centos             latest              7a5530ef979d        5 days ago          4.75 GB

id相同的鏡像是同一個鏡像
tag用來標記贊成倉庫的不一樣鏡像
使用docker run 啓動鏡像的時候,若是不指定具體的tag。怎會啓動最新latestsql

構建鏡像

通常來講不是真正的建立新鏡像,而是基於一個已有的基礎鏡像,如ubuntu,centos等構建新鏡像而已。docker

1.能夠從已有鏡像上更新,也能夠基於本地系統建立

修改已有鏡像

先使用鏡像啓動容器,而後進入容器進行修改,修改完成後退出容器,用docke commit 命令進行提交更改後的容器副本,shell

提交

docker commitapache

選項:
-a :提交的鏡像做者; -c :使用Dockerfile指令來建立鏡像; -m :提交時的說明文字; -p :在commit時,將容器暫停。

2.Dockerfile和docker build構建鏡像:

  • Dockerfile使用的是DSL語法。docker build基於Dockerfile裏面的指定進行構建鏡像。
  • 建立一個空目錄,並新建Dockerfile文件
    mkdir -p /home/docker-web && cd /home/docker-web && touch Dockerfile
    vim Dockerfile
#註釋
FROM ubuntu:14.04 #指定一個基礎鏡像,FROM要大寫
MAINTAINER #鏡像做者以及聯繫方式
RUN #RUN命令會在當前鏡像中運行指定命令。好比:
RUN yum -y install apache
默認狀況下,RUN指令會在shell裏使用命令包裝器/bin/sh -c來執行,不支持shell用exec格式的RUN
RUN [ "yum","-y","install","apache"]
EXPOSE指定須要打開哪些端口

構建鏡像
docker build -t="centos/apache:v1 ."
-t 選項爲鏡像指定倉庫和鏡像名字。
.指定在當前目錄中指定Dockerfile
也能夠指定一個git倉庫源地址
構建每一步都會有id,若是構建出錯,進入前一步驟的id進行調試,而後再次構建。
- Dockerfile和構建緩存
因爲每步過程都會提交爲鏡像,最終鏡像以前的鏡像就能夠看做是緩存,若是構建失敗對某一步驟進行調試,前面幾步沒有改動,會在有修改的步驟開始進行構建。
不須要構建緩存時,用--no-cache參數
- 基於緩存構建Dockerfile模板
構建緩存的好處是,能夠實現簡單的Dockerfile模板,,好比在Dockerfile文件頂部增長包倉庫或者更新包,儘量命中緩存。
- ENV指令爲環境變量,因爲鏡像的層次文件系統,環境變量在後續的層次中被引用。當容器啓動後,在容器能夠經過env命令查看環境變量。
ENV DIR=/usr/local/
WORKDIR $DIR
ENV建立的環境變量會持久的保存到今後鏡像建立的任何容器中,也可因此使用docker run -e參數指定環境變量,只在啓動時有效
- RUN命令是構建容器時所須要運行的命令
- CMD是在容器運行時,須要運行的命令,將要運行的命令放在一個數組結構中例如:CMD ["bin/bash","ls"], 若是不加數組結構,docker會在命令前加上/bin/sh -c
- 啓動容器時docker run命令能夠覆蓋CMD
- Dockerfile中只能指定一個CMD命令。多個CMD只會執行最後一個
- ENTRYPOINT指令與CMD類似,區別:docker run會覆蓋CMD命令,可是不能覆蓋ENTRYPOINT命令。如需覆蓋在啓動時市容docker run --entrypoint
- WORKDIR指令從鏡像建立容器時,在容器內設置一個工做目錄,指定ENTRYPOINT和/或者CMD、RUN、COPY、ADD指令的工做目錄,若是不存在,就會建立。能夠屢次設置。在啓動容器時,用docker run -w參數進行覆蓋。
- USER指令用來指定該鏡像會議什麼用戶運行。啓動時用docker run -u參數進行覆蓋。默認爲root。json

USER user
USER user:group
USER uid:gid
USER uid:group
  • VOLUME指令基於鏡像建立的容器添加捲,VOLUME ["/data/mysql","data"]
  • ADD指令將構建環境下的文件和目錄複製到鏡像中,ADD passwd /etc/passwd將本地構建目錄下的passwd複製到鏡像中/etc/passwd。能夠是一個url,或者構建上下文文件或者目錄,不能是構建目錄意外的文件。docker經過末尾的/判斷是目錄仍是文件。添加url示例:ADD http://www.baidu.com/123.zip /home/baidu.zip當ADD的文件是本地歸檔文件。會自動解包。ADD baidu.zip /home/會自動解包,若是存在目標文件或目錄,不會被覆蓋,自動解壓支支持本地歸檔文件,不支持url。若是目標路徑不存在則會自動建立
  • COPY指令與ADD相似,區別是COPY只是在構建上下文中複製本地文件,不會提取和解壓,本地文件與Dockerdile同一路徑。目標位置必須是是容器內的一個絕對路徑。任何由該指令建立的文件uid和gid都是0
  • ONBUILD指令是Dockerfile文件中的觸發器,並不會在基於此Dockerfile構建鏡像中生效,當基於此父鏡像構建子鏡像時,纔會觸發生效。孫子鏡像不能觸發,onbuild不能執行FROM、MAINTAINER、和ONBUILD自己
  • EXPOSE指令是告訴docker該容器內部的應用程序會使用容器的指定端口,
相關文章
相關標籤/搜索