dockerfile

dockerfile 创建镜像,创建自定义的镜像

包括配置文件、挂载点、对外暴露的端口、设置环境变量

docker的创建镜像的方式

1、基于已有镜像进行创建

根据官方提供的镜像源创建镜像,然后拉起容器。是一个白板,只能提供基础的功能,扩展性功能还是要自定义(进入容器进行操作)

2、基于模板进行创建

Index of /template/precreated

cd /opt

拖进去

ls

docker import ubuntu-14.04-x86-minimal.tar.gz(镜像名称) -- ubuntu:14

docker images

docker run -itd --name test ubuntu:14 /bin/bash

docker exec -it test bash

ls

apt

apt -y install nginx

apt -y install httpd

exit

3、dockerfile

联合文件系统(UnionFS),docker镜像的基础

镜像通过分层来进行集成,特性:一次同时加载多个文件系统,但是从外面看,就是一个文件系统

docker镜像实际上就是由一层一层的文件系统组成,这种层级的文件系统就是iUnionFS

每一层都是layers,每一层都包含文件系统的一部分,这些层次叠加在一起最终形成的就是rootfs

bootfs 宿主机提供内核和引导程序

rootfs 就是容器的操作系统,在dockerfile中,我们可以自己指定

rootfs 是多个基础镜像和应用镜像结合起来的只读层。镜像实际上就是只读文件

容器基于镜像实例,运行起来之后,容器变成可读可写层

在dockerfile当中,每创建一个指定都是一个镜像层

镜像层会被缓存和复用

例:

1--6层

1-4层成功,第4层失败

修复完成后,1-4将会直接完成,继续运行5-6

特点:一旦有一层镜像缓存失败,那么所有的镜像层都会失败,镜像也不会创建

镜像层是不可变的,在某一层当中添加一个新的命令,但是下一层删除了指令,镜像中基于这个命令创建的文件,依然存在,但是在容器中看不见

dockerfile的核心: 用户个性化定制docker的镜像。

dockerfile的结构

1、基础镜像信息

2、维护者信息

3、镜像的操作指令

4、容器启动时执行的命令

nginx:定义好了容器执行命令 /bin/bash覆盖了容器内的标准输出

dockerfile的语法(所有语法都是大写)

FROM 指定基础镜像信息。指定容器的操作系统(必须要有)

MAINTAINER 指定维护者信息(可有可无)

RUN 在基础镜像信息FROM上执行的命令,每个RUN就是一层,RUN越多,分层越多,镜像越大(必须要有)

ENTRYPOINT 设置容器运行时的默认命令(容器内部运行的主程序)(和CMD二选一,必须要有)

CMD 指定容器运行时的默认命令(docker run /bin/bash 后面加了其他命令,CMD命令将会被覆盖)(和ENTRYPOINT二选一,必须要有)

EXPOSE 暴露容器端口(指定容器的运行端口)(必须要有)

ENV 设置环境变量。环境变量可以被RUN命令使用(声明容器运行需要的环境变量)

ADD 复制、解压。解压不支持.zip和.rar。支持tar.gz、tar.bz2、支持url地址解压和复制(解压)

COPY 复制文件,不能解压,只能复制本地文件。文件要和dockerfile在一个目录里(官方推荐复制用COPY)

VOLUME 设置挂载点。创建一个容器内的挂载点,既可以为宿主机挂载,也可以供容器挂载

USER 设置运行镜像时使用的用户或者UID(可以不加)

WORKDIR 为后续指令设置的工作目录

ONBUILD 这个镜像可以被其他镜像引用,需要这个命令

ARG 传参,用于创建容器时传进参数(可有可无)。ENV用于容器运行时设置环境变量

Q:ENTRYPOINT和CMD的区别

A:都是可以作为容器启动时的默认命令

区别一:CMD 可以把参数传给ENTRYPOINT

root@10 opt\]# cd \[root@10 \~\]# cd /opt/ \[root@10 opt\]# ls containerd rh \[root@10 opt\]# mkdir test1 \[root@10 opt\]# ls containerd rh test1 \[root@10 opt\]# cd test1/ \[root@10 test1\]# vim Dockerfile FROM centos:7 MAINTAINER "this is my docker \" ENTRYPOINT \["echo","hello"

CMD ["by"]

root@10 test1\]# docker build -t centos7:test . \[+\] Building 0.0s (5/5) FINISHED docker:default =\> \[internal\] load build definition from Dockerfile 0.0s =\> =\> transferring dockerfile: 183B 0.0s =\> \[internal\] load .dockerignore 0.0s =\> =\> transferring context: 2B 0.0s =\> \[internal\] load metadata for docker.io/library/centos:7 0.0s =\> \[1/1\] FROM docker.io/library/centos:7 0.0s =\> exporting to image 0.0s =\> =\> exporting layers 0.0s =\> =\> writing image sha256:12ef6f09c329271e46c1d23005bf7e229 0.0s =\> =\> naming to docker.io/library/centos7:test 0.0s \[root@10 test1\]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.22.0 08a1cbf9c69e 14 months ago 142MB nginx latest 605c77e624dd 23 months ago 141MB centos7 test 12ef6f09c329 2 years ago 204MB centos 7 eeb6ee3f44bd 2 years ago 204MB \[root@10 test1\]# docker run --name test3 centos7:test hello by ****区别二:多个entrypoint和多个cmd只会运行最后一个(一个dockerfile中只会有一个entrypoint和cmd)**** \[root@10 test1\]# vim Dockerfile FROM centos:7 MAINTAINER "this is my docker \" ENTRYPOINT \["echo","hello"

ENTRYPOINT ["echo","hi"]

CMD ["by"]

CMD ["LIKE"]

root@10 test1\]# docker build -t centos7:test4 . \[+\] Building 0.0s (5/5) FINISHED docker:default =\> \[internal\] load build definition from Dockerfile 0.0s =\> =\> transferring dockerfile: 224B 0.0s =\> \[internal\] load .dockerignore 0.0s =\> =\> transferring context: 2B 0.0s =\> \[internal\] load metadata for docker.io/library/centos:7 0.0s =\> CACHED \[1/1\] FROM docker.io/library/centos:7 0.0s =\> exporting to image 0.0s =\> =\> exporting layers 0.0s =\> =\> writing image sha256:30b66fd7a78cd675a46e2b673581e1e02 0.0s =\> =\> naming to docker.io/library/centos7:test4 0.0s \[root@10 test1\]# docker run centos7:test4 hi LIKE ****区别三:entrypoint指令不会被覆盖,cmd指令如果在docker run 后面加上输出,会被覆盖**** \[root@10 test1\]# vim Dockerfile FROM centos:7 MAINTAINER "this is my docker \" ENTRYPOINT \["echo","hello"

CMD ["by"]

root@10 test1\]# docker run -it centos7:test ls /opt hello ls /opt ****共同点:entrypoint和cmd的指令在容器启动时执行,都会成为容器的主进程。主进程负责接收信号,处理容器的生命周期,主进程退出,容器也将终止运行**** ****Q:run命令的优化**** ****A:****主要是减少镜像的层数:把多个RUN命令写在一起 ****\&\&符号:**** RUN yum-y install nginx \&\& make -j 4 \&\& make install 前一个命令执行成功才会执行下一个命令 ****;符号**** RUN yum -y install nginx ; make -j 4 ; make install 不管前一个命令是否执行成功,都会执行下一个命令 ****\|\|符号**** RUN yum -y install nginx \|\| make -j 4 \|\| make install 前一个命令执行失败才会执行下一个命令 [****\\符号****](%5C%5C%E7%AC%A6%E5%8F%B7) RUN yum -y install nginx \\ \&\& make -j 4 \\ \&\& make install 换行,可读性更高 ****Q:COPY和ADD区别**** ****A:**** ****共同点:copy和add都可以把本地文件复制到镜像中 但是官方推荐如果是复制,使用copy.**** ****区别:ADD可以解压。如果是一个压缩文件,ADD在复制之后会自动解压(仅限于tar.gz和tar.bz2)。并且ADD支持URL下载源文件(只能支持下载,不能解压。通过URL拷贝的文件无法自动解压)**** ****COPY只能复制,不能解压,而且只能是本地文件,不支持URL路径**** centos7构建一个apache的dockerfile(编译安装) \[root@10 apache\]# ls apr-1.6.2.tar.gz apr-util-1.6.0.tar.gz httpd-2.4.29.tar.bz2 \[root@10 apache\]# vim Dockerfile FROM centos:7 MAINTAINER "this is my apache \" 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..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/httpd2.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 16 \&\& make install EXPOSE 80 CMD \["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"

root@10 apache\]# docker build -t apache:centos . \[root@10 apache\]# docker run -itd --name httpdl -p 1314:80 apache:centos 8968bc8a879a172d7ee90a9c63c6d047dc036c598e07279c84de16d636a35a2c \[rootadockerl apache\]# 网页浏览192.168.233.10:1314 \[rootadockerl apache\]# docker ps 基于镜像进行二次构建 \[rootadockerl apache\]# ls \[root@10 apache\]# vim Dockerfile FROM centos:7 AS first MAINTAINER "this is my apache \" 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..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/httpd2.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 16 \&\& make install #二层构建 FROM centos:7 COPY --from=first /usr/local/httpd /usr/local/httpd RUN yum -y install pcre pcre-devel expat-devel perl EXPOSE 80 CMD \["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"

root@10 apache\]# docker build t apache1:centos . \[root@10 apache\]# docker images

相关推荐
牛奔29 分钟前
Docker Compose 两种安装与使用方式详解(适用于 Docker 19.03 版本)
运维·docker·云原生·容器·eureka
青州从事5216 小时前
20260108【mac】【brew】【docker】安装
macos·docker·eureka
菜鸟思维7 小时前
优化NextJs 项目的Docker 镜像 从3.62G 优化到 296.85M
docker
怣疯knight8 小时前
Docker Desktop 4.55.0版本安装成功教程
windows·docker
东方佑8 小时前
使用Docker Compose一键部署OnlyOffice:完整指南与配置解析
运维·docker·容器
赵文宇(温玉)9 小时前
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·容器