Docker镜像原理:
- docker镜像是由特殊的文件系统叠加而成
- 最低端的是boofs,并使用宿主机的bootfs
- 第二层是root文件系统rootfs,称为base image
- 让再往上叠加其他的镜像文件
- 统一文件系统(Union FileSystem)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角这样就隐藏了多层的存在,在用户的角度看来,只存在个文件系统
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
- 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
操作系统的组成部分:
- 进程调度子系统
- 进程通信子系统
- 内存管理子系统
- 设备管理子系统
- 文件管理子系统
- 网络通信子系统
- 作业控制子系统
镜像制作:
容器转为镜像
docker commit 容器id 镜像名称:版本号
docker save -o 压缩文件名称 镜像名称:版本号 #将镜像打包成压缩文件,可以发给测试人
docker load -i 压缩文件名称 #测试人解压文件
注意:如果是镜像卷的方式挂载的文件,则打包镜像压缩后镜像中挂载失效,但是文件是存在的
Dockerfile概念
- Dockerfile 是一个文本文件
- 包含了一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境,构建一个新的镜像开始工作了
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件
- 对于运维人员:在部署时,可以实现应用的无缝移植
举例,一、基于centos基础镜像构建java应用镜像
1.上传jdk
创建文件夹,将jdk安装包上传到该目录下
mkdir -p /root/dockerfile/java
FROM centos:7
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk-8u131-linux-x64.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk-8u131-linux-x64.tar.gz \
&& mv ./jdk1.8.0_131 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
3.生成镜像
#docker build -f 文件名 -t 镜像名 .代表从当前目录
docker build -f dockerfile_java -t myjava:1.0 .
4.验证镜像是否生成成功
docker images
5.启动容器
docker run --name myjava -d -p 8080:8080 myjava:1.0
二、通过java构建应用镜像
1.编写dockerfile
FROM java:8-alpine
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
2.生成镜像
#docker build -f 文件名 -t 镜像名 .代表从当前目录
docker build -f dockerfile_java2 -t myjava:2.0 .
3.验证镜像是否成功
docker images
4.启动容器
docker run --name myjava2 -d -p 8081:8080 myjava:2.0