美文网首页人民广场
从0开始写dockerfile

从0开始写dockerfile

作者: 菜头_355f | 来源:发表于2021-04-16 15:56 被阅读0次

    教你如何从0开始写一个dockerfile

    1.简单装下docker-ce


    [root@localhost ~]# mv/etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

    [root@localhost  ~]# wget-O /etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-7.repo

    配置国内docker的yum源(阿里云)

    [root@xuegod63 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    安装docker环境依赖

    [root@localhost ~]# yum install -y yum-utilsdevice-mapper-persistent-data lvm2

    安装docker-ce

    [root@localhost  ~]# yum install docker-cedocker-ce-cli containerd.io -y

    注:docker-ce-cli 作用是docker命令行工具包

    containerd.io 作用是容器接口相关包

    yum info 软件包的名字,可以查看一个包的具体作用。

    #启动docker服务

    [root@localhost  ~]# systemctl start docker&& systemctl enable docker

    #查看Docker 版本信息

    [root@localhost  ~]# docker version   

    1.2.2  开启包转发功能和修改内核参数

    内核参数修改:br_netfilter模块用于将桥接流量转发至iptables链,br_netfilter内核参数需要开启转发。

    [root@xuegod63~]# modprobe br_netfilter

    [root@xuegod63~]# echo "modprobe br_netfilter" >> /etc/profile

    [root@xuegod63~]# cat > /etc/sysctl.d/docker.conf <

    net.bridge.bridge-nf-call-ip6tables= 1

    net.bridge.bridge-nf-call-iptables= 1

    net.ipv4.ip_forward= 1

    EOF

    [root@xuegod63~]# sysctl -p /etc/sysctl.d/docker.conf

    #重启docker

    [root@xuegod63 ~]# systemctl restart docker 

    配置镜像加速

    [root@localhost~]# tee /etc/docker/daemon.json << 'EOF'

    {

    "registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com","https://rncxm540.mirror.aliyuncs.com","https://e9yneuy4.mirror.aliyuncs.com"]

    }

    EOF

    重启docker服务使配置生效

    [root@localhost~]# systemctl daemon-reload  && systemctlrestart docker

    1.停止所有容器:docker stop $(docker ps -a -q)

    2.删除所有容器:docker rm $(docker ps -a -q)

    3.删除所有镜像:docker rmi $(docker images -q)

    开始dockerfile简单使用


    [root@localhost ~]# mkdir dockerfile

    [root@localhost ~]# cd dockerfile/

    [root@localhost dockerfile]# vim dockerfile

    写入内容如下:

    FROM centos

    MAINTAINER xue-Pod

    RUN yum install wget -y

    RUN yum install nginx -y

    COPY index.html /usr/share/nginx/html/

    EXPOSE 80

    ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]

    注意 ENTRYPONINT跟[之间有空格

    注:为什么要用-g daemonoff

    在容器里nginx是以daemon方式启动,退出容器时,nginx程序也会随着停止

    使用前台方式永久运行:/usr/sbin/nginx -g "daemon off;"

    [root@localhost dockerfile]# vim index.html

    #写入如下内容

    welcome to xue , I am Pod

    #基于上面的dockerfile构建镜像

    [root@localhost dockerfile]# docker build -t="xuegod/nginx:v1".

    如果后面不家.   那么需要加-f  制定dockerfile的路径

    #查看镜像是否创建成功:

    [root@localhost dockerfile]# docker images

    #显示如下,说明镜像创建成功

    #基于刚才的镜像启动容器

    [root@localhost dockerfile]# docker run -d  -p 80 --name html2 xue/nginx:v1

    注:--name html2 给容器起个名字,-p 80 容器端口,物理机端口会随机映射,-d是后台运行

    #查看容器详细信息和端口映射

    [root@localhost dockerfile]# docker ps | grep html

    3fcfee1e74a8 xue/nginx:v1 "/usr/sbin/nginx -g …" 7 seconds ago Up 7 seconds 0.0.0.0:49153->80/tcp html2

    [root@localhost dockerfile]# curl 192.168.172.140:49153

    1.2 dockerfile语法格式


    FROM centos

    MAINTAINER xue-Pod

    RUN yum install  -y wget

    RUN yum install  -y nginx 

    COPY index.html /usr/share/nginx/html/

    EXPOSE 80

    ENTRYPOINT["/usr/sbin/nginx","-g","daemon off;"]

    FROM:基础镜像,必须是可以下载下来的

    MAINTAINER: 指定镜像的作者信息

    RUN: 指定在当前镜像构建过程中运行的命令,包含两种模式

    #shell模式

    RUN

    RUN yum install wget -y

    #exec模式

    RUN [“executable”,“param1”,“param2”]

    RUN [“/bin/bash”,”-c”,”echo hello”]

    EXPOSE:用来声明端口的

    帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。

    在运行时使用随机端口映射时,也就是 docker run -P ,会自动随机映射EXPOSE的端口。

    格式:

    EXPOSE <端口1> [<端口2>...]

    CMD:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

    CMD[“executable”,“param1”,“param2”]  #exec模式

    CMD command param1 param2  #shell模式

    CMD[“param1”,“param2”]

    ENTRYPOINT: 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT 指令指定的程序。如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。如果运行docker run 时使用   了 --entrypoint 选项,将覆盖 CMD 指令指定的程序。如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

    ENTRYPOINT["","","",...]

    可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给ENTRYPOINT 传参,以下示例会提到。

    示例:假设已通过 Dockerfile 构建了nginx:test 镜像:

    FROM nginx

    ENTRYPOINT["nginx", "-c"]    #定参

    CMD["/etc/nginx/nginx.conf"]  #变参

    构建的镜像是nginx:test

    1、不传参运行

    docker run  nginx:test

    容器内会默认运行以下命令,启动主进程。

    nginx -c /etc/nginx/nginx.conf

    2、传参运行

    docker run  nginx:test -c /etc/nginx/new.conf

    容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)

    nginx -c/etc/nginx/new.conf

    COPY:复制指令,从目录中复制文件或者目录到容器里指定路径。

    格式:

    COPY

    [--chown=<user>:<group>] <源路径1>...  <目标路径>

    COPY

    [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

    [--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。

    <源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:

    COPY hom* /mydir/

    COPY hom?.txt /mydir/

    <目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

    ADD

    ADD:指令和COPY的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

    ADD 的优点:在执行 <源文件> 为tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。

    ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

    ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

    格式:

    ENV

    ENV ==...

    以下示例设置 NODE_VERSION =7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:

    ENV NODE_VERSION7.2.0

    RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz"&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

    ARG:构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

    构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

    格式:

    ARG <参数名>[=<默认值>]

    VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

    避免重要的数据,因容器重启而丢失,这是非常致命的。

    避免容器不断变大。

    格式:

    VOLUME ["<路径1>", "<路径2>"...]

    VOLUME <路径>

    在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点

    HEALTHCHECK:用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

    格式:

    HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令

    HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

    HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

    实战1:dockerfile构建Nginx镜像-部署nginx静态网站

    [root@localhost~]# mkdir /root/nginx

    [root@localhost~]# cd nginx/

    把nginx-1.15.2.tar.gz上传到这个目录  

    注    https://www.newbe.pro/Mirrors/Mirrors-Nginx/?highlight=nginx    一个up主做的镜像加速站,大多常用软件都有可以下载

    [root@localhostnginx]# vim run.sh

    #!/bin/bash

    #启动nginx,如果你路径改了的话,下面的也改下路径

    /usr/local/nginx/sbin/nginx

    [root@localhostnginx]# vim dockerfile

    FROM centos

    MAINTAINER xue-Pod

    RUN yum -y install gcc make pcre-devel zlib-devel tar zlib

    ADD nginx-1.15.2.tar.gz /usr/src/

    RUN cd /usr/src/nginx-1.15.2 \

        && mkdir /usr/local/nginx \

        && ./configure --prefix=/usr/local/nginx && make && make install \

        && ln -s/usr/local/nginx/sbin/nginx /usr/local/sbin/ \

        && nginx

    RUN echo"daemon off;">>/usr/local/nginx/conf/nginx.conf

    ADD run.sh /run.sh

    RUN chmod 755 /run.sh

    CMD["/run.sh"]

    EXPOSE 80

    #基于dockerfile定义好的镜像构建

    [root@localhostnginx]# docker build -t="xue/nginx:v1" .

    #查看构建的镜像

    [root@localhostnginx]# docker images | grep nginx

    #基于镜像启动容器

    [root@localhostnginx]# docker run -dit -p 30180:80 --name nginx xue/nginx:v1

    [root@localhostnginx]# curl localhost:30180

    Welcometo nginx!

    实战2:dockerfile构建Tomcat镜像

    [root@localhost~]# mkdir /root/tomcat

    [root@localhost~]# cd /root/tomcat

    把apache-tomcat-8.0.26.tar.gz 和jdk-8u45-linux-x64.rpm传到这个目录下

    [root@localhosttomcat]# ls

    apache-tomcat-8.0.26.tar.gz  jdk-8u45-linux-x64.rpm

    [root@localhosttomcat]# vim dockerfile

    FROM centos

    MAINTAINERxuegod-IT

    RUN yum installwget -y

    ADD jdk-8u45-linux-x64.rpm /usr/local/

    ADD apache-tomcat-8.0.26.tar.gz /usr/local/

    RUN cd/usr/local && rpm -ivh jdk-8u45-linux-x64.rpm

    RUN mv/usr/local/apache-tomcat-8.0.26 /usr/local/tomcat8

    EXPOSE 8080

    #开始构建镜像

    [root@localhosttomcat]# docker build -t="tomcat8081:v1"  .

    #基于镜像运行tomcat服务

    [root@localhosttomcat]# mkdir /usr/local/tomcat8/webapps -p

    [root@localhosttomcat]# docker run --name tomcat8  -v /usr/local/tomcat8/webapps:/usr/local/tomcat8/webapps -itd -p 8080 tomcat8:v1 /bin/bash

    #启动tomcat服务

    [root@localhosttomcat]# docker exec -it tomcat8 /bin/bash

    [root@8f21f5bae6b3/]# /usr/local/tomcat8/bin/startup.sh

    #打开新的终端窗口,查看刚才创建的tomcat8这个容器的详细信息

    [root@localhost~]# docker ps | grep tomcat

    8f21f5bae6b3  tomcat8:v1        "/bin/bash"  About a minute ago  Up About a minute  0.0.0.0:49153->8080/tcp

    通过上面可以看到,tomcat在宿主机上映射的端口是32776

    这样我们请求localhost节点的ip:49153,就可以访问到tomcat的内容了

    实战3:dockerfile构建Apache网站服务

    [root@localhost~]# mkdir apache

    [root@localhost~]# cd apache/

    [root@localhostapache]# vim dockerfile

    FROM centos

    MAINTAINER xue-Pod

    RUN yum -y install httpd

    ADD index.html /var/www/html/index.html

    ADD run.sh/run.sh

    RUN chmod 755/run.sh

    EXPOSE 80

    CMD["/run.sh"]

    [root@localhostapache]# vim run.sh

    #!/bin/bash

    rm -rf/run/httpd/*

    exec

    /usr/sbin/apachectl -D FOREGROUND #启动容器时启动服务

    [root@localhostapache]# vim index.html

    看到就说明成功了

    #基于刚才的dockerfile构建镜像

    [root@localhostapache]# docker build -t xue/apache:v1 .

    #启动apache服务

    [root@localhostapache]# docker run -d -p 30280:80 xuegod/apache:v1

    #验证容器是否启动成功

    [root@localhostapache]# docker ps

    CONTAINER ID  IMAGE            COMMAND      CREATED            STATUS            PORTS                    NAMES

    7d266d1312ec  xue/apache:v1  "/run.sh"    5 minutes ago      Up 5 minutes      0.0.0.0:30280->80/tcp    goofy_volhard

    #访问apache服务

    [root@localhostapache]# curl localhost:30280

    看到就说明成功了

    1、下载 php 软件包

    把 php-7.1.5.tar.gz 上传到 xuegod63 机器的/tmp/php 目录 #把 centos-7.tar.gz 镜像压缩包上传xuegod63 上,手动解压 docker load -i centos-7.tar.gz

    解压出来的镜像是 centos:7

    2 编写 dockerfile 文件

    cd /tmp/php

    cat Dockerfile

    FROM centos:7

    MAINTAINER swift

    RUN yum install -y install epel-release && \

    yum -y install git wget lrzsz vim libxml2 libxml2-devel openssl openssl-devel curl curl-devel libjpeg-turbo libjpeg-turbo-devel libpng-devel libpng freetype-devel freetype icu libicu-devel libicu libmcrypt libmcrypt-devel libxslt libxslt-devel php-mysql && \

    yum -y groupinstall "Development Tools" && \ yum provides "*/applydeltarpm" && \

    yum install deltarpm -y && \

    yum clean all && \

    groupadd www && \

    useradd -g www www

    ADD php-7.1.5.tar.gz /usr/local/src/ RUN cd /usr/local/src/php-7.1.5 && \

    ./configure --prefix=/usr/local/php71 \ --with-config-file-path=/usr/local/php71/etc \ --with-config-file-scan-dir=/usr/local/php71/conf.d \ --enable-fpm --with-fpm-user=www \ --with-fpm-group=www \

    --with-mysql=mysqlnd \ --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-iconv-dir \ --with-freetype-dir=/usr/local/freetype \ --with-jpeg-dir \

    --with-png-dir \ --with-zlib \ --with-libxml-dir=/usr \ --enable-xml \ --disable-rpath \ --enable-bcmath \

    --enable-shmop \ --enable-sysvsem \ --enable-inline-optimization \ --with-curl \ --enable-mbregex \ --enable-mbstring \ --with-mcrypt \

    --enable-ftp \ --with-gd \ --enable-gd-native-ttf \ --with-openssl \ --with-mhash \ --enable-pcntl \ --enable-sockets \ --with-xmlrpc \ --enable-zip \ --enable-soap \ --with-gettext \ --disable-fileinfo \ --enable-opcache \ --enable-intl \ --with-xsl && \

    make -j 4 && make install && \

    cp /usr/local/php71/etc/php-fpm.conf.default /usr/local/php71/etc/php-fpm.conf && \

    cp ./php.ini-production /usr/local/php71/etc/php.ini && \

    cp /usr/local/php71/etc/php-fpm.d/www.conf.default /usr/local/php71/etc/php- fpm.d/www.conf && \

    cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm && \ chmod +x /etc/init.d/php-fpm && \

    rm -rf /usr/loacl/src/php-7.1.5

    EXPOSE 9000

    CMD ["/etc/init.d/php-fpm","start"]

    3、构建镜像

    docker build -t xuegod/php:v1 .

    4、基于镜像运行一个 php

    docker run -d -p 9000:9000 --name php-test xuegod/php:v1 5

    、查看日志

    [root@xuegod63]# docker logs php-test -f

    Starting php-fpm done

    相关文章

      网友评论

        本文标题:从0开始写dockerfile

        本文链接:https://www.haomeiwen.com/subject/tgislltx.html