docker的数据卷与dockerfile自定义镜像
docker的数据卷与dockerfile自定义镜像
- 一. docker的数据卷
- 数据卷容器
- 二. dockerfile自定义镜像
- 2.1 dockerfile的命令格式
- 镜像的操作命令
- add和copy的区别
- 容器启动的命令
- 2.2 run命令
- 2.3 其它端口映射
- 三. 练习
一. docker的数据卷
- 容器于宿主机之间,或者容器和容器之间的数据共享(目录)。
- 创建容器的时候,通过指定目录,实现容器于宿主机之间,或者容器和容器之间的数据共享。
- 容器的生命周期是有限的,容器一旦销毁,内部的数据也会一并消失,所以我们创建了数据卷的方式,将容器内的数据持久化保存到宿主机。
-v /usr/share/nginx/html:/opt/test1:ro
-v 宿主机的目录:容器内的目录:数据卷的默认权限是rw,ro:只读模式
volume:挂载卷,数据卷
以宿主机的目录为准,容器的生命周期是有限的,保存到宿主机的数据可以再下一次创建容器的时候继续使用。
docker run -itd --name nginx1 -v /opt/test1:/usr/share/nginx/html -p 80:80 nginx:1.22
docker exec -it nginx1 bash
数据卷容器
容器和容器之间共享数据
docker run -itd --name test2 -v /opt/data1 -v /opt/data2 centos:7
-v指定目录,如果没有:这个目录就是容器内的数据目录,不会和宿主机挂载
docker run -itd --name test3 --volumes-from test2 centos:7
–volumes-from: 另外一个容器,使用其他容器提供的数据目录。这个目录仅限于容器内数据共享,一旦容器销毁,内部的数据目录也会一并销毁。
docker exec it test2 bash
cd /opt
ls
创建容器,指定挂载卷容器内的nginx的日志目录和宿主机挂载,nginx的映射端口为随机端口。然后访问容器,可以在宿主机显示日志的内容。
var/log/nginx
创建容器额时候,一定要做宿主机和容器之间的端口映射(容器对外提供访问),
一定要对容器做资源限制
一定要做数据卷
二. dockerfile自定义镜像
- 基于dockerfile创建
- 联台文件系统,UnionFs是创建docker镜像的基础,镜像可以通过分层来进行集成
- 基于基础的镜像可以制作各种应用的镜像
特点:一次性加载多个文件系统,但是创建好容器之后,对于用来说只有一个文件系统。
docker镜像的定制化操作实际上就是定制每一层所要添加的配置和未见等等。
把所有的需要的操作写入一个脚本当中,然后一键运行,就是dockerfile
dockerfile作为一个脚本,由四部分组成:
- 基础镜像: 程序的运行环境
- 维护者信息(可选项,相当于注释)可以不写
- 镜像的操作命令(自定义应用)
- 容器启动时的命令(容器没有可执行的命令,就会退出进入stop状态,必须要给容器一个可执行的持久化的命令。)
2.1 dockerfile的命令格式
-
FROM:指定程序的基础镜像
-
MAINTAINER:维护者信息(可以忽略)或者LABEL
镜像的操作命令
- RUN:在基础镜像运行命令,结果提交到新镜像。每执行一次run就相当于是镜像的一层,run的命令太多,镜像的分层就越多,镜像越大。
- ADD:将宿主机的文件复制到镜像的内部,可以URL和解压
- COPY:将宿主机的文件复制到镜像的内部,只能是宿主机的本地文件,不支持下载。
- ENV:指定镜像内的容器运行之后的环境变量
- WORKDIR:容器的工作目录,也是进入容器之后的默认目录
- USER:指定容器运行时的用户名或者uid
- VOLUME:创建容器内的挂载点,可以被外部使用,即可以和宿主机挂载,也可以和容器使用
- EXPOSE:声明容器对外的网络端口
- ARG:用来传递变量,把宿主机的参数传递到容器内部的参数
add和copy的区别
- add和copy在复制文件时,表现的是一致的。复制本地文件,找和dockerdfile在一个目录下的文件。自动复制到指定路径。
- 解压和下载只能是add
- ADD的优点
没有格式的限制----->解压,.gz .bz2 直接跟上路径,自动解压到目标路 - add缺点
在不解压的前提下,无法复制tar的压缩文件。
只是复制,使用copy,如果是压缩再使用 add。
容器启动的命令
- CMD:指定容器运行时的默认命令
- ENTRYPOINT:指定容器运行时的默认命令
cmd和entrtponint是有区别的
cmd可以给entrypoint传参,entrypoint会覆盖cmd的命令,外部定义了参数,如果是cmd,会被外部的传参覆盖,只会执行外部传参的命令,但是entrypoint的命令是不会被外部传参的命令覆盖的。
如果有多个cmd和entrypoint只会执行最后一个。
#制作镜像
docker build -t centos:test1 .
docker build:开启镜像的制作
-t:创建完成之后给镜像指定的名称和标签
.:直接从当前目录的dockerfile文件创建镜像
2.2 run命令
RUN apt -yinsatll nginx && apt -y install httpd
RUN apt -yinsatll nginx ; apt -y install httpd
RUN apt -yinsatll nginx || apt -y install httpd
- &&:在run命令中,表示连接多个命令,确保前一个命令执行成功,才会运行第二个命令。
- ;:不管前面的命令是否成功,都会执行后面的命令
- ||:或者(只有前面的失败了,后面的命令才会执行)
FROM ubuntu:22.04
RUN apt-get update && apt -y install nginx
EXPOSE 82
ENTRYPOINT ["nginx","-g",daemon off;"]
2.3 其它端口映射
vim /etc/nginx/nginx.conf
#http中添加
server {
listen 82;
location /{
root html;
index index.html index.html;
}
}
vim Dockerfile
FROM ubuntu:22.04
RUN apt-get update \
&& apt -y install nginx \
&& apt -y install net-tools vim
EXPOSE 82
ADD nginx.conf /etc/nginx
ENTRYPOINT ["nginx","-g","daemon off;"]
docker build -t nginx:test1 .
docker run -itd --name nginx2 -P nginx:test1
FROM ubuntu:22.04
WORKDIR /opt
ENV PATH /opt/test1:$PATH
VOLUME ["/opt/test1"]
#这个不代表容器的默认挂载路径,也不表示宿主机一定要和这个目录挂载
三. 练习
用ubuntu实现nginx:1.22的编译版本,暴露端口为84,设置nginx的默认访问目录为/var/www/html/index.html,配置都要通过dockerfile自动完成。
宿主机和访问目录实现挂载
限制cpu只能使用10%,
以及1g的内存
docker run -itd --name ubuntu1 -v /opt/ubutu:/usr/local/nginx/html/ -P --cpu-quota 20000 -m 1g nginx:1