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
相关推荐
牛奔5 分钟前
Docker Compose 两种安装与使用方式详解(适用于 Docker 19.03 版本)
运维·docker·云原生·容器·eureka
青州从事5216 小时前
20260108【mac】【brew】【docker】安装
macos·docker·eureka
菜鸟思维7 小时前
优化NextJs 项目的Docker 镜像 从3.62G 优化到 296.85M
docker
怣疯knight7 小时前
Docker Desktop 4.55.0版本安装成功教程
windows·docker
东方佑8 小时前
使用Docker Compose一键部署OnlyOffice:完整指南与配置解析
运维·docker·容器
赵文宇(温玉)8 小时前
Docker的价值、特点、创新与关键技术
运维·docker·容器
Coder码匠10 小时前
Docker Compose 部署 Spring Boot 应用完全指南
spring boot·docker·容器
可爱又迷人的反派角色“yang”11 小时前
k8s(二)
linux·运维·docker·云原生·容器·kubernetes·云计算
计算机小手11 小时前
内网穿透系列十六:使用 wg-easy 快速搭建基于 wireguard 的虚拟局域网,支持Docker部署
经验分享·网络协议·docker·开源软件
旧日之血_Hayter11 小时前
docker部署项目,/var/lib/docker/overlay2目录满了如何清理?
运维·docker·容器