上一期分享了Docker的一些基本内容,这一期主要对构建基础镜像和Docker网络、文件挂载再展开分享下,可能不一定做得很好,主要是在学习的过程中有一些自己的总结和思考,和大家一起学习。
名词说明:这里的宿主机是指liunx虚拟机。
1.基础镜像
1.1 dockerfile语法回顾
上一节讲了dockerfile,回顾下:
######
FROM 指定基础镜像
WORKDIR 设置工作目录
COPY 拷贝文件
RUN shell命令
CMD | ENTRYPOINT 容器启动时执行指令,和RUN不同的是,RUN是构建镜像时执行的
######
EXPOSE 容器内端口
VOLUME 一般是映射到匿名卷,感兴趣的可以自行了解
###### 还有一些环境指定命令,感兴趣的可以自行了解
ARG
ENV
######
LABLE 感兴趣的可以自行了解
ONBUILD 当前镜像构建时不会执行,基于当前镜像构建镜像时会执行
######
第一句就是基础镜像。
1.2 基础镜像怎么选
1.2.1 docker hub
回顾一下:基于上一篇的内容我们知道,当我们使用docker pull image命令的时候,docker首选会从本地查找有没有这个镜像,如果本地有,就用本地的;如果本 地没有,则从docker仓库获取。简单的流程图说明
我们知道,docker官方仓库有很多镜像(不过现在dockerhub好像进不去了)
在docker官方hub上搜索centos镜像,可以在github上看到dockerfile是怎么编写的
可以看到,这是一个纯净的centos,它的基础镜像是scratch(dockerhub上90%的基础镜像都来源此镜像)。不同的应用有不同的镜像,那么编写dockerfile的开 始:基础镜像的选择就比较重要了。
1.2.2 基础镜像分类
Docker Hub 上有非常多的高质量的官方镜像(docker团队制作的)。
有应用镜像,如 nginx、redis、mongo、mysql、httpd、tomcat 等;
有方便运行各种语言代码的编程语言镜像,如 node、oraclejdk,openjdk、python、ruby、golang 等。
还有更为基础的操作系统镜像,如 ubuntu、debian、centos、fedora、alpine 等。
镜像选择基本原则
- 官方镜像优于非官方的镜像,如果没有官方镜像,则尽量选择Dockerfile开源的
- 固定版本tag而不是每次都使用latest:比如java基础镜像,以java8为例,见得多的有openjdk:8-jdk-alpine。这里就指定了tag为8-jdk-alpine
- 尽量选择体积小的镜像:比如java基础镜像,以java8为例,有8-jdk-alpine(基于 Alpine Linux,镜像体积相对更小,适合对镜像大小有严格要求的场景。),还有8-jdk-slim(基于 Debian 的 slim 版本,体积更小,适合生产环境),还有8-jdk(全功能版本)
1.2.3 java项目基础镜像
上一篇我们说到,一般java项目,基础镜像是jre或jdk。造成我们不太清楚怎么选java基础镜像主要有以下几个原因: 1.由于Oracle JDK license问题,Docker官方的Java基础镜像使用的是OpenJDK而不是Oracle JDK 2.jdk有很多版本,而且镜像还有体积大小之分 3.java项目还可以在tomcat中运行 为此我们选择java镜像的时候就会感到头痛,好像总是需要查一下才知道用什么镜像。根据这一段时间内的学习,一般有两个办法:
这里以openjdk8,简单说下8-jdk-alpine和8-jdk的区别
上面我们说到,alpine是一个基础的操作系统镜像,那么从字面意思可以了解到,带了alpine和没带alpine的区别应该就是:带了alpine的镜像不仅有java环境, 还有基础的操作系统,可以执行一些简单的系统命令;没带alpine的镜像就是一个简单的jdk环境。下面实操验证下区别:
启动带alpine的镜像,看能执行ip addr命令不:
启动后进入容器
启动不带alpine的镜像,看能执行ip addr命令不:
启动后进入容器
基于上面的结果,也可以给我们选择镜像作为一个参考,如果就是跑项目,那不需要带操作系统环境,用对应版本即可。
1.2.4 web项目基础镜像
上一篇我们说到,一般web项目,基础镜像是NGINX,其实也可以是tomcat,甚至是Nodejs。根据我们部门目前的web项目,基本都可以使用NGINX基础镜像。至 于tomcat或Nodejs感兴趣的可以自行了解。
说到NGINX基础镜像,还是老问题,到底用哪个版本,是不是每次又要去查一下才知道用什么镜像,以下是几个常用的NGINX基础镜像,可供选择
• nginx:latest (默认是最新的稳定版)
• nginx:stable (当前的稳定版本)
• nginx:mainline (最新的主线版本)
• nginx:alpine (基于 Alpine Linux 的版本)
• nginx:alpine-lts (基于 Alpine LTS 版本)
可能又有疑问,nginx不是也有版本嘛,那应该用哪个版本呢,关于这个问题,因为现在dockerhub访问不到了,不太清楚有哪些版本,比如1.23.4这个版本,你可 以选择nginx:1.23.4,或者nginx:1.23.4-alpine 根据这段时间的学习和了解,使用情况较多的有3种:
1.使用最新稳定版
2.指定具体的版本
3.指定具体版本的alpine版本
当然也可以自己制作一个NGINX基础镜像。
总结:使用恰当的基础镜像是一个好的开始,如果基础镜像使用不当可能需要遇到一些问题,可能要实际遇到再根据实际情况解决。
1.3 如何构建一个Java项目的(基本)通用基础镜像
开始前的说明:尽管docker hub上有官方oraclejdk,我们可以使用。然而制作镜像和使用基础镜像不一样,制作镜像需要编写Dockerfile,因为官方基础镜像 (基本)也是通过Dockerfile制作的,所以这里的制作,是要先把jdk包下下来再解压,从而完成。(猜测官方oraclejdk镜像制作也差不多)
从上一篇可以了解到,我们构建了镜像后,可以以它作为基础镜像构建新的镜像。上一篇又说到,oraclejdk开发的java项目部署在docker,用openjdk镜像基本是没 什么问题,但在这里,出于下面三点选择oraclejdk8制作
1. 考虑到我们项目都是基于oraclejdk开发,尝试构建一个(基本)适用于所有java项目的基础镜像。
2. 从docker仓库拉取镜像不稳定:要么访问不到docker官方相关地址,要么配的docker镜像源又不稳定
3. 实际工作中,服务器可能不一定有外网。
所以这里的思路也是,编写Dockerfile制作oraclejdk8镜像后,java项目以它作为基础镜像。
1.3.1 下载 Oracle JDK 8
开发一般装的都是oraclejdk8,可能也有11的,这里以oraclejdk8为例。因为从官方下载jdk8 tar包时要求登录,然后从别的地方找了一个安装包并上传到liunx上
1.3.2 创建 Dockerfile
ADD 命令不仅可以复制文件,还可以从 URL 下载文件,并且它可以自动解压某些压缩文件(如 .tar 文件),官方centos镜像也是用了ADD命令上传并解压centos文 件。
解释说明:
1.为什么基础镜像是centos7,其实用apline镜像应该也可以,感兴趣的可以试试。一开始用的也是apline镜像,只不过遇到很多问题(下面罗列了一些),搞了2 天,后面换成了cento