基于现有镜像创建
先用现有镜像创建启动容器 docker run
再进入容器进行内容更新 docker exec -it
最后提交成新的镜像 docker commit
然后将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像
进入容器可查看相关性能
基于本地模板创建
- ,先获取模板文件 :将本地容器导出为模板文件 docker export 或从网上下载现成的模板文件:通过导入操作系统模板文件可以生成镜像,模板可以从 OPENVZ 开源项目下载,下载地址为http://openvz.org/Download/template/precreated
先获取模板文件 :将本地容器导出为模板文件 docker export 或从网上下载现成的模板文件:
再将模板文件导入成镜像 :docker import
基于Dockerfile创建
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。AUFS、OverlayFS 及 Devicemapper 都是一种 UnionFS。
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。
bootfs主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。
镜像加载原理
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。
bootfs主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。
在Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs,在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
我们可以理解成一开始内核里什么都没有,操作一个命令下载debian,这时就会在内核上面加了一层基础镜像;再安装一个emacs,会在基础镜像上叠加一层image;接着再安装一个apache,又会在images上面再叠加一层image。最后它们看起来就像一个文件系统即容器的rootfs。在Docker的体系里把这些rootfs叫做Docker的镜像。但是,此时的每一层rootfs都是read-only的,我们此时还不能对其进行操作。当我们创建一个容器,也就是将Docker镜像进行实例化,系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。
Dockerfile 操作常用的指令:
FROM 指定基础镜像(是Dockerfile的第一行指令)
MAINTAINER 指定镜像维护人信息(可选)
RUN 指定linux命令,尽量将多条linux命令合并在一个RUN指令里,用 ; 或 && 或 <<EOF 串起来使用
EXPOSE 指定容器要开启的应用的端口号
ENV 指定容器的环境变量
ADD/COPY 复制本地文件|目录到镜像里
VOLUME 指定容器的匿名数据卷(作用类似于 docker run -v /var/lib/docker/volumes/容器ID/:容器数据卷目录)
USER 指定容器的运行用户
WORKDIR 指定后续镜像层的工作目录
ARG 指定构建镜像时传入的参数变量(可通过 "docker build --build-arg 变量=值" 进行传入参数)
CMD/ENTRYPOINT 指定容器启动时执行的命令和参数
ADD 和 COPY 的区别?
共同点:都可以将本地的文件|目录复制到镜像里
区别:ADD还可以通过URL地址下载文件并复制到镜像里,还能将本地的压缩包解压后再复制到镜像里(URL下载和压缩包解压特性不能同时生效)
即通过URL下载的压缩包只能以压缩包的形式复制到镜像里
CMD 和 ENTRYPOINT 的区别?
共同点:都可以用来指定容器的启动命令
区别:ENTRYPOINT指定的容器启动命令优先级更高,如果CMD和ENTRYPOINT同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的容器启动命令的选项或参数使用
容器启动命令的优先级
docker run --entrypoint="命令" > 镜像里的ENTRYPOINT指令指定的"命令" > docker run .... 镜像 "命令" > 镜像里的CMD指令指定的"命令"
如何使用Dockerfile构建镜像?
1)编写Dockerfile文件,在第一行用 FROM 指令指定基础镜像
2)用 MAINTAINER 指令指定镜像维护人信息(可选)
3)用 RUN EXPOSE ENV ADD COPY 等指令编写构建镜像的过程
4)在Dockerfile结尾用 CMD 或 ENTRYPOINT 指令指定容器启动时执行的命令
5)用 docker build -t 镜像名:标签 . 命令来构建镜像
yum构建nginx的dockerfile:
mkdir /opt/nginx
cd /opt/nginx
vim Dockerfile
#指定基础镜像
FROM centos:7
#指定维护人信息
MAINTAINER this is nginx image by yum install <yy 20240125>
#编写构建镜像过程
COPY nginx.repo /etc/yum.repos.d/
RUN yum install -y nginx
EXPOSE 80
#EXPOSE 443
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
docker build -t nginx:kk . #表示将此路径下的文件导入成模板
########如果有网络报错提示########
解决方法:
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
systemctl restart network
systemctl restart docker
在该目录下创建nginx yum源
生成镜像:
docker build -t 镜像名:标签 . :注意别忘了末尾有"."
查看镜像
新镜像运行容器:
如果有网络报错提示:[Warning] IPv4 forwarding is disabled. Networking will not work
解决方法:
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
systemctl restart network
systemctl restart docker
进入容器进行添加网页内容:
我们为了方便不进入容器就能修改添加网页内容可以做数据卷:
先将容器中的网页文件复制到宿主机目录下:
创建容器
tomcat 模板
mkdir /opt/tomcat
cd /opt/tomcat
将jdk环境移动到此目录下
vim Dockerfile
FROM centos:7
MAINTAINER this is tomcat image on centos7 <yy 20240125>
ADD jdk-8u361-linux-x64.tar.gz /opt/
ENV JAVA_HOME=/opt/jdk1.8.0_361
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ADD apache-tomcat-9.0.16.tar.gz /opt/
EXPOSE 8080
CMD ["/opt/apache-tomcat-9.0.16/bin/catalina.sh", "run"]
docker build -t tomcat:cetnos