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地址 会发生变化

posted @ 2020-06-12 15:13  空肚食早餐  阅读(303)  评论(0编辑  收藏  举报