dockerfile

发布时间:2023年12月18日

(一)dockerfile

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

2、docker创建镜像的方式

(1)基于已有镜像进行创建:可以根据官方提供的镜像源,创建镜像,创建容器(是一个白板,只能提供基础的功能,扩展性的功能还是需要自定义,进入容器进行操作)
(2)基于模版进行创建:(https://download.openvz.org/template/precreated/)
(3)dockerfile(工作中主要使用的方式

3、dockerfile:联合文件系统(unionFS),docker镜像的基础,镜像通过分层来进行集成

(1)特性:一次可以同时加载多个文件系统,但是从外面来看(用户角度来说)就是一个文件系统
(2)docker镜像实际上就是由一层一层的文件系统组成,这种层级的文件系统就是unionFS,每一层都是一个layers,每一层都包含文件系统的一部分,这些层次叠加在一次,最终形成的就是rootfs
①bootfs:宿主机提供的内核和引导程序
②rootfs:就是容器的操作系统,在dockerfile中,可以自己指定
③rootfs是多个基础镜像和应用镜像结合起来的只读层,镜像实际上就是一个只读文件
④容器基于镜像实例,运行起来之后,容器变成可读可写层
⑤在dockerfile当中每创建一个指令都是一个镜像层,镜像层会被缓存和复用
1-6层
若1-4层失败
解决故障后,1-4将将直接完成,继续执行,继续运行5-6层
* 一旦有一层镜像失败,那么所有的镜像层都会失败,镜像也不会创建

(3)镜像层是不可变的,在某一层当中添加了一个新的命令,但是下一层删除了指令,镜像中基于这个命令创建的文件系统依然存在,但是在容器中看不见
(4)dockerfile的核心特征:用户个性化定制docker的镜像

4、dockerfile的文件结构

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

5、dockerfile的语法(大写)

FROM

指定基础镜像信息,指定容器的操作系统

MAINTAINER

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

RUN

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

ENTRYPOINT

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

CMD

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

EXPOSE

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

ENV

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

ADD

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

COPY

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

VOLUME

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

USER

设置运行镜像时使用的用户或者uid(可有可无)

WORKDIR

为后续指令(ENTRYPOINT、CMD指定的指令)设置的工作目录

ONBUILD

这个镜像可以被其他镜像引用,需要这个命令(可有可无)

ARG

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

(1)dockerfile的命令语法

①第一种:

构建镜像:docker build -t centos7:test(名称+标签) .(表示运行当前的dockerfile文件)

docker run --name test1 centos7:test

②第二种:多个entrypoint和cmd

③第三种:指定参数

6、ENTRYPOINT和CMD的区别(重点)

ENTRYPOINT

CMD

共同点

  1. 都可以作为容器启动时的默认命令
  2. entrypoint和cmd的指令在容器启动时执行,都会成为容器的主进程,主进程负责接收信号,处理容器的生命周期,主进程退出,容器也将终止运行

区别

1、cmd可以把参数传给ENTRYPOINT

  1. 多个entrypoint和多个cmd只会运行最后一个(一个dockerfile中只会有一个entrypoint和cmd)

构建镜像:docker build -t centos7:test(名称+标签) .

docker run --name test1?centos7:test

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

docker run -it centos7:test ls /opt

7、run命令的优化:减少镜像的层数,把多个run命令写在一块(分层越少,镜像就越小)

&&(推荐)

前一个命令执行成功才会执行下一个命令

yum -y install nginx &&?make -j 4?&&?make install

;(了解)

不管前一个命令是否执行成功,都会执行下一个命令

yum -y install nginx ?make -j 4 make install

||(了解)

表示或,如果前一个命令执行失败,才会执行后面的命令

yum -y install nginx ||?make -j 4 ||?make install

\

换行,可读性更高

yum -y install nginx?\

&& make -j 4?\

&& make install

8、copy和add的区别

copy

add

共同点

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

区别

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

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

9、构建dockerfile(基于centos7构建一个Apache的dockerfile,编译安装)

(1)创建基础镜像

如果出现yum安装错误,重启docker
镜像创建完成
不加/bin/bash,否则会覆盖cmd

10、基于镜像进行二次构建(可以缩小镜像的大小)——了解

11、构建dockerfile(基于centos7构建一个nginx的dockerfile,编译安装)

(1)创建基础镜像

(二)dockerfile创建镜像LNMP+wordpress

实验架构

镜像

nginx

172.111.0.10;docker-nginx

mysql

172.111.0.20;docker-mysql

php

172.111.0.30;docker-php

1、创建镜像

(1)创建容器的自定义网络
docker network create --subnet=172.111.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork

(2)创建nginx的dockerfile

①修改nginx.conf文件

②配置Dockerfile文件

③构建镜像:docker build -t nginx:lnmp .

④创建容器:docker run -itd --name nginx -p 80:80 -v /opt/nginx:/opt/nginxlogs --net mynetwork --ip 172.111.0.10 nginx:lnmp

(3)创建mysql的dockerfile

①修改my.cnf文件

②配置Dockerfile文件

③构建镜像:docker build -t mysql:lnmp .

④创建容器:docker run -itd --name mysql -p 3306:3306 --privileged -v /opt/mysql1:/opt/mysql --net mynetwork --ip 172.111.0.20 mysql:lnmp

⑤设置远程连接权限

create database wordpress;

grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';

grant all privileges on *.* to 'root'@'%' identified by '123456';

⑥测试

(4)创建php的dockerfile

①修改php的相关文件

②配置Dockerfile文件

③构建镜像:docker build -t php:lnmp .

④创建容器:docker run -itd --name php -p 9000:9000 --volumes-from nginx --volumes-from mysql --net mynetwork --ip 172.111.0.30 php:lnmp

(5)测试:20.0.0.61/wordpress/index.php(wordpress类似于微博)

文章来源:https://blog.csdn.net/weixin_48145965/article/details/134927611
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。