![39c38e4607927e982592f791329e3f46.png](https://i-blog.csdnimg.cn/blog_migrate/fa4c11b242762adc8e9a6ab49923f220.jpeg)
![f60ef1180ed1838f3fd7a3522498e036.gif](https://i-blog.csdnimg.cn/blog_migrate/c6a117e53f0453983a3431007810e345.gif)
配置文件
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。
下面创建 Dockerfile 配置文件如下:
# 使用的源镜像
FROM ubuntu
# RUN 执行的容器命令
RUN apt -y update && apt -y upgrade && apt install -y vim
nginx
# 开放端口
EXPOSE 80
# 启动后执行的命令,在执行docker run ... 命令时添加 /bin/bash ,CMD设置将无效
# 以前台运行NGINX
CMD ["nginx","g","daemon off;"]
- RUN指令是在镜像构建时执行,RUN 经常用于安装软件包。
- CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换,有多个 CMD 指令时只有最后一个 CMD 有效。
构建镜像
在 Dockerfile 文件所在目录执行编译镜像操作。
docker build -t pfinal/nginx .
查看镜像编译是否成功
docker images
使用镜像
修改 /etc/hosts
添加 pfinal.test
本地域名的解析记录
127.0.0.1 pfinal.test
运行容器
docker run -tid -p 8080:80 -v /www:/var/www/html --name nginx pfinal/nginx
宿主使用 pfinal.test
或localhost:8080
(如果宿主机没有使用80也可以将80端口映射) 访问nginx
镜像上传
制作好的镜像可以上传到网上,以供其他人使用。
登录 docker hub
docker login
推送镜像到仓库
docker push pfinal/lamp
登录 https://hub.docker.com/ 就可以在 Repositories 中查看到刚者提交的镜像了。
现在其他用户可以使用以下命令安装我们的镜像了。
docker pull pfinal/lamp
退出 docker hub
docker logout
![f60ef1180ed1838f3fd7a3522498e036.gif](https://i-blog.csdnimg.cn/blog_migrate/c6a117e53f0453983a3431007810e345.gif)
指令详解
合起来就是下面这张图:
![318ba54d331f9b4d29cde6944ae61957.png](https://i-blog.csdnimg.cn/blog_migrate/509f8dbfed18ba2063350eee79326c64.jpeg)
FROM
指令:FROM
功能描述:设置基础镜像
语法:FROM < image>[:< tag> | @< digest>]
提示:镜像都是从一个基础镜像(操作系统或其他镜像)生成,可以在一个Dockerfile中添加多条FROM指令,一次生成多个镜像
注意:如果忽略tag选项,会使用latest镜像
MAINTAINER
功能描述:设置镜像作者
语法:MAINTAINER < name>
RUN
功能描述: 用来执行命令行命令的
语法:RUN < command>
RUN [“executable”,”param1”,”param2”]
提示:RUN指令会生成容器,在容器中执行脚本,容器使用当前镜像,脚本指令完成后,Docker Daemon会将该容器提交为一个中间镜像,供后面的指令使用
补充:RUN指令第一种方式为shell方式,使用/bin/sh -c < command>运行脚本,可以在其中使用将脚本分为多行
RUN指令第二种方式为exec方式,镜像中没有/bin/sh或者要使用其他shell时使用该方式,其不会调用shell命令
例子:
RUN source $HOME/.bashrc;
echo $HOME
RUN [“/bin/bash”,”-c”,”echo hello”]
RUN [“sh”,”-c”,”echo”,”$HOME”]
使用第二种方式调用shell读取环境变量
ADD
功能描述:更高级复制文件到镜像中
语法:ADD < src>… < dest>|[“< src>”,… “< dest>”]
注意:当路径中有空格时,需要使用第二种方式
当src为文件或目录时,Docker Daemon会从编译目录寻找这些文件或目录,而dest为镜像中的绝对路径或者相对于WORKDIR的路径
提示:src为目录时,复制目录中所有内容,包括文件系统的元数据,但不包括目录本身
src为压缩文件,并且压缩方式为gzip,bzip2或xz时,指令会将其解压为目录
如果src为文件,则复制文件和元数据
如果dest不存在,指令会自动创建dest和缺失的上级目录
WORKDIR
功能描述:设置RUN CMD ENTRYPOINT ADD COPY指令的工作目录
语法:WORKDIR < Path>
提示:如果工作目录不存在,则Docker Daemon会自动创建
Dockerfile中多个地方都可以调用WORKDIR,如果后面跟的是相对位置,则会跟在上条WORKDIR指定路径后(如WORKDIR /A WORKDIR B WORKDIR C,最终路径为/A/B/C)
VOLUME
功能描述:设置定义匿名卷
语法:VOLUME [“/data”]
VOLUME /data1 /data2
提示:容器运行时应该尽量保持容器存储层不发生写操作,对于数据库需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中,为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在Dockerfile中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
VOLUME /data
这里的/data目录就会在运行时自动挂载为匿名卷,任何向/data中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。当然,运行时可以覆盖这个挂载设置。
EXPOSE
功能描述:声明端口
语法:EXPOSE < port> < port> …
延伸:镜像暴露端口可以通过docker inspect查看
提示:容器启动时,Docker Daemon会扫描镜像中暴露的端口,如果加入-P参数,Docker Daemon会把镜像中所有暴露端口导出,并为每个暴露端口分配一个随机的主机端口(暴露端口是容器监听端口,主机端口为外部访问容器的端口)
注意:EXPOSE只设置暴露端口并不导出端口,只有启动容器时使用-P/-p才导出端口,这个时候才能通过外部访问容器提供的服务
![e420e9ec4ff95f9bae8251689c92040b.gif](https://i-blog.csdnimg.cn/blog_migrate/36ab907adf51ee91ec8449f9d0f99a65.gif)