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
    
    • 启动成功之后,我们可以在浏览器访问一下,看看是否成功运行。出现如下界面就证明我们的操作成功了。
      在这里插入图片描述

    做一个有底线的博客主

  • 相关阅读:
    CMake基本语法
    Immutable使用与react+redux
    mysql 安装之docker
    elasticsearch 安装之docker 单机
    局域网共享时提示:你没有权限访问,请与网络管理员联系
    【python、Neo4j】 python3.6环境安装neo4j客户端
    【python】 Anaconda jupyter 服务正常,内核启动失败, ipython启动失败
    Neo4j 手动安装apoc插件
    Ubuntu16 安装配置Neo4j
    node工具之nodemon
  • 原文地址:https://www.cnblogs.com/xlecho/p/12052832.html
Copyright © 2011-2022 走看看