Dockerfile編寫指北

2021-02-16 肥宅與畫家

docker可以幫助我們快速部署安裝需要的軟體,比如mysql,nginx,elk等,都只需要簡單的docker pull和docker run等簡單命令即可,但是為了滿足更多需求,一些個人應用的docker鏡像,就需要用dockerfile來創建。

一. Dockerfile入門

Dockerfile的幾個核心命令

FROM

MAINTAINER

RUN

ADD

COPY

WORKDIR

VOLUME

EXPOSE

CMD

1. FROM

指定構建的鏡像的運行環境

FROM centos:7

2. MAINTAINER

指定鏡像的維護者與聯繫信息

MAINTAINER AntzUhl <antzuhl1998@gmail.com>

3. RUN

構建鏡像時執行的命令,此處我們可以安裝容器需要的工具

RUN yum install wget

RUN ["yum", "install", "wget"]

另外還可以執行其他需要的命令,比如clone庫

RUN git clone git@github.com:CasterWx/terraria-docker-server.git

4. ADD

拷貝文件或者目錄到鏡像中,會自動解壓壓縮包與下載網絡URL到目標地址,可以拷貝要執行的jar或者軟體包,之後再使用CMD啟動

格式:ADD <宿主機文件路徑> <容器目標路徑>

ADD antzuhl.jar /opt
ADD http://antzuhl.cn/download/antzuhl.jar /opt

5. COPY

類似於ADD,但是只是拷貝,不會有其他操作。

COPY antzuhl.jar /opt

6. WORKDIR

為RUN,CMD,COPY,ADD等命令設置工作目錄

WORKDIR /opt

7. VOLUME

指定容器掛載點到宿主機的目錄,類似於docker run時-v參數

VOLUME ["/opt/antzuhl"]

8. EXPOSE

指定容器運行的服務埠

EXPOSE 7777

9. ENV

配置容器內環境變量信息

ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/local/jdk1.8.0_45

10. CMD

啟動容器時執行的命令,用於啟動容器內的軟體包等,同樣支持使用數組參數

CMD ["./opt/terraria/terra_script.sh","start"]
CMD ./opt/terraria/terra_script.sh start

11. ENTRYPOINT

ENTRYPOINT與CMD命令類似,有多個ENTRYPOINT時,容器啟動只會執行最後一個

ENTRYPOINT /bin/bash -C '/start.sh'

二. Dockerfile實戰Spring Boot項目

創建一個最基礎的Spring boot項目,Dockerfile為我編寫的鏡像創建Dockerfile文件,apache-maven壓縮包為準備的maven包,通過ADD命令添加到鏡像內,sell為一個簡單的Spring boot代碼,埠8080。

# 基礎鏡像,運行在一個擁有java的環境
FROM williamyeh/java8:latest
# 維護者信息
MAINTAINER AntzUhl <antzuhl998@gmail.com>

# 將maven包添加到鏡像內
ADD apache-maven-3.3.9-bin.tar.gz /usr/local/bin
# 配置maven相關環境變量
RUN export PATH=apache-maven-3.3.9/bin:$PATH
RUN export PATH=/usr/local/bin/apache-maven-3.3.9/bin:$PATH
RUN ln -s /usr/local/bin/apache-maven-3.3.9/bin/mvn /usr/local/bin/mvn
RUN ls -l /usr/local/bin
RUN echo $PATH

# 開放埠8080

EXPOSE 8080

# 創建目錄
RUN mkdir /opt/sell
# 把代碼拷貝到創建的目錄
ADD sell/ /opt/sell
# 設置運行環境
WORKDIR /opt/sell

# mvn打包
RUN mvn clean install

# 執行打包好的jar文件
CMD java -jar target/sell.jar

完成後使用docker build -t sell:test .開始創建鏡像

sell:test為鏡像名稱,.代表當前目錄。

現在就可以使用docker run來創建鏡像,訪問localhost:8080即可。

三. Dockerfile實戰創建泰拉瑞亞伺服器

此外,還可以使用dockerfile來幫助我們簡化一些常用的部署操作,比如泰拉瑞亞伺服器的部署

# 基礎鏡像,centos7
FROM centos:7
MAINTAINER AntzUhl <antzuhl1998@gmail.com>
# 執行用戶root
USER root
# 安裝依賴
RUN yum -y update
RUN yum -y install screen

# 開放埠
EXPOSE 7777

RUN mkdir /opt/terraria/
ADD terraria/ /opt/terraria/

# 給執行腳本權限
RUN chmod 775 /opt/terraria/terra_script.sh

# 執行
CMD ["./opt/terraria/terra_script.sh","start"]

可參考我的一個泰拉腳本: https://github.com/CasterWx/terraria-docker-server

使用docker build -t terraria:test .構建鏡像即可。

相關焦點

  • Dockerfile詳解
    Dockerfile是用來構建Docker鏡像的文本文件,也可以說是命令參數腳本。docker build命令用於從Dockerfile構建鏡像。可以在docker build命令中使用-f標誌指向文件系統中任何位置的Dockerfile。
  • 解析 Dockerfile
    啟動容器時執行的 Shell 命令,同 CMD 類似,只是由 ENTRYPOINT 啟動的程序不會被 docker run 命令行指定的參數所覆蓋,而且,這些命令行參數會被當作參數傳遞給ENTRYPOINT 指定指定的程序,例如:PS:Dockerfile 文件中也可以存在多個 ENTRYPOINT 指令,但僅有最後一個會生效
  • Docker學習之Dockerfile詳解
    上一篇學習了docker的基礎,知道docker有三大概念,鏡像,容器和倉庫。使用第三方鏡像不是學習docker的最終目的,最想要的還是要自己構建鏡像。    將自己的程序、文件、環境等構建成自己想要的應用鏡像、方便後續部署、啟動、維護。
  • Dockerfile企業實戰教程
    Docker通過讀取Dockerfile中的指令自動生成映像。一、dockerfile語法詳解Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。基於Dockerfile構建鏡像可以使用docker build命令。
  • Dockerfile常用使用方法
    詳解Dockerfile是一個配置文件,可以自動執行創建Docker鏡像的步驟。Docker從Dockerfile中讀取指令,以自動執行原本手動執行的步驟來創建映像。要構建鏡像,請創建一個名為Dockerfile的文件。Dockerfile描述了組裝映像所需的步驟。創建Dockerfile後,調用docker build命令,使用包含Dockerfile的目錄的路徑作為參數。
  • docker反向查看啟動命令和dockerfile
    哈哈,那就走起?雖然這樣也能找到運行容器的命令,但是依舊還需要時間去整理,因此這裡分享一個可以直接列印運行命令的工具runlike[1],在runlike傳遞一個容器名稱runlike使用起來非常方便,可以直接通過pip安裝,也可以通過容器方式免安裝使用:# pip$ pip install runlike# by docker$ alias runlike="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock
  • Docker精髓講解(容器數據卷、Dockerfile、Docker網絡)
    構建步驟:1.編寫一個dockerfile   文件2、docker build   構建成為一個鏡像3、docker run   運行鏡像4、docker push  發布鏡像(DockerHub、阿里雲鏡像倉庫!)查看官網是怎麼操作的1、進入Docker Hub
  • Docker 入門(二):從實例來看 Dockerfile 和 Compose
    -name是指定容器的別名,-v local-dir:container-dir 將本地的目錄作為數據卷掛載到容器內的目錄進行數據持久化,-e 是 mysql 的參數,後面跟上 MySQL 的環境變量,/var/lib/mysql是 MySQL 存儲數據的目錄。
  • Docker 快速入門之 Dockerfile
    答案當然是可以的,在 Docker 中我們可以從名為 Dockerfile 的文件中讀取指令並且自動構建鏡像。在本文中,將介紹 Dockerfile 的基本語法以及基本知識。1、Dockerfile 是什麼?Dockerfile 其實是一份文本文檔,裡面包含了用戶可以用來操作鏡像的一些指令。
  • Docker 從入門到實踐系列五 - Dockerfile文件
    ,新建一個名為 Dockerfile 文件mkdir /usr/dockerfile -pvim dockerfile-demo#編輯 dockerfileFROM nginx:latest# 維護者 可以省略MAINTAINER jourwon jourwon@docker.com#啟動容器RUN mkdir /usr/share/nginx
  • 構建完美的 Python Dockerfile
    這篇文章將分享「完美」的 Python Dockerfile。當然,世上沒有完美的東西,我很樂意接受反饋以改進您可能發現的問題。跳到最後找到一個比在 docker hub 中使用默認文件快 20% 的 Dockerfile。
  • Docker命令大全及Dockerfile詳解(附示例)
    使用阿里雲設置Docker鏡像加速,注意下面連結請使用阿里雲給自己的URL sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://ua3456xxx.mirror.aliyuncs.com"] } EOF sudo systemctl
  • Dockerfile 命令介紹及實例
    Dockerfile 語法示例Dockerfile語法由兩部分構成,注釋和命令+參數# Line blocks used for commentingcommand argument argument ..一個簡單的例子:# Print "Hello docker!"
  • Dockerfile文件全面詳解
    將在當前鏡像之上的新層中執行命令,在 docker build時運行。所以過多無意義的層,會造成鏡像膨脹過大,可以使用 && 符號連接命令,這樣執行後,只會創建 1 層鏡像運行程序,在 docker run 時運行,但是和 run 命令不同,RUN 是在 docker build 時運行。
  • dockerfile中ENTRYPOINT與CMD的結合
    因為這兩個命令是掌握dockerfile編寫的核心,所以這邊還是單獨拿出來再講一講。二、CMD 與 ENTRYPOINT主要區別我們直接進入主題,CMD 與 ENTRYPOINT都是用於指定啟動容器執行的命令,區別在於:•當docker run 命令中有參數時,守護進程會忽略CMD命令。
  • Dockerfile,就是那麼簡單
    寫的最多無非是Dockerfile,以前總覺得Dockerfile構建鏡像很牛逼,寫多了就發現來來回回那幾個命令,難的是shell編程中的反人類語法,今天下班早,我就總結下Dockerfile的知識點,希望可以幫助到大家。
  • 【2021/12/13】dockerfile使用
    划水摸魚的一天,接著之前的devops打鏡像過程熟悉了下,收穫還是不小的之前devops裡面需要打鏡像,但是對於dockerfile
  • Dockerfile構建beego鏡像
    Window、Linux、Mac下Beego環境的快速安裝流程:go get github.com/astaxie/beegogo get github.com/beego/beeDocker中也可以根據以上流程快速安裝Beego鏡像,通過Dockerfile編寫構建文件。
  • 編寫 Dockerfile 的五個最佳實踐
    Docker 可以通過讀取 Dockerfile 裡面的命令來自動化地構建Docker鏡像。通過執行 docker build 就可以啟動這樣的一個自動化流程。$ docker build -f Dockerfile .
  • 如何使用Dockerfile創建鏡像
    在運行時使用隨時埠映射,也就是docker run -P時,會自動隨機映射EXPOSE的埠。EXPOSE指令實際上並未發布指定埠,它是將我們訪問時輸入的埠和運行容器之間做一種關聯或通信,具體發布哪些埠,要在運行容器時發布實際埠,可以使用docker run中-p或-P來設置映射的埠號。