返回介绍

Dockerfile

发布于 2024-01-20 01:25:02 字数 4962 浏览 0 评论 0 收藏 0

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"]
    • CMDENTRYPOINT 同样作为容器启动时执行的命令,区别有以下几点
      • 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文