Loading

前端学习Docker(六) - Dockerfile

制作 Dockerfile

  • Docker 的镜像是用一层一层的文件组成的
  • docker inspect命令可以查看镜像或者容器
  • Layers 就是镜像的层文件,只读不能修改。基于镜像创建的容器会共享这些文件层
docker inspect centos

编写 Dockerfile

  • -t --tag list 镜像名称
  • -f --file string 指定 Dockerfile 文件的位置
指令 含义 示例
FROM 构建的新镜像是基于哪个镜像 FROM centos:6
MAINTAINER 镜像维护者姓名或邮箱地址 MAINTAINER zhufengjiagou
RUN 构建镜像时运行的 shell 命令 RUN yum install httpd
CMD CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换 CMD /usr/sbin/sshd -D
EXPOSE 声明容器运行的服务器端口 EXPOSE 80 443
ENV 设置容器内的环境变量 ENV MYSQL_ROOT_PASSWORD 123456
ADD 拷贝文件或目录到镜像中,如果是 URL 或者压缩包会自动下载和解压 ADD ,ADD https://xxx.com/html.tar.gz /var/www.html, ADD html.tar.gz /var/www/html
COPY 拷贝文件或目录到镜像 COPY ./start.sh /start.sh
ENTRYPOINT 配置容器启动时运行的命令 ENTRYPOINT /bin/bash -c '/start.sh'
VOLUME 指定容器挂载点到宿主自动生成的目录或其它容器 VOLUME ["/var/lib/mysql"]
USER 为 RUN CMD 和 ENTRYPOINT 执行命令指定运行用户 USER zhufengjiagou
WORKDIR 为 RUN CMD ENTRYPOINT COPY ADD 设置工作目录 WORKDIR /data
HEALTHCHECK 健康检查 HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMS curl -f htp://localhost
ARG 在构建镜像时指定一些参数 ARG user
  • cmd 给出的是一个容器的默认的可执行体。也就是容器启动以后,默认的执行的命令。重点就是这个"默认"。意味着,如果docker run没有指定任何的执行命令或者dockerfile里面也没有entrypoint,那么,就会使用 cmd 指定的默认的执行命令执行。同时也从侧面说明了entrypoint的含义,它才是真正的容器启动以后要执行命令

.dockerignore

表示要排除,不要打包到 image 中的文件路径

.git
node_modules

Dockerfile

安装 node

  • nvm
    wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
    source /root/.bashrc
    nvm install stable
    node -v
    npm config set registry https://registry.npm.taobao.org
    npm i cnpm -g  --registry https://registry.npm.taobao.org
    npm i nrm -g  --registry https://registry.npm.taobao.org
    

安装 express 项目生成器

npm install express-generator -g
express app

Dockerfile

FROM node
COPY ./app /app
WORKDIR /app
RUN npm install
EXPOSE 3000
  • FROM 表示该镜像继承的镜像 :表示标签
  • COPY 是将当前目录下的 app 目录下面的文件都拷贝到 image 里的/app 目录中
  • WORKDIR 指定工作路径,类似于执行 cd 命令
  • RUN npm install 在/app 目录下安装依赖,安装后的依赖也会打包到 image 目录中
  • EXPOSE 暴露 3000 端口,允许外部连接这个端口

创建 image

docker build -t node-demo .
  • -t 用来指定 image 镜像的名称,后面还可以加冒号指定标签,如果不指定默认就是 latest
  • . 表示 Dockerfile 文件的所有路径,.就表示当前路径

使用新的镜像运行容器

docker container run -p 3333:3000 -it node-demo /bin/bash
npm start
  • -p 参数是将容器的 3000 端口映射为本机的 3333 端口
  • -it 参数是将容器的 shell 容器映射为当前的 shell,在本机容器中执行的命令都会发送到容器当中执行
  • express-demo image 的名称
  • /bin/bash 容器启动后执行的第一个命令,这里是启动了 bash 容器以便执行脚本
  • --rm 在容器终止运行后自动删除容器文件

CMD

Dockerfile

+ CMD npm start

重新制作镜像

docker build -t node-demo .
docker container run -p 3333:3000 node-demo
  • RUN 命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD 命令则是在容器启动后执行
  • 一个 Dockerfile 可以包含多个 RUN 命令,但是只能有一个 CMD 命令
  • 指定了 CMD 命令以后,docker container run 命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖 CMD 命令

发布 image

  • 注册账户
  • 83687401 Abc
  • docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker login
docker image tag [imageName] [username]/[repository]:[tag]
docker image build -t [username]/[repository]:[tag] .

docker tag express-demo vincent/express-demo:v1
docker push vincent/express-demo:v1
posted @ 2021-10-08 15:50  vincent_cyi  阅读(219)  评论(0编辑  收藏  举报