zoukankan      html  css  js  c++  java
  • Docker 构建自定义镜像

    为什么要构建自定义的镜像?

    • 官方镜像使用的都是默认配置,比如mysql容器使用的官网的mysql,需要自己修改mysql的配置文件、设置用户名和密码
    • 部署服务,比如在tomcat容器中部署用户服务,把部署好的tomcat容器打包为一个镜像,部署用户服务集群时,直接拉取这个镜像即可,不需要一个一个部署用户服务

    docker制作镜像的2种方式

    • Docker Commit
    • dockerfile   主流方式

    Docker Commit方式制作镜像

    修改好容器之后:

    docker commit  -a "chy  xxxxxxx@qq.com"  -m  "做了哪些修改"  id|name  imageName:version

    -a指定作者信息,-m指定镜像信息,一般是说明做了哪些修改、这个镜像的功能用途。如果值是不带空格的字符串,可以不引,带了空格就要引起来。

    -a、-m均可选,如果配置了,使用docker inspect id|name 查看该镜像创建的容器的信息时会看到这2个参数的值

    id|name指定要使用哪个容器制作镜像

    imageName:version指定镜像的名称、版本号,版本号任意,可以是test、v1这种字符串,也可以是1、1.1这种数字


    dockerfile方式制作镜像

    (1)vim dockerfile   #文件名必须是dockerfile

    (2)在里面写指令:

    FROM imageName:version
    MAINTAINER chy xxxxxxx@qq.com
    RUN each "image is building..."

    (3)docker build -t mytomcat:v1 .     #构建镜像,mytomcat:v1是自定义的镜像名称、版本号,后面是dockerfile文件所在目录,.表示当前目录

    dockerfile常用指令

    FROM imageName:version    #基于哪个镜像构建

    MAINTAINER  chy  xxxxx@qq.com    #作者信息

    COPY  1.txt   /usr/local/    #将文件从宿主机复制到镜像,宿主机的路径写相对路径,镜像的路径写绝对路径

    ADD 1.txt   /usr/local/    #和COPY相似,不同点:如果是.tar.gz文件,ADD复制之后会自动解压

    WORKDIR /usr/local/tomcat  指定应用的工作目录,如果此目录不存在,会自动创建

    ENV JAVA_HOME=/usr/local/jdk   #设置环境变量

    EXPOSE   8080  #开放防火墙端口

    RUN echo "image is building..."  #作用于镜像层面,在构建镜像时执行;如果有多条RUN命令,都会执行

    ENTRYPOINT yum install xxx  -y #作用于容器层,在容器启动的时候执行;如果有多条ENTRYPOINT命令,只执行最后一条ENTRYPOINT命令

    CMD yum install xxx  -y  #作用于容器层,在容器启动的时候执行;如果有多条CMD命令,只执行最后一条CMD命令。

    ENTRYPOINT、CMD的区别:

    CMD可以在容器启动时传递参数,参数是默认参数,可以被覆盖,ENTRYPOINT不可以传参数。

    如果要用CMD传参数,需要搭配ENTRYPOINT使用,示例:

    CMD ["-ef"]

    ENTRYPOINT ["ps"]

    docker run或docker start 启动容器时,可以向ps命令传递参数,eg.  docker start id|name -ef

    比如传递-ef,比如传递-aux,传递的参数会覆盖默认的-ef,如果不向ps命令传递参数,使用默认的-ef

    命令格式

    RUN、ENTRYPOINT、CMD运行的命令可以是下面的2种格式

    • shell命令格式     RUN echo "....",RUN yum install xxx  -y
    • exec命令格式     RUN  [ "yum","install" ,"xxx" ,"-y"]   命令写成字符串数组

    Docker Commit方式要启动镜像的一个容器,对容器进行修改,打包为镜像,再停止、删除这个容器,颇为麻烦;

    dockerfile是在宿主机上新建文件dockerfile,在dockerfile文件中写指令,不需要操作容器,更简便,用得也更多;

    但dockerfile难度也要大得多,比如制作redis镜像,在dockerfile中修改redis conf中的配置项,记住配置项的名字还是有点麻烦的。


    创建镜像时可以基于官方镜像创建,也可以基于CentOS的进行进行创建。比如tomcat,

    • 可以在tomcat官方镜像的基础上改,镜像体积相对小一些,进入容器后只能执行一些简单的命令,比如文件的增删改;不能执行yum install xxx之类的命令
    • 也可以在CentOS镜像的基础上改,自己装jdk、tomcat、配置环境变量,得到的镜像就是一个完整的CentOS系统

    构建自定义的tomcat镜像

    tomcat很常用,包含了jdk环境,运行java -jar、部署war都行。

    官方的tomcat镜像包含了jdk环境,但自带的jdk环境往往不符合需求,且tomcat本身的配置也需要修改一下,所以tomcat的镜像一般都要自己构建。

    比如docker inspect tomcat:9 | grep jdk 看到tomcat9自带的是jdk11,我们需要的是jdk8。

    dockerfile:

    FROM centos:7
    ADD jdk-8u211-linux-x64.tar.gz /usr/local
    RUN mv /usr/local/jdk1.8.0_211 /usr/local/jdk
    ENV JAVA_HOME=/usr/local/jdk
    ENV JRE_HOME=$JAVA_HOME/jre
    ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
    ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
    ADD apache-tomcat-8.5.35.tar.gz /usr/local
    RUN mv /usr/local/apache-tomcat-8.5.35 /usr/local/tomcat
    EXPOSE 8080
    ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]

    在docker容器中使用startup.sh启动tomcat,tomcat刚启动就会自动退出,需要使用catalina.sh来启动tomcat

    启动容器时需要将容器端口映射到宿主机端口:

    docker run -itd -p 8080:8080 -v /usr/local/tomcat/tomcat1:/usr/local/tomcat/webapps --name=tomcat1

    -p指定端口映射,宿主机端口:容器端口,2个端口可以不一致,访问时以宿主机的ip:port来访问

    -v指定容器挂载

    部署集群时,不推荐把集群节点都部署在同一个宿主机上,虽然容器之间是隔离的,容器故障时互不影响,但宿主机故障时整个集群就不可用了。


    构建自定义的mysql镜像

    https://hub.docker.com/_/mysql

  • 相关阅读:
    对this的浅解
    Java设计模式---工厂模式学习笔记
    MyBatis入门
    Java设计模式---单例模式学习笔记
    java设计模式--七大原则
    Servlet request常用方法
    maven中导入jdbc的坑
    Servlet生命周期
    JQuery选择器
    Test
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/12825813.html
Copyright © 2011-2022 走看看