一、仓库管理
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.crt
和yourdomain.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