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/*  # 注意清理cacheRUN /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 为 退出的时候自动删除容器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6-搭建一个私有registry

6-搭建一个私有registry docker hub 查找 registry docker hub registry 可以看到部署很简单&#xff0c;只有一条命令。 docker run -d -p 5000:5000 --restart always --name registry registry:2部署私有registry 找一台linux的服务器并安装好docker 在此服务器上部署re…

7-深入练习Dockerfile

7-深入练习Dockerfile 创建一个json-server 镜像 首先创建一个 json-server 文件夹 mkdir json-server在json-server文件夹下创建Dockerfile FROM node:10.15.0 RUN npm install -g json-server构建镜像 docker build -t json-server .创建一个api服务的镜像 首先创建一个 …

8-容器操作

8-容器操作 普通操作 进入容器 docker exec -it api /bin/bash容器停止与启动 docker stop api docker start api容器重启 docker restart api查看容器详细信息 docker inspect api查看日志 docker logs api容器删除 docker stop api # 必须先停止才能删除 docker rm…

9-资源限制

9-资源限制 了解stress工具 stress是一个压力测试工具 docker run -it ubuntu:16.04此时会进入ubuntu内&#xff0c;这时我们安装 stress工具 apt-get update && apt-get install -y stress查看help stress --helpUsage: stress [OPTION [ARG]] ...-?, --help …

10-Docker 网络

10-Docker 网络 基础网络概念 数据传输通过数据包 两台笔记本之间通信是通过数据包通信的。想知道数据包是怎么打包的呢&#xff0c;就先要知道网络分层的概念。 网络分层 目前有两种网络分层的模型。 ISO/OSI 分层&#xff0c;也就是 7 层模型。TCP/IP 分层&#xff0c;也就…

11-Docker Bridge详解

11-Docker Bridge详解 容器之间是如何通信的&#xff1f; 操作前删除test2的容器。 查看当前机器上docker的网络 docker network lsNETWORK ID NAME DRIVER SCOPE 056d0ece100f bridge bridge local a…

12-容器之间link

12-容器之间link 这篇主要讲 容器之间如何 link。 需要准备的是&#xff0c;创建两个容器 test1 和 test2 通过 busybox。 在之前的课程中已经创建的只需要重新启动即可。 什么情况下需要link 例如有一个容器是 web 服务器&#xff0c;并且跑在一个docker容器内&#xff0c;…

13-容器的端口映射

13-容器的端口映射 部署一个简单web nginx容器 docker run -d --name web nginxnginx 默认的端口是 80 端口&#xff0c;此时我们是没有办法访问的。 好的&#xff0c;通过前面的学习我们已经知道&#xff0c;这个 web 容器四连接到 bridge 网桥上的&#xff0c;那我们查看一…

14-容器网络之host和none

14-容器网络之host和none 在之前的小节&#xff0c;我们有看到过 host 和 none。 通过 docker network ls 查看。 none 网络 删除 test1 容器 docker stop test1 && docker rm test1创建 test1 容器并连接到none网络 docker run -d --name test1 --network none busy…

15-多容器复杂应用的部署

15-多容器复杂应用的部署 此节主要是通过部署一个复杂的应用场景&#xff0c;进而练习容器的网络相关知识。 创建一个flask-web应用 创建一个 flask-web 文件夹 mkdir flask-web在此文件夹内创建 app.py 文件 cd flask-web touch app.py编写一个简单的 web 程序 import os im…

16-多机器通信

16-多机器通信 回顾上节课的思考题。 flask-redis 想访问 redis&#xff0c;该如何通信&#xff1f; 创建另外一台linux虚拟机 直接拷贝Vagrantfile文件创建一个 centos 虚拟机 我们创建一个centos7-2文件夹&#xff0c;然后创建虚拟机 vagrant up创建的过程中提示选择网络接…

17-Docker的数据持久化介绍

17-Docker的数据持久化介绍 回顾容器与镜像 容器是在镜像之上创建的一层运行时层&#xff0c;这一层是可以读写的&#xff0c;我们能够在容器内添加数据&#xff0c;读取数据。 也就是说我们在创建容器的时候&#xff0c;我们能够在容器内创建文件&#xff0c;安装软件等等&a…

18-数据持久化-Data Volume

18-数据持久化-Data Volume Data Volume 使用场景。一般来讲有些容器自己会产生一些数据&#xff0c;我们不想数据随着容器的销毁而销毁&#xff0c;我们想保存数据&#xff0c;正常一般用在数据库&#xff0c;比如我们想保存数据库中的数据&#xff0c;这个时候我们就会使用 …

19-数据持久化-Bind Mounting

19-数据持久化-Bind Mounting Bind Mounting 与 Data Volume区别 Data Volume 需要在 Dockerfile 内声明需要创建的 volume 目录。 Bind Mounting 则不需要在 Dockerfile 声明 volume&#xff0c;只需要在创建容器的时候&#xff0c;也就是 run 的时候声明即可。 如: dock…

go自定义包教程

go自定义包教程 而是环境为 go version go1.11 linux/amd64linux mint 19 创建一个自定义的包 切换到src目录下&#xff0c;创建demo目录 cd src mkdir demo再创建smap 文件夹 cd demo mkdir smap创建包文件 cd smap touch map.gomap.go文件内容 package smapimport "…

在Linux中对硬盘进行分区、格式化和挂载

在Linux中对硬盘进行分区、格式化和挂载 我最近有一个全新的4-TB硬盘加入我的电脑。所以我需要在Linux中安装它。为此&#xff0c;我需要执行以下操作&#xff1a; 分区格式化挂载检查是否已安装硬盘驱动器 分区 首先&#xff0c;在通过SATA和电源线将硬盘连接到计算机后&am…

Angular gitlab持续集成之runner配置

gitlab持续集成 安装Runner 正常安装 sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64sudo chmod x /usr/local/bin/gitlab-runner sudo useradd --comment GitLab Runner --creat…

javascript编译压缩

javascript编译 js是JavaScript 源码文件&#xff0c; .min.js是压缩版的js文件。 .min.js文件经过压缩&#xff0c;相对编译前的js文件体积较小&#xff0c;传输效率快。经过编码将变量和函数原命名改为毫无意义的命名&#xff0c;以防止他人窥视和窃取 js 源代码 在线版 g…

vscode设置中文

vscode设置中文 当我们安装完成vscode后&#xff0c;会发现它是中文的&#xff0c;因为默认情况下&#xff0c;vscode使用的语言为英文(us)。 那很多同学是不喜欢英文的&#xff0c;不是看不懂&#xff0c;而是不方便哈。 修改语言配置文件 使用快捷键组合【CtrlShiftp】 在…

linux下编译boost

linux下编译boost 下载boot库 官方下载地址 下载完成会解压。 编译 1.进入解压后的文件夹内 cd boost_1_69_0 执行下面的语句 ./bootstrap.sh --with-librariesall --with-toolsetgcc–with-libraries 指定编译哪些boost库&#xff0c;all的话就是全部编译&#xff0c;只想…