Docker学习笔记(二)Dockerfile自定义镜像、DockerCompose、Docker私有镜像仓库

news2024/11/20 3:37:28

文章目录

  • 前言
  • 3 Dockerfile自定义镜像
    • 3.1 镜像结构
    • 3.2 Dockerfile文件
    • 3.3 构建自定义镜像
      • 3.3.1 基于Ubuntu构建Java项目
      • 3.3.2 基于Java8构建Java项目
    • 3.4 小结
  • 4 DockerCompose
    • 4.1 安装DockerCompose
    • 4.2 部署微服务集群
  • 5 Docker私有镜像仓库

前言

Docker学习笔记(一)安装Docker、镜像操作、容器操作、数据卷操作

3 Dockerfile自定义镜像

常见的镜像在DockerHub中就能找到,但是自己写的项目如果也想构建成一个镜像,就必须自定义镜像。

3.1 镜像结构

如上图所示,镜像就是在系统函数库、运行环境等的基础上,添加应用程序文件、配置文件、依赖文件等,然后编写好启动脚本,打包在一起所形成的文件。

构建自定义镜像,其实就是实现上述打包的过程。

3.2 Dockerfile文件

构建自定义的镜像时,并不需要一个一个文件去拷贝、打包。

而是只需要告诉Docker,构建自定义镜像需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会自动根据这些配置构建镜像。

而描述上述配置的文件就是Dockerfile文件。

Dockerfile就是一个文本文件,其内容包含多个指令(Instruction),这些指令说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。 例如:

更多更详细的指令说明,可以参考官网文档:https://docs.docker.com/engine/reference/builder

3.3 构建自定义镜像

3.3.1 基于Ubuntu构建Java项目

  • 1)现在编写了一个简单的SpringBoot项目,本地启动后在浏览器访问http://127.0.0.1:9091/hello/now结果如下:

随后将该项目打成可执行jar包。

  • 2)在虚拟机创建一个空目录docker-demo,将上面的可执行jar包、JDK安装包jdk-8u261-linux-x64.tar.gz上传至该目录下;

  • 3)在docker-demo目录下新建一个Dockerfile文件,其内容如下:

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local

# 拷贝jdk和java项目的包
COPY jdk-8u261-linux-x64.tar.gz $JAVA_DIR/
COPY ./docker-demo-1.0-SNAPSHOT.jar /tmp/app.jar

# 安装JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk-8u261-linux-x64.tar.gz \
 && mv ./jdk1.8.0_261 ./java8

# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

  • 4)进入docker-demo目录,执行构建镜像命令:
docker build -t javaweb:1.0 .

  • 5)基于该镜像创建并运行容器
docker run --name javaweb -p 9091:9091 -d javaweb:1.0

  • 6)在浏览器访问http://192.168.146.129:9091/hello/now结果如下:

3.3.2 基于Java8构建Java项目

基于Ubuntu基础镜像构建Java项目,可以添加任意自己需要的安装包,但是却比较麻烦,例如还要自己上传JDK的安装包并安装。

所以大多数情况下,在构建Java项目的镜像时,都在已经准备了JDK的基础镜像(例如java:8-alpine镜像)上进行构建。

实现步骤如下:

  • 1)创建一个空目录docker-demo-2,上传可执行jar包,并创建一个Dockerfile文件(和基于Ubuntu不同的是,不用上传JDK安装包),其中Dockerfile文件内容如下:
# 指定基础镜像
FROM java:8-alpine
# 拷贝java项目的包
COPY ./docker-demo-1.0-SNAPSHOT.jar /tmp/app.jar
# 暴露端口
EXPOSE 9091
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

可见,Dockerfile文件内容也更简洁,不需要安装JDK和配置环境变量。

  • 2)进入docker-demo-2目录,执行构建镜像命令:
docker build -t javaweb2:2.0 .

  • 3)基于该镜像创建并运行容器
docker run --name javaweb2 -p 9090:9091 -d javaweb2:2.0

  • 4)在浏览器访问http://192.168.146.129:9090/hello/now结果如下:

3.4 小结

  • Dockerfile的本质是一个文件,通过指令描述镜像的构建过程;
  • Dockerfile的第一行必须是FROM,从一个基础镜像来构建;
  • 基础镜像可以是基本操作系统,如Ubuntu;也可以是其他人制作好的镜像,例如:java:8-alpine。

4 DockerCompose

DockerCompose可以基于Compose文件实现快速部署分布式应用,而无需手动一个个创建和运行容器!

而Compose文件是一个文本文件,通过指令定义集群中的每个容器该如何运行。实际上可以看做是将多个docker run命令写到一个文件中,只是语法稍有差异。

DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/

4.1 安装DockerCompose

  • 1)下载DockerCompose
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

  • 2)修改文件权限
chmod +x /usr/local/bin/docker-compose
  • 3)Base自动补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果上述命令超时,则需要先执行以下命令修改hosts文件:

echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

4.2 部署微服务集群

在笔者的专栏【SpringCloud学习笔记】中,编写了一个SpringCloud测试项目,这里可以把该项目利用DockerCompose来部署。

  • 1)创建一个目录docker-compose,其内部目录及文件如下:

其中,docker-compose.yml文件的内容如下:

version: "3.2"

services:
  nacos:
    # 基础镜像
    image: nacos/nacos-server
    # 环境变量
    environment:
      MODE: standalone
    # 端口映射
    ports:
      - "8848:8848"
  userservice:
    build: ./user-service
  orderservice:
    build: ./order-service
  gateway:
    build: ./gateway
    ports:
      - "10010:10010"

可以看到,准备利用DockerCompose部署的包含4个service服务。

其中gatewayuser-serviceorder-service目录下都有Dockerfile文件,其内容如下:

# gateway目录下
FROM java:8-alpine
COPY ./gateway.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar
# user-service目录下
FROM java:8-alpine
COPY ./user.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar
# order-service目录下
FROM java:8-alpine
COPY ./order.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar
  • 2)修改微服务配置

因为微服务将来要部署为docker容器,而容器之间互联不是通过IP地址,而是通过容器名。 因此要将order-serviceuser-servicegateway服务的nacos地址都修改为基于容器名的访问。如图:

  • 3)打包order-serviceuser-servicegateway项目,将打包的可执行jar包放到对应目录下。如图:

  • 4)将docker-compose目录上传至虚拟机,并进入该目录,执行部署命令:
docker-compose up -d

此时可以查看部署的镜像和容器:

  • 5)由于微服务配置文件中,Nacos服务的容器名均配置为nacos,因此这里要修改一下名称:
docker rename docker-compose_nacos_1_6b6608cc4a5d nacos

  • 6)启动nacos容器及另外3个服务容器:
# 启动nacos
docker start nacos
# 启动另外3个服务
docker start docker-compose_gateway_1_48789684d386
docker start docker-compose_orderservice_1_657f620e3223
docker start docker-compose_userservice_1_60845887839c
  • 7)在浏览器输入http://192.168.146.129:8848/nacos

默认账号密码均为nacos,登录后即可查询此时注册到Nacos的微服务:

至此,微服务集群部署完毕。

5 Docker私有镜像仓库

搭建私有镜像仓库可以基于Docker官方提供的DockerRegistry来实现。 其官网地址:https://hub.docker.com/_/registry

Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。

  • 1)搭建私有镜像仓库
docker run -d \
    --restart=always \
    --name registry	\
    -p 5000:5000 \
    -v registry-data:/var/lib/registry \
    registry

上述命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry目录,这是私有镜像库存放数据的目录。

  • 2)配置Docker信任地址

私有镜像仓库采用的是https协议,默认不被Docker信任,所以需要做一个配置:

# 打开要修改的文件
vi /etc/docker/daemon.json
# 文件内容
{
  "registry-mirrors": ["https://1ooyxp73.mirror.aliyuncs.com"],
  "insecure-registries":["127.0.0.1:5000"]
}
# 重新加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
  • 3)重新tag本地镜像,名称前缀为私有镜像仓库的地址
docker tag javaweb:1.0 192.168.146.129:5000/javaweb:1.0
  • 4)推送镜像到私有镜像仓库
docker push 192.168.146.129:5000/javaweb:1.0

  • 5)在浏览器访问http://192.168.146.129:5000/v2/_catalog,就可以查看当前私有镜像服务中包含的镜像:

  • 6)从私有镜像仓库拉取镜像
docker pull 192.168.146.129:5000/javaweb:1.0

本节完,更多内容请查阅分类专栏:微服务学习笔记

感兴趣的读者还可以查阅我的另外几个专栏:

  • SpringBoot源码解读与原理分析
  • MyBatis3源码深度解析
  • Redis从入门到精通
  • MyBatisPlus详解
  • SpringCloud学习笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1691900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ctfhub中的SSRF的相关例题(下)

目录 URL Bypass 知识点 相关例题 数字IP Bypass 相关例题 方法一:使用数字IP 方法二:转16进制 方法三:用localhost代替 方法四:特殊地址 302跳转 Bypass ​编辑 关于localhost原理: DNS重绑定 Bypass 知识点&…

每日练习之数学——砝码和天平

砝码和天平 题目描述 运行代码 #include<iostream> using namespace std; int main() {int w,m,T;cin>>T;while(T--){cin>>w>>m;while(m){if((m-1)%w0)m(m-1)/w;else if((m1)%w0)m(m1)/w;else if(m%w0)m/w;else break;}if(!m)cout<<"YES&…

「职场必备」让你摆脱思维混乱的7个工具

1. 升维思考&#xff0c;降维拆解 解决复杂问题时&#xff0c;有两个关键的阶段&#xff0c;能让我们事半功倍。 第一个阶段是思考阶段&#xff0c;要自下而上进行“升维思考”&#xff0c;明确问题的本质是什么。第二阶段是行动阶段&#xff0c;要自上而下进行“降维拆解”&am…

Excel查找匹配函数(VLOOKUP):功能与应用解析

文章目录 概述VLOOKUP函数语法查询并返回单列结果查找并返回多列结果MATCH函数VLOOKUPMATCH 从右向左逆向查找&#xff1a;INDEX函数INDEXMATCH 函数匹配方式查找匹配注意事项函数名称错误: #NAME?值错误&#xff1a;#VALUE!引用错误&#xff1a;#REF!找不到数据&#xff1a;#…

1、NLP分词

分词处理 1、token&#xff08;词汇单元&#xff09;2、Tokenizer&#xff08;分词&#xff09;3、ElasticSearch 分词器&#xff08;Analyzer&#xff09;4、分词工具停用词&#xff08;Stop words&#xff09; 1、token&#xff08;词汇单元&#xff09; “token”主要用于文…

AI早班车5.25

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

51-53 DriveWorld:通过自动驾驶世界模型进行 4D 预训练场景理解 (含模型数据流梳理)

24年5月&#xff0c;北京大学、国防创新研究院无人系统技术研究中心、中国电信人工智能研究院联合发布了DriveWorld: 4D Pre-trained Scene Understanding via World Models for Autonomous Driving。 DriveWorld在UniAD的基础上又有所成长&#xff0c;提升了自动驾驶目标检测…

linux之防火墙工具

netfilter Linux防火墙是由Netfilter组件提供的&#xff0c;Netfilter工作在内核空间&#xff0c;集成在linux内核中。 Netfilter在内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING)&#xff0c;而这五个hook function向用户…

人工智能应用-实验8-用生成对抗网络生成数字图像

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;代码&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;分析结果&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;实验总结&#x1f9e1;&#x1f9e1; &#x1f9…

Stable Diffusion【艺术特效】【霓虹灯】:霓虹灯像素化马赛克特效

提示词 Neon pixelated mosaic of [Subject Description],highly detailed [主题]的霓虹灯像素化马赛克&#xff0c;高度详细 参数设置 大模型&#xff1a;万享XL_超写实摄影V8.2 采样器&#xff1a;Euler a 采样迭代步数&#xff1a;25 CFG&#xff1a;3 反向提示词&#x…

Docker Desktop安装和如何在WSL2中使用Docker

最近在使用WSL的过程中&#xff0c;想使用docker遇到了一些问题&#xff0c;在WSL中安装Linux版本的docker&#xff0c;启动镜像之后不能从Windows机器的端口映射出来&#xff0c;查了一圈之后&#xff0c;发现应该使用Docker Desktop软件&#xff0c;下面是安装和使用的方式 …

UE5 双手握剑的实现(逆向运动学IK)

UE5 双手握剑的实现 IK 前言 什么是IK&#xff1f; UE官方给我们提供了很多对于IK处理的节点&#xff0c;比如ABRIK、Two Bone IK、Full Body IK 、CCD IK等&#xff0c;但是看到这&#xff0c;很多人就好奇了&#xff0c;什么是IK&#xff1f; 首先我们来看看虚幻小白人的骨…

实战Java虚拟机-实战篇

一、内存调优 1.内存溢出和内存泄漏 内存泄漏&#xff08;memory leak&#xff09;&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;这个对象就不会被垃圾回收器回收&#xff0c;这种情况就称之为内存泄漏。内存泄漏绝大…

图论(二)-图的建立

引言&#xff1a; 建图&#xff0c;将图放进内存的方法 常用的建图方式&#xff1a;邻接矩阵&#xff0c;邻接链表&#xff0c;链式前向星 一、邻接矩阵 通过一个二维数组即可将图建立&#xff0c;邻接矩阵&#xff0c;考虑节点集合 &#xff0c;用一个二维数组定义邻接矩…

自定义原生小程序顶部及获取胶囊信息

需求&#xff1a;我需要将某个文字或者按钮放置在小程序顶部位置 思路&#xff1a;根据获取到的顶部信息来定义我需要放的这个元素样式 * 这里我是定义某个指定页面 json&#xff1a;给指定页面的json中添加自定义设置 "navigationStyle": "custom" JS&am…

子分支想主分支发起合并请求

请求合并 1.点击 git Web 页右上角打开 Merge requests 进入新页&#xff0c;点击右上角。注意选择要合并的项目 2.左边是源分支&#xff0c;右边是要合并的目标分支。 3.最后点击左下角绿色按钮 4.第一个红框 Assignee&#xff0c;选择要通知去合并的人。第二个红框不动&#…

BUUCTF---web---[BJDCTF2020]ZJCTF,不过如此

1、点开连接&#xff0c;页面出现了提示 传入一个参数text&#xff0c;里面的内容要包括I have a dream。 构造&#xff1a;?/textI have a dream。发现页面没有显示。这里推测可能得使用伪协议 在文件包含那一行&#xff0c;我们看到了next.php的提示&#xff0c;我们尝试读取…

Pytorch-08 实战:手写数字识别

手写数字识别项目在机器学习中经常被用作入门练习&#xff0c;因为它相对简单&#xff0c;但又涵盖了许多基本的概念。这个项目可以视为机器学习中的 “Hello World”&#xff0c;因为它涉及到数据收集、特征提取、模型选择、训练和评估等机器学习中的基本步骤&#xff0c;所以…

强化学习4:DQN 算法

看这篇文章之前&#xff0c;建议先了解一下&#xff1a;Q-Learning 算法。 1. 算法介绍 DQN 算法全称为 Deep Q-Network&#xff0c;即深度Q网络。它将 Q-Learning 与 Deep Learning 结合在了一起。 1.1 Q-Network Q-Learning 是使用 Q-table 才存储决策信息的&#xff0c;…

spring常用知识点

1、拦截器和过滤器区别 1. 原理不同&#xff1a; 拦截器是基于java的反射机制&#xff0c;而过滤器采用责任链模式是基于函数回调的。 2. 使用范围不同&#xff1a; 过滤器Filter的使用依赖于Tomcat等容器&#xff0c;导致它只能在web程序中使用 拦截器是一个Sping组件&am…