Dockerfile

Dockerfile

自定义镜像----------通过dockerfile创建镜像。

1、创建镜像的方式

1.1 dockerfile 最基本的方式 最常用的方式

1.2 dockerpull 拉取的是最基础的镜像,只有基础功能,没有定制化的功能

1.3 基于基础镜像,创建好了容器之后再容器内部进行定制化的操作,然后导出成镜像,下次继续使用

2、基于dockerfile创建

UnionFS:联合文件系统

这个是docker镜像的基础,镜像通过分层来进行集成,基于基础可以制作各种具体的应用镜像

特性:一次性同时加载多个文件系统,但是从外面看,只能看见一个文件系统,文件系统叠加。

镜像加载的原理:

一层一层的文件系统组成

rootfs:根文件系统,包含一个完整的文件系统(操作系统)包括了所有的文件和目录,以及相关权限和用户等信息。运行容器时,整个的根文件系统就会整个被使用,作为应用的运行的环境

bootfs:引导文件系统。启动根系统时需要加载的核心文件。

3、dockerfile定制化镜像

3.1 dockerfile

定制每一层需要添加的配置和文件。把每一层的修改、安装、构建和操作都写入到一个脚本。用脚本来进行创建镜像。这个脚本就是dockerfile

3.2 dockerfile分为四个部分

1.1 基础镜像信息:底层

1.2 维护者信息(可有可无)

1.3 镜像的操作指令和相关配置

1.4 容器启动时执行的命令

可以支持#开头作为注释

4、dockerfile的命令

4.1 命令

FROM:永远是整个脚本第一个语法,指定定制镜像的基础操作系统

MAINTAINER:维护者信息,可以不写 新版本用LABEL来代替了

RUN:在基础镜像上执行的命令,然后把运行结果整合到新镜像当中,RUN就是一个镜像的分层,RUN越多分层就越多,镜像就越大,为了控制镜像的大小,多个RUN尽可能得写在一个RUN里面

ENTRYPOINT:指定容器在启动时执行的命令或者参数

CMD:指定容器在启动时执行的命令或者参数

EXPOSE:指定容器对外暴露的端口号

ENV:用来设置基础操作系统的环境变量,以便RUN命令使用或者新镜像使用,就是给系统添加环境变量

ADD:支持URL从网络下载文件,也可以对压缩文件进行解压

COPY:只能复制本地文件(宿主机文件)到镜像的目标位置

VOLUME:创建一个容器内的挂载点,不是和宿主机进行挂载

USER:设置运行镜像时的用户

WORKDIR:指定容器的工作目录,相当于切换到这个目录,在这个目录下做指定的操作

ONBUILD:指定一个镜像作为另一个镜像构建的基础时需要运行的命令

ARG:用来传参,用户传递的参数,ENV是容器内部的参数

4.2 FROM的语法,以及CMD和ENTRYPOINT

bash 复制代码
vim Dockerfile

FROM centos:7 

ENTRYPOINT ["ls","/etc"]
ENTRYPOINT ["ls","/usr"]

CMD ["ls","/etc"]
CMD ["ls","/usr"]

wq!

docker build -t centos:test .

docker run -it --name test1 centos:test
# 看一下运行内容,文本内容可以变换,其中cmd会传参给entrypoint

4.3 CMD和ENTRYPOINT的区别

ENTRYPOINT:在有多个的情况下,只会运行最后一个

CMD:在有多个的情况下,也是运行最后一个

cmd和entrypoint同时存在,命令都执行,entrypoint会覆盖cmd的命令,并且cmd会把命令作为参数传给entrypoint,作为容器启动时执行命令的语句,一般情况下二者是通用的,但是在传参的情况下,需要加上cmd;如果没有特殊的操作(传参),写一个cmd或者entrypoint即可,二者不要同时存在

总结:cmd作为启动命令,运行容器时传了额外参数,cmd会被覆盖不会被执行;entrypoint不会被覆盖,容器运行时指定的命令相当于给entrypoint传参

4.4 run的作用

在基础镜像运行然后把结果传给新镜像。

bash 复制代码
FROM centos:7

RUN ls /opt 
RUN ls /etc 
RUN ls /usr

wq!

docker build -t centos:test .    # 运行速度慢

run的结构要合理

run优化

bash 复制代码
FROM centos:7

RUN ls /opt && ls /etc && ls /usr

wq!

docker build -t centos:test .   # 写在一层,运行速度快
bash 复制代码
&&  前一个指令成功,才会执行下一个
;   不论前面是否成功,后面都会执行
||  前面一个失败了,后面才会执行
\   把一个命令分成多个行,提高可读性

4.5 COPY和ADD

ADD作用:解压,如 .tar .tar.gz .zip 根据URL进行文件下载、复制(官方解释:同样是复制。推荐使(copy)

AAD不能复制压缩文件,使用COPY

COPY:只能复制,复制本地文件到容器内

bash 复制代码
echo 123 > xiaodai.txt

(1)vim Dockerfile

FROM centos:7

ADD wordpress-6.4.2-zh_CN.tar.gz /opt 
# 只有和Dockerfile在同一目录下

COPY xiaodai.txt /opt/test
wq!

docker build -t centos:test .

docker run -it centos:test   # 进入容器查看add和copy的结果

(2)vim Dockerfile

FROM centos:7
ADD http://mirrors.aliyun.com/repo/Centos-7.repo /opt/Centos-7.repo
wq!
docker build -t centos:test .

docker run -it centos:test   # 进入容器查看add

4.6 工作目录和环境变量以及容器卷(挂载卷)

WORKDIR 工作目录:切换到容器内的指定目录

ENV 环境变量:添加一个PATH

VOLUME 挂载卷:

bash 复制代码
(1)vim Dockerfile

COPY xiaodai.txt /opt/test
WORKDIR /opt
ENV PATH /opt/test:$PATH
wq!

docker build -t centos:test .

docker run -it centos:test 
-----------------------------------------------------------------------
[root@3ef9d5910092 opt]# ls
test
[root@3ef9d5910092 opt]# echo $PATH
/opt/test:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

(2)vim Dockerfile

COPY xiaodai.txt /opt/test
WORKDIR /opt
ENV PATH /opt/test:$PATH
VOLUME ["/opt/test1"]
wq!

docker build -t centos:test .
docker run -itd --name test1 centos:test /bin/bash
docker ps  # 启动

docker run -it --name test2 --volumes-from test1 centos:7
# 容器和容器挂载,可以查看挂载结果

docker run -it --name test3 -v /opt/test:/opt/test1 centos:test
# 容器和宿主机/opt/test挂载,可以查看内容

EXPOSE 指定端口:

bash 复制代码

5、实战:使用yum安装定制一个nginx

bash 复制代码
FROM centos:7

RUN rm -rf /etc/yum.repos.d/*

ADD http://mirrors.aliyun.com/repo/Centos-7.repo /etc/yum.repos.d/Centos-7.repo

RUN yum -y install epel-release && \
    yum -y install nginx

EXPOSE 80

WORKDIR /var/log/nginx/

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

wq!

docker build -t centos:test .

docker run -itd --name nginx1 centos:test   # docker ps

docker run -itd --name nginx2 -v /opt/html:/usr/share/nginx/html centos:test    # 宿主机和容器挂载

cd /opt/html/
echo 123 > index.html
# 开一个终端:获取ip,如172.17.0.3  
curl 172.17.0.3     # 出现 123

docker run -itd --name nginx3 --volumes-from nginx2 centos:test  # 容器3和容器2挂载

# 开一个终端:获取ip,如172.17.0.4  
curl 172.17.0.4     # 出现 123

补充:指定nginx在容器中启动时执行的命令或者参数

bash 复制代码
vim Dockerfile
CMD ["nginx","-g","daemon off;"]
wq!

docker run -itd --name nginx1 centos:test    # docker ps

docker exec -it nginx1 bash
ll /usr/share/nginx/html/

# 开启另外一个终端,获取nginx1的ip,如:172.17.0.2
curl 172.17.0.2    # 页面出现403

cd /usr/share/nginx/html/
rm -rf index.html
echo 123 > index.html

# 开启另外一个终端,获取nginx1的ip,如:172.17.0.2
curl 172.17.0.2    # 出现123

docker run -itd --name nginx2 centos:test /bin/bash

# 开启另外一个终端,获取nginx2的ip,如:172.17.0.3
curl 172.17.0.3   # 出现curl: (7) Failed connect to 172.17.0.4:80; 拒绝连接
相关推荐
花菜回锅肉4 小时前
hadoop分布式文件系统常用命令
大数据·hadoop·分布式
gsls2008084 小时前
docker打包nginx版wordpress
nginx·docker·wordpress
Hoper.J6 小时前
用两行命令快速搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),包含完整的 Docker 安装步骤
人工智能·深度学习·docker
Nue.js7 小时前
Docker中最常用的一些命令
docker·容器·eureka
2401_857636398 小时前
实时数据流的革命:分布式数据库的挑战与实践
数据库·分布式
scc21408 小时前
kafka中topic的数据抽取不到hdfs上问题解决
分布式·hdfs·kafka
basic_code9 小时前
Docker部署kafka集群
docker·容器·kafka
程序员小潘10 小时前
Dubbo分布式日志跟踪实现
分布式·dubbo
Z y..10 小时前
记:Docker部署kafka消费者注册不到问题
docker·容器·kafka
ly498311 小时前
docker--工作目录迁移
docker·容器·eureka