亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

定制自己的應(yīng)用鏡像

cnio / 2421人閱讀

摘要:指定了自己的執(zhí)行器,還有其他的寫法注意我們?cè)谌$R像名的時(shí)候,這里要注意,字母只能全部小寫。

這部分介紹比較實(shí)用,在開中會(huì)經(jīng)常用到,因?yàn)槲覀儠?huì)根據(jù)自己的項(xiàng)目來構(gòu)建自己的鏡像,然后發(fā)布。

第一種定制方式

首先跑起來一個(gè)ubuntu,在ubuntu上安裝相應(yīng)的軟件。

docker run -it --name temp ubuntu /bin/bash

進(jìn)來后,安裝一個(gè)apache2吧

apt-get update && apt-get install apache2

使用dpkg -L來查看下apache2安裝的位置。在/usr/local/apache2就是我們安裝的。

開始以這個(gè)容器為基礎(chǔ)來制作鏡像吧!

docker commit -a "robinyang" temp robinyang0909/apache2:latest

好了,很快就會(huì)出現(xiàn)長(zhǎng)uuid說明生成完成了。執(zhí)行docker ps看看

你肯定有疑惑,開發(fā)要是這樣來為應(yīng)用制作鏡像的話,豈不是要瘋了,確實(shí),我也這么覺得,死難用!別慌,下面來看看第二種制作鏡像的方法。

第二種定制方式

首先,在學(xué)習(xí)目錄下新建一個(gè)buildImage下新建一個(gè)Dockerfile文件(buildImage是一個(gè)docker上下文)。并在新建文件里加入下面指令:

FROM ubuntu:14.04
MAINTAINER robinyang
RUN apt-get update && apt-get install nginx
RUN echo "HelloWorld">/usr/share/nginx/html/index.html
EXPOSR 80

保存退出,先來執(zhí)行下:

docker build -t robinyang0909/nginx:latest .

上面指定不知道什么意思嗎?第一節(jié)有操作過,當(dāng)然,記不住??!確實(shí)有時(shí)候忘記了,docker build --help 查看。

這里說下原理,每執(zhí)行一條指令都穿創(chuàng)建一個(gè)鏡像層,并且會(huì)commit提交,執(zhí)行嚇一跳指定,就是基于剛才的鏡像層來創(chuàng)建。

你會(huì)發(fā)現(xiàn)在你的鏡像列表里多出一個(gè)你剛才構(gòu)建的鏡像。這樣的好,我們可以在我們的項(xiàng)目的頂級(jí)目錄下新建一個(gè)Dockerfile來給你的應(yīng)用定制鏡像。既然用Dockerfile來構(gòu)建鏡像的話,我們先來系統(tǒng)了解一下Dockerfile所需要的基本指令。

Dockerfile 基本參數(shù) FROM

Dockerfile的第一條指令,后面指定一個(gè)基礎(chǔ)鏡像。你新建的鏡像是想基于那個(gè)基礎(chǔ)鏡像來構(gòu)建的。一定要放在第一句。

FROM ubuntu:14.04

你可以 docker search 去搜索你需要的鏡像。

MAINTAINER

指定這個(gè)鏡像的作者信息。

MAINTAINER robinyang robinyang_beijing@163.com
RUN

這個(gè)用的很多,就詳細(xì)說說。在構(gòu)建鏡像的時(shí)候,在當(dāng)前鏡像層里執(zhí)行這些shell腳本,并且會(huì)commit,構(gòu)建成新一層鏡像。

RUN    //默認(rèn)是使用/bin/sh 來執(zhí)行

RUN ["", "", "", ...]    //默認(rèn)調(diào)用docker exec來執(zhí)行,有的鏡像沒有sh

來看幾個(gè)例子

RUN touch /tmp/hello.html && echo hello>hello.html

RUN /bin/bash -c "touch /tmp/hello.html && echo hello>hello.html"

RUN ["/bin/bash", "-c", "touch /tmp/hello.html && echo hello>hello.html"]

RUN ["touch", "/tmp/hello.html && echo hello>hello.html"]
EXPOSE

這個(gè)很簡(jiǎn)單,讓你的容器在運(yùn)行的時(shí)候監(jiān)聽哪個(gè)端口。但是有一點(diǎn)要注意,他監(jiān)聽的是容器的端口,而不是主機(jī)的端口,所以我們創(chuàng)建容器的時(shí)候,要用 -p 來指定端口。

EXPOSE 8080

學(xué)了以上的幾個(gè)命令的話,現(xiàn)在可以來個(gè)小練習(xí)。以tomcat為基礎(chǔ),加入一個(gè)hello.html頁面,并在頁面中加入一個(gè)helloWorld內(nèi)容。

FROM tomcat
MAINTAINER robinyang robinyang_beijing@163.com

RUN touch /usr/local/tomcat/webapps/ROOT/hello.html
RUN ["/bin/bash", "-c", "echo helloWorld>/usr/local/tomcat/webapps/ROOT/hello.html"]

EXPOSE 8080

構(gòu)建下

docker build -t robinyang09090/tomcat:latest .

鏡像制作完成了,現(xiàn)在可以創(chuàng)建容器了

docker run -d -p 8080:8080 --name testTomcat robinyang09090/tomcat

【-p 宿主機(jī):容器】

可以用你的瀏覽器訪問下 host:8080/hello.html試試。

ENV

在上面的Dockerfile 構(gòu)建文件中,我們會(huì)發(fā)現(xiàn)很多有重復(fù)的,可以用一個(gè)變量來帶代替重復(fù)的地方。改寫下上面Dockerfile

FROM tomcat
MAINTAINER robinyang robinyang_beijing@163.com

ENV rootPath=/usr/local/tomcat/webapps/ROOT/hello.html

RUN touch $rootPath
RUN ["/bin/bash", "-c", "echo helloWorld>$rootPath"]

EXPOSE 8080

是不是簡(jiǎn)潔很多。這里ENV的書寫有兩種方式:

ENV key1=val1 key2=val2  //推薦
或者
ENV key1 val1
ENV key2 val2

這些變量會(huì)被持久保存到我們創(chuàng)建的任何容器里,所以我們?nèi)〉淖兞棵⒁?,別和系統(tǒng)自帶變量名沖突就行。

CMD

在容器啟動(dòng)的時(shí)候執(zhí)行的命令,RUN則是在構(gòu)建鏡像的時(shí)候執(zhí)行的命令,這里要區(qū)分開。還記得我們?cè)谥叭萜骼飯?zhí)行循環(huán),docker run后面 /bin/sh -c "while [ true ]; do echo helloWorld; sleep 1; done"相當(dāng)于CMD的作用。

FROM ubuntu
    
CMD ["/bin/sh", "-c", "while [ true ];do echo helloWorld; sleep 1;"] 
//指定了自己的執(zhí)行器, CMD ["executable","param1","param2"]

//還有其他的寫法
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

注意:我們?cè)赿ocker build -t 取鏡像名的時(shí)候,這里要注意,字母只能全部小寫。給容器取名的可以大寫。

可以構(gòu)建我們的鏡像了

docker build -t robinyang0909/loop .

創(chuàng)建并運(yùn)行容器

docker run -d --name testLoop robinyang0909/loop

//接著打印日志
docker logs testLoop 
ENTRYPOINT

這個(gè)指令跟CMD有點(diǎn)類似,都是容器啟動(dòng)成功開始運(yùn)行執(zhí)行腳本;但又不同的地方,CMD會(huì)被覆蓋,而ENTRYPOINT不會(huì)被覆蓋;ENTRYPOINT是一個(gè)基礎(chǔ)前綴指令。

ENTRYPOINT ["/bin/sh", "-c"]
CMD ["java Hello"]

上面的會(huì)構(gòu)成一個(gè)完整的指令/bin/sh -c java Hello,CMD或者docker run后面的參數(shù),都會(huì)傳入ENTRYPOINT,他來指定執(zhí)行器,我們這里的執(zhí)行器是/bin/bash -c,一般我們會(huì)ENTRYPOINT和CMD搭配起來一起用。

WORKDIR

上面ENTRYPOINT里我們指定了一個(gè)java Hello運(yùn)行我們自己的jar包,但是有一個(gè)問題,你怎么知道你的jar在哪里。就算你知道目錄了,你難道要在Hello前拼接路徑嗎?這樣確實(shí)可以,但是不優(yōu)雅,這里有更好的方法,就是WORKDIR。

WORKDIR指定一個(gè)工作目錄,這樣CMD和ENTRYPOINT就會(huì)在該目錄下執(zhí)行我們的程序。

FROM java
ENV jarPath=/var/class/
ENTRYPOINT ["/bin/sh", "-c"]
WORKDIR $jarPath

CMD ["java Hello"]

構(gòu)建鏡像后,run一個(gè)容器,啟動(dòng)會(huì)失敗!別慌,還有一步?jīng)]有完成,等下一步完成后,就可以了。

WORKDIR可以多次出現(xiàn),意思就是切換目錄。

COPY

上面的例子跑不起來,還缺少COPY一個(gè)Hello文件,接下來,將會(huì)拷貝一個(gè)文件到鏡像里去。在Dockerfile同級(jí)目錄下新建一個(gè)tmp文件,生成一個(gè)Hello.class文件。

COPY tmp/Hello.class /var/class/

補(bǔ)充上面的,完整的是

FROM java
ENV jarPath=/var/class/
ENTRYPOINT ["/bin/sh", "-c"]
WORKDIR $jarPath

COPY tmp/Hello.class $jarPath
CMD ["java Hello"]

生成鏡像docker build -t roinyang0909/hello . ,創(chuàng)建啟動(dòng)容器docker run -d --name hello robinyang0909/hello,看下容器的日志docker logs hello發(fā)現(xiàn)我們的java程序跑起來了。

上面的 CMD ["java Hello"]千萬別寫成了CMD ["java", "Hello"]系統(tǒng)會(huì)先執(zhí)行java再執(zhí)行Hello的,是分步執(zhí)行的,很顯然只運(yùn)行java指令就出錯(cuò)。建議 一個(gè) ""就引起一個(gè)完整的指令。

上面COPY文件的時(shí)候,我們只能拷貝上下文里的文件,上下文之外的文件是沒法拷貝成功的。什么是上下文了,就是Dockerfile文件所在目錄及其子目錄,都是上下文。

VOLUMN

這個(gè)指令,估計(jì)有點(diǎn)陌生,確實(shí)!首先我們來談?wù)勅萜鞯拇鎯?chǔ)機(jī)制,我們知道,容器只能在最上面的讀寫層進(jìn)行文件的讀寫,這樣做理論上沒有問題,但是你有沒有想過一個(gè)很嚴(yán)重的問題,我在這個(gè)容器里寫了一些東西,下次升級(jí),舊容器里的文件是不是要拷貝出來,然后放入到新容器里去,最典型的應(yīng)用就是數(shù)據(jù)庫容器?,F(xiàn)在我們可以將宿主機(jī)的一個(gè)目錄掛在到容器上,這樣可以將數(shù)據(jù)放到宿主機(jī)上。

來吧!我們用容器跑一個(gè)mysql

docker pull mysql   //拉去mysql鏡像

docker run -d -p 3307:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=root mysql  //創(chuàng)建啟動(dòng)mysql容器

用SQLyog工具連接3307,密碼為root ,沒有問題。我們創(chuàng)建一個(gè)demo庫。docker stop mysql1關(guān)閉容器,重新創(chuàng)建啟動(dòng)一個(gè)mysql2的容器docker run -d -p 3307:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=root mysql,再次連接,發(fā)現(xiàn)我們剛才創(chuàng)建的demo庫沒有了。然后你可能想到的解釋就是,mysql容器將數(shù)據(jù)放在了容器里面,不同的容器數(shù)據(jù)當(dāng)然不一樣。這樣理解,也不能算錯(cuò)。其實(shí)數(shù)據(jù)是寫在宿主機(jī)上的,因?yàn)閙ysql這個(gè)鏡像指定了VOLUMN,https://github.com/docker-lib... 這是docker鏡像的制作github倉庫,在Dockerfile 里可以看到VOLUME /var/lib/mysql已經(jīng)掛在了/var/lib/mysql。

其實(shí)Dockerfile的VOLUMN掛在,只是掛在了/var/lib/docker/volumes/w75wew.../_date/這個(gè)下面的一個(gè)零食目錄里的,可以docker inspect mysql1看到Mounts信息,掛在在Source指定的宿主機(jī)目錄下

name的一長(zhǎng)串?dāng)?shù)字字符組成的id是唯一的,每次啟動(dòng)一個(gè)Dockerfile指定了VOLUMN的容器,都會(huì)創(chuàng)建一個(gè)像這樣的目錄,所以新建容器就是一個(gè)新的,是沒有數(shù)據(jù)的。

容器刪除的時(shí)候,這些零時(shí)文件不會(huì)被刪除的。假設(shè)我們沒有將這些目錄掛在到宿主機(jī)上,容器刪除了,數(shù)據(jù)還在。只不過尋找過程麻煩點(diǎn),但是這也會(huì)是一個(gè)補(bǔ)救的機(jī)會(huì)。

小結(jié): 在Dockerfile里指定VOLUMN會(huì)映射到宿主機(jī)上,但是他會(huì)在/var/lib/docker/volumns/下生成一個(gè)唯一的目錄來做掛載。

能不能讓容器的掛在目錄映射到我指定的目錄下?當(dāng)然能

docker run -d -p 3307:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=root -v /home/mysql/data/:/var/lib/mysql mysql   //將容器的/var/lib/mysql映射到宿主機(jī)的/home/mysql/data/

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/26907.html

相關(guān)文章

  • 構(gòu)建與定制:唯品會(huì) PaaS 基于 Kubernetes 實(shí)踐

    摘要:基于年底或年初沒有推廣的現(xiàn)狀,唯品會(huì)部門目前已經(jīng)做了兩年的時(shí)間。唯品會(huì)現(xiàn)狀唯品會(huì)目前線上有一千多個(gè)域,每個(gè)域之間相互的依賴比較復(fù)雜,每次的部署發(fā)布困難。這是唯品會(huì)的架構(gòu),主要包含持續(xù)集成和持續(xù)部署。 數(shù)人云上海&深圳兩地容器之Mesos/K8S/Swarm三國演義的嘉賓精彩實(shí)錄第三更來啦。唯品會(huì)是數(shù)人云Meetup的老朋友,去年曾做過RPC服務(wù)框架和Mesos容器化的分享。本次分享中,...

    JackJiang 評(píng)論0 收藏0
  • 從零開始學(xué)習(xí) Docker

    摘要:此命令下載測(cè)試鏡像并在容器中運(yùn)行它。國內(nèi)很多云服務(wù)商都提供了加速器服務(wù),例如阿里云加速器注冊(cè)用戶并且申請(qǐng)加速器,會(huì)獲得如這樣的地址。獲取鏡像阿里云鏡像庫上有大量的高質(zhì)量的鏡像可以用,這里我們就說一下怎么獲取這些鏡像并運(yùn)行。 showImg(https://segmentfault.com/img/remote/1460000012924583); 這篇文章是我學(xué)習(xí) Docker 的記錄...

    lily_wang 評(píng)論0 收藏0
  • 如何用Docker定制自己Beego環(huán)境

    摘要:如何用定制你自己的環(huán)境前言學(xué)習(xí)幾個(gè)月了,一直在論壇和群里潛水,一直都想寫點(diǎn)什么回報(bào)大家積極的知識(shí)分享。關(guān)于如何使用,可以參考上面的文章和官方文檔二小試牛刀,用構(gòu)建一個(gè)的環(huán)境并運(yùn)行程序首先來貼上我的先附上這個(gè)項(xiàng)目地址。 如何用Docker定制你自己的Beego環(huán)境 前言: 學(xué)習(xí)golang幾個(gè)月了,一直在論壇和qq群里潛水,一直都想寫點(diǎn)什么回報(bào)大家積極的知識(shí)分享。 前幾日在CSDN上...

    alaege 評(píng)論0 收藏0
  • Docker學(xué)習(xí)之基本概念及安裝(1)

    摘要:分層存儲(chǔ)因?yàn)殓R像包含操作系統(tǒng)完整的文件系統(tǒng),其體積往往是龐大的,因此在設(shè)計(jì)時(shí),就充分利用的技術(shù),將其設(shè)計(jì)為分層存儲(chǔ)的架構(gòu)。分層存儲(chǔ)的特征還使得鏡像的復(fù)用定制變的更為容易。 什么是Docker Docker 是一個(gè)開源的應(yīng)用容器引擎,基于 Go 語言 并遵從Apache2.0協(xié)議開源。Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 L...

    lvzishen 評(píng)論0 收藏0
  • Dockerfile 與 Compose 環(huán)境搭建學(xué)習(xí)筆記(一)

    摘要:的主要作用是自己根據(jù)基礎(chǔ)鏡像,重新定制鏡像,而不是直接從官方倉庫拿現(xiàn)成的使用。以接下來要構(gòu)建的環(huán)境來說明下,下面我將要搭建一個(gè)的開發(fā)環(huán)境,需要進(jìn)行配合。它的主要作用是持久化數(shù)據(jù),避免容器銷毀后內(nèi)部數(shù)據(jù)丟失暴露到宿主機(jī)的端口。 以前一直使用 Vagrant 作為自己的開發(fā)環(huán)境,并且在上家公司也推行大家采用 Vagrant 作為開發(fā)環(huán)境,保障公司使用的是同一套開發(fā)環(huán)境。隨著docker的流...

    TZLLOG 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<