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 <fmh>"

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 <fmh>"

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 <fmh>"

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

前一个命令执行失败才会执行下一个命令

\符号

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 <fmh>"

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 <fmh>"

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

相关推荐
追梦不止~1 小时前
Docker常用命令+详解
运维·docker·容器
铁锤妹妹头发多2 小时前
新手用docker真**难受
运维·docker·容器
南猿北者11 小时前
docker容器
docker·容器
二十雨辰12 小时前
[linux]docker基础
linux·运维·docker
time never ceases12 小时前
使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
数据库·docker·oracle
MonkeyKing_sunyuhua14 小时前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
追风林15 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
€☞扫地僧☜€16 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
茶馆大橘16 小时前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
全能全知者17 小时前
docker快速安装与配置mongoDB
mongodb·docker·容器