指令 | 功能 | 特殊说明 |
|---|---|---|
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.4rm /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
exitconmitdocker 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 388MBdocker 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 param2CMD ["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 param2docker run -it [image]启动时,输出为:Hello world
而如果通过 docker run -it [image] noah 启动,则输出为:Hello noah原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。