Dockerfile

一、基本语法解析

FROM

指定基于什么镜像构建

FROM <image>或FROM <image>:<tag>

LABEL

指定将要构建的镜像的一些元数据

LABEL maintainer="pd<123456@qq.com>" \
	  version="1.0"

ENV

指定环境变量

ENV GOROOT /opt/go
ENV GOBIN $GOROOT/bin

WORKDIR

可以为RUN、CMD、ENTRYPOINT、ADD、COPY指令配置工作目录;进入容器时,当前的路径就是WORKDIR

WORKDIR /opt

ADD

ADD <src> <dest>该命令将复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件。

ADD http://nginx.org/download/nginx-1.19.1.tar.gz /opt
ADD test.txt /opt

COPY

COPY <src> <dest>复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的

COPY app.py /flask

VOLUME

相当于数据卷

VOLUME ["/var/lib", "/var/log"]
VOLUME /var/lib /var/log

EXPOSE

指定该容器对外暴露的端口

EXPOSE <port> [<port>/<protocol>...]
EXPOSE 8080 80/tpc

ONBUILD

配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令

说明一下shell、exec格式

shell格式写法:

RUN yum install -y vim
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"

exec格式写法:

RUN ["yum", "install", "-y", "vim"]
CMD ["/bin/echo", "hello docker"]
ENTRYPOINT ["/bin/echo", "hello docker"]

$NAME:

CMD/ENTRYPOINT /bin/bash -c "ls -al;echo 'hello docker'"
ENV NAME docker
CMD/ENTRYPOINT ["/bin/bash", "-c", "echo hello $NAME"]

RUN

构建镜像时执行命令并创建新的 image layer

CMD

  1. 容器启动时默认执行的命令和参数
  2. 如果docker run指定了其他命令,CMD命令会被忽略
  3. 如果定义了多个CMD,只有最后一个会执行

ENTRYPOINT

  1. 容器启动时执行的命令(让容器以应用程序或服务的形式运行)
  2. 不会被忽略,一定会执行

二、Dockerfile实战操作

实战1:基于python3部署flask应用

  1. 编写app.py

    from flask import Flask
    app = Flask(__name__)
    @app.route("/")
    def hello():
        return "hello docker"
    if __name__ == "__main__":
        app.run(host="0.0.0.0", port=5000)
    
  2. 编写Dockerfile

    FROM python:3.7.8
    LABEL maintainer="pd<123456@qq.com>"
    RUN pip install pip -U && \
    	pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
    	pip install flasK
    COPY app.py /app/
    WORKDIR /app
    EXPOSE 5000
    CMD python app.py
    
  3.  docker build -t pd/flask-app .
    
  4.  docker run -d -p 8888:5000 pd/flask-app
    
  5.  访问 ip:8888
    

实战2:基于centos7安装nginx

FROM centos:7
LABEL maintainer="pd<123456@qq.com>"
WORKDIR /opt
RUN yum install -y wget gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
ADD http://nginx.org/download/nginx-1.19.1.tar.gz /opt
RUN tar xzvf nginx-1.19.1.tar.gz && \
	cd /opt/nginx-1.19.1 && \
	./configure --prefix=/opt/nginx --with-http_ssl_module --with-http_stub_status_module && \
	make && \
	make install && \
	ln -s /opt/nginx/sbin/nginx /usr/local/sbin/ && \
	nginx
RUN rm -rf /opt/*nginx-1.19.1*
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

实战3:多容器部署(一个容器运行flask应用、另一个容易运行redis);但是 --link 不建议使用

  1. app.py

    from flask import Flask
    from redis import Redis
    import os
    import socket
    
    app = Flask(__name__)
    redis = Redis(host=os.environ.get("REDIS_HOST", "127.0.0.1"), port=6379)
    
    @app.route('/')
    def hello():
        redis.incr("hits")
        return "hits:{} - hostname:{}\n".format(bytes.decode(redis.get("hits")), socket.gethostname())
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", port=5000, debug=True)
    
  2. Dockerfile

    FROM python:3.7.8
    LABEL maintainer="pd<123456@qq.com>"
    RUN pip install pip -U && \
    	pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
    	pip install flask redis
    COPY app.py /app/
    WORKDIR /app
    EXPOSE 5000
    CMD ["python", "app.py"]
    
  3. 构建

    docker build -t flask .
    
  4. 启动redis

    docker run -d --name redis redis
    
  5. 启动flask

    docker run -d --name flask --link redis -e REDIS_HOST=redis -p 8888:5000 flask
    
posted @ 2020-09-26 17:51    阅读(91)  评论(0编辑  收藏  举报