FROM

4. Dockerfile语法 - 图2
我们上一节只做helloworld的时候不需要基础镜像就写了 FROM scratch
4. Dockerfile语法 - 图3
为了安全

LABEL

4. Dockerfile语法 - 图4
4. Dockerfile语法 - 图5

RUN

4. Dockerfile语法 - 图6
因为我们每次run就是生成新的一层,所以推荐合并多条命令
4. Dockerfile语法 - 图7

WORKDIR

4. Dockerfile语法 - 图8
4. Dockerfile语法 - 图9

ADD COPY

4. Dockerfile语法 - 图10
4. Dockerfile语法 - 图11

ENV

4. Dockerfile语法 - 图12
4. Dockerfile语法 - 图13

VOLUME

和宿主机共享数据
做数据的持久化

EXPOSE

暴露端口

CMD and ENTRYPOINT

举栗

  1. vim Dockerfile
  2. FROM python:2.7
  3. LABEL maintainer="sixmillions<test@test.com>"
  4. RUN pip install flask
  5. COPY app.py /appFolder/
  6. WORKDIR /appFolder
  7. EXPOSE 5000
  8. CMD ["python", "app.py"]

用python2.7做基础镜像,安装flask然后将app.py复制到appFolder文件夹
然后进入这个文件夹,暴露5000端口供别人访问, 执行python app.py命令

vim app.py

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return "hello docker!"
if __name__ == '__main__':
    app.run()

构建容器

docker build -t sixmillions/falsk-hello .

4. Dockerfile语法 - 图14
4. Dockerfile语法 - 图15
运行这个镜像

docker run -d --name flask-hell sixmillions/falsk-hello

4. Dockerfile语法 - 图16
查看log

 docker logs flask-hell

4. Dockerfile语法 - 图17
访问5000端口

curl http://127.0.0.1:5000

没访问通,不知道什么原因,我们进入容器,试一下

docker exec -it flask-hell bash

ps -ef | grep app
# 查看进程的 

curl http://127.0.0.1:5000

4. Dockerfile语法 - 图18
说明我们的是成功的
没成功的原因查了一下说是没有用-p指定端口映射

https://blog.csdn.net/qq_17639365/article/details/86655177 但是没有尝试

参考

github上的官方dockerfile

https://github.com/docker-library

4. Dockerfile语法 - 图19

https://github.com/docker-library/mysql/blob/master/5.7/Dockerfile

dockerfile官方的手册

https://docs.docker.com/engine/reference/builder/

image.png

shell 和 exec格式

image.png
image.png

FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"

image.png
运行看一下情况
image.png
打印出来了hello Docker
接着我们换另一种exec格式

FROM centos
ENV name Docker
ENTRYPOINT ["/bin/echo", "hello $name"]

image.png
根据这个镜像构建容器
image.png
结果是这个name变量没有被替换,而是当成字符串输出了.
如果我们想让变量起作用,就需要用bash的方式执行echo

FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]

image.png
运行这镜像生成的容器
image.png

CMD

image.png
试一下第一条

FROM centos
ENV name Docker
cmd echo "hello $name"

image.png
结果是容器执行就默认执行了.
试一下第二条,用上面的镜像

docker run six/hello-cmd1 /bin/bash -c "echo hello world"

image.png
确实cmd的那个没有执行,而是执行了我后面指定的命令
试一下第三条

FROM centos
ENV name Docker
cmd echo "hello $name"
cmd echo "hello six"
cmd echo "hello millions"

image.png
结果是执行了最后一句

ENTRYPOINT

image.png