Dockerfile創建鏡像的方法以(推薦docker file這種方法)及Docker常用命令


一、鏡像制作的方法

1、本地導入導出鏡像

導出命令

這里默認是把文件導出到當前運行shell的位置,后面跟的是導出路徑和文件名

docker save (imageId) > (fileName).tar

導入命令

后面跟的是導出文件的位置

docker load < (fileName).tar

2、docker commit 命令創建鏡像副本

下載一個centos鏡像

docker pull 鏡像名
例如:
docker pull centos

使用docker commit 來提交容器副本 -m 提交時的描述文字

dock commit -m 容器 鏡像名
例如:
docker commit -m  centosid centos 
或
docker commit -m 'add centos images' centosid centos


#提交當前容器到鏡像: docker commit <容器ID> <NAME:VERSION>

制作好的鏡像可以上傳官網(需要注冊賬號)

docker login

docker tag 鏡像id  Dockerhub用戶名/倉庫名/鏡像名 #打標簽

docker push Dockerhub用戶名/倉庫名/鏡像名 #推送




二、docker file方法制作鏡像

1、什么是docker file

用來全自動構建鏡像文件,命名為Dockerfile

2、Dockerfile 文件編寫指令及語法

vi Dockerfile #編輯Dockerfile文件指令

FROM       
MAINTAINER   
RUN       
CMD      
EXPOSE
ENV
ADD
COPY
ENTRYPOINT
VOLUME
USER
WORKDIR
ONBUILD



3、語法

1、FROM       <image>
  例子:FROM centos
  FROM指定構建鏡像的基礎源鏡像,如果本地沒有指定的鏡像,則會自動從Docker的公共庫pull鏡像下來。
  FROM必須是Dockerfile中非注釋行的第一個指令,即一個Dockerfile從FROM語句開始
  FROM可以在一個DOCKERfile中出現多次,如果有需求在一個Dockerfile中創建多個鏡像

2、MAINTAINER   <name>
  例子:MAINTAINER zxg zhutoyearn@163.com
  指定創建鏡像的用戶

3、RUN       <"executable","parm1","param2">
  兩種使用方式:
RUN
RUN  "executable", "param1", "param2"

  例子:RUN yum install wget -y
 

  每條RUN指令將在當前鏡像基礎上執行指定命令,並提交為新的鏡像,后續的RUN都在之前RUN提交后的鏡像為基礎,鏡像是分層的,可以通過一個鏡像的任何一個歷史提交點來創建,類似源碼的 版本控制 。

  exec 方式會被解析為一個 JSON 數組,所以必須使用雙引號而不是單引號。exec 方式不會調用一個命令 shell,所以也就不會繼承相應的變量,如:

    RUN [ "echo", "$HOME" ]  #錯誤,這個個方法不會輸出HOME變量,下面為正確方式
    RUN [ "sh", "-c", "echo", "$HOME" ]
 RUN 產生的緩存在下一次構建的適合是不會失效的,會被重用,可以使用--no-cache選擇,即docker build-no-cache,如此便不會緩存



4、CMD       <"executable",>
 三種使用方式:
CMD  "executable","param1","param2"
CMD  "param1","param2"
CMD command param1 param2 (shell form)
 例子:CMD["nginx"] 
CMD指定在 Dockerfile 中只能使用一次,如果有多個,則只有最后一個會生效。

CMD的目的是為了在啟動容器時提供一個默認的命令執行選項。如果用戶啟動容器時指定了運行的命令,則會覆蓋掉CMD指定的命令。

CMD會在啟動容器的時候執行,build 時不執行,而RUN只是在構建鏡像的時候執行,后續鏡像構建完成之后,啟動容器就與RUN無關了,這個初學者容易弄混這個概念,這里簡單注解一下。


  
5、EXPOSE  <port>[<port>...]
  告訴docker服務端容器對外映射的本地端口,需要在docker run的使用使用-p或者-P選項生效

  例子:EXPOSE 80
6、ENV
  ENV <key> <value>
  ENV <key>=<value>。。。
  指定一個環節變量,會被后續RUN指令使用,並在容器運行時保留

  例子:ENV myname zxg
     ENV myhome beijing
     ENV myname="zxg" myhome=beijing
  
7、ADD
  ADD <src>...<dest>
  ADD復制本地主機文件、目錄或者遠程文件URLS從並且添加到容器指定路徑中
  支持通過Go的正則模式匹配,具體規則可參見Go filepath.Match

  例子:ADD hom* /mydir/  #adds all files starting with ”hom“
     ADD hom?.txt /mydir/ #?is replaced with any single character
    ADD index.html /usr/share/nginx/html/index.html


  注意如下:
路徑必須是絕對路徑,如果 不存在,會自動創建對應目錄
路徑必須是 Dockerfile 所在路徑的相對路徑
如果是一個目錄,只會復制目錄下的內容,而目錄本身則不會被復制

  

8、COPY
  COPY <src>...<dest>
  COPY復制新文件或者目錄並且添加到容器指定路徑中,用法和ADD相同,唯一區別時不能指定遠程文件URLS。

9、ENTRYPOINT
  ENTRYPOINT "executable","param1","param2"
  ENTRYPOINT command param1 param2(shell form)
    配置容器啟動后執行的命令,並且不可被 docker run 提供的參數覆蓋,而CMD是可以被覆蓋的。如果需要覆蓋,則可以使用docker run --entrypoint選項。

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

    Exec form ENTRYPOINT 例子
    通過ENTRYPOINT使用 exec form 方式設置穩定的默認命令和選項,而使用CMD添加默認之外經常被改動的選項。

    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
    通過 Dockerfile 使用ENTRYPOINT展示前台運行 Apache 服務

    FROM debian:stable
    RUN apt-get update && apt-get install -y --force-yes apache2
    EXPOSE 80 443
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
    ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
    Shell form ENTRYPOINT 例子
    這種方式會在/bin/sh -c中執行,會忽略任何CMD或者docker run命令行選項,為了確保docker stop能夠停止長時間運行ENTRYPOINT的容器,確保執行的時候使用exec選項。

    FROM ubuntu
    ENTRYPOINT exec top -b
    如果在ENTRYPOINT忘記使用exec選項,則可以使用CMD補上:

    FROM ubuntu
    ENTRYPOINT top -b
    CMD --ignored-param1 # --ignored-param2 ... --ignored-param3 ... 依此類推


10、VOLUME 
  VOLUME ["/data"]
  創建一個可以從本地主機或其他容器掛載的掛載點,后續具體介紹
11、USER
  USER daemon
  指定運行容器時的用戶名或UID,后續RUN、CMD、ENTERPOINT也會使用指定用戶

12、WORKDIR 
 WORKDIR /path/to/workdir
  為后續的RUN、CMD、ENTRYPOINT指令配置工作目錄。可以使用多個WORKDIR指令,后續命令如果參數是相對路徑,則會基於之前命令指定的路徑
  WORKDIR /a
  WORKDIR b
  WORKDIR c
  RUN pwd
  最終路徑是/a/b/c
  WORKDIR指令可以在ENV設置變量之后調用環境變量:
  ENV DIRPATH /path
  WORKDIR $DIRPATH/$DIRNAME
  最終路徑則為 /path/$DIRNAME
 
13、ONBUILD
  ONBUILD [INSTRUCTION]
  配置當所創建的鏡像作為其他新創建鏡像的基礎鏡像時,所執行的操作指令
  例如:Dockerfile 使用如下的內容創建了鏡像image-A:
    [...]
    ONBUILD ADD . /app/src
    ONBUILD RUN /usr/local/bin/python-build --dri /app/src
    [...]

4、使用build命令制作鏡像

打包鏡像 docker build 路徑 -it 鏡像名:版本號

例如:

sudo docker build . -t centos-lhq:1.0



三、Docker常用命令

#1.查看鏡像

sudo docker images

#2.啟動鏡像

sudo docker run -it -p 端口:8000(映射端口) 鏡像id /bin/bash

例如:

sudo docker run -it -p 8000:8000 751a8f9dda48 /bin/bash

#3.查看容器

sudo docker ps -all

#4.進入容器

sudo docker exec -it 容器id /bin/bash 

#5.停止容器

docker stop <容器ID>

#6.將外部文件拷貝到docker容器中

例如:

#將主機/www/runoob目錄拷貝到容器96f7f14e99ab的/www目錄下。

sudo docker cp /www/runoob 96f7f14e99ab:/www/

#7.擴展

#導入sql文件

mysql -uroot -p密碼 #進入mysql

use database; #使用數據庫

使用source 命令

例如:
source /root/StaticAnalyzer_so_and_sdk.sql;  導入sql文件




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM