zoukankan      html  css  js  c++  java
  • Docker Dockerfile

    一、什么是 Dockerfile

    比如我想制作一个镜像,这个镜像安装了 lnmp 、redis 、elk 等各种软件,制作流程会是这样:

    ① 先下载一个基础镜像,如 centos
    ② 使用这个镜像启动成一个容器
    ③ 在容器中安装 lnmp 、redis 、elk 等各种软件
    ④ 最后再把容器制作成一个镜像

    什么是 Dockerfile:Dockerfile 相当于一个命令集 ( 命令的集合 ) 文件,我们可以把上面的步骤都写到这个文件,然后执行这个文件就能生成一个镜像


    二、Dockerfile 常用指令

    FROM          # 指定基于哪个镜像,语法:FROM <image> 或 FROM <image>:<tag>,如 FROM centos:latest
    MAINTAINER    # 指定Dockerfile文件的作者信息,语法:MAINTAINER <name> <mail>,如 MAINTAINER xiaoming xiaoming@qq.com
    LABEL # 用于定义镜像的 meta data(元数据),以描述该镜像的详细信息,以便他人下载时知道该镜像的情况,如 LABEL version="1.0" RUN # 指定要操作的命令,语法:RUN <command>,如 RUN yum install -y redis,也可以写成 RUN ["yum", "install", "-y", "redis"]
    # 另外,我们每写一条RUN语句,就会在 docker history <image> 中多显示一层,因此尽量用 && 或 把多条命令写成一条命令 CMD # 指定容器启动时要执行的命令,语法:CMD <command>,如 CMD yum install redis,如果命令有选项必须写成 CMD ["yum", "install", "-y", "redis"] EXPOSE # 指定容器要开放的端口,以便外部能访问,如 EXPOSE 22 80 443 表示开放 22 80 443 这三个端口,但必须结合 docker -p 80:80 这种形式来使用 ENV # 用于定义环境变量,如 ENV PATH /usr/local/bin:$PATH,也可以自定义用户变量,如 EVN MySQL_Version 5.6,定义的变量可以让 RUN 或 CMD 使用 ADD # 用于拷贝宿主机的文件到容器的某个目录里,语法:ADD <src> <dest>,如 ADD 1.txt /data 表示拷贝宿主机的1.txt到容器的/data目录,<src>也可以是一个url COPY # 用法与ADD一致,不同的是,ADD可以使用url,COPY不能使用url ENTRYPOINT # 指定容器启动时要执行的命令,用法与CMD一致,不同的是,CMD的命令会被覆盖,比如 docker run -itd centos bash 去启动容器时,bash就是启动容器时执行的命令 # 而如果我们写了 CMD echo 123 是不会执行的,因为被bash命令覆盖了,而我们使用ENTRYPOINT就不会被覆盖,而且会优先执行ENTRYPOINT指定的命令再执行bash命令 # 另外一点,如果我们再Dockerfile文件中写了多条CMD指令,那么只有最后一条会执行,使用ENTRYPOINT则每一条都会执行 VOLUME # 指定挂载目录,如 VOLUME ["/data"] 表示把宿主机的/data目录挂载到容器里,但不会指定挂载到容器里的哪个目录,需要使用 docker inspect 来查看,参考链接 USER # 指定启动容器的用户,如 USER root 表示使用 root 用户来启动容器 WORKDIR # 指定工作目录,对 RUN,CMD,ENTRYPOINT,COPY,ADD 生效,比如 WORKDIR /data,那么我执行 RUN echo 123 相当于执行 cd /data; echo 123
    # 尽量使用 WORKDIR 而不要使用 RUN cd,因为如果目录不存在,WORKDIR会自动创建该目录,而 RUN cd 我们并不知道该目录是否存在


    三、Dockerfile 实例:使用 Dockerfile 制作一个安装了 Nginx 的镜像

    [root@localhost ~]$ vim Dockerfile                                                     # 注意文件名固定为Dockerfile
    FROM centos                                                                            # 基于centos镜像,会自动去 Docker Hub 拉取
    MAINTAINER panzekai 1210640219@qq.com                                                  # 指定该文件的作者信息
    RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel    # 安装一些依赖包
    ADD http://nginx.org/download/nginx-1.12.2.tar.gz .                                    # 下载nginx,默认的当前目录是根目录
    RUN tar zxvf nginx-1.12.2.tar.gz                                                       # 解压nginx
    RUN mkdir -p /usr/local/nginx                                                          # 创建安装目录
    RUN cd nginx-1.12.2 && ./configure --prefix=/usr/local/nginx && make && make install   # 编译安装
    RUN rm -fv /usr/local/nginx/conf/nginx.conf                                            # 删除源配置文件
    ADD http://www.apelearn.com/study_v2/.nginx_conf /usr/local/nginx/conf/nginx.conf      # 下载新的配置文件
    EXPOSE 80                                                                              # 开放80端口
    ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd                          # 启动容器时启动nginx,,加上 tail -f /etc/passwd 是为了让容器一直
    # 运行,否则执行完启动nginx容器就直接停止运行了,这是Dockerfile的一个Bug
    [root@localhost ~]$ docker build -t centos_with_nginx .    # 运行Dockerfile文件,"-t"用于指定产生的镜像名,"."表示在哪个路径下寻找Dockerfile文件
    [root@localhost ~]$ docker images    # 查看是否生成了镜像
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos_with_nginx   latest              6365087f4297        54 seconds ago      346MB
    [root@localhost ~]$ docker run -itd -p 80:80 centos_with_nginx    # 使用镜像运行容器,并把宿主机端口映射到容器
    [root@localhost ~]$ docker exec -it 336bb211d1 bash               # 进入容器
    [root@336bb211d1f6 /]# ps aux | grep nginx                        # 查看是否运行了nginx
    root         1  0.1  0.0  11680  1356 pts/0    Ss+  23:22   0:00 /bin/sh -c /usr/local/nginx/sbin/nginx && tail -f /etc/passwd
    root         7  0.0  0.0  20540   620 ?        Ss   23:22   0:00 nginx: master process /usr/local/nginx/sbin/nginx
    nobody       9  0.0  0.1  22984  3204 ?        S    23:22   0:00 nginx: worker process
    nobody      10  0.0  0.1  22984  3204 ?        S    23:22   0:00 nginx: worker process
    root        25  0.0  0.0   9088   668 pts/1    S+   23:22   0:00 grep --color=auto nginx
    [root@localhost ~]$ curl 127.0.0.1:80    # 在宿主机访问一下,看看是否成功
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    ......

    可以参考一下官方安装 Nginx 的 Dockerfile:https://github.com/docker-library/nginx/blob/master/1.7/Dockerfile

        

  • 相关阅读:
    zoj 3627#模拟#枚举
    Codeforces 432D Prefixes and Suffixes kmp
    hdu 4778 Gems Fight! 状压dp
    CodeForces 379D 暴力 枚举
    HDU 4022 stl multiset
    手动转一下田神的2048
    【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律
    poj 3254 状压dp
    C++中运算符的优先级
    内存中的数据对齐
  • 原文地址:https://www.cnblogs.com/pzk7788/p/10198259.html
Copyright © 2011-2022 走看看