1 FROM
| # Usage: FROM [image name] |
| FROM busybox |
2 MAINTAINER
- 作用: 于声明作者,并应该放在FROM的后面。
- 示例:
| # Usage: MAINTAINER [name] |
| MAINTAINER liubei |
3 RUN
3.1 作用
镜像构建时执行制定命令
3.2 语法
3.3 示例
| # Usage: RUN [command] |
| RUN yum install httpd |
4 CMD
4.1 作用和特点
- 作用
容器启动时执行点命令 - 特点:
可以被docker run
覆盖
每个dockerfile职能有一个CMD,如果多个只有最后一个生效
4.2 和RUN的区别
RUN
:镜像构建的过程中执行CMD
:容器启动时被执行
4.3 示例 1(简单使用)
| FROM busybox |
| MAINTAINER liubei |
| CMD ["echo","hello"] |
| [root@test dockerfile]# docker build -t busybox-test . |
| Sending build context to Docker daemon 2.048kB |
| Step 1/3 : FROM busybox |
| ---> ffe9d497c324 |
| Step 2/3 : MAINTAINER liubei |
| ---> Using cache |
| ---> b6943236f003 |
| Step 3/3 : CMD ["echo","hello"] |
| ---> Running in fd08f0dbb677 |
| Removing intermediate container fd08f0dbb677 |
| ---> 21d68914b7d5 |
| Successfully built 21d68914b7d5 |
| Successfully tagged busybox-test:latest |
| [root@test]# docker run busybox-test |
| hello |
可见,CMD后边点命令被执行了。
容器启动一下就结束了,这是因为镜像持续运行需要有一个稳定的前台输出。但是没关系,我们只是为了验证输出。
| [root@test]# docker run busybox-test echo "docker run" |
| docker run |
4.4 示例 (2 多个CMD只有最后一个生效)
Dockerfile文件如下:
| FROM busybox |
| MAINTAINER liuwei |
| CMD "echo" "1" |
| CMD "echo" "2" |
| CMD "echo" "3" |
构建同示例1
启动容器
| [root@n9e-client-01 dockerfile]# docker run busybox-test |
| 3 |
5 ENTRYPOINT
5.1 作用和特点
5.2 示例 1(简单应用)
| FROM busybox |
| MAINTAINER liuwei |
| ENTRYPOINT ["echo","ENTRYPOINT"] |
| docker build -t busybox-test . |
| [root@test dockerfile]# docker run busybox-test |
| ENTRYPOINT |
可见执行了预期命令
| [root@test dockerfile]# docker run busybox-test echo run |
| ENTRYPOINT echo run |
可见,docker run
的命令只能作为ENTRYPOINT的参数,而不能覆盖ENTRYPOINT。
那么问题来了:CMD是否能做ENTRYPOINT的参数呢?看下例:
5.3 示例2 (CMD/RUN做ENTRYPOINT的参数)
| FROM busybox |
| MAINTAINER liubei |
| CMD ["hello"] |
| ENTRYPOINT ["echo"] |
| |
| docker build -t busybox-test . |
| [root@test dockerfile]# docker run busybox-test |
| hello |
可见,CMD可以做为ENTRYPOINT的参数
| [root@test dockerfile]# docker run busybox-test docker run |
| docker run |
敲黑板
:
容器启动时如果要执行几条命令,前边的必须是后台输出,最后一个是前台输出。
- 如果前边是前台输出则后边不能执行
- 如果最后一条也是后台输出,则容器执行完所有命令后会立刻退出。
- 几个命令做好写成一个启动脚本
6 ADD
6.1 作用和特点
6.2 语法
| # Usage: ADD [source directory or URL] [destination directory] |
| ADD source target |
6.3 示例
| FROM busybox |
| MAINTAINER liuwei |
| ADD agentd.tar.gz / |
| docker build -t busybox-test . |
| [root@test dockerfile]# docker run busybox-test ls |
| agentd |
| bin |
| dev |
| etc |
| home |
| proc |
| root |
| sys |
| tmp |
| usr |
| var |
结果可见,agentd.tar.gz 不但被拷贝到容器中,而且还被解压缩了。
7 COPY
7.1 作用和特点
-
作用
拷贝文件到镜像
-
特点
如果是压缩包则不
会被解压缩
7.2 语法
| # Usage: ADD [source directory or URL] [destination directory] |
| COPY source target |
7.3 示例
| FROM busybox |
| MAINTAINER liuwei |
| ADD agentd.tar.gz / |
| docker build -t busybox-test . |
| [root@test dockerfile]# docker run busybox-test ls |
| agentd.tar.gz |
| bin |
| dev |
| etc |
| home |
| proc |
| root |
| sys |
| tmp |
| usr |
| var |
| |
结果可见,agentd.tar.gz 被拷贝到容器中,但不会被解压缩
8 WORKDIR
8.1 作用
指明的命令的运行目录,后边点操作会直接在个目录下执行。
8.2 语法
8.3 示例
| FROM busybox |
| MAINTAINER liuwei |
| WORKDIR /bin |
工作目录设置到 bin
目录
| docker build -t busybox-test . |
| # docker run busybox-test pwd |
| /bin |
输出可见,工作目录在 /bin
9 ENV
9.1 作用
设置环境变量。
这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。
9.2 语法
9.3 示例
| FROM busybox |
| MAINTAINER liubei |
| ENV MY_NAME liubei |
| docker build -t busybox-test . |
以伪终端方式启动容器,进入容器后打印变量如下:
| [root@test dockerfile]# docker run -it busybox-test sh |
| / # echo $MY_NAME |
| liubei |
如果用之前 方式启动容器,则打印的变量是宿主机的变量,而非镜像中的变量。
| [root@test dockerfile]# export MY_NAME=guanyu |
| [root@test dockerfile]# docker run busybox-test echo ${MY_NAME} |
| guanyu |
10 EXPOSE
10.1 作用
指定端口,使容器内的应用可以通过端口和外界交互。
10.2 语法
10.3 示例
| FROM centos |
| MAINTAINER liubei |
| RUN yum install -y httpd |
| EXPOSE 80 |
| RUN mkdir -p /var/www/html |
| RUN echo "my httpd" >/var/www/html/index.html |
| CMD ["httpd","-DFOREGROUND"] |
| |
| docker build -t centos-test . |
| [root@test dockerfile]# docker run -d centos-test |
| fc581f78fe667b76210cfbbf127b3e6f8bc5cad5ae1e104fbb0512ce1dc0f897 |
| [root@test dockerfile]# docker ps |
| CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
| fc581f78fe66 centos-test "httpd -DFOREGROUND" 3 seconds ago Up 1 second 80/tcp kind_meitner |
上图可见,80端口被暴露(但是此时并没有被映射到宿主机,所以我们仍不能访问)
| [root@test dockerfile]# curl http://127.0.0.1 |
| curl: (7) Failed connect to 127.0.0.1:80; 拒绝连接 |
| [root@test dockerfile] |
| 1583150a79b4ea814a268e4f5ded02baef55d272ebcad695f332ec54fa0d95fe |
| [root@test dockerfile] |
| CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
| 1583150a79b4 centos-test "httpd -DFOREGROUND" 5 seconds ago Up 5 seconds 0.0.0.0:32768->80/tcp focused_keldysh |
| fc581f78fe66 centos-test "httpd -DFOREGROUND" 5 minutes ago Up 5 minutes 80/tcp kind_meitner |
可见新启动的容器,加上-P参数,将端口映射到宿主机随机端口了。
| [root@test dockerfile]# curl http://127.0.0.1:32768 |
| my httpd |
| [root@test dockerfile]# docker run -d -p 6666:80 centos-test |
| d5999e826d6c05dc78bdad96717830c464f8f15358d1c9004f84a84a89f73deb |
| [root@test dockerfile]# docker ps |
| CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
| d5999e826d6c centos-test "httpd -DFOREGROUND" 5 seconds ago Up 4 seconds 0.0.0.0:6666->80/tcp elegant_hoover |
查看结果
| [root@test dockerfile]# curl http://127.0.0.1:6666 |
| my httpd |
11 USER
11.1 作用
设置运行容器用户ID
11.2 语法
| # Usage: USER [UID] |
| USER USER_ID |
11.3 示例
| FROM busybox |
| MAINTAINER liubei |
| USER 1002 |
| [root@test dockerfile]# docker build -t busybox-test . |
| [root@test dockerfile]# docker run busybox-test id |
| uid=1002 gid=0(root) |
输出可见,容器的默认用户id是我们刚才设置的1002
12 VOLUME
12.1 作用
用于让你的容器访问宿主机上的目录。(因此是宿主机目录覆盖容器内目录)
12.2 语法
| # Usage: VOLUME ["/dir_1", "/dir_2" ..] |
| VOLUME ["/my_files"] |
12.3 示例
| FROM centos |
| MAINTAINER liubei |
| RUN yum install -y httpd |
| VOLUME /var/www/html |
| CMD ["httpd","-DFOREGROUND"] |
计划把Apache点主页目录挂出来
| [root@test dockerfile]# mkdir /tmp/dockerfile/html |
| [root@test dockerfile]# chmod 755 /tmp/dockerfile/html |
| [root@test dockerfile]# echo "MY_VOLUME" > /tmp/dockerfile/html/index.html |
| [root@test dockerfile]# chmod 644 /tmp/dockerfile/html/index.html |
| docker build -t centos-test . |
| [root@test dockerfile]# docker run -d -p 80:80 -v /tmp/dockerfile/html:/var/www/html centos-test |
| 36c04b696675dedfaa839fefe2c8880d6f931318cd2cf0366a36cb99fa483b7c |
| [root@test dockerfile]# curl http://127.0.0.1 |
| MY VOLUME |
如上可见,访问Apache是我们之前设定点主页。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了