1.FROM: 文件的开始
FROM scratch # 从头开始制作一个最简的
FROM centos # 使用centos作为系统,若本地没有,则从网上拉取
FROM centos:7.0 # 指定系统 + 版本号
2. LABEL: 相当于注释或者说明信息
LABEL version="1.0"
LABEL author="无名"
LABEL description="你好呀"
1. LABEL 是关键字,后面的内容可以随便写,例如上面version,author,description 不是关键字,可以随便写
3. RUN: 执行命令(Linux的命令),每执行一条RUN,就会多一层,通常用于安装应用和软件包,或者给文件权限
RUN yum -y update
RUN yum -y install lrzsz
1.尽量把命令写在一行上,因为每执行一条run,就会多一层,当然,这样写,可读性不好
RUN yum -y upate && yum -y install lrzsz net-tools
4. WORKDIR: 进入或创建目录(没有就创建)
WORKDIR /root # 进入 /root 目录
WORKDIR /test # 进入 /test 目录,可能没有这个目录,就会新建
WORKDIR hello # 进入当前目录下的 hello目录
5.AND and COPY: 将本地文件,添加到镜像里面
1. AND: 可以解压缩文件
AND hello / # 把本地的hello,添加到根目录下
AND xxx.tar.gz / # 把本地的xxx.tar.gz,解压到根目录下
2.COPY: 只是复制文件
COPY hello / # 把本地的hello,复制到根目录下
6.ENV: 定义变量
ENV MYSQL_VERSION 5.6 # 定义一个变量名MYSQL_VERSION,值是 5.6
RUN apt-get -y install mysql-server="${MYSQL_VERSION}" # 调用变量的时候,要加个$
7.CMD and ENTRYPOINT: 执行命令
1. 两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令:Shell 格式和 Exec 格式:
- Shell格式:<instruction> <command>。例如:apt-get install python3
- Exec格式:<instruction> ["executable", "param1", "param2", ...]。例如: ["apt-get", "install", "python3"]
CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。RUN 则两种格式都可以。
2. CMD 指令允许用户指定容器的默认执行的命令。此命令会在容器启动且 docker run 没有指定其他命令时运行。
例如:Dockerfile 文件内容是这样
1 CMD echo "Hello world"
运行容器 docker run -it [image] 将输出:
Hello world
如果后面加上一个命令,比如 docker run -it [image] /bin/bash,CMD 会被忽略掉,命令 bash 将被执行:
root@30a52dc7c5c5:/#
3. ENTRYPOINT 的 Exec 格式用于设置容器启动时要执行的命令及其参数,同时可通过CMD命令或者命令行参数提供额外的参数。ENTRYPOINT 中的参数始终会被使用,这是与CMD命令不同的一点。
例如:Dockerfile 文件内容是这样
1 ENTRYPOINT ["/bin/echo", "Hello"]
当容器通过 docker run -it [image] 启动时,输出为:
1 Hello
如果通过 docker run -it [image] Docker 启动,则输出为:
1 Hello Docker
如果Dockerfile的内容是这样:
1 ENTRYPOINT ["/bin/echo", "Hello"] 2 CMD ["world"]
当容器通过 docker run -it [image] 启动时,输出为:
1 Hello world
而如果通过 docker run -it [image] Docker 启动,输出依旧为:
1 Hello Docker
也就是说,ENTRYPOINT 中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。
8.技巧
1.改版本号,把其他版本标记为最新
docker tag mysql:5.5 mysql:latest