文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
Dockerfile
Dockerfile 构建一个 nginx 镜像
Dockerfile 构建一个 nginx 镜像,构建好的镜像内会有一个 /usr/share/nginx/html/index.html
文件
新建一个名为 Dockerfile 文件,并在文件内添加以下内容
FROM nginx RUN echo '你好 docker' > /usr/share/nginx/html/index.html WORKDIR /usr/share/nginx/html
- 构建镜像
docker build -t nginx:v1 .
- 进入容器
docker run -it -d -p 8900:80 容器 ID
- [root@localhost ~]#
curl 127.0.0.1
你好 docker
Dockerfile 详解
Dockerfile
文件的文件名建议使用Dockerfile
,如果是其他文件构建的时候需要指定文件 名- Dockerfile 构建镜像的执行顺序是从上往下
- 每一个指令都会创建一个新的镜像层,并提交
FROM # 基础境像,一切从这里开始构建 MAINTAINER # 镜像是谁写的,姓名+邮箱 LABEL # LABEL 指令用来给镜像添加一些元数据 RUN # 编译镜像时运行的脚本 COPY # 编译镜像时复制文件到镜像中 不会解压 ADD # 编译镜像时复制文件到镜像中 tar.gz 文件会自动解压 WORKDIR # 镜像的工作目录 CMD # 设置容器启动的命令 ENTRYPOINT # 设置容器启动的命令 EXPOSE # 设置镜像暴露的端口 VOLUME # 设置容器挂载的卷 ENV # 设置容器的环境变量
FROM
指定哪种镜像作为新镜像的基础镜像,如:FROM ubuntu:14.04
MAINTAINER
指明该镜像的作者和其电子邮件,如:MAINTAINER "xxxxxxx@qq.com"
LABEL
给镜像添加信息。使用docker inspect
可查看镜像的相关信息,如:LABEL maintainer="xx@qq.com"
LABEL version="1.0"
LABEL description="This is description"
RUN
在新镜像内部执行的命令- 比如安装一些软件、配置一些基础环境,可使用
\
来换行,如:RUN apt-get update && apt-get install -y vim
- 也可以使用
exec
格式RUN ["executable", "param1", "param2"]
的命令,如RUN ["apt-get","install","-y","nginx"]
RUN ["yum","install","-y","nginx"]
- 比如安装一些软件、配置一些基础环境,可使用
COPY
- 将主机的文件复制到镜像内,如果目的位置不存在,Docker 会自动创建所有需要的目录结 构,但是它只是单纯的复制,并不会去做文件提取和解压工作。如:
COPY ./src/ /usr/share/nginx/html/
ADD
- 将主机的文件复制到镜像内,如果目的位置不存在,Docker 会自动创建所有需要的目录结 构,并且会解压文件。如:
ADD ./src.tar.gz /usr/share/nginx/html/
WORKDIR
- 在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会 创建目录
WORKDIR /usr/share/nginx/html
CMD
- 在构建镜像时,指定容器启动的命令,如果不存在,则会使用镜像的默认启动命令
CMD ["/bin/bash"]
ENTRYPOINT
- 在构建镜像时,指定容器启动的命令,如果不存在,则会使用镜像的默认启动命令
ENTRYPOINT ["/bin/bash"]
CMD
和ENTRYPOINT
同样作为容器启动时执行的命令,区别有以下几点CMD
的命令会被docker run
的命令覆盖而ENTRYPOINT
不会- 如使用
CMD ["/bin/bash"]
或ENTRYPOINT ["/bin/bash"]
后,再使用docker run -it image
启动容 器,它会自动进入容器内部的交互终端,如同使用docker run -it image /bin/bash
- 但是如果启动镜像的命令为
docker run -it image /bin/ps
,使用CMD
后面的命令就会被覆盖 转而执行bin/ps
命令,而ENTRYPOINT
的则不会,而是会把docker run
后面的命令当做ENTRYPOINT
执行命令的参数
EXPOSE 暴露端口
- 在构建镜像时,指定暴露的端口,如果不存在,则会使用镜像的默认端口
EXPOSE 8080
- 仅仅是声明了一个暴露的端口
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射端口
- 在运行时使用随机端口映射时,也就是
docker run -P
时,会自动随机映射EXPOSE
的端口。
VOLUME
- 在构建镜像时,指定挂载的卷,如果不存在,则会使用镜像的默认卷
VOLUME /usr/share/nginx/html
- 帮助镜像使用者理解这个镜像服务的守护卷,以方便配置映射卷
- 在运行时使用随机卷映射时,也就是
docker run -v
时,会自动随机映射VOLUME
的卷。 - 我们通过
docker inspect
查看通过该dockerfile
创建的镜像生成的容器
ENV
- 在构建镜像时,指定环境变量,如果不存在,则会使用镜像的默认环境变量
ENV PATH=/usr/bin
- 帮助镜像使用者理解这个镜像服务的守护环境变量,以方便配置映射环境变量
- 在运行时使用随机环境变量映射时,也就是
docker run -e
时,会自动随机映射ENV
的环境变量。
Dockerfile 构建 Centos 并安装 net-tools yum 软件
# Dockerfile_centos FROM centos MAINTAINER xx.com ENV MyLocal /usr/local WORKDIR $MyLocal EXPOSE 80 VOLUME ["volume1","volume2"] RUN yum install -y net-tools RUN yum install -y vim ADD test.tar.gz /root COPY test.tar.gz /usr/local CMD /bin/bash
编译 编译的时候注意最后面的 .
docker build -f Dockerfile_centos -t centos:v1.0 .
查看执行的历史 docker history 镜像名称或者 id
Dockerfile 自动部署 Nodejs 程序
项目目录中新建 Dockerfile
COPY . /root/wwwroot/
表示把项目目录中的代码复制到容器里面的 /root/wwwroot
目录
FROM node COPY . /root/wwwroot/ WORKDIR /root/wwwroot/ EXPOSE 3000 RUN npm install cnpm -g --registry=https://registry.nlark.com RUN cnpm install CMD node app.js
构建 docker build -t nodeimg:v1.0.1 .
运行镜像并且进入容器 docker run -tid --name nodeDemo -p 3000:3000 nodeimg:v1.0.1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论