前端学习Docker(六) - Dockerfile
2021-09-20 运维知识
制作 Dockerfile #
- Docker 的镜像是用一层一层的文件组成的
docker inspect
命令可以查看镜像或者容器- Layers 就是镜像的层文件,只读不能修改。基于镜像创建的容器会共享这些文件层
docker inspect centos
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
.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
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
npm install express-generator -g
express app
Dockerfile #
FROM node
COPY ./app /app
WORKDIR /app
RUN npm install
EXPOSE 3000
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 express-demo .
docker build -t express-demo .
- -t 用来指定 image 镜像的名称,后面还可以加冒号指定标签,如果不指定默认就是 latest
.
表示 Dockerfile 文件的所有路径,.
就表示当前路径
使用新的镜像运行容器 #
docker container run -p 3333:3000 -it express-demo /bin/bash
docker container run -p 3333:3000 -it express-demo /bin/bash
npm start
npm start
-p
参数是将容器的 3000 端口映射为本机的 3333 端口-it
参数是将容器的 shell 容器映射为当前的 shell,在本机容器中执行的命令都会发送到容器当中执行express-demo
image 的名称- /bin/bash 容器启动后执行的第一个命令,这里是启动了 bash 容器以便执行脚本
--rm
在容器终止运行后自动删除容器文件
CMD #
Dockerfile
+ CMD npm start
+ CMD npm start
重新制作镜像
docker build -t express-demo .
docker container run -p 3333:3000 express-demo
docker build -t express-demo .
docker container run -p 3333:3000 express-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
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
版权属于: vincent
转载时须注明出处及本声明
Tags:# Docker