Docker: dockerfile 使用介紹

Docker簡介

?

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

?

Docker項目提供了構建在Linux內核功能之上,協同在一起的的高級工具。其目標是幫助開發和運維人員更容易地跨系統跨主機交付應用程序和他們的依賴。Docker通過Docker容器,一個安全的,基于輕量級容器的環境,來實現這個目標。這些容器由鏡像創建,而鏡像可以通過命令行手工創建或 者通過Dockerfile自動創建。

Dockerfile

Dockerfile是由一系列命令和參數構成的腳本,這些命令應用于基礎鏡像并最終創建一個新的鏡像。它們簡化了從頭到尾的流程并極大的簡化了部署工作。Dockerfile從FROM命令開始,緊接著跟隨者各種方法,命令和參數。其產出為一個新的可以用于創建容器的鏡像。

Dockerfile 語法

在我們深入討論Dockerfile之前,讓我們快速過一下Dockerfile的語法和它們的意義。

什么是語法?

非常簡單,在編程中,語法意味著一個調用命令,輸入參數去讓應用執行程序的文法結構。這些語法被規則或明或暗的約束。程序員遵循語法規范以和計算機 交互。如果一段程序語法不正確,計算機將無法識別。Dockerfile使用簡單的,清楚的和干凈的語法結構,極為易于使用。這些語法可以自我釋義,支持注釋。

Dockerfile 語法示例

Dockerfile語法由兩部分構成,注釋和命令+參數

# Line blocks used for commenting
command argument argument?..

一個簡單的例子:

# Print "Hello docker!"
RUN echo?"Hello docker!"

Dockerfile 命令

Dockerfile有十幾條命令可用于構建鏡像,下文將簡略介紹這些命令。

ADD

ADD命令有兩個參數,源和目標。它的基本作用是從源系統的文件系統上復制文件到目標容器的文件系統。如果源是一個URL,那該URL的內容將被下載并復制到容器中。

# Usage: ADD [source directory or URL] [destination directory]
ADD?/my_app_folder?/my_app_folder?

CMD

和RUN命令相似,CMD可以用于執行特定的命令。和RUN不同的是,這些命令不是在鏡像構建的過程中執行的,而是在用鏡像構建容器后被調用。

# Usage 1: CMD application "argument", "argument", ..
CMD?"echo"?"Hello docker!"

ENTRYPOINT

配置容器啟動后執行的命令,并且不可被?docker?run?提供的參數覆蓋。

每個?Dockerfile?中只能有一個?ENTRYPOINT,當指定多個時,只有最后一個起效。

ENTRYPOINT 幫助你配置一個容器使之可執行化,如果你結合CMD命令和ENTRYPOINT命令,你可以從CMD命令中移除“application”而僅僅保留參數,參數將傳遞給ENTRYPOINT命令。

# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD?"Hello docker!"
ENTRYPOINT echo

ENV?

ENV命令用于設置環境變量。這些變量以”key=value”的形式存在,并可以在容器內被腳本或者程序調用。這個機制給在容器中運行應用帶來了極大的便利。

# Usage: ENV key value
ENV SERVER_WORKS?4

EXPOSE

EXPOSE用來指定端口,使容器內的應用可以通過端口和外界交互。

# Usage: EXPOSE [port]
EXPOSE?8080

FROM

FROM命令可能是最重要的Dockerfile命令。改命令定義了使用哪個基礎鏡像啟動構建流程。基礎鏡像可以為任意鏡 像。如果基礎鏡像沒有被發現,Docker將試圖從Docker image index來查找該鏡像。FROM命令必須是Dockerfile的首個命令。

# Usage: FROM [image name]
FROM ubuntu?

MAINTAINER

我建議這個命令放在Dockerfile的起始部分,雖然理論上它可以放置于Dockerfile的任意位置。這個命令用于聲明作者,并應該放在FROM的后面。

# Usage: MAINTAINER [name]
MAINTAINER authors_name?

RUN

RUN命令是Dockerfile執行命令的核心部分。它接受命令作為參數并用于創建鏡像。不像CMD命令,RUN命令用于創建鏡像(在之前commit的層之上形成新的層)。

# Usage: RUN [command]
RUN aptitude install?-y riak

USER

USER命令用于設置運行容器的UID。

# Usage: USER [UID]
USER?751

VOLUME

VOLUME命令用于讓你的容器訪問宿主機上的目錄。

# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME?["/my_files"]

WORKDIR

WORKDIR命令用于設置CMD指明的命令的運行目錄。

# Usage: WORKDIR /path
WORKDIR?~/

如何使用Dockerfiles

使用Dockerfiles和手工使用Docker Daemon運行命令一樣簡單。腳本運行后輸出為新的鏡像ID。

# Build an image using the Dockerfile at current location
# Example: sudo docker build -t [name] .
sudo docker build?-t my_mongodb?.

?

Dockerfile 示例一:創建一個MongoDB的鏡像

在這部分中,我們講一步一步創建一個Dockfile,這個Dockerfile可用于構建MongoDB鏡像進而構建MongoDB容器。

創建一個Dockerfile

使用nano文本編輯器,讓我們創建Dockerfile。

sudo nano?Dockerfile

定義文件和它的目的

讓閱讀者明確Dockerfile的目的永遠是必要的。為此,我們通常從注釋開始寫Dockerfile。

############################################################
# Dockerfile to build MongoDB container images
# Based on Ubuntu
############################################################

設置基礎鏡像?

# Set the base image to Ubuntu
FROM ubuntu

定義作者

# File Author / Maintainer
MAINTAINER?Example?McAuthor

設置命令與參數下載MongoDB

################## BEGIN INSTALLATION ######################
# Install MongoDB Following the Instructions at MongoDB Docs
# Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
# Add the package verification key
RUN apt-key adv?--keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
# Add MongoDB to the repository sources list
RUN echo?'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen'?|?tee?/etc/apt/sources.list.d/mongodb.list
# Update the repository sources list once more
RUN apt-get?update
# Install MongoDB package (.deb)
RUN apt-get?install?-y mongodb-10gen
# Create the default data directory
RUN mkdir?-p?/data/db
##################### INSTALLATION END #####################

設置MongoDB端口?

# Expose the default port
EXPOSE?27017
# Default port to execute the entrypoint (MongoDB)
CMD?["--port 27017"]
# Set default container command
ENTRYPOINT usr/bin/mongod

保存Dockerfile。

構建鏡像

使用上述的Dockerfile,我們已經可以開始構建MongoDB鏡像

sudo docker build?-t my_mongodb?.

Dockerfile 示例二:創建一個Nginx的鏡像

Nginx簡述

Nginx是一個高性能的 HTTP 和 反向代理 服務器。它因為它的輕量級,易用,易于擴展而流行于業界。基于優良的架構設計,它能夠比之前的類似軟件處理更多的請求。它也可以用來提供靜態文件服務,比如圖片,腳本和CSS。

和上個例子一樣,我們還是從基礎鏡像開始,運用FROM命令和MAINTAINER命令

############################################################
# Dockerfile to build Nginx Installed Containers
# Based on Ubuntu
############################################################
# Set the base image to Ubuntu
FROM ubuntu
# File Author / Maintainer
MAINTAINER?Maintaner?Name

安裝Nginx

# Install Nginx
# Add application repository URL to the default sources
RUN echo?"deb http://archive.ubuntu.com/ubuntu/ raring main universe"?>>?/etc/apt/sources.list
# Update the repository
RUN apt-get?update
# Install necessary tools
RUN apt-get?install?-y nano wget dialog net-tools
# Download and Install Nginx
RUN apt-get?install?-y nginx

Bootstrapping?

安裝Nginx后,我們需要配置Nginx并且替換掉默認的配置文件

# Remove the default Nginx configuration file
RUN rm?-v?/etc/nginx/nginx.conf
# Copy a configuration file from the current directory
ADD nginx.conf?/etc/nginx/
# Append "daemon off;" to the beginning of the configuration
RUN echo?"daemon off;"?>>?/etc/nginx/nginx.conf
# Expose ports
EXPOSE?80
# Set the default command to execute
# when creating a new container
CMD service nginx start

保存 dockfile。

使用Dockerfile自動構建Nginx容器

因為我們命令Docker用當前目錄的Nginx的配置文件替換默認的配置文件,我們要保證這個新的配置文件存在。在Dockerfile存在的目錄下,創建nginx.conf:

  1. sudo nano nginx.conf

然后用下述內容替換原有內容:

worker_processes?1;
events?{?worker_connections?1024;?}
http?{sendfile on;server?{listen?80;location?/?{proxy_pass http://httpstat.us/;proxy_set_header X-Real-IP $remote_addr;}}
}

讓我們保存nginx.conf。之后我們就可以用Dockerfile和配置文件來構建鏡像。

?

轉自:https://www.cnblogs.com/boshen-hzb/p/6400272.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448811.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Hello CSS】第六章-文檔流與排版

作者:陳大魚頭github: KRISACHAN正常流 什么是“正常流”? 其實就是我們日常所說的“文檔流”。 在W3C官方文檔里對應的是“normal flow”。 正常流的盒子屬于格式化上下文(FC),在CSS2.2中可以是表格、塊或內聯。 在CSS3中引入了f…

創建型模式---工廠模式

工廠模式 在工廠設計模式中,客戶端可以請求一個對象,而無需要知道這個對象來自哪里,也就是使用哪個類來生成這個對象。工廠背后的思想是簡化對象的創建。與客戶端自己基于類實例化直接創建對象相比,基于一個中心化函數來實現&…

OpenCL memory object 之 Global memory (2)

當我們用clCreateBuffer, clCreateImage創建OpenCL memory object時候,我們需要輸入一個flag參數,這個參數決定memory object的位置。 cl_mem clCreateBuffer (cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errc…

數據結構進階篇-跳表

大家想必都知道,數組和鏈表的搜索操作的時間復雜度都是O(N)的,在數據量大的時候是非常耗時的。對于數組來說,我們可以先排序,然后使用二分搜索,就能夠將時間復雜度降低到O(logN),但是有序數組的插入是一個O…

查看本機ssh公鑰,生成公鑰

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 查看ssh公鑰方法: 1.通過命令窗口:打開你的git bash 窗口,進入.ssh目錄:cd ~/.ssh&…

如何實現動態水球圖 --》 echars結合echarts-liquidfill實現

1)項目中作為項目依賴,安裝到項目當中(注意必須要結合echars) npm install echarts vue-echarts --save npm install echarts-liquidfill --save 2)在需要使用水晶球的組件里引入liquidFill.js import echarts-liquidfill/src/liquidFill.js;…

OpenCL memory object 之選擇傳輸path

對應用程序來說,選擇合適的memory object傳輸path可以有效提高程序性能。 下面先看一寫buffer bandwidth的例子: 1. clEnqueueWriteBuffer()以及clEnqueueReadBuffer() 如果應用程序已經通過malloc 或者mmap分配內存,CL_MEM_USE_HOST_PTR是個…

struts入門超詳細

https://blog.csdn.net/yerenyuan_pku/article/details/52652262轉載于:https://www.cnblogs.com/liuna369-4369/p/10870873.html

RabbitMQ 從入門到精通 (一)

目錄 1. 初識RabbitMQ2. AMQP3.RabbitMQ的極速入門4. Exchange(交換機)詳解4.1 Direct Exchange4.2 Topic Exchange4.3 Fanout Exchange5. Message 消息1. 初識RabbitMQ RabbitMQ 是一個開源的消息代理和隊列服務器,用來通過普通協議在完全不同的應用之間共享數據&a…

接收并解析消息體傳參、解析 json 參數

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.場景:postman 發送了一個 post 請求,如下: 2. 解析方式為用一個 vo 對象來接收 json。把 json 中的…

OpenCL memory object 之 傳輸優化

首先我們了解一些優化時候的術語及其定義: 1、deferred allocation(延遲分配), 在第一次使用memory object傳輸數據時,runtime才對memory object真正分配空間。 這樣減少了資源浪費,但第一次使用時要慢一些…

VBS使文本框的光標位于所有字符后

有時候在文本框里會顯示一部分提示信息,用戶在這些提示信息后面輸入文本,但是將焦點設置于文本框后,光標總是在文本框的最前面, 用戶輸入的時候需要按"-->"鍵將光標移到最后才能輸入,這樣的操作很不爽。我…

記錄ionic 最小化應用時所遇的問題

ionic3與ionic4最小化插件安裝不一樣: ionic3安裝方法: $ ionic cordova plugin add cordova-plugin-appminimize $ npm install --save ionic-native/app-minimize4 并在app.module.ts中 注入依賴: import { AppMinimize } from ionic-nativ…

解決 --- Docker 啟動時報錯:iptables:No chain/target/match by the name

問題:jenkins的docker containner啟動失敗,報錯:failed programming external connectivity … iptables: No chain/target/match by that name” docker 服務啟動的時候,docker服務會向iptables注冊一個鏈,以便讓dock…

AMD OpenCL 大學課程

AMD OpenCL大學課程是非常好的入門級OpenCL教程,通過看教程中的PPT,我們能夠很快的了解OpenCL機制以及編程方法。下載地址:http://developer.amd.com/zones/OpenCLZone/universities/Pages/default.aspx 教程中的英文很簡單,我相信…

第一篇 計算機基礎

1.什么是編程語言 python和中文、英語一樣、都是一門語言,只要是語言,其實就庫看成是一種事物與另一種事物溝通的介質。python屬于編程語言,編程語言是程序員與計算機之間溝通的介質;中文和英文則是人與人之間溝通的介質。 2.什么…

47.QT-QChart之曲線圖,餅狀圖,條形圖使用

1.使用準備 在pro中, 添加QT charts 然后在界面頭文件中添加頭文件并聲明命名空間,添加: #include <QtCharts> QT_CHARTS_USE_NAMESPACE 2.QChart之曲線圖 繪制曲線圖需要用到3個類 QSplineSeries: 用于創建有由一系列數據組成的曲線.類似的還有QPieSeries(餅圖數據). Q…

Docker 部署應用、jar 工程 docker 方式部署

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 把要部署的工程打成一個jar包。&#xff08;我的工程叫 gentle &#xff09; 打 jar 的方法&#xff1a;超簡單方法&#xff1a; Int…

流浪不是我的初衷 ... ...

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 或許&#xff0c;我從來就是一個習慣沉默的人 ... 或許&#xff0c;我從來就不善于傾述 ... 會有難過的時候&#xff0c;會有覺得累的…

第二階段沖刺(2)

1、整個項目預期的任務量 &#xff08;任務量 所有工作的預期時間&#xff09;和 目前已經花的時間 &#xff08;所有記錄的 ‘已經花費的時間’&#xff09;&#xff0c;還剩余的時間&#xff08;所有工作的 ‘剩余時間’&#xff09; &#xff1b; 所有工作的預期時間&#…