Dockerfile詳解,以及構建自定義鏡像

Dockerfile使用

前面的操作我們一直下載下載官方已經構建好的鏡像,直接下載後就可以run,如果我們想要在鏡像中添加自己的應用,比如在tomcat中添加自己的app,構建一個自定義的鏡像,那麼我們應該怎麼做,這個時候就用到了Dockerfile。Dockerfile是由一系列命令和參數構成的腳本,Docker可以根據這個腳本基於某個基礎鏡像創建一個新的定製化的鏡像,大大提高了我們部署的效率,使用Dockfile最終的結果是幫助我們定製化自己的鏡像。

Dockerfile初體驗

下面就基於tomcat鏡像簡單部署一個屬於我們自己的應用,選擇一個合適的目錄,這裏我選擇的目錄是/usr/local/src,在/usr/local/src目錄下創建一個文件夾docker-web,在裏面創建一個index.html文件,寫上下面內容

mkdir docker-web
vim index.html
<h1>I'm Docker Test Page</h1>

然後創建一個沒有擴展名的文件Dockerfile,開始編寫相關命令

FROM tomcat 
MAINTAINER www.conly.top
WORKDIR /usr/local/tomcat/webapps
ADD docker-web ./docker-web

一個簡單的Dockerfile就編寫完成,其中命令具體是什麼意思,下面會做詳細說明,接下來開始構建鏡像

[root@node2 docker-test]# docker build -t conly/mywebapp:1.0 ./
Sending build context to Docker daemon 3.584kB
Step 1/4 : FROM tomcat
---> 6408fdc94212
Step 2/4 : MAINTAINER www.conly.top
---> Running in 53e29f832089
Removing intermediate container 53e29f832089
---> b285ad91c35b
Step 3/4 : WORKDIR /usr/local/tomcat/webapps/
---> Running in ac5f64ef5e3c
Removing intermediate container ac5f64ef5e3c
---> f3eeee360833
Step 4/4 : ADD dockerweb ./dockerweb
---> 51a4c7e6ed10
Successfully built 51a4c7e6ed10
Successfully tagged conly/mywebapp:1.0

在構建的過程中,Docker根據Dockerfile中的內容進行了四個步驟,分別對應四個命令,這裏要提到一個鏡像分層的概念,每執行一步都會創建一個臨時容器,並且可以看到臨時容器的ID,臨時容器是不可使用的,執行完成後,會展示構建鏡像的鏡像ID,鏡像名稱,tags等信息。

這時可以看到我們的Docker image已經多了一個自己創建的鏡像conly/tomcat 的1.0版本

[root@node2 docker-test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
conly/mywebapp      1.0                 51a4c7e6ed10        3 minutes ago       507MB
tomcat              latest              6408fdc94212        2 weeks ago         507MB

如果此時基於原來的Dockerfile構建2.0版本

[root@node2 docker-test]# docker build -t conly/mywebapp:2.0 ./
Sending build context to Docker daemon  3.584kB
Step 1/4 : FROM tomcat
 ---> 6408fdc94212
Step 2/4 : MAINTAINER www.conly.top
 ---> Using cache
 ---> b285ad91c35b
Step 3/4 : WORKDIR /usr/local/tomcat/webapps/
 ---> Using cache
 ---> f3eeee360833
Step 4/4 : ADD dockerweb ./dockerweb
 ---> Using cache
 ---> 51a4c7e6ed10
Successfully built 51a4c7e6ed10
Successfully tagged conly/mywebapp:2.0

Dcoker在根據Dockerfile構建鏡像時沒有變動的 部分會使用緩存Using cache不會重新構建,只會對我們變更的部分進行構建,由於鏡像分層的和使用緩存的機制使得Docker在構建鏡像的效率大大提升。

構建鏡像後執行run來運行我們的鏡像,這個時候就可以在外部瀏覽器訪問自定義的app應用了。

docker run -p 80:8080 -d conly/mywebapp:3.0

訪問頁面

Dockerfile常用指令詳解

基本指令

下面介紹Docker常用的指令:

  • FROM 指定基礎鏡像
    • 指令格式 
      • FROM <image>
      • FROM <image>:<tag>
      • FROM <image>@<digest>
    • 說明 
      • 指定基準鏡像,類似JAVA的繼承,FROM使用在其他指令之前,其他指令的操作依賴於FROM指令;如果不依賴於其他鏡像,構建初始鏡像可使用FROM  scratch。
  • LABEL 爲鏡像添加元數據
    • 指令格式
      • LABEL <key>=<value> <key>=<value> ...
    • 說明
      • LABEL指令給鏡像添加元數據,也可以看作鏡像的標籤,對於鏡像信息的描述。
      • LABEL指令是鍵值對形式的如果value中有空格,可以使用引號和\,例:LABEL desc="This is a test lable"。
      • 一個鏡像可以有多個LABEL,但是LABEL是分層的,每個LABELL都會構建一層鏡像,可以使用合併寫法,例子:
        LABEL multi.label1="value1" \
              multi.label2="value2" \
              other="value3"


        LABEL multi.label1="value1" multi.label2="value2" other="value3"
      • 新添加LABEL會覆蓋原有重名LABEL。
      • 鏡像的LABEL信息可以使用 docker inspect image:<tag>來查看。
  • MAINTAINER 指定鏡像維護者信息
    • 指令格式
      • MAINTAINER <name>
    • 說明 
      • 該指令現在已經被廢棄,建議使用LABEL來指定,例:LABEL maintainer="www.conly.top"。
  • ADD 複製文件
    • 指令格式
      • ADD <src> <dest>
      • ADD ["<src>","<dest>"]
    • 說明
      • 從src路徑複製指定內容到dest路徑,src可以是Dockfile相對路徑,也可以是一個URL,還可以是一個壓縮包。
      • 拷貝文件時可識別壓縮包格式,docker會自動解壓。
      • 若src是一個URL,dest不以斜槓結尾,dest將會被視爲文件,src對應內容將會被下載到dest文件。
      • 若src是一個URL,dest以斜槓結尾,dest將會被視爲目錄,src對應內容將會被下載到dest目錄。
      • 若src是一個目錄,整個目錄下的內容,包括文件系統元數據將會被拷貝至dest目錄。
  • WORKDIR 指定工作目錄
    • 指令格式
      • WORKDIR /path
    • 說明
      • 指定工作目錄,相當於cd /path,path不存在可以自動創建,爲指令RUN,CMD,ENTRYPOINT指定工作目錄,以WORKDIR目錄爲當前目錄。
  • ARG 設置構建參數
    • 指令格式
      • ARG <name>[=<default value>]
    • 說明
      • 定義構建鏡像時需要的參數,可用於FROM指令前。
      • ARG指令定義的參數,在docker build命令中以--build-arg a_name=a_value形式賦值。
      • Dockerfile中可以使用ARG定義一個變量,也可以定義多個變量,變量定義時可設置默認值,在build時傳遞參數則使用參數,未傳遞參數則使用默認值。
      • ARG變量定義從在Dockerfile定義的行生效,而不是從在命令行參數的使用或其它地方。
      • RUN指令可運行使用ARG或ENV指令定義的變量。使用ENV定義的環境變量會覆蓋ARG指令定義的同名變量。
      • Dcoker中預設的一組ARG變量不需要預設即可使用,在執行docker --build-arg a_name=a_value即可使用。 
        HTTP_PROXY
        http_proxy
        HTTPS_PROXY
        https_proxy
        FTP_PROXY
        ftp_proxy
        NO_PROXY
        no_proxy
      • 在構建鏡像過程中如果ARG傳遞的參數未定義會出現警告。
        [root@conly webapps]# docker build --build-arg xxccx=conly -t conly .
        Sending build context to Docker daemon  4.608kB
        Step 1/5 : from tomcat:latest
         ---> 6408fdc94212
        Step 2/5 : MAINTAINER www.conly.top
         ---> Using cache
         ---> 79180381b68d
        Step 3/5 : WORKDIR /opt/tomcat/webapps
         ---> Using cache
         ---> 9735f116f248
        Step 4/5 : EXPOSE 8080 8081 8082
         ---> Using cache
         ---> 8b140733df33
        Step 5/5 : ADD https://images.cnblogs.com/cnblogs_com/conly/1600508/o_191211120217min.png ./docker-web
        Downloading [==================================================>]  230.1kB/230.1kB
         ---> Using cache
         ---> 61e9f6346096
        [Warning] One or more build-args [xxccx] were not consumed
        Successfully built 61e9f6346096
        Successfully tagged conly:latest

        關於ARG的更多使用可以參考https://www.centos.bz/2016/12/dockerfile-arg-instruction/

  • CMD 容器啓動指令
    • 指令格式xiang
      • CMD ["executable", "param1", "param2"] (推薦使用)
      • CMD ["param1", "param2"] 爲[ENTRYPOINT]指令提供預設參數
      • CMD command param1 param2 在shell中執行
    • 說明
      • 用於在Docker容器創建時執行默認的命令,CMD命令可以有多個,但只會執行最後一個,CMD命令可以被覆蓋。
      • 如果使用docker run 創建容器時附加了其他命令則默認的CMD命令不會被執行,執行附加命令。
  • RUN 執行命令
    • 指令格式
      • RUN <command> shell命令格式
      • RUN ["executable", "param1", "param2"] exec命令格式
    • 說明
      • 用於在Docker鏡像構建時執行命令,鏡像構建結束,RUN命令也就結束執行。
  • COPY 複製文件
    • 指令格式
      • COPY <src> <dest>
      • COPY ["<src>", "<dest>"]
    • 說明
      • 複製本地的src文件到dest目錄,功能類似於ADD,COPY不支持URL和壓縮包。
  • ENTRYPOINT 入口點
    • 指令格式
      • ENTRYPOINT ["executable", "param1", "param2"]
      • ENTRYPOINT command param1 param2
    • 說明
      • 用於在Docker容器創建時執行命令,ENTRYPOINT 可以存在多個,但只會執行最後一個,且ENTRYPOINT運行的命令不可被覆蓋。
  • ENV 設置環境變量
    • 指令格式
      • ENV <key> <value>
      • ENV <key>=<value> ...
    • 說明
      • 設置環境變量,會被RUN指令使用,並在容器運行時保持。例:ENV JAVA_HOME /path/to/java。
  • EXPOSE 聲明暴漏的端口
    • 指令格式
      • EXPOSE <port> [<port>...]
    • 說明
      • 用於聲明容器運行時提供服務的端口,便於鏡像使用者查看該鏡像服務的守護端口,運行時並不會因爲聲明就打開相應端口。
      • 當運行時使用隨機映射時,會自動映射EXPOSE的端口。例:docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 -d image:<tag>。
  • USER 設置用戶
    • 指令格式
      • USER <daemon>
    • 說明
      • 該指令用於指定容器運行時的用戶或者UID,RUN、CMD以及ENTRYPOINT指令都將使用該用戶執行命令。例:
        RUN groupadd -r postgres && useradd -r -g postgres postgres

相似指令區別

  •  RUN,CMD,ENTRYPOINT的區別
    • 執行時機不同,RUN指令在鏡像構建時使用,CMD | ENTRYPOINT在容器創建時使用。
    • CMD是默認執行命令,可以被覆蓋,原有命令不一定執行,ENTRYPOINT不可以被覆蓋,一定會被執行。
    • ENTRYPOINT和CMD命令可以組合使用,將CMD命令當作ENTRYPOINT命令的參數來執行,例:
      ENTRYPINT ["ps"]
      CMD ["-ef"]

      鏡像構建完成,如果使用docker run image -aux,則原有CMD命令在執行時會被替換爲ps -aux,這種方式實現了動態傳參,不用修改Dockerfile重新構建鏡像就可以在創建容器上執行自定義命令。

  • ARG和ENV的區別
    • 從語義上看ARG是用來設置構建鏡像時參數的,設置參數僅在構建時期有用,ENV用來設置環境變量,可以保存在容器運行時。
    • Dockerfile中聲明ARG後可以設定默認值,也可以構建時傳參設置,ENV設置的環境變量可以覆蓋ARG聲明的同名參數。
    • Dockerfile中ARG和ENV可以配合使用,類似於ENTRYPOINT和CMD指令。例:
      # use the value to set the ENV var default
      ARG A_VARIABLE
      ENV an_env_var=$A_VARIABLE
    • 需要注意的是雖然使用ARG設置的參數僅在構建時有效,但是使用docker history <image>:<tag>還是可以查看構建記錄,儘量避免傳遞密鑰,password等敏感信息。
      [root@conly webapps]# docker build -t tomcat:0.1 .
      Sending build context to Docker daemon  4.608kB
      Step 1/7 : ARG user=test_user
      Step 2/7 : ARG password=test_password
      Step 3/7 : from tomcat:latest
       ---> 6408fdc94212
      Step 4/7 : MAINTAINER www.conly.top
       ---> Using cache
       ---> 79180381b68d
      Step 5/7 : WORKDIR /opt/tomcat/webapps
       ---> Using cache
       ---> 9735f116f248
      Step 6/7 : EXPOSE 8080 8081 8082
       ---> Using cache
       ---> 8b140733df33
      Step 7/7 : ADD https://images.cnblogs.com/cnblogs_com/conly/1600508/o_191211120217min.png ./docker-web
      Downloading [==================================================>]  230.1kB/230.1kB
       ---> Using cache
       ---> 61e9f6346096
      Successfully built 61e9f6346096
      Successfully tagged tomcat:0.1
      [root@conly webapps]# docker history tomcat:0.1   
      IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
      61e9f6346096        5 hours ago         /bin/sh -c #(nop) ADD 394a0073236e50f2867f4a…   230kB               
      8b140733df33        5 hours ago         /bin/sh -c #(nop)  EXPOSE 8080 8081 8082        0B                  
      9735f116f248        2 days ago          /bin/sh -c #(nop) WORKDIR /opt/tomcat/webapps   0B                  
      79180381b68d        2 days ago          /bin/sh -c #(nop)  MAINTAINER www.conly.top     0B                  
      6408fdc94212        2 weeks ago         /bin/sh -c #(nop)  CMD ["catalina.sh" "run"]    0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop)  EXPOSE 8080                  0B                  
      <missing>           2 weeks ago         /bin/sh -c set -e  && nativeLines="$(catalin…   0B                  
      <missing>           2 weeks ago         /bin/sh -c set -eux;   savedAptMark="$(apt-m…   18.6MB              
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV TOMCAT_SHA512=263480a…   0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV TOMCAT_VERSION=8.5.49    0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV TOMCAT_MAJOR=8           0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV GPG_KEYS=05AB33110949…   0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV LD_LIBRARY_PATH=/usr/…   0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV TOMCAT_NATIVE_LIBDIR=…   0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop) WORKDIR /usr/local/tomcat     0B                  
      <missing>           2 weeks ago         /bin/sh -c mkdir -p "$CATALINA_HOME"            0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV PATH=/usr/local/tomca…   0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV CATALINA_HOME=/usr/lo…   0B                  
      <missing>           2 weeks ago         /bin/sh -c set -eux;   dpkgArch="$(dpkg --pr…   205MB               
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV JAVA_URL_VERSION=8u23…   0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV JAVA_BASE_URL=https:/…   0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV JAVA_VERSION=8u232       0B                  
      <missing>           2 weeks ago         /bin/sh -c { echo '#/bin/sh'; echo 'echo "$J…   27B                 
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV PATH=/usr/local/openj…   0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/local/…   0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B                  
      <missing>           2 weeks ago         /bin/sh -c set -eux;  apt-get update;  apt-g…   9.68MB              
      <missing>           2 weeks ago         /bin/sh -c apt-get update && apt-get install…   142MB               
      <missing>           2 weeks ago         /bin/sh -c set -ex;  if ! command -v gpg > /…   7.81MB              
      <missing>           2 weeks ago         /bin/sh -c apt-get update && apt-get install23.2MB              
      <missing>           2 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B                  
      <missing>           2 weeks ago         /bin/sh -c #(nop) ADD file:152359c10cf61d800…   101MB

      完整信息命令

      docker history --format "table {{.ID}}\t{{.CreatedBy}}" --no-trunc image:<tag>
  • ADD和COPY的區別
    • ADD和COPY都可以用來拷貝源文件到指定目錄,在這點上用法一致。
    • ADD的源可以是本地也可以是遠程的,COPY只能是本地文件。
    • 使用ADD來拷貝可識別的壓縮文件時,如.tar,.war可以自動解壓,COPY則不具備。
    • COPY可用於multi-stage中,複製上一階段的鏡像,筆者水平有限,詳細內容看參考use multi-stage builds此功能在Docker17.05以後才添加,極大方便了Dockerfilr的維護者。

首次使用 COPY 和 ADD 命令時也沒有考慮過太多二者的區別,隨着對Docker的使用會發現 COPY 命令的設計是簡單,概念清晰的。而 ADD 命令是在COPY命令上的擴展,提高了使用的複雜度,尤其在使用ADD添加源爲URL的情況,要注意dest路徑的結尾有沒有/,但這些設計在我們熟悉Docker後也會方便操作。

shell和exec區別

  • shell 在Linux系統中,使用shell執行時腳本時,當前shell爲父進程,會生成一個子進程來執行腳本,執行完畢後會退出子進程回到當前shell。
  • exec 使用exec執行時,exec進程會替換當前進程,進程PID保持不變執行結束直接退出,不會退出到進程執行之前的環境。

  在Docker中推薦使用exec方式執行命令,方便於我們的操作,這也是官方推薦的方式。

使用Dockerfile構建Redis鏡像

在瞭解完Dockerfile中的一些常見命令後,接下來就進行一個簡單的應用吧,創建一個Dockerfile基於CentOS來構建自定義Redis鏡像。這裏切換到/usr/local/redis_dockertest目錄來進行操作,Redis作爲一個優秀的NoSQL數據庫,Docker Hub自然有官方鏡像,這裏用來練習Dockerfile的常用指令。

基於CentOS7構建Redis鏡像

基於CentOS7的鏡像,添加Redis的安裝包進去,添加配置文件來製作鏡像,幫助我們熟悉Dockerfile的指令。

下載redis-5.0.5安裝包

wget http://download.redis.io/releases/redis-5.0.5.tar.gz

下載redis.conf配置文件

wget http://download.redis.io/redis-stable/redis.conf

修改redis.conf

bind 127.0.0.1  -->  #bind 127.0.0.1
daemonize no    -->  daemonize yes
protected-mode yes -->   protected-mode no

創建Dockerfile

vim Dockerfile

編寫Dockerfile

ARG desc
FROM centos
LABEL maintainer=www.cnblogs.com/conly/
RUN ["yum","-y","install","gcc","gcc-c++","net-tools","make"]
WORKDIR /usr/local
ADD redis-5.0.5.tar.gz .
WORKDIR /usr/local/redis-5.0.5/src/
RUN make && make install
WORKDIR /usr/local/redis-5.0.5
ADD redis.conf .
EXPOSE 6379
CMD ["redis-server","redis.conf"]

構建redis鏡像

docker build --build-arg desc="this is a docker image build test" -t conly/redis:1.0 .

截取部分執行過程,看到Dockerfile的執行步驟

[root@conly redis_dockertest]# docker build --build-arg desc="this is a docker image build test" -t conly/redis:1.0 .
...
...
...
Removing intermediate container 528d15f50a03
 ---> 809289100143
Step 9/14 : WORKDIR /usr/local/redis-5.0.5
 ---> Running in 566b63100414
Removing intermediate container 566b63100414
 ---> 9cfce44318ee
Step 10/14 : ADD redis.conf .
 ---> dc8127dafb54
Step 11/14 : EXPOSE 6379
 ---> Running in eda8f77e9c83
Removing intermediate container eda8f77e9c83
 ---> 08f348a33ff6
Step 12/14 : WORKDIR /usr/local/redis-5.0.5/utils
 ---> Running in c7cd15701c85
Removing intermediate container c7cd15701c85
 ---> 1dcde04ee437
Step 13/14 : ENTRYPOINT ["./"]
 ---> Running in 152277e9979e
Removing intermediate container 152277e9979e
 ---> 1c9a7b9c6bae
Step 14/14 : CMD ["install_server.sh"]
 ---> Running in 065dc4a5ba65
Removing intermediate container 065dc4a5ba65
 ---> 8b1990aa9224
Successfully built 8b1990aa9224
Successfully tagged conly/redis:1.0

查看docker的鏡像,可以看到除了我們構建的conly/redis:1.0版本意外,此外Dockerfile中的FROM centos也pull下來了

[root@conly redis_dockertest]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
conly/redis         1.0                 8b1990aa9224        3 minutes ago       587MB
centos              latest              0f3e07c0138f        2 months ago        220MB

使用docker run運行redis鏡像

[root@conly redis_dockertest]# docker run -p 6379:6379 conly/redis:1.0                                               
1:C 12 Dec 2019 13:27:00.599 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 12 Dec 2019 13:27:00.599 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 12 Dec 2019 13:27:00.599 # Configuration loaded
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 5.0.5 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 1
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

1:M 12 Dec 2019 13:27:00.601 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 12 Dec 2019 13:27:00.601 # Server initialized
1:M 12 Dec 2019 13:27:00.601 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 12 Dec 2019 13:27:00.601 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
1:M 12 Dec 2019 13:27:00.603 * Ready to accept connections

此時redis是阻塞狀態運行,當然我們也可以重新編寫Dockerfile來構建鏡像讓redis容器後臺運行

ARG desc
FROM centos
LABEL maintainer=www.cnblogs.com/conly/
RUN ["yum","-y","install","gcc","gcc-c++","net-tools","make"]
WORKDIR /usr/local
ADD redis-5.0.5.tar.gz .
WORKDIR /usr/local/redis-5.0.5/src/
RUN make && make install
WORKDIR /usr/local/redis-5.0.5
ADD redis.conf .
RUN cd /usr/local/redis-5.0.5/utils  && echo | /bin/bash install_server.sh
ENTRYPOINT /usr/local/bin/redis-server /etc/redis/6379.conf && tail -f /var/log/redis_6379.log

運行redis,可以看到我們自定義的redis已經運行了。

[root@conly redis_dockertest]# dockerun -p 6379:6379 -d conly/redis:1.0  .                                              
d3b1191ae2408d5025ba55e3b893300ca9438246a10feb2d7e02fa0f29801740
[root@conly redis_dockertest]# docker ps -s
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES               SIZE
d3b1191ae240        conly/redis:1.0     "/bin/sh -c '/usr/lo…"   8 seconds ago       Up 7 seconds        0.0.0.0:6379->6379/tcp   fervent_babbage     2.58kB (virtual 587MB)

Dockerfile中常用的指令總結完畢,並且進行了簡單的練習,接下來開始學習Docker容器間的通信,Docker Compose的實戰應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章