Docker的生成与镜像仓库的生成(三)

一. image的补充

        前面我们讲解了怎么自制一个image镜像,并启动springboot项目镜像生成容器访问;下面我们来聊一些基本命令及dockerfile的一些讲解;官网网址如果下:

        https://github.com/docker-library

       进入官网以后我们随便打开一个dockerfile文件看下,我打开的是tomcat的dockerfile文件,网址如果下:https://github.com/docker-library/tomcat/blob/master/8.5/jdk8/openjdk-buster/Dockerfile

     

FROM openjdk:8-jdk-buster  //指定基础镜像

ENV CATALINA_HOME /usr/local/tomcat  //ENV是设置变量的值
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"    //RUN是在镜像内部执行一些命令,比如安装软件,配置环境等,换行可以使用""
WORKDIR $CATALINA_HOME      //workdir是指定镜像的工作目录,之后的命令都是基于此目录工作,若不存在则创建
# let "Tomcat Native" live somewhere isolated
ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR

# see https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/KEYS
# see also "update.sh" (https://github.com/docker-library/tomcat/blob/master/update.sh)
ENV GPG_KEYS 05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 713DA88BE50911535FE716F5208B0AB1D63011C7 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23

ENV TOMCAT_MAJOR 8
ENV TOMCAT_VERSION 8.5.57
ENV TOMCAT_SHA512 720de36bb3e40a4c67bdf0137b12ae0fd733aef772d81a4b8dab00f29924ddd17ecb2a7217b9551fc0ca51bd81d1da13ad63b6694c445e5c0e42dfa7f279ede1

RUN set -eux; \
	\
	savedAptMark="$(apt-mark showmanual)"; \
	apt-get update; \
	apt-get install -y --no-install-recommends \
		gnupg dirmngr \
		wget ca-certificates \
	; \
	\
	ddist() { \
		local f="$1"; shift; \
		local distFile="$1"; shift; \
		local mvnFile="${1:-}"; \
		local success=; \
		local distUrl=; \
		for distUrl in \
# https://issues.apache.org/jira/browse/INFRA-8753?focusedCommentId=14735394#comment-14735394
			"https://www.apache.org/dyn/closer.cgi?action=download&filename=$distFile" \
# if the version is outdated (or we're grabbing the .asc file), we might have to pull from the dist/archive :/
			"https://www-us.apache.org/dist/$distFile" \
			"https://www.apache.org/dist/$distFile" \
			"https://archive.apache.org/dist/$distFile" \
# if all else fails, let's try Maven (https://www.mail-archive.com/users@tomcat.apache.org/msg134940.html; https://mvnrepository.com/artifact/org.apache.tomcat/tomcat; https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/)
			${mvnFile:+"https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/$mvnFile"} \
		; do \
			if wget -O "$f" "$distUrl" && [ -s "$f" ]; then \
				success=1; \
				break; \
			fi; \
		done; \
		[ -n "$success" ]; \
	}; \
	\
	ddist 'tomcat.tar.gz' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz" "$TOMCAT_VERSION/tomcat-$TOMCAT_VERSION.tar.gz"; \
	echo "$TOMCAT_SHA512 *tomcat.tar.gz" | sha512sum --strict --check -; \
	ddist 'tomcat.tar.gz.asc' "tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc" "$TOMCAT_VERSION/tomcat-$TOMCAT_VERSION.tar.gz.asc"; \
	export GNUPGHOME="$(mktemp -d)"; \
	for key in $GPG_KEYS; do \
		gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
	done; \
	gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz; \
	tar -xf tomcat.tar.gz --strip-components=1; \
	rm bin/*.bat; \
	rm tomcat.tar.gz*; \
	command -v gpgconf && gpgconf --kill all || :; \
	rm -rf "$GNUPGHOME"; \
	\
# https://tomcat.apache.org/tomcat-9.0-doc/security-howto.html#Default_web_applications
	mv webapps webapps.dist; \
	mkdir webapps; \
# we don't delete them completely because they're frankly a pain to get back for users who do want them, and they're generally tiny (~7MB)
	\
	nativeBuildDir="$(mktemp -d)"; \
	tar -xf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1; \
	apt-get install -y --no-install-recommends \
		dpkg-dev \
		gcc \
		libapr1-dev \
		libssl-dev \
		make \
	; \
	( \
		export CATALINA_HOME="$PWD"; \
		cd "$nativeBuildDir/native"; \
		gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \
		aprConfig="$(command -v apr-1-config)"; \
		./configure \
			--build="$gnuArch" \
			--libdir="$TOMCAT_NATIVE_LIBDIR" \
			--prefix="$CATALINA_HOME" \
			--with-apr="$aprConfig" \
			--with-java-home="$JAVA_HOME" \
			--with-ssl=yes; \
		make -j "$(nproc)"; \
		make install; \
	); \
	rm -rf "$nativeBuildDir"; \
	rm bin/tomcat-native.tar.gz; \
	\
# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
	apt-mark auto '.*' > /dev/null; \
	[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
	find "$TOMCAT_NATIVE_LIBDIR" -type f -executable -exec ldd '{}' ';' \
		| awk '/=>/ { print $(NF-1) }' \
		| sort -u \
		| xargs -r dpkg-query --search \
		| cut -d: -f1 \
		| sort -u \
		| xargs -r apt-mark manual \
	; \
	apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
	rm -rf /var/lib/apt/lists/*; \
	\
# sh removes env vars it doesn't support (ones with periods)
# https://github.com/docker-library/tomcat/issues/77
	find ./bin/ -name '*.sh' -exec sed -ri 's|^#!/bin/sh$|#!/usr/bin/env bash|' '{}' +; \
	\
# fix permissions (especially for running as non-root)
# https://github.com/docker-library/tomcat/issues/35
	chmod -R +rX .; \
	chmod 777 logs temp work

# verify Tomcat Native is working properly
RUN set -e \
	&& nativeLines="$(catalina.sh configtest 2>&1)" \
	&& nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')" \
	&& nativeLines="$(echo "$nativeLines" | sort -u)" \
	&& if ! echo "$nativeLines" | grep -E 'INFO: Loaded( APR based)? Apache Tomcat Native library' >&2; then \
		echo >&2 "$nativeLines"; \
		exit 1; \
	fi

EXPOSE 8080
CMD ["catalina.sh", "run"]

  其它参数

           1. LABEL

              设置镜像标签

                  LABEL email="13277387375@163.com" 

                 LABEL name="ljx"

            2.  VOLUME 

                指定数据的挂在目录

                     VOLUME /var/lib/mysql

            3. COPY 

               将主机的文件复制到镜像内,如果目录不存在,会自动创建所需要的目录,注意只是复制,不会提取和 解压

                    COPY docker-entrypoint.sh /usr/local/bin/

            4.  ADD 

               将主机的文件复制到镜像内,和COPY类似,只是ADD会对压缩文件提取和解压

                     ADD application.yml /etc/itcrazy2016/

            5. WORKDIR 

               指定镜像的工作目录,之后的命令都是基于此目录工作,若不存在则创建

                    WORKDIR /usr/local

                    WORKDIR tomcat

                    RUN touch test.txt

            

              会在/usr/local/tomcat下创建test.txt文件

                    WORKDIR /root

                    ADD app.yml test/

            会在/root/test下多出一个app.yml文件 

      6.  CMD 

          容器启动的时候默认会执行的命令,若有多个CMD命令,则最后一个生效

             CMD ["mysqld"]

             或 CMD mysqld

    7. ENTRYPOINT

        和CMD的使用类似

           ENTRYPOINT ["docker-entrypoint.sh"]

        和CMD的不同 docker run执行时,会覆盖CMD的命令,而ENTRYPOINT不会 

   8.  EXPOSE 

        指定镜像要暴露的端口,启动镜像时,可以使用-p将该端口映射给宿主机

       EXPOSE 3306

二 镜像仓库

       1. docker hub

            登录网址:https://hub.docker.com/;没有注册的可以自己去注册个

            我们根据下图命令进入docker nub

 

      做完上一步我们就可以直接push将我们的镜像推送到官网;

 

但是上面的push会报错,因为我们没有指明我们是push到哪个用户的仓库以及我们没有给镜像取别名,可能会导致镜像名冲突

给image重命名,其中ID是要推送镜像的ID;ljx958720是我的账号名;/后面的是我重定义的名称

 

 

 

上面一步搞定后,我们再次push,会发现这次提交会成功

 

 

如果想要拉取我docker hub仓库的镜像,用命令 docker pull ljx958720/ghy-eureka,国外网站网速太慢了,我等了大半天我的push还在进行中,为节约时间我就不等截图了,我们接下来讲第二种方法

   2. 阿里云  regs

      阿里云docker仓库     https://cr.console.aliyun.com/cn-hangzhou/instances/repositories

       首先我们创建命名空间

 

 

 

 

 然后执行命令进入阿里云,其中ljx958720是我的阿里帐号

sudo docker login --username=ljx958720 registry.cnhangzhou.aliyuncs.com

     

 

 

 我现在要做的事就是要把下面镜像推送到阿里云中去

 

   给image打tag ,把我们的镜像打成阿里云的tag;其中imageId是我们镜像的ID,ghy_colud是我们上面取的命名空间

    sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ghy_colud/ghy-cloud-eureka

 

 

 

 

 查看镜像

 

 

    推送镜像到docker阿里云仓库 

    sudo docker push registry.cn-hangzhou.aliyuncs.com/ghy_colud/ghy-cloud-eureka

 

 

 

 push完后我们可以在我们的镜像仓库中看到我们上传的镜像

 

 

 

 

 下载我的阿里云镜像

     docker pull registry.cn-hangzhou.aliyuncs.com/ghy_colud/ghy-cloud-eureka

运行我的阿里云镜像

    docker run -d --name cloud-eureka -p 6661:8080 ghy_colud/ghy-cloud-eureka

 3. Docker Harbor 

   前面聊过两种上传镜像的方式,那接下来我们再聊一个上传镜像的方式;我们建一个自己的局域网的仓库Docker Harbor,这种方式比较适合公司维护用 ;

Docker Harbor网址:https://github.com/goharbor/harbor,如果不想自己构造,可以点下图位置进行体验:帐号:admin;密码:Harbor12345

 

 

 

    1.下载版本,比如1.7.1 

        https://github.com/goharbor/harbor/releases

    2.将文件传送到根目录下

 

 

    3.解压

        tar -zxvf xxx.tar.gz

 

  4. 执行命令cd harbor  进入到harbor目录 ;然后执行命令 vi harbor.cfg 修改harbor.cfg文件,主要是ip地址的修改成当前机器的ip地址    同时也可以看到Harbor的密码,默认是Harbor12345 ;红框是我修改后的地址

        

      5. 安装harbor

               sh install.sh

         在执行上面命令时有些朋友可能会失败,那是因为你没有安装docker-compose;安装harbor需要docker-compose的支持,下载最新版的docker-compose文件 

               sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

         若是github访问太慢,可以用daocloud下载

              sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

        添加可执行权限

              sudo chmod +x /usr/local/bin/docker-compose

     测试安装结果

            docker-compose --version

 

 执行完上面安装命令后我们再回到harbor目录执行命令

      sh install.sh

     

 

 

 

 

 到这一步局域网仓库就搭建成功了,后面的推送和下载和阿里一样很简单,可以自己看官网搞下

 

posted @ 2020-08-14 21:13  童话述说我的结局  阅读(897)  评论(0)    收藏  举报