前言
我们在了解了docker是一个容器引擎、架构、docker镜像、容器的常用命令,下面正式在系统中应用,构建并运行软件、微服务镜像,并进一步熟悉docker的虚拟化原理。使用Dockerfile构建docker镜像
一、dockerfile
1.文本文件dockerfile是一个文本文件,里面有若干条指令,指令描述构建镜像的细节。
2.常用指令
命令 | 用途 |
---|---|
FROM | 基础镜像文件 |
RUN | 构建镜像阶段执行命令 |
ADD | 添加文件,从src目录复制文件到容器的dest,其中src类型有:Dockerfile所在目录的相对路径、URL和压缩包 |
COPY | 拷贝文件,和ADD命令类似,但不支持URL和压缩包 |
CMD | 容器启动后执行命令 |
EXPOSE | 声明容器在运行时对外提供的服务端口 |
WORKDIR | 指定容器工作路径 |
ENV | 指定环境变量 |
ENTRYPINT | 容器入口,ENTRYPOINT 和 CMD 指令目的一样,是指定Docker容器启动时执行的命令,可多次设置,但只有最后一个有效 |
USER | 用于设置启动镜像时的用户或UID,写在该指令后的RUN、CMD以及ENTRYPOINT指令都将使用该用户执行命令 |
VOLUME | 指定挂载点,该指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可共享给其他容器。当容器中的应用有持久化数据的需求时,可以在Dockerfile中使用该指令。格式为:VOLUME["/data"] |
二、构建Nginx相关镜像
1.镜像作用修改Nginx镜像的首页
2.构建步骤
(1)新建一个文件,名称:Dockerfile
FROM nginx
RUN echo'<h1>This is docker control Nginx!!!</h1>' > /usr/share/nginx/html/index.html
(2)构建镜像
-t 指定镜像名字, (.)表示Dockerfile文件所在路径
docker build ‐t nginx:dockercontrol.
(3)使用该镜像启动docker容器
docker run -d -p 92:80 nginx:dockercontrol
(4)访问http://Docker宿主机IP:92,就可以看到Nginx首页被修改后的结果了。
三、构建微服务项目镜像
1.微服务项目eureka-server的jar包上传Linux服务器创建目录/usr/local/docker-app/docker-demo/app/eureka
2.创建文件,名称:Dockerfile
// 基于哪个镜像
From java:8
// 复制文件到容器
ADD eureka‐server‐0.0.1‐SNAPSHOT.jar /app.jar
// 声明需要暴露的端口
EXPOSE 8761
// 配置容器启动后执行的命令
ENTRYPOINT ["java","‐jar","/app.jar"]
3.构建镜像
docker build -t eureka-server:0.0.1 .
4.启动镜像
-d:在后台启动, -v :挂载一个主机上的目录到容器目录
docker run -d ‐p 8761:8761 ‐v /log:/container‐log eureka‐server:0.0.1
5.访问http://Docker宿主机IP:8761/,正常显示Eureka Server首页
虚拟化原理
一、传统虚拟化与容器技术
1.结构对比
- 传统虚拟化技术
在硬件层面实现虚拟化,增加了系统调用链路的环节,有性能损耗; - 容器虚拟化技术
以共享宿主机Kernel的方式实现,几乎没有性能损耗。
2.工作过程对比 - docker工作过程
利用的是宿主机的内核,而不需要Guest OS,当新建一个容器时,docker不需要重新加载一个操作系统内核,避免了寻址、加载操作系统内核这些费时费资源的过程,只需要几秒钟。 - 虚拟机工作过程
当新建一个虚拟机时,虚拟机软件需要加载Guest OS,分钟级别。
二、联合文件系统
1.作用使docker实现机器资源的隔离
2.常见系统
常见的有AUFS、Overlay、devicemapper、BTRFS和ZFS等,以Overlay2举例说明,Overlay2的架构图如下:
overlayfs在linux主机上只有两层
- lowerdir 在下层,用来保存镜像(docker)
- upperdir 在上层,用来存储容器信息
- merged 对外提供统一的文件系统。
工作原理 - 当需要修改一个文件时,使用COW(Copy-on-write)将文件从只读的Lower复制到可写的Upper进行修改,结果也保存在Upper层。
- 在Docker中,底下的只读层就是image,可写层就是Container。