日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

镜像制作大法

發(fā)布時(shí)間:2024/3/12 编程问答 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 镜像制作大法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

鏡像制作大法

一、前言

上一節(jié)《程序員背鍋救星-docker》中,我們講述了docker最基本的概念以及鏡像、容器以及倉(cāng)庫(kù)的概念和使用,還包含了實(shí)踐內(nèi)容,我們通過(guò)拉取centos鏡像,創(chuàng)建容器并且進(jìn)入容器對(duì)linux系統(tǒng)進(jìn)行操作;但是那只是利用了倉(cāng)庫(kù)中的鏡像,然后創(chuàng)建容器進(jìn)行操作的,那我們?nèi)绻枰约旱溺R像改怎么做呢?這次就和大家一起看看鏡像是怎么制作的~


二、制作鏡像

一般制作鏡像有兩種方式,一種是基于commit命令,另外一種是基于dockerfile創(chuàng)建鏡像;

過(guò)程如下圖所示:

對(duì)于這兩種創(chuàng)建鏡像的方式,我們會(huì)實(shí)地操作一下,并且會(huì)區(qū)分一下兩種鏡像創(chuàng)建的優(yōu)點(diǎn)缺點(diǎn);

一般在工作中,會(huì)采用第二種方式,至于為什么不采用第一種,后面細(xì)說(shuō)~


<1>基于commit命令

基于commit命令

命令:

docker commit :從容器創(chuàng)建一個(gè)新的鏡像。

docker?commit?[OPTIONS]?CONTAINER?[REPOSITORY[:TAG]]

OPTIONS說(shuō)明:

  • -a :提交的鏡像作者;
  • -c :使用Dockerfile指令來(lái)創(chuàng)建鏡像;
  • -m :提交時(shí)的說(shuō)明文字;
  • -p :在commit時(shí),將容器暫停。

實(shí)踐:

按照之前《程序員背鍋救星-docker》中的實(shí)例,我們把這個(gè)容器制作成一個(gè)新的鏡像;

1、拉取鏡像
docker?pull?centos:centos7

2、運(yùn)行鏡像
docker?run?-itd?--name?centos-test?centis:centos7

3、進(jìn)入容器并安裝gcc、vim

4、在vim中編寫C代碼并編譯運(yùn)行
#include?<stdio.h>

int?main()
{
????printf("this?is?test\n");
????return?0;
}

5、退出容器
exit
6、獲取容器
docker?pa?-a

7、從容器中制作鏡像
docker?image?10ba02adb18f

8、再次制作容器
docker?run?-it?--name?test?mycentos:V1?/bin/bash

進(jìn)去發(fā)現(xiàn),我們之前所有的環(huán)境都存在,證明我們的鏡像制作的很成功


以上就是使用commit制作docker進(jìn)行全部過(guò)程啦~


<2>基于dockerfile

基于dockerfile

1、dockerfile概念

Dockerfile是由一系列命令和參數(shù)構(gòu)成的腳本,這些命令應(yīng)用于基礎(chǔ)鏡像并最終創(chuàng)建一個(gè)新的鏡像。它們簡(jiǎn)化了從頭到尾的流程并極大的簡(jiǎn)化了部署工作。Dockerfile從FROM命令開(kāi)始,緊接著跟隨者各種方法,命令和參數(shù)。其產(chǎn)出為一個(gè)新的可以用于創(chuàng)建容器的鏡像。

Dockerfile由一行行命令語(yǔ)句組成,支持#注釋。一般分為四個(gè)部分:基礎(chǔ)鏡像,維護(hù)者信息,鏡像操作指令和容器啟動(dòng)時(shí)執(zhí)行指令


2、Dockerfile 命令

下面簡(jiǎn)單的介紹幾個(gè)命令:

  • FROM

    指明構(gòu)建的新鏡像是來(lái)自于基礎(chǔ)鏡像是什么,比如:

    FROM?gcc:latest
  • RUN

    用于執(zhí)行后面跟著的命令行命令,有兩種格式:

    • shell 格式:RUN <命令行命令>(終端操作命令一樣),例如:

      RUN?mkdir?tmp
    • exec 格式:RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"],例如:

      RUN?["./test"]

  • COPY

    拷貝文件或目錄到鏡像中,COPY...,例如:

    COPY?test.cpp?/home/CPP

  • ADD

    拷貝文件或目錄到鏡像中,ADD...例如:

    ADD?test.cpp?/home/CPP

    如果是URL或壓縮包,會(huì)自動(dòng)下載或自動(dòng)解壓。


  • WORKDIR

    為RUN、CMD、ENTRYPOINT以及COPY和AND設(shè)置工作目錄,例如:

    WORKDIR?/home/CPP

  • CMD

    啟動(dòng)容器時(shí)執(zhí)行的Shell命令,例如:

    CMD?[“./test”]
    • CMD 在docker run 時(shí)運(yùn)行。
    • RUN 是在 docker build。

    注:如果 Dockerfile 中如果存在多個(gè) CMD 指令,僅最后一個(gè)生效。


  • ENV

    設(shè)置環(huán)境變量,定義了環(huán)境變量,那么在后續(xù)的指令中,就可以使用這個(gè)環(huán)境變量。

    格式:

    ENV?<key>?<value>

基本的命令就是這些了,對(duì)于我們構(gòu)建一個(gè)鏡像也差不多了,后續(xù)需要其他命令,可以自行學(xué)習(xí)~

實(shí)踐

構(gòu)建一個(gè)運(yùn)行C++程序的鏡像

1、編寫C++代碼
#include?<iostream>
#include?<unistd.h>

using?namespace?std;

int?main()
{
????while(1)
????{
????????sleep(1);
????????cout<<"this?is?test"<<endl;
????}
????return?0;
}

2、編寫dockerfile
FROM?codenvy/cpp_gcc
RUN?mkdir?/home/test
ADD?test.cpp?/home/test
WORKDIR?/home/test
RUN?g++?test.cpp
CMD?["./a.out"]
3、創(chuàng)建鏡像

執(zhí)行命令:

docker?build?-f?./test_dockerfile?-t?test_cpp_dockerfile?.

如果提示下面的錯(cuò)誤:

?--->?Running?in?de73d0b0da3e
mkdir:?cannot?create?directory?‘/home/test’:?Permission?denied
The?command?'/bin/sh?-c?mkdir?/home/test'?returned?a?non-zero?code:?1

需要在dockerflie中加上

USER?root

5、查看鏡像是否創(chuàng)建成功
docker?images

6、運(yùn)行容器
docker?run?test_cpp_dockerfile

我們會(huì)發(fā)現(xiàn)我們的程序運(yùn)行正常,沒(méi)有異常。


三、總結(jié)

這就是我們一般使用這兩種方式構(gòu)建鏡像,但是我們一般使用**Dockerfile **進(jìn)行創(chuàng)建,原因如下:(采用網(wǎng)絡(luò)資料)

使用docker commit命令雖然可以比較直觀的幫助理解鏡像分層存儲(chǔ)的概念,但是實(shí)際環(huán)境中并不會(huì)這樣使用。

首先,如果在安裝軟件,編譯構(gòu)建,那會(huì)有大量的無(wú)關(guān)內(nèi)容被添加進(jìn)來(lái),如果不小心清理,將會(huì)導(dǎo)致鏡像及其臃腫。

此外,使用docker commit 意味著所有對(duì)鏡像的操作都是黑箱操作,生成的鏡像也被稱為黑箱鏡像,換句話說(shuō),就是除了制定鏡像的人知道執(zhí)行過(guò)什么命令,怎么生成的鏡像,別人根本無(wú)從得知,而且,即使是這個(gè)制作鏡像的人,過(guò)一段時(shí)間后也無(wú)法記清具體的操作的。雖然docker diff或許可以得到一點(diǎn)線索,但是遠(yuǎn)遠(yuǎn)不到可以確保生成一致鏡像的地步。這種黑箱鏡像的維護(hù)工作是非常痛苦的。

而且,任何修改的結(jié)果僅僅是在當(dāng)前層進(jìn)行標(biāo)記,添加,修改,而不會(huì)改動(dòng)上一層。如果使用docker commit制作鏡像,以及后期修改的話,每一次修改都會(huì)讓鏡像更加臃腫一次,所刪除的上一層的東西并不會(huì)丟失,會(huì)一直如影隨形的跟著這個(gè)鏡像,即使根本無(wú)法訪問(wèn)到,這會(huì)使鏡像更加臃腫。

docker commit有一些特殊的應(yīng)用場(chǎng)合,比如被入侵后保存現(xiàn)場(chǎng)等。但是,不要使用docker commmit定制鏡像,定制行為應(yīng)該使用Dockerfile來(lái)完成。

祝大家早日熟練使用docker相關(guān)命令~


總結(jié)

以上是生活随笔為你收集整理的镜像制作大法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。