03-DockerFile选项(详细讲解和示例)

1 FROM

  • 作用: 定义基础镜像,FROM命令必须是Dockerfile的首个命令。

  • 示例:

# Usage: FROM [image name]
FROM busybox

2 MAINTAINER

  • 作用: 于声明作者,并应该放在FROM的后面。
  • 示例:
# Usage: MAINTAINER [name]
MAINTAINER liubei 

3 RUN

3.1 作用

镜像构建时执行制定命令

3.2 语法

# Usage: RUN [command]
RUN COMMAND

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(简单使用)

  • 创建Dockerfile 文件,内容如下:
FROM  busybox
MAINTAINER liubei
CMD ["echo","hello"]
  • 构建镜像,镜像名为busybox-test
[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后边点命令被执行了。

容器启动一下就结束了,这是因为镜像持续运行需要有一个稳定的前台输出。但是没关系,我们只是为了验证输出。

  • CMD可以被docker run 覆盖:
[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 作用和特点

  • 作用:
    配置容器启动后执行的命令

  • 特点:
    可以被docker run覆盖
    每个dockerfile只能有一个ENTRYPOINT,如果多个只有最后一个生效

5.2 示例 1(简单应用)

  • 创建 Dockerfile文件:
FROM  busybox
MAINTAINER liuwei
ENTRYPOINT ["echo","ENTRYPOINT"]
  • 编译镜像
docker build -t busybox-test .
  • 从该镜像运行容器
[root@test dockerfile]# docker run  busybox-test
ENTRYPOINT

可见执行了预期命令

  • 不能被docker run 覆盖
[root@test dockerfile]# docker run busybox-test echo run
ENTRYPOINT echo run

可见,docker run的命令只能作为ENTRYPOINT的参数,而不能覆盖ENTRYPOINT。

那么问题来了:CMD是否能做ENTRYPOINT的参数呢?看下例:

5.3 示例2 (CMD/RUN做ENTRYPOINT的参数)

  • 创建 Dockerfile文件:
FROM busybox
MAINTAINER liubei
CMD ["hello"]
ENTRYPOINT ["echo"]

  • 编译镜像
docker build -t busybox-test .
  • 从该镜像运行容器
[root@test dockerfile]# docker run busybox-test
hello

可见,CMD可以做为ENTRYPOINT的参数

  • docker run 覆盖 CMD做参数
[root@test dockerfile]# docker run busybox-test docker run
docker run

敲黑板
容器启动时如果要执行几条命令,前边的必须是后台输出,最后一个是前台输出。

  • 如果前边是前台输出则后边不能执行
  • 如果最后一条也是后台输出,则容器执行完所有命令后会立刻退出。
  • 几个命令做好写成一个启动脚本

6 ADD

6.1 作用和特点

  • 作用
    拷贝文件到镜像

  • 特点
    如果是压缩包则会被解压缩
    如果是url则会下载URL的内容并复制到镜像。

6.2 语法

# Usage: ADD [source directory or URL] [destination directory]
ADD source target 

6.3 示例

  • 创建 Dockerfile文件:
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 示例

  • 创建 Dockerfile文件:
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 语法

# Usage: WORKDIR /path
WORKDIR ~/

8.3 示例

  • 创建 Dockerfile文件:
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 语法

# Usage: ENV key value
ENV KEY_NAME VALUE

9.3 示例

  • 创建 Dockerfile文件:
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 语法

# Usage: EXPOSE [port]
EXPOSE 8080

10.3 示例

  • 创建 Dockerfile文件:
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]# docker run -d -P centos-test
1583150a79b4ea814a268e4f5ded02baef55d272ebcad695f332ec54fa0d95fe
[root@test dockerfile]# docker ps
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 示例

  • 创建 Dockerfile文件:
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 示例

  • 创建 Dockerfile文件:
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是我们之前设定点主页。

posted on 2021-12-23 11:47  运维开发玄德公  阅读(28)  评论(0编辑  收藏  举报  来源

导航