指令 | 功能 | 特殊说明 |
---|---|---|
FROM | 指定基础镜像 | 必须有 |
MAINTAINER | 指定维护者信息 | 可以没有 |
ENV | 设置环境变量 | 可被后面的指令使用 |
COPY | 复制文件到容器 | |
ADD | 复制文件到容器 | 压缩文件会自动解压 |
WORKDIR | 设置当前工作目录 | 类似linux的cd命令 |
VOLUME | 设置卷,挂载主机目录 | 需'-v'配合 |
EXPOSE | 指定对外的端口 | 默认不暴露,需"-P"配合 |
RUN | 运行指定的命令 | 在用于容器创建过程中执行命令 |
CMD | 容器启动后执行的命令 | 容易被替换 |
ENTRYPOINT | 容器启动后执行的命令 | 无法被替换 |
两种命令方式以及run,cmd,ENTRYPOINT的关系说明
案例以cnetos6.9为基础镜像,制作含有nginx的镜像
docker container rm `docker container ls -q -a`
docker volume rm `docker volume ls -q`
docker run -it --name noah-nginx centos:7.4
rm /etc/yum.repos.d/* -f
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y nginx
echo 'this nginx test pag' >/usr/share/nginx/html/index.html
exit
conmit
docker commit noah-nginx c7-nginx:v1
[root@docker01 ~]# docker image ls c7-nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
c7-nginx v1 f823aff3828d 39 seconds ago 388MB
docker run -d --name nginx-test -p 880:80 c7-nginx:v1 nginx -g "daemon off;"
[root@docker01 ~]# curl 127.0.0.1:880
this nginx test pag
已经通过自己手动构建的镜像创建了新容器,并且成功运行和访问
相对于手动制作的docker镜像,使用dockerfile构建的镜像有以下优点:
接下来通过dockerfile构建一个nginx镜像
docker container rm `docker container ls -q -a`
docker volume rm `docker volume ls -q`
mkdir -p /data/docker-file/c7-nginx/
cd /data/docker-file/c7-nginx/
docker build -t c7-nginx:v2 .
RUN、CMD 和 ENTRYPOINT 这三个 Dockerfile 指令看上去很类似,很容易混淆。简单的说他们的区别:
docker run
后面跟的命令行参数替换。Shell 和 Exec
可用两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令:Shell 格式和 Exec 格式 CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。RUN 则两种格式都可以。
<instruction> <command>
RUN apt-get install python3 CMD echo "Hello world" ENTRYPOINT echo "Hello world"<instruction> ["executable", "param1", "param2", ...]
RUN ["apt-get", "install", "python3"] CMD ["/bin/echo", "Hello world"] ENTRYPOINT ["/bin/echo", "Hello world"]name
已经被值 Noah luo
替换。CMD 指令允许用户指定容器的默认执行的命令,此命令会在容器启动且 docker run 没有指定其他命令时运行。
CMD ["executable","param1","param2"]
CMD command param1 param2
CMD ["param1","param2"]
专为 ENTRYPOINT 提供额外的参数,此时 ENTRYPOINT 必须使用 Exec 格式,详见 ENTRYPOINT部分说明。CMD echo "Hello world"
,运行容器 docker run -it [image]
将输出:Hello world
.
但当后面加上一个命令,比如docker run -it [image] /bin/bash
,CMD 会被忽略掉,命令 bash 将被执行ENTRYPOINT 指令可让容器以应用程序或者服务的形式运行, 与 CMD都可以指定要执行的命令及其参数. 不同的地方在于 ENTRYPOINT 不会被忽略,一定会被执行,即使运行 docker run 时指定了其他命令。
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
docker run -it [image]
启动时,输出为:Hello world
而如果通过 docker run -it [image] noah
启动,则输出为:Hello noah
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。