dockerfile

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

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

docker的创建镜像的方式

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

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

2、基于模版进行创建

3、dockerfile

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

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

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

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

bootfs 宿主机的引导文件系统,启动操作系统的文件,启动容器需要的最基本的文件。包含宿主机的bootloader和kernel**(内核)**。

rootfs 镜像的操作系统,会给镜像自动创建一个操作系统

RUN、ADD 创建容器时的命令

container 镜像 容器

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

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

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

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

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

镜像层会被缓存和复用。

1-6

1-4失败

1-4将直接完成,继续运行5-6

一旦有一层镜像失败,那么所有的镜像层都会失败。镜像也不会被创建。

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

但是在容器中看不见。

1、touch 123

2、rm-rf 123

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

dockerfile的结构:

1、基础镜像信息

2、维护者信息

3、镜像的操作命令

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

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

dockerfile的语法:

FROM:指定基础镜像信息。指定容器的操作系统。

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

RUN:在基础的镜像上执行的命令,每一个run就是一层,分层越多,镜像越大。

ENTRYPOINT:设置容器运行时的默认命令(容器内部运行的主程序)。

CMD:指定容器运行时的默认命令(docker run /bin/bash 后面加了其他的命令,cmd的指令将会被覆盖)

EXPOSE:暴露端口(指定容器的运行端口)

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

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

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

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

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

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

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

ARG:传参,用于创建容器时,传递参数。ENV用于容器运行时设置环境变量。

CMD和ENTRYPOINT的区别(重点):

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

entrypoint和cmd的指令在容器启动时执行,都会成功容器的主进程。主进程负责接收信号,处理容器的生命周期,主进程退出,容器也将终止运行。

1、CMD可以把参数传给ENTRYPOINT

2、多个entrypoint和多个cmd只会运行最后一个(一个dockerfile当中只会有一个entrypoint和cmd)

3、entrypoint的指令不会被覆盖,cmd的指令如果在docker run的后面加上输出,会被覆盖

RUN命令的优化:

主要是减少镜像的层数:把多个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

如果前面的命令执行失败,才会执行后面的操作

反斜杠\:换行(提高命令的可读性)

RUN yum -y install nginx \

&&meke -j 4 \

&&make install

可读性更高。

copy和add的区别:

copy和add都可以把本地文件复制到镜像中 但是官方推荐如果是复制,使用copy

区别:

ADD可以解压,如果是一个压缩文件,add在复制之后会自动解压。(tar.gz和tar.bz2)可以支持URL下载原文件,支持下载,但是不能解压。通过URL拷贝的文件无法主动解压。

copy只能复制,不能解压,而且只能是本地文件,不支持URL路径。

centos7构建一个apache的dockerfile(编译安装):

创建基础镜像

FROM centos:7

MAINTAINER "this is my apache <wx>"

RUN yun -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

EXPOSE 80

CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]

docker build -t apache:centos .

基于镜像的二次构建(了解)

vim dockerfile

#创建基础镜像

FROM centos:7 AS first

MAINTAINER "this is my apache <wx>"

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

#安装apache运行所需的环境依赖包,不再安装源码编译所需的依赖包

RUN yum install -y pcre pcre-devel expat-devel perl

EXPOSE 80

CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]

docker build -t apache1:centos .

基于dockerfile创建镜像

LNMP+WordPress

nginx 172.111.0.10 docker-nginx

MySQL 172.111.0.20 docker-MySQL

php 172.111.0.30 docker-php

创建容器的自定义网络(容器内部署)

docker network create --subnet-172.111.0.0/16 --opt

-M 不创建家目录 -s 指定使用的shell

设置环境变量

ENV PATH /usr/local/nginx/sbin:$PATH

COPY nginx.conf

ADD wordpress

#创建容器内的数据卷,即可以对外给宿主机挂载,也可以对内,给容器作为挂载点

VOLUME ["/usr/local/nginx/html"]

#设定容器启动时的命令

CMD

9:30

daemom off (前台运行)

设置暴露的端口

EXPOSE 3306

RUN

ENTRYPOINT[""]

docker run --name=mysql -d --privileged -v /usr/local/mysql --net mynetwork --ip 172.18.0.20 mysql:lnmp

socket文件

相关推荐
tntlbb3 分钟前
Ubuntu20.4 VPN+Docker代理配置
运维·ubuntu·docker·容器
热心市民运维小孙6 分钟前
Ubuntu重命名默认账户
linux·ubuntu·excel
PyAIGCMaster8 分钟前
文本模式下成功。ubuntu P104成功。
服务器·数据库·ubuntu
Jackey_Song_Odd1 小时前
解决Ubuntu下无法装载 Windows D盘的问题
linux·ubuntu
Linux运维技术栈1 小时前
Ansible(自动化运维)环境搭建及ansible-vault加密配置
运维·自动化·ansible
乔巴不是狸猫1 小时前
第11周作业
linux
Bessssss3 小时前
centos权限大集合,覆盖多种权限类型,解惑权限后有“. + t s”问题!
linux·运维·centos
苹果醋33 小时前
Golang的文件加密工具
运维·vue.js·spring boot·nginx·课程设计
jwensh3 小时前
【Jenkins】Declarative和Scripted两种脚本模式有什么具体的区别
运维·前端·jenkins
silver6873 小时前
Linux 下的 GPT 和 MBR 分区表详解
linux