人民广场

从0开始写dockerfile

2021-04-16  本文已影响0人  菜头_355f

教你如何从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

上一篇下一篇

猜你喜欢

热点阅读