从0开始写dockerfile

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,408评论 4 371
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,690评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,036评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,726评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,123评论 3 296
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,037评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,178评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,964评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,703评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,863评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,333评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,658评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,374评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,195评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,988评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,167评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,970评论 2 279

推荐阅读更多精彩内容