# Dockerfile
dockerfile 就像是 docker 专属的自动化脚本
# 起步
编写
FROM nginx:latest
RUN echo '<html lang="zh-CN"><head><meta charset="UTF-8"></head><body><h1>Hello, Docker!</h1></body></html>' > /usr/share/nginx/html/index.html
- FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
- RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
构建
# 语法
docker build -t <image-name:tag> .
# 示例
docker build -t nginx:test .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx:latest
---> b692a91e4e15
Step 2/2 : RUN echo '<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"></head><body><h1>这是一个本地构建的nginx镜像</h1></body></html>' > /usr/share/nginx/html/index.html
---> Running in 0ea66102f4c7
Removing intermediate container 0ea66102f4c7
---> 3a0859ab6028
Successfully built 3a0859ab6028
Successfully tagged nginx:test
查看
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx test 3a0859ab6028 30 seconds ago 142MB
运行
docker run -d --name nginx-test -p 9000:80 nginx:test
# 嵌套
WARNING
注意:Dockerfile 的 RUN 指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
# RUN 和 CMD
- RUN 在镜像创建时执行
- CMD 在容器运行后执行
- WORKDIR 表示工作目录
FROM python:3.8-slim-buster
WORKDIR /app
COPY . .
RUN pip3 install -r requirements.txt
CMD ["python3","app.py"]
# 创建镜像
也可以使用 docker commit 将一个已有的容器制作为镜像,不过一般还是推荐使用 Dockerfile
docker commit
# -a --author
# -c --config 使用Dockerfile指令来创建镜像
# -m --message 提交说明
# -p --pause 提交时将容器暂停
docker commit -a <author> -m <message> <container> repository:tag
docker commit -a gausszhou -m 'hello docker' nginx-test gausszhou/nginx:test
# Nginx 简单示例
FROM nginx
WORKDIR /app
COPY ./dist /app
COPY ./nginx.conf /etc/nginx/nginx.conf
docker build -t nginx:simple .
docker run -d \
--name nginx-simple \
--port 8080:80 \
-v /docker/nginx-simple.conf:/etc/nginx/nginx.conf
nginx:simple
# Node 后端示例
# 基于 node:12.1 的定制镜像
FROM node:12.1
# 镜像作者
LABEL maintainer="[email protected]"
# 制文件到容器里指定路径
COPY . /home/json-server
# 指定工作目录为,RUN/CMD 在工作目录运行
WORKDIR /home/json-server
# 指定环境变量 NODE_ENV 为 production
ENV NODE_ENV=production
# 初始化项目
RUN npm install
# 暴露端口
EXPOSE 3000
# 运行 node 项目 `$ node src/app.js`
CMD [ "node", "src/app.js" ]
# Vue 前端示例
FROM node:12.22.1-alpine as build
WORKDIR /app
COPY package.json /app/
COPY package-lock.json /app/
RUN npm install
COPY . /app
RUN npm run build
FROM nginx
COPY /app/dist /app
COPY /app/nginx.conf /etc/nginx/nginx.conf
docker build -t vue-webapp-image .
docker run -d \
--name vue-webapp-containre \
--port 9000:80 \
vue-webapp-image