文章目录
- 1.Dockerfile的例子
- 2.Dockerfile指令的用法
- 3.从 Dockerfile 运行 Docker 实例的步骤
1.Dockerfile的例子
- eg:文件名是Dockerfile,src/目录下有个1.txt文件
(1)Dockerfile中的内容如下:
FROM alpine
WORKDIR /app
COPY src/ /app
RUN echo 321>> 1.txt
CMD tail -f 1.txt 或者CMD cat 1.txt或者CMD ["cat","1.txt"]
(2)在命令行输入:
-t表示构建成的镜像名字是:test,指定版本就是test:latest,点表示位于当前目录
docker build -t test .
docker run test
123321
2.Dockerfile指令的用法
- Dockerfile作用:构建Docker镜像的配置文件
- 重要的指令如下:
FROM 表示基于什么什么镜像
WORKDIR 表示:当前的工作目录,shell语句运行在哪个路径下,没有目录会自动创建
COPY 将宿主机的文件拷贝至容器中的目录下
RUN 在构建的时候,就要运行的脚本shell语句
CMD 容器运行的时候,才会运行的脚本,该语句执行完毕后,镜像的生命周期也就结束了,所以一般可以
指定为阻塞式的,eg:tail -f
---------------------------------------------------------------------------
EXPOSE 指定当前镜像所暴露出来的端口
eg:docker inspect nginx中的Config这一项的ExposedPorts就是暴露出的端口,可以通过
docker run P 将该端口映射到主机的随机端口,若将net指定为host模式,会将该端口绑定到本机
的80端口
VOLUME /a/b 指定映射文件,一般是映射到匿名卷,将容器中的/a/b目录映射到主机的一个目录下,
eg:docker run中-p和-v都分别指定映射到外部的端口和目录
---------------------------------------------------------------------------
ENV 指定参数,容器的环境变量,docker -e可以指定环境变量,容器运行时的环境变量
eg:
FROM alpine
WORKDIR /app
COPY src/ /app
ENV A=10 或者 ENV A 10
CMD echo $A
ARG 构建参数,只有构建的时候才会有效,构建指的是:docker build
其实际作用是通过参数--build-arg指定变量的值,在构建时起到临时修改内部变量的效果
在dockerfile中其值相当于默认参数
eg:
FROM alpine
WORKDIR /app
COPY src/ /app
ARG B=10
ENV A=$B
CMD echo $A
运行的结果是10
如果使用docker build -t test --build-arg B=12 .
构建后,再运行的结果是:12
---------------------------------------------------------------------------
LABEL 指定元数据信息,作用就是看镜像是否有标识,没啥具体作用
eg:
FROM alpine
LABEL k="v" k1="v1"
WORKDIR /app
COPY src/ /app
ARG B=10
ENV A=$B
CMD echo $A
ONBUILD 后面可以接dockerfile其它的命令,指定在当前镜像下不会去运行
若另一个镜像是基于当前镜像的话,就会在另一个镜像的FROM后面执行ONBUILD,就是会继承父镜像相关指令
eg:
FROM alpine
LABEL k="v" k1="v1"
WORKDIR /app
COPY src/ /app
ONBUILD ENV C=100
CMD echo $C
再创建一个teset2目录,且新建一个Dockerfile文件
FROM test
执行命令:在test2目录下,构建了一个名为test2的镜像(-t参数)
docker build -t test2 test2
docker run test
最终打印100
docker run test
会打印空行
---------------------------------------------------------------------------
STOPSIGNAL 指定容器用什么信号可以停止,很少用,eg:STOPSIGNAL SIGINIT,STOPSIGNAL KILL
HEALTHCHECK 检查容器是否健康
SHEEL 指定RUN,CMD是哪种shell,linux一般默认是/bin/sh
---------------------------------------------------------------------------
(1)COPY与ADD的区别:
都是可以从主机外复制到镜像里面
COPY的源地址是主机文件系统的源地址,ADD的源地址不仅可以是主机文件系统的源地址,还可以是URL
推荐使用COPY
(2)CMD与EENTRYPOINt的区别:
都是指定容器运行起来的核心脚本
若ENTRYPOINt的形式非json数组形式,则以ENTRYPOINt为准,CMD指令无效;
ENTRYPOINt和CMD都是json,则ENTRYPOINt+CMD拼接成shell语句来执行;
ONBUILD用法的对应图片
3.从 Dockerfile 运行 Docker 实例的步骤
(1)创建一个 Dockerfile
要创建 Dockerfile,我们必须了解它的组件。
- 一些最常见的命令包括:
FROM:创建使用的父/基础镜像的层。
WORKDIR:允许我们设置工作目录。
COPY:使我们能够将当前目录内容复制到容器中的目录中。
PULL:从你的 Docker 存储库添加文件。
RUN:当我们想要构建镜像时执行。
CMD:指定容器启动时要运行的命令。
ENV:定义构建期间使用的环境变量。
ENTRYPOINT:确定容器启动时要运行的命令。
MAINTAINER:指定镜像的作者。
(2)首先创建将托管 Dockerfile 等文件的主目录
- 制作一个简单的 Flask 应用程序,在控制台上打印一条消息。
mkdir my-app
- 进入该目录并创建应用程序的主文件为 app.py
from flask import Flask
app = Flask(__name__)
def hello():
print("Hello, this is a simple Flask application")
hello()
(3)创建 Dockerfile
touch Dockerfile
(4)我们还创建了一个 requirements.txt 文件,其中包含运行此应用程序所需的安装文件
click==8.0.4
Flask==2.0.3
gunicorn==20.1.0
itsdangerous==2.1.0
Jinja2==3.0.3
MarkupSafe==2.1.0
Werkzeug==2.0.3
(5)编辑 Dockerfile 并添加以下命令以使用 docker build 命令创建 docker 映像
- 设置了工作目录并将必要的文件从当前目录复制到 Docker 容器中的目录
# base image
FROM python
# Set your working directory
WORKDIR /var/www/
# Copy the necessary files
COPY ./app.py /var/www/app.py
COPY ./requirements.txt /var/www/requirements.txt
# Install the necessary packages
RUN pip install -r /var/www/requirements.txt
# Run the app
CMD ["echo", "Hello, Developer"]
(6)创建 Docker 映像
- docker build 命令创建 Docker 映像,必须在同一目录中运行此命令。
- -t 标志使我们能够标记映像的名称并指示 Dockerfile 位于我们正在执行此命令的同一目录中。
~/my-app$ docker build -t new_image .
输出:
[+] Building 184.4s (10/10) FINISHED
=> [internal] load build definition from Dockerfile 1.5s
=> => transferring dockerfile: 38B 0.0s
=> [internal] load .dockerignore 1.9s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:latest 50.8s
=> [1/5] FROM docker.io/library/python@sha256:3204faabc2f0b5e0939bdb8b29079a2a330c38dee92a22482a9ed449c5649a55 30.4s
=> => resolve docker.io/library/python@sha256:3204faabc2f0b5e0939bdb8b29079a2a330c38dee92a22482a9ed449c5649a55 0.4s
=> => sha256:3204faabc2f0b5e0939bdb8b29079a2a330c38dee92a22482a9ed449c5649a55 2.14kB / 2.14kB 0.0s
=> => sha256:17e2d81e5757980ee40742d77dd5d3e1a69ad0d6dacb13064e1b018a6664ec72 2.22kB / 2.22kB 0.0s
=> => sha256:178dcaa62b393b539abc8b866c39be81e8ade01786880dc5d17ce3fe02426dbb 8.55kB / 8.55kB 0.0s
=> => sha256:38121472aa0128f87b31fde5c07080418cc17b4a8ee224767b59e24c592ff7d3 2.34MB / 2.34MB 10.4s
=> => extracting sha256:38121472aa0128f87b31fde5c07080418cc17b4a8ee224767b59e24c592ff7d3 14.6s
=> [internal] load build context 1.1s
=> => transferring context: 195B 0.0s
=> [2/5] WORKDIR /var/www/ 3.2s
=> [3/5] COPY ./app.py /var/www/app.py 1.9s
=> [4/5] COPY ./requirements.txt /var/www/requirements.txt 2.6s
=> [5/5] RUN pip install -r /var/www/requirements.txt 82.3s
=> exporting to image 8.1s
=> => exporting layers 6.0s
=> => writing image sha256:5811f24b498ae784af32935318a5fddba536e2be27233b19bf08cad81438d114 0.2s
=> => naming to docker.io/library/new_image
(7)docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
new_image latest 5811f24b498a 2 minutes ago 929MB
(8)从 Dockerfile 运行实例
~/my-app$ docker run -it new_image
Hello, Developer
参考:链接,从 Dockerfile 运行 Docker 实例