運用と保守の章Docker Soul Torture-2.1

WeChatのパブリックアカウントに注目してください。より良い記事を入手するには、Java Book ClubにアクセスしてくださいYo Ollie

前回のブログ投稿では、すでにDockerの基本的な理解がありました。今回は、Dockerの2つのコアコンポーネントについて魂拷問を行います。スペースのため、このセクションでは主に画像を拷問します。コンテナについては、後半に残します。拷問。

画像

前のセクションの最後で、Docker設計の推測について説明しましたが、今回はTomcatを例にして、推測を段階的に証明します。

[外部リンク画像の転送に失敗しました。ソースサイトにホットリンク防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-6pXHwOzL-1583691583551)(E:\ architect \ markdown \ gallery \ Docker-image.png)]

前のセクションから、dokcer pull tomcatが実行されると、hub.docker.comからtomcatイメージを検索することがわかっています。

画像はどのように作成されますか

魂の拷問1:この画像はどのようにして生まれたのですか?

まずアドレスを開きましょう:

https://github.com/docker-library/tomcat/tree/master/8.5/jdk8/openjdk

このアドレスから、次のことがわかります。画像はすべてDockerfileから取得されます。信じられませんか?他の倉庫を検索できます〜

Dockerfileを開くと、次のようになっていることがわかりました。長いセクション(セクションの長さのため、一部のスクリーンショットのみをスクリーンショットで表示しています)、固定された文法のように見えます。方法はありません〜

FROM openjdk:8-jdk
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME
......
RUN set -eux; \
	\
	......
	chmod -R +rX .; \
	chmod 777 logs temp work
# verify Tomcat Native is working properly
RUN ......
EXPOSE 8080
CMD ["catalina.sh", "run"]

Dockerfileを使用して、イメージを生成できるかどうかを確認しましょう。

#1.查看现有images
docker images
#2.将上述的DOckerfiler文件上传到当前目录
#3.执行生成image操作
docker build -t my-mysql-image .
#4.再次执行查看image操作,就可以发现生成了镜像my-mysql-image

上記の操作から、結論を導き出すことができimage都是由Dockerfile得来的ます。独自のイメージを生成するDockerfileを作成できるでしょうか?答えは「はい」です独自のDockerfilerを作成するには、彼の基本的な構文を確認する必要があります。

#1.FROM 指定基础镜像
FROM ubuntu:14.04
#2.RUN 在镜像内部执行命令,例如安装软件或者配置环境等,换行可以用""
RUN groupadd -r mysql && useradd -r -g mysal mysql
#3.ENV 设置变量的值,后面可以直接使用${MYSQL_MAJOR},可通过docker run --e key=value修改
ENV MYSQL_MAJOR 5.7 
#4.LABEL设置镜像标签
LABEL email="[email protected]" 
LABEL name="itcrazy2016
#5.VOLUME 指定数据的挂载目录
VOLUME /usr/lib/mysql
#6.COPY 将宿主机的文件复制到镜像内,如果目录不存在,会自动创建所需要的目录。注意只是复制,不会提取和解压
COPY docker-entrypoint.sh /usr/local/bin/
#7.ADD 将主机的文件复制到镜像内,和COPY类似,只是ADD会对压缩文件提取和解压
ADD application.yml /etc/itcrazy2016/
#8.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文件
#9.CMD 容器启动的时候默认执行命令,若有多个CMD命令,只有最后一个会生效
CMD ["mysqld"] 
或
CMD mysqld
#10.ENTRYPOINT 和CMD的使用类似,与之不同的是:docker run执行时,会覆盖CMD的命令,而ENTRYPOINT不会 
ENTRYPOINT ["docker-entrypoint.sh"]
#11.EXPOSE 指定镜像要暴露的端口,启动镜像时,可以使用-p将该端口映射给宿主机
EXPOSE 3306

独自の画像を作成する

Dockerfileの基本的なコマンドを理解したら、独自のイメージの作成に進むことができます。ここでは、Spring Boot Webプロジェクトを使用して説明します。具体的な操作は次のとおりです。

#1.创建一个Spring Boot项目,创建一个Controller类,参考代码:
https://github.com/Alvin33/docker-all
#2.对项目进行打包
mvn clean package
#3.在docker环境中新建一个目录'first-dockerfile'
#4.将所打的jar包'docker-all-0.0.1-SNAPSHOT.jar'上传到该目录中(这里我们可以先执行sudo yum install lrzsz,这样就可以直接把文件拖入到虚机中啦)。并在该目录下创建Dockerfile文件,编写Dockerfile文件内容如下:
FROM openjdk:8
MAINTAINER jarluo
LABEL name="dockerfile-demo" version="1.0" author="jarluo"
COPY docker-all-0.0.1-SNAPSHOT.jar dockerfile-image.jar
CMD ["java","-jar","dockerfile-image.jar"]
#5.根据我们上面建立的Dockerfile构建镜像
docker build -t my-docker-image .
#6.基于image创建container
docker run -d --name user01 -p 8888:8080 my-docker-image
	#我们可以通过docker ps 查看我们创建的容器
#7.查看启动日志
docker logs user01
#8.宿主机上访问curl localhost:8888/dockerfile 如果返回结果 说明我们自己定义的Dockerfile正确啦~
#9.此外,我们还可以在启动一个容器
docker run -d --name user02 -p 8889:8080 my-docker-image

この時点で、小さな本の友達はDockerイメージをより深く理解していると思います。しかし、多分誰もが新しい疑問を抱いています。自分でイメージを作成しました。それをすべてのインターネットプログラマーや社内の同僚が利用できるようにしたいのですが、どうすればよいですか?

カスタム画像を共有する

魂の拷問2:カスタム画像を共有する方法

ここでは3つのオプションについて説明しますが、あなたに適したものは常にあると思います〜

  • カスタムイメージアップロードhub.docker.com

前のセクションでは、すべての画像がハブからプルされていることがわかっているため、作成した画像をハブにアップロードすることもできます。

#1.首先我们要登录hub官网注册属于我们自己的账户,然后进行登录
#2.在docker机器上登录,会要求输入用户名及密码
docker login
#3.将我们自定义image进行重新命名,docker能找到我们官网的账户
docker tag my-docker-image alvin33/my-docker-image 
#4.将我们自定义的iamge推送到hub
docker push alvin33/my-docker-image

プッシュが成功したら、公式Webサイトで自分のホームページを更新すると、アップロードした画像が表示されます。他のユーザーがそれを使用したい場合は、どうすればよいですか?もちろん他のミラーと同じように使用されます

#1.拉取镜像
docker pull alvin33/my-docker-image
#2.创建容器
dokcer run -d --name user01 -p 6666:8080 alvin33/my-docekr-image
  • Alibaba Cloudへのカスタム画像のアップロード

一部の人々は、Docker公式Webサイトウェアハウスで、なぜAlibaba Cloudウェアハウスを使用するのかと尋ねるかもしれません。上で示したのはほんの小さなデモですが、非常に大きなプロジェクトをアップロードすると速度が低下するため、夕食には国内サーバーのAlibaba Cloudを検討します。

#1.阿里云官网登录自己的阿里云,打开该网址
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
#2.宿主机登录阿里云docker仓库,参照阿里云官网访问路径https://cr.console.aliyun.com/cn-hangzhou/instances/credentials
sudo docker login --username=alvinos666 registry.cn-hangzhou.aliyuncs.com
#3.阿里云容器镜像服务创建命名空间alvin33 
#4.给自定义image打tag.
sudo docker tag my-docker-image:latest  registry.cn-hangzhou.aliyuncs.com/alvin33/my-docker-image:v1.0
#5.推送自定义镜像到阿里云docker仓库
sudo docker push registry.cn-hangzhou.aliyuncs.com/alvin33/my-docker-image:v1.0

上記の手順を完了した後、ミラーウェアハウスを再度更新すると、アップロードしたミラーが表示されます。

プルアンドプレイをしたい場合は、コマンドも直接投稿されます。結局のところ、このAlibaba CloudのWebサイトは非常に長いです。

#镜像拉取
docker pull registry.cn-hangzhou.aliyuncs.com/alvin33/my-docker-image:v1.0
#创建容器
docker run -d --name user01 -p 6661:8080 registry.cn-hangzhou.aliyuncs.com/alvin33/my-docker-image:v1.0
  • カスタムイメージアップロードプライベートサーバーDockerハーバー

最後に、プライベートサーバーを構築する場合の操作方法を見てみましょう。最初にDocker Harbourの基本環境を構築できます。具体的な手順は次のとおりです。

#1.下载版本Docker Harbor,以1.7.1版本为例   
https://github.com/goharbor/harbor/releases
#2.检查当前机器是否安装了docker-compose
docker-compose version
	#2.1如果没有安装,则执行以下命令进行安装
	#2.1.1.下载最新版的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
	#2.1.2.添加可执行权限
	sudo chmod +x /usr/local/bin/docker-compose
	#2.1.3.测试安装结果
	docker-compose --version
		#测试安装结果的时候可能会爆出以下错误
		Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/docker-compose.pkg
		#解决方案:
		参见该网址:https://www.cnblogs.com/sixiweb/p/7048914.html
#3.上传并解压
tar -zxvf harbor-online-installer-v1.7.1.tgz
#4.进入到harbor目录,修改harbor.cfg文件,主要是ip地址的修改成当前机器的ip地址。同时也可以看到Harbor的密码,默认是Harbor12345
hostname = 192.168.110.164
#5.安装harbor
sh install.sh
#6.浏览器访问,比如192.168.110.164(个人虚机地址),输入用户名admin和密码Harbor12345即可。

#tip:
	当发现页面访问不了的时候,可以重启harbor,进入到harbor目录,命令以下命令:
	docker-compose stop
	docker-compose start
	

Docker Harbourの基本的な環境が整いましたので、どうやってプッシュしますか?どれどれ:

#1.在宿主机上登录Docker Harbor
docker -D login 192.168.110.164
	#报如下错误:
	Error response from daemon: Get https://192.168.110.164/v2/: dial tcp 192.168.110.164:443: connect: connection refused
	#解决方案参考:https://blog.csdn.net/zyl290760647/article/details/83752877
	A:在需要登陆的docker client端修改lib/systemd/system/docker.service文件,在里面修改ExecStart那一行,增加--insecure-registry=192.168.110/164,
	然后重启docker (systemctl daemon-reload    systemctl restart docker)
	B:在harbor服务器端修改 /etc/docker/daemon.json(如果没有这个文件,自己建),增加
	{
    
    
 	 "insecure-registries": ["192.168.110.164"]
  	}
  	以上语句注意空格。
	修改后,同样运行 (systemctl daemon-reload    systemctl restart docker)
	出现以下语句,说明成功.
	WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
#2.推送自定义镜像
	#2.1 登录Harbor UI,新建项目harbor-test,并新建用户alvin33,并在新建的项目harbor-test内添加刚才新建的成员用户:alvin33
	#2.2 使用alvin33重新登录账户(输入用户名时请输入alvin33)
	docker login 192.168.110.164
	#2.3 登录完成后我们就可以进行推送啦,具体执行以下两步操作;
docker tag my-docker-image:latest 192.168.110.164/harbor-test/my-docker-image:v1.0
docker push 192.168.110.164/harbor-test/my-docker-image:v1.0

この時点で、Harbourプライベートサーバーを使用してカスタムイメージを管理しています。
ここに画像の説明を挿入

最後に書かれた:

記事の冒頭で、Dockerの階層化された考え方について説明しましたが、記事を読んだ後は、実際に常に1つのこと、つまりDockerfileについて話していることを実感できるはずです。そして、Dockerfileのコマンド実行プロセスは、レイヤーごとに1000層のケーキを作るようなものではありませんか?

後半では、コンテナを分析し、イメージレイヤーの上にあるコンテナーレイヤーを感じます。

少し外れたトピック:

この記事は写真を多用せずに書いていますが、前回の記事をブログにアップロードした後、写真が表示されないことを考えると、多くの解決策を試しましたがあまり快適ではありませんでした。ですから、この問題が解決されるのを待ちたいので、表現力を高めるために写真を追加します。この問題に関しては、良い解決策があります。そこで、時間をかけてツールのコラムを書くことを考えました。特に開発中または作業中のツールを紹介します。一緒に成長し、一緒に進歩する。

おすすめ

転載: blog.csdn.net/aiwaston/article/details/104744939