FROM

我们上一节只做helloworld的时候不需要基础镜像就写了 FROM scratch
为了安全
LABEL


RUN

因为我们每次run就是生成新的一层,所以推荐合并多条命令
WORKDIR


ADD COPY


ENV


VOLUME
和宿主机共享数据
做数据的持久化
EXPOSE
暴露端口
CMD and ENTRYPOINT
举栗
vim DockerfileFROM python:2.7LABEL maintainer="sixmillions<test@test.com>"RUN pip install flaskCOPY app.py /appFolder/WORKDIR /appFolderEXPOSE 5000CMD ["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 .


运行这个镜像
docker run -d --name flask-hell sixmillions/falsk-hello

查看log
docker logs flask-hell

访问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

说明我们的是成功的
没成功的原因查了一下说是没有用-p指定端口映射
https://blog.csdn.net/qq_17639365/article/details/86655177 但是没有尝试
参考
github上的官方dockerfile

https://github.com/docker-library/mysql/blob/master/5.7/Dockerfile
dockerfile官方的手册
shell 和 exec格式


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

运行看一下情况
打印出来了hello Docker
接着我们换另一种exec格式
FROM centos
ENV name Docker
ENTRYPOINT ["/bin/echo", "hello $name"]

根据这个镜像构建容器 
结果是这个name变量没有被替换,而是当成字符串输出了.
如果我们想让变量起作用,就需要用bash的方式执行echo
FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]
CMD

试一下第一条
FROM centos
ENV name Docker
cmd echo "hello $name"

结果是容器执行就默认执行了.
试一下第二条,用上面的镜像
docker run six/hello-cmd1 /bin/bash -c "echo hello world"

确实cmd的那个没有执行,而是执行了我后面指定的命令
试一下第三条
FROM centos
ENV name Docker
cmd echo "hello $name"
cmd echo "hello six"
cmd echo "hello millions"
ENTRYPOINT




