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 |
共同点 |
- 都可以作为容器启动时的默认命令
- entrypoint和cmd的指令在容器启动时执行,都会成为容器的主进程,主进程负责接收信号,处理容器的生命周期,主进程退出,容器也将终止运行
|
区别 | 1、cmd可以把参数传给ENTRYPOINT |
- 多个entrypoint和多个cmd只会运行最后一个(一个dockerfile中只会有一个entrypoint和cmd)
构建镜像:docker build -t centos7:test(名称+标签) . docker run --name test1?centos7:test |
- 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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!