dockerfile

dockerfile的主要作用

|-----------------------------------------|
| 创建镜像,创建自定义的镜像,包括配置文件,挂载点,对外暴露的端口,设置环境变量 |

docker的创建镜像的方式

|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 基于已有镜像的方式 | 可以根据官方提供的镜像源,创建镜像,然后拉起容器,是一个白班,只能提供基础的功能,扩展性的功能还是需要自定义(进入容器进行操作) |
| 基于模版进行创建 | 模版网址 Index of /template/precreated |
| 联合文件系统 (UnionFS) | docker镜像的基础,镜像通过分层来进行集成 分层特性:一次性同时加载多个文件系统,但从外面来看,就是一个文件系统,docker镜像实际上就是由一层层的文件系统组成的,这总层级的文件系统就是UnionFS,它的每一层都是layers,每一层都包含文件系统的一部分,这些层次叠加在一起,最总形成的就是rootfs bootfs:宿主机提供的内核和引导程序 rootfs:就是容器的操作系统,在dockerfile中,我们可以自己指定,rootfs是多个基础镜像和应用镜像结合起来的可读层,镜像实际上就是一个只读文件,容器基础镜像实例,运行起来后,容器变成可读可写层 |

|-------------------------------------------------------------------------------------------------------------|
| 在dockerfile当中每创建一个指定都是一个镜像层 镜像层会被缓存和复用 如1-6部 1-4运行失败后修复完成,1-4将直接完成,继续运行5-6,一旦有一层镜像缓存失败,那么所有的镜像层都会失败,镜像也不会创建 |
| 镜像层是不可变的,你在某一层当中添加一个新的命令,但是下一层删除了指令,镜像中基于这个命令创建的文件依然存在,但是在容器中看不见 |

|----------------------------------|
| Dockerfile的核心作用:用户个性化定制docker的镜像 |

dockerfile的结构

|---|------------|
| 1 | 基础镜像信息 |
| 2 | 维护者信息 |
| 3 | 镜像的操作指令 |
| 4 | 容器启动时执行的命令 |

dockerfile的语法

|------------|---------------------------------------------------------------------------|
| FROM | 指定基础镜像信息,指定容器的操作系统 |
| MAINTAINER | 指定维护者信息(可有可无) |
| RUN | 在这个基础的镜像上执行的命令,每个RUN就是一层,分层越多,镜像就越大 |
| ENTRYPOINT | 设置容器运行时的默认命令(容器内部运行的主程序) |
| CMD | 指定容器运行时的默认命令(如果docker run 加了/bin/bash)后面加了其他的命令,cmd的指令将会被覆盖 |
| EXPOSE | 暴露端口(指定容器的运行端口) |
| ENV | 设置整个环境的变量,环境变量可以被RUN命令使用(声明容器运行需要的环境变量) |
| ADD | 两个作用一个是复制,一个是解压,但解压不支持.zip和.tar,只能解压rar.gz,tar.bz2,支持url地址解压和复制(主要作用就是解压) |
| COPY | 复制文件,不能解压,而且只能复制本地文件,文件要和dockerfile在一个目录里才能复制(官方推荐复制使用copy) |
| VOLUME | 创建一个容器的挂载点,既可以为宿主机挂载,也可以供容器挂载 |
| USER | 设置镜像运行时使用的用户或者UID(可以不加) |
| WORKDIR | 为后续指令设置的工作目录 |
| ONBUILD | 这镜像可以被其他镜像引用,需要这个命令 |
| ARG | 传参,用于创建容器时,传递参数,EMV用于容器运行时设置环境变量 |

CMD和ENTRYPOINT的区别

|-----|-------------------------------------------------------------------------|
| 相同点 | 都是可以作为容器启动时的默认命令 |
| 区别 | CMD可以把参数传给ENTRYPOINT |
| | 多个ENTRYPOINT和多个CMD只会运行最后一个(一个dockerfile当中只会有一个ENTRYPOINT和CMD) |
| | ENTRYPOINT的指令不会被覆盖,CMD的指令如果在docker run后面加上输出,会被覆盖 |
| | ENTRYPOINT和CMD的指令在容器启动时执行,都会成为容器的主进程,主进程负责接收信号,处理容器的生命周期,主进程退出,容器也将终止运行 |

RUN命令的优化

|------|------------------------------------------------------------------------------|
| | 主要是减少镜像的层数,把多个run命令写在一块 |
| && | RUN yum -y install nginx && make -j 4 && make install 前一个命令执行成功才会执行下一个命令 |
| ; | RUN yum -y install nginx ; make -j 4 ; make install 不管前一个命令是否成功,后一个命令都会执行 |
| || | RUN yun -y install nginx || make -j 4 如果前一个命令执行失败,才会执行后面的操作 |
| \ | 换行 RUN yum -y install nginx \ && make -j 4 \ && make install 可读性更高 |

COPY和ADD的区别

|-----|----------------------------------------------------------------------------------------------|
| 共同点 | copy和andd可以把本地文件复制到镜像中,但是官方推荐如果是复制,推荐使用copy |
| 不同点 | add可以解压,如果是一个压缩文件,add在复制之后会自动解压,仅限于(tar.gz和tar.bz2)可以支持URL下载源文件,支持下载,但是不能解压,通过URL拷贝的文件无法自动解压 |
| | copy 只能复制,不能解压,而且只能是本地文件,不支持URL路径 |

基于centos7创建apache

bash 复制代码
[root@docker1 opt]# mkdir apache
[root@docker1 opt]# cd apache/
[root@docker1 apache]# ls
apr-1.6.2.tar.gz  apr-util-1.6.0.tar.gz  httpd-2.4.29.tar.bz2
文件必须要在同一文件内
[root@docker1 apache]# vim Dockerfile
#必须为Dockerfile 否则识别不了

FROM centos:7
MAINTAINER "my docker <cwh>"
RUN yum -y install epel-release.noarch
RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt
ADD apr-util-1.6.0.tar.gz /opt
ADD httpd-2.4.29.tar.bz2 /opt
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util &&\
cd /opt/httpd-2.4.29 &&\
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\
make && make install
EXPOSE 80
ENTRYPOINT ["/usr/local/httpd/bin/apachectl","-D","FOREGROUIND"]

[root@docker1 apache]# docker build -t apache:centos .
如果yum过程报错可以通过重启docker解决该问题, . 表示构建images
[root@docker1 apache]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
apache       centos    02b2f1614fe1   12 minutes ago   958MB
[root@docker1 apache]# docker run -itd --name httpd -p 1080:80 apache:centos

二次构建

bash 复制代码
vim Dockerfile
#创建基础镜像
FROM centos:7 AS first
# AS first表示一层
MAINTAINER "this is my apache <zyg>"
RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt
ADD apr-util-1.6.0.tar.gz /opt
ADD httpd-2.4.29.tar.bz2 /opt
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util &&\
cd /opt/httpd-2.4.29 &&\
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\
make -j 4 && make install
#二层构建:了解即可
FROM centos:7
COPY --from=first /usr/local/httpd /usr/local/httpd
RUN yum -y install make pcre pcre-devel expat-devel perl
EXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]
 
docker build -t apache1:centos .

基于centos7构建nginx

bash 复制代码
[root@docker1 ~]# cd /opt
[root@docker1 opt]# mkdir nginx
[root@docker1 opt]# cd nginx/
[root@docker1 nginx]# vim Dockerfile
#必须要Dockerfile才能被识别,否则会报错
FROM centos:7
MAINTAINER "this is my nginx <czy>"
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make  && useradd -M -s /sbin/nologin nginx
ADD nginx-1.22.0.tar.gz /opt/
RUN cd /opt/nginx-1.22.0 && ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
RUN cd /opt/nginx-1.22.0 && make && make install
RUN ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ && touch /lib/systemd/system/nginx.service
RUN sed -i '$a [Unit]\Description=nginx\After=network.target\[Service]\Type=forking\PIDFile=/usr/local/nginx/logs/nginx.pid\ExecStart=/usr/local/nginx/sbin/nginx\ExecReload=/bin/kill -s HUP $MAINPID\ExecStop=/bin/kill -s QUIT $MAINPID\PrivateTmp=true\[Install]\WantedBy=multi-user.target'  /lib/systemd/system/nginx.service
RUN chmod 754 /lib/systemd/system/nginx.service

EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

[root@docker1 nginx]# ls
Dockerfile  nginx-1.22.0.tar.gz
[root@docker1 nginx]# docker build -t nginx:centos .
ERROR: failed to solve: process "/bin/sh -c yum -y install pcre-devel zlib-devel gcc gcc-c++ make  && useradd -M -s /sbin/nologin nginx" did not complete successfully: exit code: 1
#yum报错重启docker即可
[root@docker1 nginx]# systemctl restart docker
[root@docker1 nginx]# docker build -t nginx:centos .
#构建镜像
[root@docker1 nginx]# docker run -itd --name nginx -p 1080:80 nginx:centos
#可以映射 80:80 不修改80端口本地无法访问
de060c3317fbe975418ee69ccaeab8e515832d6e2c889c2c629f443bae71d53b
[root@docker1 nginx]# netstat -antp | grep 1080
[root@docker1 nginx]# curl 192.168.233.11:1080
相关推荐
€☞扫地僧☜€1 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
茶馆大橘1 小时前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
全能全知者2 小时前
docker快速安装与配置mongoDB
mongodb·docker·容器
阿尔帕兹4 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
ZHOU西口5 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
川石课堂软件测试11 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
追风林18 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
城南vision20 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wclass-zhengge20 小时前
Docker篇(Docker Compose)
运维·docker·容器
梦魇梦狸º1 天前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github