首页 > 其他分享 >深入理解Docker,从入门到精通-Part3(高级进阶)

深入理解Docker,从入门到精通-Part3(高级进阶)

时间:2024-10-31 16:45:11浏览次数:3  
标签:compose 进阶 harbor storage Part3 learn 镜像 docker Docker

一、仓库管理

docker的仓库,存的就是镜像,所以仓库管理就是对镜像进行管理。

在Docker里面一般有两类仓库:公共仓库(DockerHub官方仓库)和私人仓库(Registry和harbor)

下面分别对这三种仓库进行介绍

1、DockerHub仓库管理

DockerHub 是 Docker 公司维护的公共 Registry,用户可以将自己的镜像保存到 DockerHub 免
费的 repository 中,如果不希望别人访问自己的镜像,也可以购买私有 repository

我们可以到DockerHub官方网站进行账户注册,网址:https://hub.docker.com/

进行登录

Docker客户端登录

docker login

 Docker Hub 为了区分不同用户的同名镜像,镜像的 registry 中要包含用户名

完整格式为: [用户 名]/镜像名:tag
我们通过 docker tag 命令重命名镜像

docker tag learn-docker-storage:0.0.3 baiyp/learn-docker-storage:0.0.3

 

到这里,我们就已经准备好了我们的镜像,我们可以将这个镜像推送到DockerHub

推送镜像的规范是 docker push 注册用户名/镜像名:tag ,因为我们上面已经把镜像名字改正确
了,所以可以直接推送。

docker push baiyp/learn-docker-storage:0.0.3

 

我们可以到 docker hub 检查我们的镜像是否已经push上去了

先删除本地的镜像

docker rmi baiyp/learn-docker-storage:0.0.3 learn-docker-storage:0.0.3

 这个时候可以从 docker hub 拉取镜像

# 注意要带上用户名
docker pull baiyp/learn-docker-storage:0.0.3

 运行镜像

docker run -d \
-v /tmp/data/logs:/logs \
-p 8003:8003 \
--name learn-docker-storage \
--network=learn-docker-network \
baiyp/learn-docker-storage:0.0.3

 我们访问下,检查下是否可以正常运行

curl http://192.168.64.153:8003/storage/employe/findByID/10001 | python -m json.tool

 

 到这里我们就完成dockerhub仓库的发布与拉取

2、Registry仓库管理

     官方提供了Docker Hub网站来作为一个公开的集中仓库,然而,本地访问Docker Hub速度往往
很慢,并且很多时候我们需要一个本地的私有仓库只供网内使用

所以registry你可以理解为一个搭建在本地的私人仓库,也是一个仓库,可以存储镜像,对镜像进行管理,不过只在本地,本地内网使用,无法公用

安装Registry

这将使用官方提供的 registry 镜像来启动私有仓库,默认情况下,仓库会被创建在容器的/var/lib/registry 目录下。我们可以通过 -v 参数将镜像文件存放在本地的指定路径。

docker run -d \
-p 5000:5000 \
-v /tmp/data/registry:/var/lib/registry \
--restart=always \
registry

上传镜像

registry 上传镜像的命名规范是 仓库IP:5000/镜像名称:tag

将我们的镜像改成服务规范的名字

docker tag baiyp/learn-docker-storage:0.0.3 192.168.64.153:5000/learn-docker- storage:0.0.3

 使用命令推送镜像

docker push 192.168.64.153:5000/learn-docker-storage:0.0.3

 我们发现推送报错了,这是因为docker推送默认使用的https的方式,而我们的registry只支持http的方式

 修改Docker推送配置

vi /etc/docker/daemon.json

 添加下面的配置

{ "insecure-registries": ["仓库IP:5000"] }

 执行以下命令重启重新加载配置并生效

systemctl daemon-reload
service docker restart

 执行命令再次推送

docker push 192.168.64.153:5000/learn-docker-storage:0.0.3

 

推送成功

curl http://192.168.64.153:5000/v2/_catalog | python -m json.tool

 

3、Harbor仓库管理

需要安装docker以及docker-compose的环境上面我们已提前安装了

  • 安装Docker环境
  • 安装docker-compose环境

解压安装包

tar -zxvf harbor-offline-installer-v2.1.4.tgz

进入目录 然后将 harbor.yml.tmp 复制一份并该命为 harbor.yml

cd harbor
cp harbor.yml.tmpl harbor.yml

 注意: 这里跟老版本不一样,没有了harbor.cfg文件,我们需要手动复制harbor.yml.tmpl在做修改即可

修改harbor.yml(harbor作为私有仓库作用在公司内网,一般都是信任关系,没多大必要做https,使用http即可!所以 把https相关的已经注释掉)

并注意配置文件的用户名密码配置,默认是 用户名是:admin,密码是:Harbor12345,如果修改
需要安装前修改

使用 docker load 命令加载本地镜像,不用再从DockerHub下载了

docker load -i harbor.v2.1.4.tar.gz

 

这样容器镜像就被加载到了本地,我们可以通过 docker images 命令查看导入的镜像

 先执行预处理命令,会创建一些文件夹,初始化一些文件

 然后开始真正的安装过程

./install.sh

 

如果出现 -Harbor has been installed and started successfully 表示安装成功,并查看docker进程

 在harbor的安装目录执行以下命令就可以启动和停止了

# 启动 
docker-compose up -d 
# 停止 
docker-compose stop 
# 重新启动 
docker-compose restart

 输入 http://harborIP 就可以直接访问了,这里访问我们的地址 http://192.168.149.128/  (因为端口是80)

使用docker login命令就可以登录harbor了

docker login -u admin -p Harbor12345 192.168.149.128

 我们发现登录报错了,这和registry一样,docker模式使用https方式,而我们使用的是http的方
式登录

修改Docker配置

vi /etc/docker/daemon.json
{ "insecure-registries": ["harbor地址"] }

 执行以下命令重启重新加载配置并生效

systemctl daemon-reload
service docker restart

 再次进行登录

 我们推送镜像我要把我们的镜像名称改成符合规范的格式

docker tag \
192.168.64.153:5000/learn-docker-storage:0.0.3 \
192.168.64.153/library/learn-docker-storage:0.0.3

 这里有一个 library 路径,是harbor默认的项目名称

 可以通过 docker push 进行推送镜像,注意需要先登录在进行推送

docker push 192.168.64.153/library/learn-docker-storage:0.0.3

 到这里我们已经推送到了harbor,我们可以登录library页面查看

删除本地镜像

docker rmi \
192.168.64.153:5000/learn-docker-storage:0.0.3 \
192.168.64.153/library/learn-docker-storage:0.0.3

 测试从Harbor拉取镜像

docker run -d \
-v /tmp/data/logs:/logs \
-p 8003:8003 \
--name learn-docker-storage \
--network=learn-docker-network \
192.168.64.153/library/learn-docker-storage:0.0.3

HarBor用户权限说明

  • 项目管理员:增删改查
  • 开发人员:上传和下载
  • 访客:只允许下载

 HarBor权限配置

 

 

 登录docker客户端测试

重新拉取镜像测试

Harbor支持Https(扩展)

前面说了怎么搭建harbor仓库,这里讲一讲harbor实现https访问,因为只需要内网访问,没必要去申请一个ssl证书,所以我就用openssl颁发自签名证书,实现https访问。

生成证书颁发机构证书

创建证书目录

mkdir -p /tmp/data/cert && cd /tmp/data/cert && ll

 

 生成CA证书私钥

openssl genrsa -out ca.key 4096

 生成CA证书

openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=lcc/OU=Personal/CN=lcc.harbor.com" \
 -key ca.key \
 -out ca.crt

 

 生成服务器证书

证书通常包含一个.crt文件和一个.key文件,例如yourdomain.com.crtyourdomain.com.key

生成私钥 

openssl genrsa -out lcc.harbor.com.key 4096

 生成证书签名请求(CSR)

调整-subj选项中的值以反映您的组织。如果使用FQDN连接Harbor主机,则必须将其指定为通用名称(CN)属性,并在密钥和CSR文件名中使用它

openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=lcc/OU=Personal/CN=lcc.harbor.com" \
    -key lcc.harbor.com.key \
    -out lcc.harbor.com.csr

 生成一个x509 v3扩展文件

无论您使用FQDN还是IP地址连接到Harbor主机,都必须创建此文件,以便可以为您的Harbor主机生成符合主题备用名称(SAN)和x509 v3的证书扩展要求,替换DNS条目以反映您的域。

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=lcc.harbor.com
DNS.2=lcc.harbor
DNS.3=harbor
EOF

 生产主机证书

使用该v3.ext文件为您的Harbor主机生成证书,注意将yourdomain.comCRS和CRT文件名中的替换为Harbor主机名。

openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in lcc.harbor.com.csr \
    -out lcc.harbor.com.crt

 配置harbor.yml

然后进入harbor安装目录修改harbor.yml,修改下面几个选项

  • hostname,使用IP或域名,不要用回环地址,localhost等
  • certificate,yourdomain.com.crt的路径/tmp/data/cert/lcc.harbor.com.crt
  • private_key,yourdomainr.com.key的路径/tmp/data/cert/lcc.harbor.com.key

 

 重新安装harbor服务

修改本地host文件(windows(C:\Windows\System32\drivers\etc)和linux(/etc/hosts)都要修改)
192.168.64.153 lcc.harbor.com

接下来就可以通过域名进行https访问了 

二、微服务Docker打包

我们项目中用到了多个微服务,我们上一节课程打包用的是手动上传,但是很麻烦,有没有更好的
方式呢,是有的,我们可以直接通过idea将我们的微服务打包成Docker镜像,并推送到Docker仓库中

这里我们采用jib-maven-plugin 来进行来构建容器化的spring boot应用程序,Jib可以让不写
Dockerfile就能实现Docker打包

在properties中配置harbor的共有配置

<properties>
    <!--harbor 仓库地址-->
    <docker.registry.url>lcc.harbor.com</docker.registry.url>
    <!--harbor 的项目名称-->
    <docker.registry.name>library</docker.registry.name>
    <!--harbor账号-->
    <docker.registry.username>admin</docker.registry.username>
    <!--harbor密码-->
    <docker.registry.password>Harbor12345</docker.registry.password>
</properties>

 编译配置插件配置

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <plugins>

        <plugin>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>jib-maven-plugin</artifactId>
            <version>2.8.0</version>
            <configuration>
                <allowInsecureRegistries>true</allowInsecureRegistries>
                <!--from节点用来设置镜像的基础镜像,相当于Docerkfile中的FROM关键字-->
                <from>
                    <!--使用openjdk官方镜像,tag是:8-jdk-alpine,表示镜像的操作系统是alpine,装好了jdk8-->
                    <image>openjdk:8-jdk-alpine</image>
                </from>
                <to>
                    <!--镜像名称和tag,使用了mvn内置变量${project.version},表示当前工程的version-->
                    <image>${docker.registry.url}/${docker.registry.name}/${project.artifactId}:${project.version}
                    </image>
                    <tags>
                        <!--版本号-->
                        <tag>${project.version}</tag>
                    </tags>
                    <!--harbor的认证信息-->
                    <auth>
                        <username>${docker.registry.username}</username>
                        <password>${docker.registry.password}</password>
                    </auth>
                </to>
                <!--容器相关的属性-->
                <container>

                    <jvmFlags>
                        <!--一些启动参数-->
                        <jvmFlag>-Djava.security.edg=file:/dev/./urandom</jvmFlag>
                    </jvmFlags>
                    <!--挂载volume的配置-->
                    <volumes>
                        <volume>/tmp</volume>
                        <volume>/logs</volume>
                    </volumes>
                    <ports>
                        <!--暴漏端口号-->
                        <port>8080</port>
                    </ports>
                    <!--微服务的启动类-->
                    <mainClass>com.heima.test.Application</mainClass>
                    <format>OCI</format>
                    <!--使用该参数将镜像的创建时间与系统时间对其-->
                    <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
                </container>
            </configuration>
            <executions>
                <!--执行打包配置-->
                <execution>
                    <id>jib-maven-plugin</id>
                    <phase>package</phase>
                    <goals>
                        <goal>build</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!-- Docker maven plugin -->
    </plugins>
</build>

至此,就可以在idea中通过maven插件进行Docker打包上传至Harbor仓库 

三、docker-compose容器编排

1、docker-compose安装

Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装 Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。

curl -L https://github.com/docker/compose/releases/download/1.22.0/docker- compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 
# 设置文件可执行权限 
chmod +x /usr/local/bin/docker-compose 
# 查看版本信息 
docker-compose -version

 卸载Docker Compose

# 二进制包方式安装的,删除二进制文件即可 
rm /usr/local/bin/docker-compose

 2、容器编排

接下来我们使用 docker-compose 构建我们的微服务以及mysql,并逐步讲解其使用。

在项目文件夹下创建 docker-compose.yml文件

先在 docker-compose.yml 文件里添加如下代码,构建我们的项目

version: '2'   
services:
    mysql:
        image: mysql:5.7.38
        hostname: mysql
        container_name: mysql
        restart: always
        networks:
            - learn-docker-network
        volumes:
            - "/tmp/etc/mysql:/etc/mysql/mysql.conf.d/"
            - "/tmp/data/mysql:/var/lib/mysql"
        environment:
            MYSQL_ROOT_PASSWORD: 'root'
    nacos:
        image: nacos/nacos-server
        hostname: nacos
        container_name: nacos
        restart: always
        ports:
            - "8848:8848"
        networks:
            - learn-docker-network
        environment:
            MODE: 'standalone'
            JVM_XMS: '128m'
            JVM_XMX: '128m'
    
    learn-docker-web:
        image: 项目仓库地址/learn-docker-web:1.0-SNAPSHOT
        restart: always
        networks:
            - learn-docker-network
        depends_on:
            - nacos
            - mysql
        volumes:
            - "/tmp/data/logs:/logs"
    learn-docker-storage:
        image: 项目仓库地址/learn-docker-storage:1.0-SNAPSHOT
        restart: always
        networks:
            - learn-docker-network
        depends_on:
            - nacos
            - mysql
        volumes:
            - "/tmp/data/logs:/logs"
    learn-docker-gateway:
        image: 项目仓库地址/learn-docker-gateway:1.0-SNAPSHOT
        restart: always
        ports:
            - "8888:8888"
        networks:
            - learn-docker-network
        depends_on:
            - nacos
            - mysql
        volumes:
            - "/tmp/data/logs:/logs"
networks:
    learn-docker-network:
        driver: bridge

测试是否成功 

curl http://localhost:8888/employeapi/find/10001| python -m json.tool

3、docker-compose文件参数解释(手册)

version

指定 docker-compose.yml 文件的写法格式

docker-compose.yml的version版本号应该和docker的版本进行匹配,如果不匹配可能出现问题。

services

表示多个容器的集合

服务对象

docker-compose.yml管理是以服务为单位管理的,一个services下面可以有多个服务,mysql,app都代表一个服务

image

image是指定服务的镜像名称或镜像 ID,如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。

hostname

配置容器的host名称,在容器的hosts文件中加入了映射

container_name

配置启动后的容器名称和docker的--name xxx效果是一样的

restart

restart参数能够使我们在重启docker时,自动启动相关容器,和docker的--restart效果一致

Docker容器的重启策略如下

  • no,默认策略,在容器退出时不重启容器
  • on-failure,在容器非正常退出时(退出状态非0),才会重启容器
  • on-failure:3,在容器非正常退出时重启容器,最多重启3次
  • always,在容器退出时总是重启容器
  • unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
ports

映射端口的标签,对外暴露的端口定义,和 expose 对应,和docker的-p效果一致

depends_on

这个是依赖配置的选项,意思是如果 服务启动是如果有依赖于其他服务的,先启动被依赖的服务,启动完成后在启动该服务

networks

配置容器所使用的网络

volumes

挂载一个目录或者一个已存在的数据卷容器,和docker -v效果一致

environment

配置环境变量,和docker的 -e效果一致

4、常用命令 

docker-compose up

用于部署一个 Compose 应用

默认情况下该命令会读取名为 docker-compose.yml 或 docker-compose.yaml 的文件

,用户也可以使用 -f 指定其他文件名。通常情况下,会使用 -d 参数令应用在后台启动。

docker-compose stop

停止 Compose 应用相关的所有容器,但不会删除它们。

被停止的应用可以很容易地通过 docker-compose restart 命令重新启动。

如果带有服务命则停止该服务 ,否则停止所有服务

 

docker-compose rm

用于删除已停止的 Compose 应用

 

它会删除容器和网络,但是不会删除卷和镜像

如果带有服务命则删除该服务 ,否则删除所有服务

docker-compose restart

重启已停止的 Compose 应用。

如果用户在停止该应用后对其进行了变更,那么变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。

docker-compose ps

用于列出 Compose 应用中的各个容器。

输出内容包括当前状态、容器运行的命令以及网络端口。

docker-compose down

停止并删除运行中的 Compose 应用。

它会删除容器和网络,但是不会删除卷和镜像。

5、

nacos查看集群情况

我们可以查看nacos,查看当服务器集群的一个部署情况

扩容节点

我们现在对learn-docker-storage节点进行扩容

语法格式:docker-compose up -d --scale 服务名=节点数

docker-compose up -d --scale learn-docker-storage=2

启动后查看nacos节点信息 

 

标签:compose,进阶,harbor,storage,Part3,learn,镜像,docker,Docker
From: https://blog.csdn.net/qq_46248151/article/details/143303083

相关文章

  • React面试常见题目(基础-进阶)
    React面试常见题目及详细回答讲解基础题目(20个)什么是React?回答:React是一个用于构建用户界面的JavaScript库,它允许你将UI拆分成可复用的组件。React起源于Facebook的内部项目,用于构建高性能的Web应用界面。React组件有哪些类型?回答:React组件主要有函数组件和类组件两种类......
  • openwrt解决docker拉取失败问题
    非原创,原文链接:loveyu.org/6115.html背景:在openwrt上的docker拉取失败,提示如下错误:root@openwrt:\~#dockerpulldebianErrorresponsefromdaemon:Get"https://registry-1.docker.io/v2/":contextdeadlineexceeded(Client.Timeoutexceededwhileawaitingheade......
  • Docker+Jenkins:一键自动化部署,让你的项目管理飞跃!
    使用Docker安装Jenkins并实现项目自动化部署是一种高效且便捷的方法。以下是详细的步骤和代码示例,帮助你完成这一过程。一、准备工作安装Docker:确保你的系统已经安装了Docker。如果没有安装,请参考 Docker官方文档进行安装。拉取Jenkins镜像:从DockerHub上拉取Je......
  • 网管平台(进阶篇):网管系统的管理与维护
    随着信息技术的飞速发展,网络环境日益复杂,网络管理系统(简称网管系统)作为监控、配置、故障排除及优化网络性能的关键工具,其重要性不言而喻。一个高效、稳定的网管系统不仅能够提升网络运行效率,还能有效降低运维成本,保障业务连续性。因此,对网管系统进行科学的管理与精心维护,是确保网......
  • autMan奥特曼机器人-对接Docker版本NTQQ详细教程
    准备1、准备一台服务器,amd64/arm64都可以,配置最好还是2核保底吧。2、准备一个VNC软件。1Remote:点此下载3、准备手机登陆机器人QQ号,扫码NTQQ相关NTQQ一键脚本(适用于小白支持autMan/无界)复制以下代码,在服务器发送即可。按照提示步骤输入正确参数,如果出现输错可以自行去......
  • PromQL (Prometheus Query Language)进阶教程
    PrometheusQueryLanguage典型应用场景:在仪表板中可视化Prometheus数据、使用Prometheus的警报管理器构建警报规则等。了解如何构建PromQL是使用Prometheus的一项基本技能,通过上篇文章学习了基础知识,本文带你更深入学习并实践。Prometheusmetrics类型我们已经知道,Promet......
  • 内网机安装docker
    1)关闭防火墙关闭systemctlstopfirewalld禁止开机启动防火墙systemctldisablefirewalld2).下载docker的安装包:可以直接使用该链接进行下载:https://download.docker.com/linux/static/stable/x86_64/docker-20.10.9.tgz也可访问官网选择匹配自己系统的版本进行下载:I......
  • C++:二叉搜索树进阶
    文章目录前言一、二叉搜索树的查找(递归版本)二、二叉树搜索树的插入(递归版本)三、二叉搜索树的删除(递归版本)四、析构函数五、拷贝构造六、赋值重载七、代码总结八、二叉搜索树性能对比九、key_value模型总结前言前面我们学习的二叉搜索树迭代的版本,今天我们来学习递归......
  • MongoDB 部署指南:从 Linux 到 Docker 的全面讲解
    一、MongoDB简介MongoDB是一种NoSQL数据库,以文档模型存储数据,具备高性能、弹性扩展性和分布式架构等特点,非常适用于高并发和大数据量的场景。本文将从Linux和Docker环境开始讲解,帮助读者在不同环境下顺利部署MongoDB。二、在Linux(CentOS)上部署MongoDB2.1......
  • VSCode进阶之路
    VSCode进阶之路:从入门到高效率开发......