Docker进阶之构建自定义镜像实战指南

 更新时间:2022年07月12日 11:37:49   作者:Bug 终结者  
从docker镜像仓库中下载的镜像不能满足我们的需求时,可以对镜像进行更改,下面这篇文章主要给大家介绍了关于Docker进阶之构建自定义镜像实战的相关资料,需要的朋友可以参考下

一、什么是 Docker 镜像?

Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像是Docker容器的基石,容器是镜像的运行实例,有了镜像才能启动容器。

二、自定义镜像的好处?

从软件版本管理角度讲,Dockerfile本身是脚本文件,是可以版本化的。理论上使用Dockerfile,在任何时候任何机器上都可以重演镜像制作过程制作出一模一样的镜像,这是非常有利于工程化的。

Dockerfile 可以快速帮助我们构建自己的定制镜像!

三、构建自己的Centos

通过编写 Dockerfile 文件来制作Centos 镜像,并在官方提供的基础上添加 vim、net-tools文件

新建 /home/dockerfile

cd /home
mkdir dockerfile

进入新建的dockerfile文件夹,并新建 mydockerfile-centos

# 基础镜像引入centos7
FROM centos:centos7
# 作者
MAINTAINER xiaowang<wanghuichen2003@163.com>
#配置工作目录
ENV MYPATH /usr/local

WORKDIR $MYPATH
#由于官方默认提供的centos是压缩版本,没有vim以及一些其它的命令,只有基础的命令,我们需要去下载安装包
RUN yum -y install vim
RUN yum -y install net-tools

# 开放端口80
EXPOSE 80

# 输出工作目录
CMD echo $MYPATH
CMD echo "--- end ---"
# 以bin/bash启动
CMD /bin/bash

查看编写好的文件

编译刚刚写好的centos7

# 注意后面有一个 .  代表当前目录
docker build -f mydockerfile-centos  -t mycentos:0.1 .

等待编译完成即可

完成后运行镜像

docker run -it mycentos:0.1

vim 文件

vim test

pwd

查看ifconfig

查看镜像历史操作

docker history 2c2feb50d12c

四、RUN、CMD和ENTRYPOINT的区别

RUN命令与CMD命令的区别在哪里?

简单说,RUN命令在Image 文件的构建阶段执行,执行结果会打包进入image文件,CMD命令则是在容器启动后执行。另外,一个Dockerfile可以包含多个RUN命令,但只能由一个CMD命令

注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。

CMD和ENTRYPOINT命令的区别

  • CMD:指定容器启动的时候要运行的命令,只有最后一个会生效
  • ENRTYPOINT:指定容器启动的时候要运行的命令,命令可以追加

CMD命令

# 进入dockerfile 目录,新建dockerfile-cmd-test文件

FROM centos:centos7
CMD ["ls", "-a"]

编译并执行文件

# 编译文件
docker build -f dockerfile-cmd-test -t cmdtest .

# 执行文件
docker run f74776bf8b3c

追加命令查看全部文件目录

docker run f74776bf8b3c -l

可以看到,cmd命令把上一个命令给替换了,由于 -l 不是命令,所以报错了,证明cmd命令会覆盖前面的cmd命令,只执行最后一个cmd命令

再次执行查看全部文件目录命令

docker run f74776bf8b3c ls -al

可以看到,上一个 ls-a命令已被替换为ls -al命令!

ENTRYPOINT命令

回到 /home/dockerfile 目录,新建文件测试ENTRYPOINT并写入内容

cd /home/dockerfile

vim dockerfile-entrypoint

# 写入以下命令
FROM centos:centos7
ENTRYPOINT ["ls", "-a"]

编译文件并执行容器

# 编译文件
docker build -f dockerfile-entrypoint
# 执行容器
docker run 29891c9ff3c9

在启动时追加命令

docker run 29891c9ff3c9 -l

可以看到直接追加了命令

五、【实战】Dockerfile制作tomcat镜像

下载JDK、Tomcat文件

jdk:https://www.jb51.net/softs/698365.html

Tomcat:https://www.jb51.net/softs/537911.html

使用Filezilla将文件上传至 /home/xiaowang目录下

上传成功后查看文件

编写文件

编写dockerfile文件,文件名使用官方命名:Dockerfile,build的时候会默认寻找当前目录下的文件,不需要 -f 参数指定

vim Dockerfile

# 写入以下文件

FROM centos:centos7
MAINTAINER ethan<wanghuichen2003@163.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u311-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.62.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_311
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib.tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62
ENVPATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/logs/catalina.out

构建镜像

编译镜像文件

docker build -t diytomcat:1.0

启动镜像

编译完成后启动镜像

# 启动容器,外部端口3355映射内部容器8080 重命名容器名称,挂载镜像
docker run -d -p 3355:8080 --name diytomcat -v /home/dockerfile/xiaowang/test:/usr/local/apache-tomcat-9.0.62/webapps/test diytomcat:1.0

测试访问

访问外网ip地址+3355端口出现tomcat界面

在tomcat目录下新建html文件

由于内部容器和外部进行了挂载,所以修改外部内容,内部容器也会更新

我们进入目录,新建html文件对外访问时展示此页面

cd /home/dockerfile/xiaowang/test

vim test.html

写入以下内容

<!DOCTYPE html>
<html>
    <head>
         <meta charset="UTF-8"/>
        <title>Title</title>
    </head>
    <body>
        <h1>简单的HTML页面</h1>
        <p>Hello World!</p>
    </body>
</html>

浏览器后缀+test路径访问

ok,至此tomcat镜像制作完毕

小结

以上就是【Bug 终结者】对 【云原生】Docker 进阶 – 构建自定义镜像实战 自定义我们的Docker镜像可利于我们的快速开发,提高开发的效率,可谓是开发利器!

到此这篇关于Docker进阶之构建自定义镜像实战的文章就介绍到这了,更多相关Docker构建自定义镜像内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决运行Docker镜像报错:version `GLIBC_2.32‘ not found问题

    解决运行Docker镜像报错:version `GLIBC_2.32‘ not found

    文章介绍了解决Docker镜像运行时因GLIBC版本不匹配导致的错误,建议使用AlpineLinux作为基础镜像,并在其中安装所需的运行时库,作者还分享了个人经验,提醒读者尝试其他方法无效后可以寻求帮助
    2024-12-12
  • docker安装drone的实现示例

    docker安装drone的实现示例

    Drone是一款基于Docker的持续集成和持续部署平台,可以帮助开发者自动化构建、测试和部署应用程序,本文主要介绍了docker安装drone的实现示例,感兴趣的可以了解一下
    2023-12-12
  • docker安装部署jumpserver 2.25.5的方法

    docker安装部署jumpserver 2.25.5的方法

    这篇文章主要介绍了docker安装部署jumpserver 2.25.5的方法,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Deepin使用docker安装mysql数据库过程详解

    Deepin使用docker安装mysql数据库过程详解

    这篇文章主要介绍了Deepin使用docker安装mysql数据库过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • dockerfile中su命令切换用户激活环境,报错su: invalid option -- ‘n‘

    dockerfile中su命令切换用户激活环境,报错su: invalid option 

    本文主要介绍了dockerfile中su命令切换用户激活环境以及报错su: invalid option -- ‘n‘的问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • 浅谈Windows平台上Docker安装与使用

    浅谈Windows平台上Docker安装与使用

    本篇文章主要介绍了浅谈Windows平台上Docker安装与使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • docker部署rabbitmq集群的实现方法

    docker部署rabbitmq集群的实现方法

    这篇文章主要介绍了docker部署rabbitmq集群的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 详解挂载运行的docker容器中如何挂载文件系统

    详解挂载运行的docker容器中如何挂载文件系统

    这篇文章主要给大家介绍了如何在挂载运行中的docker容器中挂载文件系统,文中通过一步步的实践过程介绍的很详细,相信对有需要的朋友们来说具有一定的参考借鉴价值,感兴趣的朋友们下面来一起看看吧。
    2016-12-12
  • Docker挂载/etc/timezone报错问题

    Docker挂载/etc/timezone报错问题

    这篇文章主要介绍了Docker挂载/etc/timezone报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 使用 Docker 部署 RStudio 的完美教程

    使用 Docker 部署 RStudio 的完美教程

    在数据科学和统计分析中,RStudio是重要的IDE,但传统安装可能复杂,Docker提供了容器化技术,简化了RStudio的部署,本文介绍使用Docker部署RStudio的方法,包括环境准备、拉取镜像、创建容器命令等步骤,帮助用户快速搭建稳定高效的RStudio环境
    2024-09-09

最新评论