1. 程式人生 > >八、【Docker筆記】使用Dockerfile建立映象

八、【Docker筆記】使用Dockerfile建立映象

在前面我們講解了基於已有的映象容器建立和基於本地模板匯入兩種方式來建立映象,在這裡我們就來說說第三種建立映象的方式。Dockerfile是一個文字格式的配置檔案,我們可以通過Dockerfile快速建立自定義的映象。

一、基本結構

Dockerfile是由多行命令語句組成的,並且在檔案中支援以 # 開始的註釋行。我們一般將Dockerfile檔案分為四部分:基礎映象資訊、維護者資訊、映象操作指令和容器啟動時執行指令。其中,第一行(不包含註釋行)必須指定基於的基礎映象,例如:FROM ubuntu。之後可以是維護者資訊,如:MAINTAINER gongziqi [email protected]。再往後可以是映象的操作指令,如:

RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list

RUN apt-get update && apt-get install -y nginx

RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

最後可以是容器啟動時執行指令,如:CMD /usr/sbin/nginx。

# 0. 在ubuntu映象的基礎上,安裝inotify-tools/nginx/apache2/openssh-server等,建立新的Nginx映象
	# Nginx
	# VERSION 1.0
	FROM ubuntu
	MAINTAINER gongziqi [email protected]
	RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
	
# 1. 在ubuntu映象基礎上,安裝firefox/vnc。啟動後,使用者可通過5900埠通過vnc方式使用firefox
	# FireFox over VNC
	# VERSION 1.0
	FROM ubuntu
	RUN apt-get update && apt-get install -y x11vnc xvfb firefox
	RUN mkdir ./.vnc
	RUN x11vnc -storepasswd 123456 ~/.vnc/passwd
	RUN bash -c 'echo "firefox" >> /.bashrc'
	EXPOSE 5900
	CMD ["x11vnc","-forever","usepw","-create"]

二、指令

1、FROM

語法為:FROM 或 FROM :。若在同一個Dockerfile中建立多個映象,可以使用多個FROM即每個映象一個。

2、MAINTAINER

語法:MAINTAINER ,用來指定維護者資訊。

3、RUN

語法:RUN 或 RUN ["executable","param1","param2"]。第一個將在shell終端中執行命令,即 /bin/bash -c;第二個則使用 exec 執行。每條RUN指令將在當前映象基礎上執行指定指令,並提交為新的映象。若命令列太長可以使用 \ 來換行書寫。

4、CMD

支援三種方式:

  • CMD ["executable", "param1", "param2"],使用 exec執行,推薦方式。

  • CMD command param1 param2,在 /bin/sh 中執行,提供給需要互動的應用。

  • CMD ["param1","param2"],提供給 ENTRYPOINT的預設引數。

    指定啟動容器時執行的命令,每個Dockerfile只能由一條 CMD命令。若指定多條,則只有最後一條有效。若在啟動容器時,指定了執行的命令,則CMD命令將會被覆蓋。

5、EXPOSE

語法:EXPOSE [ ...],如:EXPOSE 22 80 8443,即告訴Docker伺服器容器暴露的埠,這些埠可供互聯使用。此時在容器啟動中,可使用 -P 來隨機指定一個埠,也可使用 -p 來指定具體的埠對映。

6、ENV

語法:ENV 。指定一個環境變數,會被後面的RUN指令使用,並在容器執行時保持。如:

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

7、ADD

語法:ADD 。將複製指定的src到容器中的desc。其中,src 可以是Dockerfile所在目錄的一個相對路徑(檔案/目錄);也可為一個URL;還可為一個tar檔案。

8、COPY

語法:COPY 。複製本地主機的src(Dockerfile所在目錄的相對路徑)到容器中的desc。當目標路徑不存在時,將自動建立。當使用本地目錄為源目錄時,推薦使用COPY,不推薦ADD。

9、ENTRYPOINT

語法:ENTRYPOINT ["executable","param1","param2"] 或 ENTRYPOINT command param1 param2(shell中執行)。配置容器啟動後執行的命令,並且不可被docker run 提供的引數覆蓋。每個Dockerfile只能有一個ENTRYPOINT,當指定多個時,只有最後一個有效。

10、VOLUME

語法:VOLUME ["/data"]。建立一個可以從本地主機或其他容器掛載的掛載點,一般用來存放資料庫和需要保持的資料等。

11、USER

語法:USER daemon。指定執行容器時的使用者名稱或UID,後續的RUN指令也會使用指定使用者。當服務不需要管理員許可權時,可通過該命令指定執行使用者,並且可以在之前建立所需要的使用者。如:RUN groupadd -r postgres && useradd -r -g postgres postgres。若此時需要臨時獲取管理員許可權,則可使用gosu,不推薦使用sudo。

12、WORKDIR

語法:WORKDIR /path/to/workdir。為後續的 RUN、CMD、ENTRYPOINT指令配置工作目錄。可使用多個WORKDIR,若後面的WORKDIR指定的是相對路徑,則是基於前一個WORKDIR指定的路徑。如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
# 結果為:/a/b/c

13、ONBUILD

語法:ONBUILD [INSTRUCTION]。配置當所建立的映象作為其他新建立映象的基礎映象時,所執行的操作指令。如:Dockerfile使用如下的內容建立了映象 image-A。

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

若基於image-A建立新的映象時,新的Dockerfile中使用 FROM image-A指定基礎映象時,會自動執行 ONBUILD 指令內容,即等價於在 FROM指令後添加了以上的兩條指令。在使用ONBUILD指令的映象,我們推薦在標籤中註明,如:ruby:1.9-onbuild。

三、建立映象

在編寫完Dockerfile之後,可以通過 Docker build 命令來建立映象。語法為:docker build [選項] 路徑,即讀取指定路徑下的Dockerfile,並將該路徑下所有內容傳送給Docker服務端,由服務端來建立映象。因此我們建議放置Dockerfile的目錄為空目錄。若為非空目錄,希望忽略路徑下的某些目錄或檔案,可通過 .dockerignore檔案來配置。

# 指定Dockerfile路徑所在路徑為 /tmp/docker_builder/,希望生成映象標籤為 build_repo/first_image, # 在標籤命名時需要注意,所有字母必須為小寫
$ sudo docker build -t build_repo/first_image /tmp/docker_builder/

四、一個例項

根據以上資訊,我們來自己建立一個Nginx映象。

# 0. 建立Dockerfile所在目錄
$ sudo mkdir /opt/tmp_dockerbuilder

# 1. 建立Dockerfile檔案並編寫內容
$ sudo vim Dockerfile
	# Nginx
	# VERSION 1.0
	FROM ubuntu
	MAINTAINER gongziqi [email protected]
	RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server

# 2. 檢視當前本地映象
$ sudo docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE

# 3. build Dockerfile檔案,建立映象
$ sudo docker build -t nginx/mynginx /opt/tmp_dockerbuilder/Dockerfile
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu
 ---> 4e5021d210f6
Step 2/3 : MAINTAINER gongziqi [email protected]
 ---> Running in 8dc5269da475
Removing intermediate container 8dc5269da475
 ---> e27af3f3a447
Step 3/3 : RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
 ---> Running in 2ec0f5b9fc81
 ........
 ........
 ........
Successfully built d27de6c7896d
Successfully tagged nginx/mynginx:latest

# 4. 再次檢視本地映象
$ sudo docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
nginx/mynginx        latest              d27de6c7896d        6 minutes ago       275MB

# 5. 以當前建立的映象執行容器
$ sudo docker run -ti d27de6c7896d /bin/bash
root@a505965d1b84:/#

# 6. 檢視當前的容器中是否有我們剛才需要安裝的相關軟體
root@a505965d1b84:/# find / -name apache2
/etc/cron.daily/apache2
/etc/init.d/apache2
/etc/logrotate.d/apache2
/etc/apache2
/etc/ufw/applications.d/apache2
find: '/proc/1/map_files': Operation not permitted
find: '/proc/12/map_files': Operation not permitted
/usr/lib/apache2
/usr/sbin/apache2
/usr/share/bug/apache2
/usr/share/doc/apache2
/usr/share/lintian/overrides/apache2
/usr/share/apache2
/var/cache/apache2
/var/lib/apache2
/var/log/apache2

# 7. 檢視ubuntu映象執行的容器中是否有apache2
$ sudo docker run -tid ubuntu /bin/bash
$ sudo docker exec -ti 6df8ff14f57f /bin/bash
root@6df8ff14f57f:/# find / -name apache2
find: '/proc/1/map_files': Operation not permitted
find: '/proc/10/map_files': Operation not permitted
find: '/proc/19/map_files': Operation not permitted
root@6df8ff14f57f:/#

# 說明:我們會發現剛才的配置的 apache2 軟體已被安裝,而基於的 ubuntu映象本身是沒有apache2的

相關推薦

Docker筆記使用Dockerfile建立映象

在前面我們講解了基於已有的映象容器建立和基於本地模板匯入兩種方式來建立映象,在這裡我們就來說說第三種建立映象的方式。Dockerfile是一個文字格式的配置檔案,我們可以通過Dockerfile快速建立自定義的映象。 一、基本結構 Dockerfile是由多行命令語句組成的,並且在檔案中支援以 # 開始的註釋

Docker筆記進入Docker世界

​ 我們平時判斷一個電腦的效能主要看什麼?磁碟讀寫?CPU的主頻高低?還是記憶體的大小?可是作為個人使用者來說,這些引數高一些足夠我們去使用了,可是對於一個大型系統甚至是超大型系統,當前的硬體是遠遠達不到的。而作為當前的雲端計算時代,虛擬化技術就發揮了自己的獨特的作用。 ​ 隨著資訊科技的快速發展,虛擬

Docker筆記Docker中網路基礎配置

一個系統一般都包含多個服務元件,這些大量的服務元件不可能放在同一個容器中,這就需要多個容器之間可以互相通訊。Docker提供了兩種方式來實現網路服務:對映容器埠到宿主主機、容器互聯機制。 一、埠對映實現訪問容器 1、從外部訪問容器中的應用 在啟動容器時,若我們不指定某些引數,則我們在容器外部是無法通過網路來訪

Docker筆記-開啟TCP管理埠

如果我們通過docker來整合spring cloud專案,可以通過maven-docker外掛將構建好的映象直接推送到docker伺服器上,但是生產環境建議關閉該功能,為了安全考慮。開啟tcp遠端監聽埠示例如下: 開啟docker apiserver的2375管理埠,本示例在CentOS7環境下。編輯do

Docker江湖建立帶有SSH服務的映象

開啟微信掃一掃,關注微信公眾號【資料與演算法聯盟】 轉載請註明出處:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/

[轉]Docker基礎-使用Dockerfile建立映象

本文轉自:https://www.cnblogs.com/jie-fang/p/7927643.html 1、基本結構   Dockerfile由一行行命令語句組成,並支援以#開頭的註釋行。例如: # This dockerfile uses the ubuntu image #

docker linuxlinux系統映象轉化為docker映象

概述 使用docker安裝linux的同學都知道,你在docker提供的倉庫安裝linux系統,你就會體驗到最精簡的、最純淨的linux系統,當然,他會精簡到你連ifconfig命令都需要自己配置,恰好對於我來說,這並不是我想要的。如果我去使用VMware安裝linux系統,但是我已經使用了docker,就不

學習筆記堆的定義及其建立排序等基本操作的實現

目錄 堆的定義: 堆的基本操作的程式碼實現: 詳情請參見《演算法筆記》P335,此處只做簡單的學習筆記記錄。   堆的定義: 堆是一棵完全二叉樹,樹中的每個結點的值都不小於(或不大於)其左右孩子結點。 堆一般用於優先佇列的實現(目前不是很懂),故預設

學習筆記平衡二叉樹(AVL樹)簡介及其查詢插入建立操作的實現

  目錄 平衡二叉樹簡介: 各種操作實現程式碼:   詳細內容請參見《演算法筆記》P319 初始AVL樹,一知半解,目前不是很懂要如何應用,特記錄下重要內容,以供今後review。   平衡二叉樹簡介: 平衡二叉樹由兩位前

學習筆記六:面向物件的程式設計——理解JS中的物件屬性建立物件JS中的繼承

  ES中沒有類的概念,這也使其物件和其他語言中的物件有所不同,ES中定義物件為:“無序屬性的集合,其屬性包含基本值、物件或者函式”。現在常用的建立單個物件的方法為物件字面量形式。在常見多個物件時,使用工程模式的一種變體。 1.理解物件   1)物件的屬性分兩種:資料屬性和訪問器屬性,每個型別的屬性都具有

問題筆記Docker安裝問題:1啟動docker服務失敗

yum install docker 進入目錄/etc/yum.repos.d/下面新建檔案docker.repo,輸入以下內容 [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/

讀書筆記計算機網絡1章:課程介紹協議分層

視頻 打印 http dns 物理層 size cli 電子商務 ann 改變 這是我在Coursera上的學習筆記。課程名稱為《Computer Networks》。出自University of Washington。 因為計算機網絡才誕生不久

Linux筆記第九篇添加MariaDB用戶設置權限

.com 生效 mysq local 分享圖片 style info user 創建 一、登錄mysql 二、創建用戶 create user [email protected] identified by ‘dev‘; 三、給新建用戶授權數據庫h_user的權限 授權

學習筆記四:變量作用域和內存問題

允許 幫助 範圍 訪問內存 常用 ie9 值傳遞 問題: eof 1.引用類型的值   引用類型的值是指保存在內存中的對象,JavaScript不允許直接訪問內存中的位置,因此在操作對象時,實際上是操作的引用而不是實際的對象。(嚴密的說法是:當復制保存著對象的某個變量時,

學習筆記 唐大仕—Java程式設計 第4講 類包和介面之4.2 類的繼承

【學習筆記】 唐大仕—Java程式設計 第4講 類、包和介面之4.2 類的繼承 super的使用 1.使用super訪問父類的域和方法 注意:正是由於繼承,使用this可以訪問父類的域和方法。但是有時為了明確指明父類的域和方法,就要用關鍵字super。this和super都是指當前同一個物件

學習筆記 唐大仕—Java程式設計 第4講 類包和介面之4.4 訪問修飾符

修飾符(modifiers) 訪問修飾符(access modifiers) 如public/private等 其他修飾符 如abstract等 可以修飾類、也可以修飾類的成員(欄位、方法)   同一個類中 同一個包中 不同包中的子類

學習筆記 唐大仕—Java程式設計 第4講 類包和介面之4.6 介面

【學習筆記】 唐大仕—Java程式設計 第4講 類、包和介面之4.6 介面 介面(interface) 介面,某種特徵的約定 定義介面interface  所有方法都自動是public abstract 實現介面implements  可以實現多繼承  與類的繼承關係無關 面向介面程式設計,而不

Python筆記操作讀取Excel檔案文字檔案

需求:讀取Excel檔案、替換文字檔案中得指定某個字串並生成新的檔案 原始碼: #encoding:utf-8 # -*- coding: utf-8 -*- #!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2 #Author:

學習筆記Hands-on ML with sklearn&tensorflow [TF] [1]模型的訓練儲存和載入

本篇內容:一個簡單的預測模型的建立、訓練、儲存和載入。 匯入必要模組: import numpy as np import pandas as pd import tensorflow as tf import ssl #解決資料來源網站簽名認證失敗的問題 from sklearn.data

java設計模式之——建造者模式原型模式(建立性)讀書筆記

一、建造者模式(生成器模式)                 定義:將一個複雜物件的構建和它的表示分離開,使得同樣的構建過程可以得到不同的表示。                 效果:採用建造者模式,使用者只需要選擇建造的型別就可以得到它們,而具體的建造過程和細節就不需要