Dockerfile
介绍:
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
- 使用docker build 构建镜像
- docker build -f 可以指定具体的dockerfile文件
- docker -t “xx/xx:v1” 编辑镜像REPOSITORY和TAG
语法
-
FROM。基础镜像,必须是可以下载下来的,定制的镜像都是基于FROM 的镜像,这里的centos就是定制需要的基础镜像。后续的操作都是基于centos镜像。
-
MANTAINER。指定镜像的作者信息
-
RUN。指定在当前镜像构建过程中要运行的命令包含两种模式:
- shell。 RUN 。 例:RUN echo hello
- exec。 RUN [“executable”, “paraml”, “param2”]。例: RUN [“/bin/bash”, “-c”, “echo hello”],等价于 /bin/bash -c echo hello
-
EXPOSE。仅仅只是声明端口。格式: EXPOSE <端口1> [<端口2>…]
作用:
- 帮助镜像使用者理解景象服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是docker run -p 时, 会自动随机映射EXPOSE端口
- 可以是一个或者多个端口,也可以指定多个EXPOSE
-
CMD。类似于RUN指令,用于运行程序,但二者运行的时间点不同:
- CMD在docker run 时运行。
- RUN是在docker build 构建镜像时运行
CMD [“/usr/sbin/nginx”, “-g”, “daemon off;”]
-
ENTERYPOINT。类似CMD指令,用于传参。但不会被docker run 的命令行参数指定的指令所覆盖。所以ENTERYPOINT一般传定参,CMD一般传变参。
FROM nginx
ENTERYPORINT ["nginx", "-c"] #定参
CMD ["/etc/nginx/nginx.conf"] #变参
-
COPY。复制命令。 格式:COPY [–chown=:] …
可以使用通配符。满足go语言的表达方式。
- COPY hom* /mkdir
- COPY hom?.txt /mkdir
-
ADD。拷贝的另一种方式。格式:ADD …
优点:再执行<源文件>为tar压缩文件的话,压缩格式为gzip,bzip2以及xz的情况下,自动复制并解压到<目标路径>
缺点:在不解压的前提下,无法复制tar压缩文件。会令镜像构建缓存失效,从而可以会令镜像构建缓慢。
-
VOLUME。定义匿名数据卷,在启动容器时忘记挂在数据卷,会自动挂在到匿名卷。格式:VLOLUME <路径>
作用:1.避免重要的数据,因容器重启而丢失。2.避免容器不断变大
-
WORKDIR。指定工作目录。
-
ENV。设置环境变量。格式:ENV 或 ENV =
-
USER。制定执行后续命令的用户和用户组,只是用于切换后续命令执行的用户和用户组(因此改用户和用户组必须提前已经存在)。 格式:USER <用户名>[:<用户组>]
-
ONBUILD。触发器,就是在本次构建过程中不会执行该命令,但有新的dockerfile使用了之前构建的镜像时,才会触发。
-
LABEL。打标签。格式:LABEL
-
HEALTHCHECK。健康检查。
-
ARG。构建参数。与ENV作用一致,但ARF仅对Dockerfile内有效,也就是说只有docker build的过程中有效,构建好的镜像内不存在此环境变量。构建命令docker build 中可以使用 --build-arg =来覆盖。格式:ARG <参数名>[=<默认值>]
Dockerfile构建Nginx
# 1.下载基础镜像
docker pull alpine
# 编写dockerfile文件
vim dockerfile
# 使用基础镜像
FROM centos
# 构建人
MAINTAINER xianchao
# 清空镜像内系统的repo
RUN rm -rf /etc/yum.repos.d/*
# 添加本地repo到镜像系统
COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/
# 下载安装
RUN yum install wget -y
RUN yum install nginx -y
# 添加本地文件配置到ngxin工作目录
COPY index.html /usr/share/nginx/html/
# 指定端口
EXPOSE 80
# 设置定参,把nginx设置在前台
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
#构建镜像
docker build -t "fengshi/nginx:v1" .
#查看构建是否成功
docker images -a|grep nginx
#启动容器
docker run -d -p 80 --name html fengshi/nginx:v1
#检查
curl localhost:xxxx
### TS
# 如果镜像构建完成但容器启动失败,使用前台启动查看容器具体报错
Dockerfile 构建tomcat
FROM centos
MAINTAINER fengshi
RUN rm -rf /etc/yum.repos.d/*
COPY xxx.repo /etc/yum.repos.d/
RUN yum install wget -y
# 使用add,先解压再添加到指定目录
ADD apache-tomcat-8.0.26.tar.gz /usr/local
ADD jdk-8u45-linux-x64.rpm /usr/local
# 使用rpm安装指定jdk包
RUN cd /usr/local && rpm -ivh jdk-8u45-linux-x64
RUN mv /usr/local/apache-tomcat-8.0.26 /usr/local/tomcat8
# 启动tomcat和打印日志
ENTRYPOINT /usr/local/tomcat8/bin/startup.sh && tail -F /usr/local/tomcat8/logs/catalina.out
# 第二种启动方式
# ENTERYPOINT ["usr/local/tomcat8/bin/catalina.sh","run"]
EXPORT 8080
把Go代码做成镜像
# 1.linux机器安装go
yum install go -y
# 2.创建源码文件和文件夹
mkdir test && cd test/
cat main.go
# 3.go mod 初始化项目
go mod init test
# 设置代理
go env -w GOPROXY=https://goproxy.cn,direct
go mod tidy
# 4.构建源码
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o demo main.go
# 5.配置dockerfile
vim dockerfile
FROM alpine
# 指定工作目录
WORKDIR /data/app
ADD demo /data/app
CMD ["/bin/sh","-c","./demo"]
# 6.构建镜像
docker build -t="fengshi/demo:v1" .
# 运行
docker run -d --name go -p xxxxx:8080 fengshi/demo:v1
把python代码做成镜像
# 1.创建源码文件和文件夹
# 包含相关代码
cat main.py
# 包含相关包列表的依赖
cat requirements.txt
# 2.配置dockerfile
cat dockerfile
FROM python3.7
RUN mkdir /app
WORKDIR /app
add . /app/
# 升级pip
RUN /usr/local/bin/python -m pip install --upgrade pip
# 安装依赖
RUN pip install -r requirements.txt
EXPOSE 5000
# 在构建的时候未运行,在容器run的时候才运行
CMD ["python","/app/main.py"]
# 6.构建镜像
docker build -t="fengshi/pip:v1" .
# 运行
docker run -d --name go -p xxxxx:5000 fengshi/pip:v1