教你如何从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
网友评论