• 容器化技术最佳实践2--制作自己的Docker镜像


    容器化技术最佳实践2–制作自己的Docker镜像

    镜像构建命令及Dockerfile语法

    https://docs.docker.com/engine/reference/builder/

    制作jdk镜像

    创建工作目录及相应的文件

    创建:

    mkdir -p jdk
    mkdir -p my-java-app/src
    touch jdk/Dockerfile
    touch my-java-app/Dockerfile
    touch my-java-app/src/Readme.md
    cp ~/Downloads/jdk-8u341-linux-x64.tar.gz jdk
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    检查:

    PS D:\workspace\docker> wsl.exe tree -p
    [drwxrwxrwx]  .
    ├── [drwxrwxrwx]  jdk
    │   ├── [-rwxrwxrwx]  Dockerfile
    │   └── [-rwxrwxrwx]  jdk-8u341-linux-x64.tar.gz
    └── [drwxrwxrwx]  my-java-app
        ├── [-rwxrwxrwx]  Dockerfile
        └── [drwxrwxrwx]  src
            └── [-rwxrwxrwx]  Readme.md
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    编辑jdk镜像Dockerfile

    修改jdk/Dockerfile内容如下:

    # syntax=docker/dockerfile:1
    FROM oraclelinux:8-slim
    
    # WORKDIR为RUN, CMD, ENTRYPOINT, COPY 和 ADD 指令的工作目录,可以多次定义,可以理解为mkdir -p && cd
    WORKDIR /java
    
    # ADD命令可以把本机文件或目录拷贝到镜像中,如果是压缩文件会自动执行解压
    ADD jdk-8u341-linux-x64.tar.gz /java
    
    # 设置环境变量
    ENV JAVA_HOME=/java/jdk1.8.0_341
    ENV PATH=$JAVA_HOME/bin:$PATH
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    构建jdk镜像

    $ cd jdk
    $ docker build -t jdk1.8:8u341 -t jdk1.8:latest .
    
    • 1
    • 2

    运行jdk容器试试

    # 如果镜像不加tag,会默认使用latest这个tag
    $ docker run -it --name jdk8u341 jdk1.8 java -version
    java version "1.8.0_341"
    Java(TM) SE Runtime Environment (build 1.8.0_341-b10)
    Java HotSpot(TM) 64-Bit Server VM (build 25.341-b10, mixed mode)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    删除不用的镜像和容器

    $ docker rm jdk8u341
    jdk8u341
    $ docker rmi jdk1.8:8u341
    Untagged: jdk1.8:8u341
    
    • 1
    • 2
    • 3
    • 4

    制作my-java-app应用程序镜像并运行容器

    编辑my-java-app镜像Dockerfile

    修改my-java-app/Dockerfile内容如下:

    # syntax=docker/dockerfile:1
    FROM jdk1.8:latest
    WORKDIR /java
    
    # COPY命令可以把本机文件或目录拷贝到镜像中,和ADD类似,但不会自动解压文件
    COPY src /java/src
    
    # RUN指令是构建镜像的时候要执行的指令,可以有多条
    RUN echo "configure" >> /java/src/Readme.md
    RUN echo "INSTALL" >> /java/src/Readme.md
    RUN sed -i 's/configure/CONFIGURE/g' /java/src/Readme.md
    
    # EXPOSE指令列出服务监听的端口,可通过docker run -p参数映射出去
    EXPOSE 80 443
    
    # VOLUME指令中的目录会自动创建,可通过docker run -v 或--mount映射到主机目录
    VOLUME ["/java/lib", "/java/config"]
    
    # CMD指令只有最后一条能够生效,是在容器启动后运行的。可以被docker run后面的命令覆盖。
    # 如果存在ENTRYPOINT指令,它将作为ENTRYPOINT的一个参数
    CMD ["java", "-version"]
    
    # ENTRYPOINT指令通常用来定义容器要运行的主程序,通常为一个脚本,可以在其中修改要连接的数据库的密码等
    #ENTRYPOINT ["/java/bin/start-server", "-p", "listen port"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    构建镜像

    docker build -t my-java-app .
    
    • 1

    运行容器

    PS D:\workspace\docker\my-java-app> docker run -it --name my-java-app my-java-app
    java version "1.8.0_341"
    Java(TM) SE Runtime Environment (build 1.8.0_341-b10)
    Java HotSpot(TM) 64-Bit Server VM (build 25.341-b10, mixed mode)
    PS D:\workspace\docker\my-java-app> docker run -it --name my-java-app1 my-java-app /bin/bash
    bash-4.4#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    关于uniapp小程序的分包问题
    Python算法练习 10.23
    Android 9.0 隐藏设置中一级菜单“已连接的设备”
    C/C++后端开发学习路线总结(附带实习学习经历分享)
    Chapter8:控制系统状态空间分析
    vue3 基础语法(一)
    sharding-jdbc分库分表(一)
    2. 在node中使用ts
    MyBatis-Plus 和swagger
    PostgreSQL heap堆表 存储引擎实现原理
  • 原文地址:https://blog.csdn.net/huzhenwei/article/details/128139793