zoukankan      html  css  js  c++  java
  • Docker--DockerFile创建自己的image

    echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075)交流学习。 百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!!!


    在我们使用docker库中的诸多image的时候,我们可以去了解一下他的生成的过程,这样有利于我们自己封装自己的image。改文章主要是用于介绍dockerfile生成自己的image,介绍了基本的操作和一个实例,熟练的可以略过

    image生成的关键dockerfile

    Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像。一般而言,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。我们可以登录github找到docker的官方仓库:https://github.com/docker-library/mysql/blob/master/5.7/Dockerfile 找到mysql对应的dockerfile来分析一下。(里面的注释全是为了方便解读后面加上去的,官网原地址上并没有这些注释)

    # FROM指定基础镜像,比如 FROM ubuntu:14.04
    FROM debian:stretch-slim
    
    # add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
    RUN groupadd -r mysql && useradd -r -g mysql mysql
    
    # RUN在镜像内部执行一些命令,比如安装软件,配置环境等,换行可以使用""
    RUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/*
    
    # add gosu for easy step-down from root
    
    # ENV :设置变量的值,ENV MYSQL_MAJOR 5.7,可以通过docker run --e key=value修改,后面可以直接使 用${MYSQL_MAJOR}
    ENV GOSU_VERSION 1.7
    RUN set -x 
    	&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* 
    	&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" 
    	&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" 
    	&& export GNUPGHOME="$(mktemp -d)" 
    	&& gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 
    	&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu 
    	&& gpgconf --kill all 
    	&& rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc 
    	&& chmod +x /usr/local/bin/gosu 
    	&& gosu nobody true 
    	&& apt-get purge -y --auto-remove ca-certificates wget
    
    RUN mkdir /docker-entrypoint-initdb.d
    
    RUN apt-get update && apt-get install -y --no-install-recommends 
    # for MYSQL_RANDOM_ROOT_PASSWORD
    		pwgen 
    # for mysql_ssl_rsa_setup
    		openssl 
    # FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
    # File::Basename
    # File::Copy
    # Sys::Hostname
    # Data::Dumper
    		perl 
    	&& rm -rf /var/lib/apt/lists/*
    
    RUN set -ex; 
    # gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported
    	key='A4A9406876FCBD3C456770C88C718D3B5072E1F5'; 
    	export GNUPGHOME="$(mktemp -d)"; 
    	gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; 
    	gpg --batch --export "$key" > /etc/apt/trusted.gpg.d/mysql.gpg; 
    	gpgconf --kill all; 
    	rm -rf "$GNUPGHOME"; 
    	apt-key list > /dev/null
    
    ENV MYSQL_MAJOR 5.7
    ENV MYSQL_VERSION 5.7.28-1debian9
    
    RUN echo "deb http://repo.mysql.com/apt/debian/ stretch mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list
    
    # the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
    # also, we set debconf keys to make APT a little quieter
    RUN { 
    		echo mysql-community-server mysql-community-server/data-dir select ''; 
    		echo mysql-community-server mysql-community-server/root-pass password ''; 
    		echo mysql-community-server mysql-community-server/re-root-pass password ''; 
    		echo mysql-community-server mysql-community-server/remove-test-db select false; 
    	} | debconf-set-selections 
    	&& apt-get update && apt-get install -y mysql-server="${MYSQL_VERSION}" && rm -rf /var/lib/apt/lists/* 
    	&& rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld 
    	&& chown -R mysql:mysql /var/lib/mysql /var/run/mysqld 
    # ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime
    	&& chmod 777 /var/run/mysqld 
    # comment out a few problematic configuration values
    	&& find /etc/mysql/ -name '*.cnf' -print0 
    		| xargs -0 grep -lZE '^(bind-address|log)' 
    		| xargs -rt -0 sed -Ei 's/^(bind-address|log)/#&/' 
    # don't reverse lookup hostnames, they are usually another container
    	&& echo '[mysqld]
    skip-host-cache
    skip-name-resolve' > /etc/mysql/conf.d/docker.cnf
    
    # VOLUME : 指定数据的挂在目录
    VOLUME /var/lib/mysql
    
    # COPY : 将主机的文件复制到镜像内,如果目录不存在,会自动创建所需要的目录,注意只是复制,不会提取和解压
    COPY docker-entrypoint.sh /usr/local/bin/
    RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
    ENTRYPOINT ["docker-entrypoint.sh"]
    
    # EXPOSE : 指定镜像要暴露的端口,启动镜像时,可以使用-p将该端口映射给宿主机
    EXPOSE 3306 33060
    CMD ["mysqld"]
    

    基本指令整理

    指令 说明
    FROM 指定所创建镜像的基础镜像
    MAINTAINER 指定维护者信息
    RUN 运行命令
    CMD 指定启动容器时默认执行的命令
    LABEL 指定生成镜像的元数据标签信息
    EXPOSE 声明镜像内服务所监听的端口
    ENV 指定环境变量
    ADD 赋值指定的路径下的内容到容器中的路径下,可以为URL;如果为tar文件,会自动解压到路径下
    COPY 赋值本地主机的路径下的内容到容器中的路径下;一般情况下推荐使用COPY而不是ADD
    ENTRYPOINT 指定镜像的默认入口
    VOLUME 创建数据挂载点
    USER 指定运行容器时的用户名或UID
    WORKDIR 配置工作目录
    ARG 指定镜像内使用的参数(例如版本号信息等)
    ONBUILD 配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作的命令
    STOPSIGNAL 容器退出的信号
    HEALTHCHECK 如何进行健康检查
    SHELL 指定使用SHELL时的默认SHELL类型

    Dockerfile实战Spring Boot项目

    这里提供一个项目,链接:https://git.coding.net/xlsorry/docker-demo.git

    下载之后验证可以在idea中启动,并且访问有返回值:
    在这里插入图片描述

    完成这些基本的验证之后,我们将项目打包成为jar

    mvn clean package
    
    • 完成这些操作之后,我们将jar包传入已经安装了docker的linux中。
    • 在安装了docker环境中新建一个目录"first-dockerfile"
    • 进入first-dockerfile,将我们打好的jar包放入该目录下
    • 创建Dockerfile文件,编写如下内容
    FROM openjdk:8
    MAINTAINER 2421499075@qq.com
    LABEL name="dockerfile-demo" version="1.0" author="2421499075@qq.com"
    COPY springboot-0.0.1-SNAPSHOT.jar dockerfile-image.jar
    CMD ["java","-jar","dockerfile-image.jar"]
    

    完成之后如下图:
    在这里插入图片描述

    • 在该目录下执行:docker build -t test-docker-image .

    在这里插入图片描述

    • 完成之后我们可以执行docker images查看是否打包成功。

    在这里插入图片描述
    我们可以看到images中多了一个test-docker-image,名称是我们在执行命令的时候,使用了该名字。这个image通过我们创建dockerfile打包出来的。

    • 基于image创建container,运行我们刚刚打包的docker
    docker run -d --name springboot01 -p 10080:8080 test-docker-image
    
    • 启动成功之后,我们可以在浏览器访问一下,看看是否成功运行。出现如下界面就证明我们的操作成功了。
      在这里插入图片描述

    做一个有底线的博客主

  • 相关阅读:
    7.21 高博教育 数组 内存
    【基础扎实】Python操作Excel三模块
    PAT 甲级 1012 The Best Rank
    PAT 甲级 1011  World Cup Betting
    PAT 甲级 1010 Radix
    链式线性表——实验及提升训练
    循环程序设计能力自测
    链表应用能力自测
    PAT 甲级 1009 Product of Polynomials
    1008 Elevator (20分)
  • 原文地址:https://www.cnblogs.com/xlecho/p/12052832.html
Copyright © 2011-2022 走看看