Docker构建自定义镜像

Posted Ricky_0528

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker构建自定义镜像相关的知识,希望对你有一定的参考价值。

文章目录

1. 镜像制作的两种方法

  • 基于Docker Commit制作镜像
  • 基于Dockerfile制作镜像,该方法为目前主流的方式

2. Commit构建自定义镜像

  • 启动并进入容器:docker run -it centos:7 /bin/bash
  • 在/home路径下创建test文件夹:mkdir /home/test
  • 安装ifconfig命令:yum -y install net-tools
  • 重启容器,查看容器的test文件夹还在不在:docker restart 67862569d4f7
  • 删除容器,再重新启动一个容器进入查看有没有这个test文件夹:docker rm 67862569d4f7 && docker run -it centos:7 /bin/bash

    发现test文件夹没有了

  • 构建镜像:
    • docker commit eeb6ee3f44bd mycentos:7
    • docker commit -a "Ricky" -m "mkdir /home/test" eeb6ee3f44bd mycentos:7
      • -a:标注作者
      • -m:注释
      • 查看详细镜像详细信息:docker inspect c98e30feab0f
    • 启动容器:docker run -itd c98e30feab0f /bin/bash
    • 进入容器:docker exec -it 2a4d38eca64f /bin/bash

3. Dockerfile构建镜像

  • Dockerfile
    # this is a dockerfile
    FROM centos:7
    MAINTAINER XD 123456@qq.com
    RUN echo "正在构建镜像!!!"
    WORKDIR /home/xdclass
    COPY 123.txt /home/xdclass
    RUN yum install -y net-tools
    
  • 构建:docker build -t mycentos:v2 .
  • 查看:docker images

4. 镜像的分层结构

  • 镜像层与容器层共享资源
  • 对容器的任何改动都是发生在容器层
  • 容器层是可读可写,而镜像层只读

5. Dockerfile基础指令

  • FROM:基于哪个镜像
  • MAINTAINER:注明作者
  • COPY:复制文件进入镜像(只能使用相对路径,不能用绝对路径)
  • ADD:复制文件进入镜像(加入文件是.tar.gz的压缩文件,会自动被解压,且源文件会被删除)
  • WORKDIR:指定工作目录,加入路径不存在会自动创建
  • ENV:设置环境变量
  • EXPOSE:暴露容器的端口
  • RUN:在构建镜像的时候执行,作用于镜像层
  • ENTRYPOINT:在容器启动的时候执行,作用于容器层,Dockerfile里面有多条时只允许执行最后一条
  • CMD:
    • 在容器启动的时候执行,作用域容器层,Dockerfile里有多条时只允许执行最后一条
    • 容器启动后执行默认的命令或者参数,允许被修改
  • 命令格式:
    • shell命令格式:RUN yum install -y net-tools
    • exec命令格式:RUN [“yum”, “install”, “-y”, “net-tools”]

6. Java服务器镜像构建

  • 文件准备:jdk-8u211-linux-x64.tar.gz和apache-tomcat-8.5.35.tar.gz放到宿主机目录下
  • 宿主机配置jdk
    export JAVA_HOME=/usr/local/jdk
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
    
  • 写入到配置文件:vi /etc/profile
  • 更新当前环境变量:source /etc/profile
  • 检查:java --version
  • 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 run -itd -p 80:8080 -v /root/test/ROOT:/usr/local/tomcat/webapps/ROOT mycentos:jdk /bin/bash
  • 访问localhost:80,成功

7. nginx镜像构建

  • 文件准备:nginx-1.16.0.tar.gz放到宿主机目录下
  • Dockerfile
    FROM centos:7
    ADD nginx-1.16.0.tar.gz /usr/local
    COPY nginx_install.sh /usr/local
    RUN sh /usr/local/nginx_install.sh
    EXPOSE 80
    
  • 安装Nginx的shell脚本nginx_install.sh,可以直接使用
    #!/bin/bash
    yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
    cd /usr/local/nginx-1.16.0
    ./configure --prefix=/usr/local/nginx && make && make install
    
  • 制作Nginx镜像:docker build -t mycentos:nginx .
  • Nginx镜像启动注意
    • 在容器里Nginx是以daemon方式启动,退出容器时,Nginx程序也会随着停止:/usr/local/nginx/sbin/nginx
    • 使用前台方式永久运行:/usr/local/nginx/sbin/nginx -g "daemon off;"
  • 启动容器:docker run -itd -p 80:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g "daemon off;"
  • 访问localhost:80,成功

8. Redis镜像构建

  • 文件准备:redis-4.0.9.tar.gz放到宿主机目录下
  • Dockerfile
    FROM centos:7
    ADD redis-4.0.9.tar.gz /home
    COPY redis_install.sh /home
    RUN sh /home/redis_install.sh
    ENTRYPOINT /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
    
  • 安装Redis的脚本redis_install.sh
    #!/bin/bash
    yum install -y gcc gcc-c++ make openssl openssl-devel
    cd /home/redis-4.0.9
    make && make PREFIX=/usr/local/redis install
    mkdir -p /usr/local/redis/conf/
    cp /home/redis-4.0.9/redis.conf /usr/local/redis/conf/
    sed -i '69s/127.0.0.1/0.0.0.0/' /usr/local/redis/conf/redis.conf
    sed -i '88s/protected-mode yes/protected-mode no/' /usr/local/redis/conf/redis.conf
    
  • 测试Redis
    • 启动容器:docker run -itd -p 6380:6379 mycentos:redis #6380是宿主机端口,6379是容器的端口
    • 进入容器:docker exec -it 9b402baeaba7 /bin/bash
    • 宿主机连接Redis:/usr/local/redis/bin/redis-cli -p 6380
    • 验证:
      127.0.0.1:6380> set name Ricky
      OK
      127.0.0.1:6380> get name
      "Ricky"
      127.0.0.1:6380>
      

9. 快速部署mysql并初始化

  • 将MySQL镜像拉到本地:docker pull mysql:5.7
  • 启动:docker run --name some-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:5.7
  • 进入容器:docker exec -it 4336ae28fbfa env LANG=C.UTF-8 /bin/bash
  • Dockerfile
    FROM mysql:5.7
    WORKDIR /docker-entrypoint-initdb.d
    ENV LANG=C.UTF-8
    ADD init.sql .
    

以上是关于Docker构建自定义镜像的主要内容,如果未能解决你的问题,请参考以下文章

04-docker系列-commit构建自定义镜像

Docker | 第五章:构建自定义镜像

Docker -- 自定义镜像(Dockerfile)基于Ubuntu镜像构建一个新镜像基于java:8-alpine镜像将一个Java项目构建为镜像

从 github 构建 grafana 的生产自定义 docker 镜像

Dockerfile语法自定义镜像构建详解

构建自定义Docker镜像使用ApacheHttp服务的代理功能