5-Dockerfile文件

5-Dockerfile文件

先练习一个例子:

  1. 创建 Dockerfile 文件

    FROM ubuntu:14.04
    LABEL maintainer="vincent <jeffmanword@gmail.com>"
    RUN apt-get update && apt-get install -y redis-server
    EXPOSE 6397
    ENTRYPOINT [ "/usr/bin/redis-server" ]
    
    • FROM 是 我们选择的 base 基础镜像
    • LABEL 为 我们需要的标识,比如作者是谁
    • RUN 是我们 执行的命令,必须使用连接符
    • EXPOSE 暴漏的端口
    • ENTRYPOINT 程序的入口
  2. 构建

docker build -t vincent/redis:latest .

关键字

  1. FROM

    FROM scratch             # 制作base image
    
    FROM centos              # 使用base image
    
    FROM ubuntu:14.04
    

    尽量使用官方发布的image作为base image,原因很简单,为了安全!

  2. LABEL

    LABEL maintainer="jeffmanword@gmail.com"
    LABEL version="1.0"
    LABEL description="This is description."
    

    定义image的meta data,描述这个镜像的信息

  3. RUN

    RUN yum update && yum install -y vim \
        python-dev     # 反斜线换行
    
    RUN apt-get update && apt-get install -y perl \
        pwgen --no-install-recommends && rm -rf \
        /var/lib/apt/lists/*  # 注意清理cache
        
    RUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'
    

    使用 && 的原因是因为,每一次RUN都会增加一层(类似commit),如果使用 && 连接,将只有一层。
    总结: 为了无用分层,为了美观,合并多条命令为一条,如果复杂的RUN请使用反斜线换行!

  4. WORKDIR

    WORKDIR /root
    
    WORKDIR /test    # 如果没有test文件夹将会自动创建
    WORKDIR demo
    RUN pwd          # 输出结果应该是/test/demo
    

    设定当前工作目录的,类似 cd 命令。在使用的时候注意尽量不要用RUN cd,而是使用WORKDIR,并且路径尽量使用绝对路径,避免出错。

  5. ADDCOPY

    ADD hello /
    
    ADD test.tar.gz /  # 添加到根目录并解压,这是与COPY的区别
    
    WORKDIR /root
    ADD hello test/    # 添加到 /root/test/hello
    
    WORKDIR /root
    COPY hello test/   # /root/test/hello
    

    大部分情况下,COPY优先于ADD,ADD除了COPY外还有额外功能(如解压),添加远程文件请使用curl或者wget。

  6. ENV

    ENV MYSQL_VERSION 5.6   # 设置环境变量
    RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \
        && rm -rf /var/lib/apt/lists/*   # 引用环境变量
    

    尽量使用ENV,可以简化Dockerfile,并增加可维护性(避免写死)。

  7. EXPOSE

    EXPOSE 1080 443
    

    EXPOSE 用来暴露端口,EXPOSE 只是声明运行容器时提供的服务端口,这仅仅是一个声明,在运行容器的时候并不会因为这个声明就会开启端口服务,你依旧需要使用 -P 或者 -p 参数映射端口。在 Dockerfile 中写这样的端口声明有助于使用者理解这个镜像开放哪些服务端口,以便配置映射。

  8. VOLUME

    VOLUME /data
    
  9. CMDENTRYPOINT

    • shell方式
    RUN apt-get install -y vim
    CMD echo "hello word"
    ENTRYPOINT echo "hello docker"
    
    RUN ["apt-get", "install", "-y", "vim"]
    CMD ["/bin/echo", "hello word"]
    ENTRYPOINT ["/bin/echo", "hello docker"]
    
    • exec 方式
    FROM ubuntu:16.04
    WORKDIR /
    CMD ["ls"]
    
    FROM ubuntu:16.04
    WORKDIR /
    ENTRYPOINT ["ls"]
    

    CMD 和 ENTRYPOINT 是容器启动命令。这两条命令的区别是ENTRYPOINT 可以让我们把容器当成一条指令运行。CMD 命令为 docker 容器启动时默认执行的命令,如果 docker run 指定了其他命令,CMD将会被忽略。

    分别将上面exec的两个例子构建成镜像

    docker build -t ubuntu-cmd .
    docker build -t ubuntu-entry .
    
    $: docker run --rm ubuntu-cmd -l
    docker: Error response from daemon: OCI runtime create failed:
    container_linux.go:344: starting container process caused
    "exec: \"-l\": executable file not found in $PATH": unknown.
    
    $: docker run --rm ubuntu-entry -l
    total 4
    drwxr-xr-x.   2 root root 4096 Jan 22 19:22 bin
    drwxr-xr-x.   2 root root    6 Apr 12  2016 boot
    drwxr-xr-x.   5 root root  340 Feb 10 09:44 dev
    drwxr-xr-x.   1 root root   66 Feb 10 09:44 etc
    drwxr-xr-x.   2 root root    6 Apr 12  2016 home
    drwxr-xr-x.   8 root root   96 Sep 13  2015 lib
    ...
    

制作一个hello word镜像

  1. 编写 一个 简单 c 程序

    hello.c

    #include<stdio.h>
    
    int main()
    {
    	printf("hello docker\n");
    }
    

    编译成二进制

    sudo yum install gcc glibc-static
    gcc -static hello.c -o hello
    

    测试是否正常

    [vagrant@10 hello-word]$ ./hello 
    hello docker
    
  2. 创建Dockerfile

    FROM scratch
    ADD hello /
    CMD ["/hello"]
    
  3. 创建镜像

    docker build -t 144.202.112.240:5000/hello-word .
    

    输出结果

    Sending build context to Docker daemon  7.472MB
    Step 1/3 : FROM scratch
     ---> 
    Step 2/3 : ADD hello /
     ---> Using cache
     ---> 8d2cefe8cbf3
    Step 3/3 : CMD ["/hello"]
     ---> Using cache
     ---> bb6f23084c78
    Successfully built bb6f23084c78
    Successfully tagged 144.202.112.240:5000/hello-word:latest
    

    检查是否构建成功

    [vagrant@10 hello-word]$ docker image ls
    REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
    144.202.112.240:5000/hello-word   latest              bb6f23084c78        23 hours ago        857kB
    
  4. 创建容器

    docker run --rm 144.202.112.240:5000/hello-word 
    
    

    –rm 为 退出的时候自动删除容器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlyWine

你的鼓励将是我创作的做大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值