# 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 --from=build /app/dist /app
COPY --from=build /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