Day12 : Docker基本操作 Dockerfile篇

应用Docker化

Docker的核心思想就是将应用给整合进Container内运行,让这个Container可以部属在任何机器上,这个过程被称是Docker化 (Dockerizing)。应用Docker化分成下面几个步骤:

  1. 编写应用程序Code
  2. 编写Dockerfile,Dockerfile内会包含这个应用程序该如何构建、运行
  3. 对Dockerfile运行build,产生属於你的image
  4. 执行这个image成为一个可运行的Container

运行Dockerfile

在项目的根目录撰写Dockerfile,配合我们之前的文章,我们先来建立一个简单的Dockerfile吧。

https://ithelp.ithome.com.tw/upload/images/20210914/20119044TP5vhme2oq.png

FROM httpd:2.4
LABEL maintainer="Lufor"

ENV Apple="Good Apple"

RUN echo ${Apple}

COPY . /usr/local/apache2/htdocs/
  • docker build -t web:latest .
  • docker run -d -p 8083:80 --name Web_dockerfile web:latest

写好Dockerfile後运行docker build,-t <ImageName>:<tag>代表tag新建立出来的imagea名称,後面的.代表当前目录下的Dockerfile。照上述执行完後会出现一个新的images叫做web:lastest,随後运行这个images就能使用这个Container应用了。

撰写Dockerfile

具体Dockerfile该如何写呢? 有很多指令,以建立一个Flask Server为例子:

# use Python Image
FROM python:3.7-slim

#Set working dir (切换目录)
WORKDIR /app

# Copy current direction into container /app
COPY . .

#install the need of package in requirement
RUN pip install -r requirements.txt

#Make port 3000 available to the world outside
EXPOSE 3000

#Define environment (Name变数内容为World)
ENV NAME World

#RUN app.py when launch
CMD ["python","app.py"]

以下容我慢慢详解一些常用的指令,方便你未来阅读後可以撰写出Dockerfile

  • FROM FROM是起手式,指定我们的基础Image由什麽构成,本地端没找到就会去远端找
  • LABEL <key>=<Value> <key>=<Value> ... LABEL代表了建构出来的image的MetaData,宣示了这个专案的负责人,可以透过docker image inspect <ImageName>查看
  • WORKDIR <path> 切换目录,未来进入Container内默认就是进入该WORKDIR
  • COPY <SRC> <TGT> 复制档案,将你的专案复制进Image内,未来RUN时就能直接使用。如上面Flask Server的例子,由於我们已经切换WORKDIR,所以目标目录为.
  • ENV <key>=<Value> <key>=<Value> ... 订定系统环境变数,方便未来专案可以抓取,dockerfile的ENV可以在run container时被-e <key> <value>取代。
  • ARG <key>=<Value> <key>=<Value> ... 一样是环境变数,注意!!,只存在於Build阶段,在Container内不会出现。
  • RUN <指令1> && <指令2> && ... 在初始化时会执行的指令
  • VOLUME <TGT_PATH> or VOLUME <SRC_PATH> <TGT_PATH>指定内部持久层,Container删除後资料不删除,详细可以见前几天的文章
  • EXPOSE <PROT> Container要对外开的PORT
  • CMD ["executable","param1","param2"] 一样是执行,但是通常用於阻塞式指令,放在最後一个指令。

以上大致就是常用的Dockerfile写法,Dockerfile可以说是Docker的精华,未来几天会模拟建立前後端专案,让看到的人能更熟悉Dockerfile。


<<:  [day2] 付款流程 & 取得(Nonce)

>>:  DAY 2 『 RGB调色盘 』Part1

Day 15【web3.js】一袋米要扛几楼

【前言】 这两天的文章都是 web3.js 的学习笔记,大部分内容都来自他们的官方文件!之後还会有...

DAY 13 接下来的实作

接下来的天数,预计要来实作上面已经教学的 sass 方法,毕竟学习是一回事,真正拿来实作则是另一回事...

Day 11:架设 Grafana (0)

做好了指标的收集,接下来还有一个很重要的步骤 --- 数据的视觉化,关於这方面的功能虽然 Prome...

[Day 9]从零开始学习 JS 的连续-30 Days---物件

宣告变数的资料型别--物件 1.数值( Number ) 2.字串( String ) 3.布林值(...

Day 26: LeetCode Hard+Medium

Day 26: LeetCode Hard+Medium LeetCode 212. Word Se...