Dockerfile 关键字
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: 可以解压缩文件,如果给的是一条URL,可以下载下来到镜像里面
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 的额外参数可以在容器启动时动态替换掉。
ENTRYPOINT 和 CMD,一般在实际应用中,是搭配使用的,需要注意的是,两者搭配使用的时候,只支持 Exec格式 的命令
ENTRYPOINT 是实际执行的命令,CMD 是用来接受用来传递给ENTRYPOINT 的参数,如下例子,ENTRYPOINT 执行的命令是 /bin/echo, CMD 是传递参数 Hello,给 /bin/echo
1 ENTRYPOINT ["/bin/echo"] 2 CMD ["Hello"]
当容器通过 docker run -it [image] 启动时,输出为:
1 Hello
而如果通过 docker run -it [image] Docker 启动,输出为:
1 Docker
8.技巧
1.改版本号,把其他版本标记为最新
docker tag mysql:5.5 mysql:latest
2.启动一个Container (容器) 的时候要考虑一下内容
1.开机自启动 --restart=always
1.指定名称 --name app01
2.指定端口 -p 8080:80,端口映射,访问宿主机,转到访问这个容器
3.后台启动 -d
4.目录挂载(数据卷映射) -v
绝对路径 是 外 -> 里 卷映射 是 里 -> 外
a) 绝对路径 -v /app/html:/usr/shar/nginx/html
缺点,会覆盖Container 里面的文件,以/app/html 为准,如果没有 /app/html 这个目录,会直接报错,Container 直接启动不起来
b) 卷映射,起个名字,其实就是卷名,推荐使用这种, -v nginxHtml:/usr/shar/nginx/html
实际存放的地方是宿主机 /var/lib/docker/volumes/卷名
5.网络同组,容器间,用容器名访问,http:mysql:容器暴露的端口
1.创建一个网络
1 docker network create myAppNetwork
2.把其他容器添加到这个网络,可以容器启动的时候 --networks 网络名,添加,也可以容器运行起来之后再添加
1 #在容器启动时,添加到网络 2 docker run --network myAppNetwork 镜像名 3 4 #指定容器连接网络,在容器启动之后 5 docker network connect myAppNetwork 容器Id
容器互联(容器的通信) --link 已经弃用,使用 network, 添加到同一个网络
docker run --link 要连接的容器名
--link
1.可以通过容器名互相通信,容器间共享环境变量
2. 主要用来解决两个容器通过 IP 地址连接是 容器IP地址 会发生变化