Dockerfile

Docker可以通过Dockerfile构建镜像。Dockerfile是一个文本文档,它包含用户可以在命令行上调用的所有命令来组装镜像。使用 docker build用户可以创建一个连续执行几个命令行指令的自动化构建

首先写一个Dockerfile

FROM nginx      # 基于一个基础镜像
RUN ls

运行 docker build . 构建一个镜像

  • -f 指定使用的dockerfile来生成镜像
  • -t 指定镜像名和标签
  • .当前上下文环境 这里使用当前目录(.)作为构建背景 . 可以放在-t -f 等指令之前 也可以放在指令后面
  • docker build . -f mydockerfile -t my_nginx:2.0
Sending build context to Docker daemon  6.144kB
Step 1/1 : FROM nginx
 ---> f2f70adc5d89
Successfully built f2f70adc5d89
Successfully tagged my_nginx:2.0
[root@iZuf620p8rsr3faul3zsx6Z test1]# docker images
REPOSITORY                             TAG       IMAGE ID       CREATED          SIZE
my_nginx                               2.0       41637892bcfc   19 seconds ago   142MB
nginx                                  latest    f2f70adc5d89   8 days ago       142MB

有效的Dockerfile必须以FROM指令开始

语法:
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
</name></tag></image></platform>
&#x8BED;&#x6CD5;1&#xFF1A;
RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
&#x8BED;&#x6CD5;2&#xFF1A;
RUN ["executable", "param1", "param2"] (exec form)

这个WORKDIR指令可以为RUN, CMD, ENTRYPOINT, COPY和ADD中的指令指定工作文件夹。

&#x8BED;&#x6CD5;&#xFF1A;
WORKDIR /path/to/workdir

为镜像设置环境变量

&#x8BED;&#x6CD5;&#xFF1A;
ENV <key>=<value> ...

</value></key>
FROM nginx
RUN pwd
WORKDIR /etc
ENV mykey=myvalue

docker build创建镜像,然后依次执行指令

[root@iZuf620p8rsr3faul3zsx6Z test1]# docker build . -t nginx_run_env_workdir
Sending build context to Docker daemon  7.168kB
Step 1/4 : FROM nginx
 ---> f2f70adc5d89
Step 2/4 : RUN pwd
 ---> Running in fca96ac4ffc3
/
Removing intermediate container fca96ac4ffc3
 ---> d254ae1be464
Step 3/4 : WORKDIR /etc                   **&#x8FD9;&#x91CC;&#x6307;&#x5B9A;etc&#x4E3A;&#x5DE5;&#x4F5C;&#x76EE;&#x5F55;**
 ---> Running in 96c839d4d559
Removing intermediate container 96c839d4d559
 ---> 850465095d7d
Step 4/4 : ENV mykey=myvalue              **&#x8FD9;&#x91CC;&#x8BBE;&#x7F6E;&#x65B0;&#x7684;&#x73AF;&#x5883;&#x53D8;&#x91CF;**
 ---> Running in 2d83734c81d1
Removing intermediate container 2d83734c81d1
 ---> f77f64a01b10
Successfully built f77f64a01b10
Successfully tagged nginx_run_env_workdir:latest      **&#x6784;&#x5EFA;&#x6210;&#x529F; &#x8FD0;&#x884C;&#x5BB9;&#x5668;**
[root@iZuf620p8rsr3faul3zsx6Z test1]# docker run -d --rm nginx_run_env_workdir
a4569433802ec0853b5f3536ce66f0d55486e46e2ecb85b1f533305028aedef3
[root@iZuf620p8rsr3faul3zsx6Z test1]# docker ps -a
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS     NAMES
a4569433802e   nginx_run_env_workdir   "/docker-entrypoint.&#x2026;"   42 seconds ago   Up 41 seconds   80/tcp    dreamy_sanderson
[root@iZuf620p8rsr3faul3zsx6Z test1]# docker exec -it a4569433802e bash      **&#x8FDB;&#x5165;&#x5BB9;&#x5668;**
root@a4569433802e:/etc# env             **&#x8FD9;&#x91CC;&#x8FDB;&#x5165;&#x5BB9;&#x5668; &#x9ED8;&#x8BA4;&#x8FDB;&#x5165;etc&#x6587;&#x4EF6;&#x5939;**
HOSTNAME=a4569433802e
PWD=/etc
PKG_RELEASE=1~bullseye
HOME=/root
NJS_VERSION=0.7.2
TERM=xterm
SHLVL=1
mykey=myvalue                          **&#x8FD9;&#x91CC;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x65B0;&#x52A0;&#x7684;&#x73AF;&#x5883;&#x53D8;&#x91CF;**
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.21.6
_=/usr/bin/env
root@a4569433802e:/etc#

这个COPY指令将新文件或目录从并将它们添加到路径上容器的文件系统中.

&#x8BED;&#x6CD5;1&#xFF1A;
COPY [--chown=<user>:<group>] <src>... <dest>
&#x8BED;&#x6CD5;2&#xFF1A;
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
</dest></src></group></user></dest></src></group></user>

ADD指令复制新文件、目录或远程文件url。并将它们添加到路径上图像的文件系统中. ADD比COPY指令多了一个下载远程文件url的功能

&#x8BED;&#x6CD5;1&#xFF1A;
ADD [--chown=<user>:<group>] <src>... <dest>
&#x8BED;&#x6CD5;2&#xFF1A;
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
</dest></src></group></user></dest></src></group></user>
FROM nginx
RUN pwd
WORKDIR /etc
ENV mykey=myvalue
COPY ./a.txt /root/
ADD ./a.txt /root/c.txt
ADD https://nginx.org/download/nginx-1.21.6.tar.gz /root

docker build . -t nginx_copy_add 构建镜像
docker run -d --rm nginx_copy_add 运行容器

[root@iZuf620p8rsr3faul3zsx6Z test1]# docker exec -it 548e96d26901 bash  **&#x8FDB;&#x5165;&#x5BB9;&#x5668;**
root@548e96d26901:/etc# cd /root
root@548e96d26901:~# ls
nginx-1.21.6.tar.gz  a.txt  c.txt     **&#x7531;COPY&#x6307;&#x4EE4;&#x590D;&#x5236;&#x7684;a.txt &#x6587;&#x4EF6; &#x548C;&#x7531;ADD&#x6307;&#x4EE4;&#x590D;&#x5236; c.txt &#x4EE5;&#x53CA;&#x7F51;&#x7EDC;&#x4E0B;&#x8F7D;&#x7684;nginx-1.21.6.tar.gz &#x6587;&#x4EF6;**
root@548e96d26901:~# cat a.txt            **&#x91CC;&#x9762;&#x7684;&#x5185;&#x5BB9;&#x4E5F;&#x662F;&#x5B8C;&#x5168;&#x4E00;&#x6837;&#x7684;**
aaaaawqewqewq
root@548e96d26901:~# cat c.txt
bbbbbbbb
root@548e96d26901:~#

这个EXPOSE指令通知Docker容器在运行时侦听指定的网络端口。可以指定端口是否侦听TCP或UDP,如果未指定协议,则默认为TCP。
一般不使用EXPOSE指令指定的网络端口,在运行容器时使用 docker run -p-P指令

&#x8BED;&#x6CD5;&#xFF1A;
EXPOSE <port> [<port>/<protocol>...]
</protocol></port></port>

这个VOLUME指令创建一个具有指定名称的挂载点,并将其标记为保存来自本机主机或其他容器的外部挂载卷。值可以是JSON数组,VOLUME [“/var/log/”],或者具有多个参数的普通字符串,如VOLUME /var/log或VOLUME /var/log /var/db
docker run -v指令作用相当

&#x8BED;&#x6CD5;&#xFF1A;
VOLUME ["/data"]
FROM nginx
WORKDIR /root
EXPOSE 8080/tcp
EXPOSE 8081/udp
VOLUME /volume1

docker volume --help 查看数据卷挂载情况

Usage:  docker volume COMMAND
Manage volumes
Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

docker build . -t nginx_volume
docker run -d --rm --name nginx_volume nginx_volume
构建镜像并运行容器

**docker volume &#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x5230;&#x672C;&#x5730;&#x591A;&#x4E86;&#x4E00;&#x6761;&#x6570;&#x636E;&#x5377;&#x6302;&#x8F7D;&#x4FE1;&#x606F;**
[root@iZuf620p8rsr3faul3zsx6Z test1]# docker volume ls
DRIVER    VOLUME NAME
local     739de9625ef852803660a1d5b63c8457ebd90bd50cbbe815650846c3610adb71

docker inspect --help 查看容器信息

Usage:  docker inspect [OPTIONS] NAME|ID [NAME|ID...]
Return low-level information on Docker objects
Options:
  -f, --format string   Format the output using the given Go template
  -s, --size            Display total file sizes if the type is container
      --type string     Return JSON for specified type

docker inspect nginx_volume 找到Mounts节点 Source 为宿主机对应容器挂载地址

"Mounts": [
            {
                "Type": "volume",
                "Name": "739de9625ef852803660a1d5b63c8457ebd90bd50cbbe815650846c3610adb71",
                "Source": "/var/lib/docker/volumes/739de9625ef852803660a1d5b63c8457ebd90bd50cbbe815650846c3610adb71/_data",
                "Destination": "/volume1",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
[root@iZuf620p8rsr3faul3zsx6Z test1]# docker exec -it nginx_volume bash
root@a1876b7b5872:~# cd /
root@a1876b7b5872:/# ls
bin   dev          docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc           lib   media  opt  root  sbin  sys  usr  volume1
root@a1876b7b5872:/# cd volume1/  **&#x8FDB;&#x5165;&#x5BB9;&#x5668;&#x6839;&#x76EE;&#x5F55;volume1&#x6587;&#x4EF6;&#x5939;&#x4E0B;**
root@a1876b7b5872:/volume1# touch aaa.txt
root@a1876b7b5872:/volume1# echo 123 > aaa.txt
root@a1876b7b5872:/volume1# cat aaa.txt     **&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;**
123
root@a1876b7b5872:/volume1# exit       **&#x9000;&#x51FA;&#x5BB9;&#x5668;**
exit
[root@iZuf620p8rsr3faul3zsx6Z test1]# cd /var/lib/docker/volumes/739de9625ef852803660a1d5b63c8457ebd90bd50cbbe815650846c3610adb71/_data
[root@iZuf620p8rsr3faul3zsx6Z _data]# ls    **&#x5728;&#x5BBF;&#x4E3B;&#x673A;&#x76F8;&#x5E94;&#x4F4D;&#x7F6E;&#x4E0A;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x76F8;&#x540C;&#x7684;&#x6587;&#x4EF6;**
aaa.txt
[root@iZuf620p8rsr3faul3zsx6Z _data]# cat aaa.txt
123
[root@iZuf620p8rsr3faul3zsx6Z _data]# touch bbb.txt
[root@iZuf620p8rsr3faul3zsx6Z _data]# vim bbb.txt     **&#x5728;&#x5BBF;&#x4E3B;&#x673A;&#x4E0A;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x6587;&#x4EF6;**
[root@iZuf620p8rsr3faul3zsx6Z _data]# docker exec -it nginx_volume bash
root@a1876b7b5872:~# cd /
root@a1876b7b5872:/# ls
bin   dev          docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc           lib   media  opt  root  sbin  sys  usr  volume1
root@a1876b7b5872:/# cd volume1
root@a1876b7b5872:/volume1# ls  **&#x518D;&#x6B21;&#x8FDB;&#x5165;&#x5BB9;&#x5668;volume1&#x6587;&#x4EF6;&#x5939;, &#x53D1;&#x73B0;&#x4E86;&#x5BBF;&#x4E3B;&#x673A;&#x65B0;&#x521B;&#x5EFA;&#x7684;&#x6587;&#x4EF6;,&#x6570;&#x636E;&#x5377;&#x6302;&#x8F7D;&#x6210;&#x529F;**
aaa.txt  bbb.txt

Dockerfile只能有一个CMD中的指令。如果你列出了多个CMD那么只有最后一个CMD会生效。
如果在运行 docker run时带上其他指令 CMD也不会生效
CMD主要目的为正在执行的容器提供默认值

&#x8BED;&#x6CD5;1&#xFF1A;
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
&#x8BED;&#x6CD5;2&#xFF1A;
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
&#x8BED;&#x6CD5;3&#xFF1A;
CMD command param1 param2 (shell form)

和CMD指令类似,和CMD不同的是在运行 docker run时带上其他指令 ENTRYPOINT也会生效
使用 docker run --entrypoint可以重写ENTRYPOINT指令

&#x8BED;&#x6CD5;1&#xFF1A;
ENTRYPOINT ["executable", "param1", "param2"]
&#x8BED;&#x6CD5;2&#xFF1A;
ENTRYPOINT command param1 param2
FROM nginx
RUN pwd               **RUN&#x6307;&#x4EE4;&#x5728;&#x6784;&#x5EFA;&#x65F6;&#x6267;&#x884C;**
CMD pwd
CMD ls                   **CMD&#x3001;ENTRYPOINT &#x6307;&#x4EE4;&#x5728;&#x5BB9;&#x5668;&#x8FD0;&#x884C;&#x65F6;&#x6267;&#x884C;**
ENTRYPOINT echo 12345
ENTRYPOINT ["ls"]                **ENTRYPOINT&#x6307;&#x4EE4;&#x4E0D;&#x4F1A;&#x88AB;&#x8986;&#x76D6; RUN&#x6307;&#x4EE4;&#x53EF;&#x4EE5;&#x88AB;&#x8986;&#x76D6;**
CMD ["/root"]                    **&#x4E24;&#x8005;&#x7ED3;&#x5408;&#x53EF;&#x4EE5;&#x505A;&#x5230;&#x5728;&#x8FD0;&#x884C;&#x65F6;&#x8F93;&#x5165;&#x4E0D;&#x540C;&#x53C2;&#x6570;&#xFF0C;&#x8FBE;&#x5230;&#x4E0D;&#x540C;&#x7684;&#x6548;&#x679C;**

docker build . -t nginx_ec
如下在运行时,输入不同的参数实现不同的操作

[root@iZuf620p8rsr3faul3zsx6Z /]# docker run --rm nginx_ec /var
backups
cache
lib
local
lock
log
mail
opt
run
spool
tmp
[root@iZuf620p8rsr3faul3zsx6Z /]# docker run --rm nginx_ec /dev
core
fd
full
mqueue
null
ptmx
pts
random
shm
stderr
stdin
stdout
tty
urandom
zero
[root@iZuf620p8rsr3faul3zsx6Z /]#

docker官方文档

Original: https://www.cnblogs.com/Dewumu/p/16084950.html
Author: 德乌姆列特
Title: Dockerfile

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606532/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • WPF 调试依赖属性变更方法

    本文告诉大家如何调试 WPF 的某个依赖属性被变更的方法 在 WPF 里面,所有的依赖属性都有带通知的功能,通过带通知的功能,可以在通知里加上断点,通过调用堆栈了解是哪个模块调用的…

    Linux 2023年6月6日
    099
  • 【设计模式】Java设计模式-命令模式

    Java设计模式 – 命令模式 😄生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德德🌝分享学习心得,…

    Linux 2023年6月6日
    086
  • 剑指offer计划31(数学困难)—java

    1.1、题目1 剑指 Offer 14- II. 剪绳子 II 1.2、解法 刚刚好结束了,这个专题,国庆休息,后面再改 1.3、代码 class Solution { publi…

    Linux 2023年6月11日
    0105
  • Jquery如何使用animation动画效果改变背景色

    一、问题引入 1. jquery的animate动画虽然强大,但是无法使用其进行背景色(background-color)的动画效果变化,因为animate动画效果只能动态改变数值…

    Linux 2023年6月14日
    0224
  • FinalShell—一体化服务器管理软件(SSH客户端)

    下面附上一些截图和官方连接: 官网:http://www.hostbuf.com/ FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运…

    Linux 2023年5月28日
    086
  • 甲骨文严查Java授权,换openJDK要避坑

    背景 外媒The Register报道,甲骨文稽查企业用户,近期开始将把过去看管较松散的Java授权加入。 甲骨文针对标准版Java(Java SE)有2种商业授权。2019年4月…

    Linux 2023年6月14日
    0101
  • HTTP状态码1XX深入理解

    前段时间看了《御赐小仵作》,里面有很多细节很有心。看了一些评论都是:终于在剧里能够看到真正在搞事业、发了工资第一时间还钱的正常人了。我印象比较深的是王府才能吃上的葡萄。觉得非常合理…

    Linux 2023年6月13日
    0102
  • mysql join语句的执行流程是怎么样的

    mysql join语句的执行流程是怎么样的 join语句是使用十分频繁的sql语句,同样结果的join语句,写法不同会有非常大的性能差距。 select * from t1 st…

    Linux 2023年6月8日
    0104
  • MySQL实现 group_concat 排序

    MySQL支持实现group_concat() 内部自定义排序: 实例: 新建一张表 reward,表中数据如下: SQL: SELECT uid, GROUP_CONCAT(mo…

    Linux 2023年6月13日
    0125
  • Shiro结合Redis实现分布式或集群环境下的Session共享

    本篇是Shiro系列第二篇,使用Shiro基于Redis实现分布式或集群环境下的Session共享。在讲Session共享之前先说一下为什么要做Session共享。 什么是Sess…

    Linux 2023年5月28日
    0133
  • 如何验收安卓PCBA主板的质量和性能

    .版本:v0.1作者:河东西望日期:2022-7-15. 对很多安卓智能设备厂商来说,他们的通用开发模式一般是:ODM/OEM设计开发主板PCBA(包括BSP驱动、原生AOSP系统…

    Linux 2023年6月7日
    0113
  • Mysql 5.7开启binlog日志

    Mysql 5.7开启binlog日志 前言 binlog是MySQL的二进制日志,并且是MySQL中最重要的日志。binlog记录了对MySQL数据库执行更改的所有操作,包括对数…

    Linux 2023年6月6日
    0112
  • MySQL注入 利用系统读、写文件

    MySQL能读写系统文件的前提 不同系统、不同的数据库版本有细微差异,以下实验在Windows10和Mysql 5.7.26下操作; 1.拥有该File的读权限 、 该目录写的权限…

    Linux 2023年6月6日
    0117
  • sed语句用法

    sed编辑器 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要…

    Linux 2023年6月6日
    0102
  • 通过shell命令在MAC安装证书

    Macmini打包要需要更新苹果证书,又不想连接显示器,鼠标点点,如果可以通过shell命令,直接远程安装证书就好了。 #双击证书文件 open #输入密码 security un…

    Linux 2023年5月28日
    0135
  • centos7磁盘扩容

    1.先增加一块磁盘 2.查看虚拟机磁盘[root@book ~]# df -h 记住红框里的位置信息 3.查看当前磁盘分区表[root@book ~]# fdisk -l 4.输入…

    Linux 2023年6月8日
    0103
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球