八、【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
2、MAINTAINER
語法:MAINTAINER
3、RUN
語法:RUN
4、CMD
支援三種方式:
-
CMD ["executable", "param1", "param2"],使用 exec執行,推薦方式。
-
CMD command param1 param2,在 /bin/sh 中執行,提供給需要互動的應用。
-
CMD ["param1","param2"],提供給 ENTRYPOINT的預設引數。
指定啟動容器時執行的命令,每個Dockerfile只能由一條 CMD命令。若指定多條,則只有最後一條有效。若在啟動容器時,指定了執行的命令,則CMD命令將會被覆蓋。
5、EXPOSE
語法:EXPOSE
6、ENV
語法:ENV
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
8、COPY
語法:COPY
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 linux】linux系統映象轉化為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設計模式之——建造者模式、原型模式(建立性)【讀書筆記】
一、建造者模式(生成器模式) 定義:將一個複雜物件的構建和它的表示分離開,使得同樣的構建過程可以得到不同的表示。 效果:採用建造者模式,使用者只需要選擇建造的型別就可以得到它們,而具體的建造過程和細節就不需要