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是我们之前设定点主页。