Docker与微服务实战(基础篇)
Docker与微服务实战(基础篇)
- 1、Docker简介
- 2、Docker安装步骤
- 1.Centos7及以上的版本
- 2.卸载旧版本
- 3.yum安装gcc相关
- 4.安装需要的软件包
- 5.设置stable镜像仓库【国内aliyun】
- 6.更新yum软件包索引--以后安装更快捷
- 7.安装Docker-Ce
- 8.启动Docker
- 9.测试
- 10.卸载
- 11.配置阿里云镜像加速
- 3.Docker常用命令
- 帮助启动类命令
- 镜像命令
- 面试题:谈谈虚悬镜像是什么,怎么删除?
- 容器命令【演示用ubuntu】
- 1.拉取镜像
- 2.新建+启动容器
- 3.启动交互式容器(前台命令行)
- 4.列出当前所有正在运行的容器
- 5.退出容器--两种退出方式
- 6.启动已停止运行的容器
- 7.重启容器
- 8.停止容器
- 9.强制停止容器
- 10.删除已停止的容器
- 下载一个Redis6.0.8镜像演示
- 1.启动守护式容器(后台服务器)
- 2.前台交互式启动【不建议】
- 3.查看容器日志
- 4.查看容器内运行的进程
- 5.查看容器内部细节
- 6.进入正在运行的容器并以命令交互
- 7.从容器内拷贝文件到主机上
- 8.导入和导出容器
- 常用命令小结
- 4.Docker镜像
- 分层的镜像
- UnionFS联合文件系统
- Docker镜像加载原理
- 为什么Docker镜像采用这种分层结构呢?
- 重点理解
- docker镜像commit操作案例--演示ubuntu安装vim
- 总结
- 5.本地镜像发布到阿里云
- 本地镜像发布到阿里云流程
- 镜像的生成方法
- 将本地镜像推送到阿里云
- 将阿里云的镜像下载本地
- 6.CentOS7安装DockerCompose
- 6.1.下载
- 6.2.修改文件权限
- 6.3.Base自动补全命令:
- 7.本地镜像发布到私有库--Docker Registry
- 1.下载镜像--创建registry容器并开放端口
- 2.案例演示创建一个新镜像,ubuntu安装ifconfig命令
- 3.curl验证私服库上有什么镜像
- 4.将新镜像ubuntu;修改符合私服规范的Tag
- 5.修改配置文件使之支持http-配置Docker信任地址
- 6.带有图形化界面版本--更改私有库
- 7.push推送到私服库
- 8.curl验证私服库上有什么镜像
- 9.pull到本地并运行
- 8.Docker容器数据卷
- 1.运行一个带有容器卷存储功能的实例
- 2.宿主vs容器之间映射添加容器卷
- 绑定映射目录
- 查看数据卷是否挂载成功
- 容器和宿主机之间数据共享
- 3.容器数据卷读写规则映射添加说明
- 4.卷的继承和共享
- 容器1完成和宿主机的映射
- 容器2继承容器1的卷规则
- 9.Docker常规安装简介
- 1.总体步骤
- 2.安装Tomcat【新版本webapps已改为webapps.dist】
- 1.docker hub上面查找tomcat镜像
- 2.从docker hub上拉取tomcat镜像到本地
- 3.docker images查看是否有拉取到的tomcat
- 4.使用tomcat镜像创建容器实例(也叫运行镜像)
- 5.访问猫首页
- 6.免修改版说明
- 3.安装mysql:5.7
- 简单版
- 1.查询拉取mysql镜像
- 2.使用mysql镜像
- 3.建库建表插入数据
- 4.外部win10连接运行在docker上的Mysql容器实例服务
- 5.中文字符集问题
- 实战版本
- 1.新建mysql容器实例
- 2.新建my.cnf--通过容器卷同步给mysql容器实例
- 3.重新启动mysql容器实例再重新进入并查看字符编码
- 4.再新建库新建表再插入中文测试
- 4.安装redis
- 1.下载redis镜像到本地标签为6.0.8
- 2.入门命令
- 3.命令提醒:容器卷记得加入 --privileged=true
- 4.在Centos宿主机下新建目录/app/redis
- 5.将一个redis.conf文件模板拷贝进/app/redis
- 6. /app/redis目录下修改redis.conf文件
- 7.使用redis6.0.8镜像创建容器(也叫运行镜像)
- 8.测试redis-cli连接上来
- 9.请证明docker启动使用了我们自己指定的配置文件
- 10.测试redis-cli连接上来第2次
- 5.安装Nginx
- endl
编码开发微服务
上线部署容器化
时时刻刻要监控
devops
1、Docker简介
docker官网:https://www.docker.com/
Docker Hub仓库官网:https://hub.docker.com/
Docker hub 安装docker镜像的仓库
Docker中有几个重要的概念:
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。
一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。
而镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。
容器呢,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。
Docker是一个CS架构的程序,由两部分组成:
- 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
- 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。


2、Docker安装步骤
Docker必须部署在Linux内核的系统上,如果其他系统想部署Docker就必须安装一个Linux环境
1.Centos7及以上的版本
uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)
[root@192 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@192 ~]#
[root@192 ~]# uname -r
3.10.0-1160.el7.x86_64
Docker的基本组成:镜像(image)、容器(container)、仓库(repository)
2.卸载旧版本
https://docs.docker.com/engine/install/centos/

sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine \docker-ce
3.yum安装gcc相关
Centos7能上网yum -y install gccyum -y install gcc-c++
4.安装需要的软件包

# 国外网址,容易报错,建议不要照着国外安装
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo报错:
1[Errno 14] curl#35 -TCP connection reset by peer
2 [Errno 12] curl#35 -Timeout
虚拟机联网,安装yum工具
yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken
5.设置stable镜像仓库【国内aliyun】
然后更新本地镜像源:
# 设置docker镜像源
yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo


6.更新yum软件包索引–以后安装更快捷
# 更新yum软件包索引
yum makecache fast
7.安装Docker-Ce

然后输入命令:
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
或者
yum install -y docker-ce
docker-ce为社区免费版本。稍等片刻,docker即可安装成功。
8.启动Docker
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

systemctl start docker # 启动docker服务systemctl stop docker # 停止docker服务systemctl restart docker # 重启docker服务
9.测试
[root@192 docker]# ps -ef | grep docker
root 2001 1 7 13:40 ? 00:00:01 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root 2291 1475 0 13:41 pts/0 00:00:00 grep --color=auto docker
[root@192 docker]#
[root@192 docker]# docker -v
Docker version 24.0.7, build afdd53b
[root@192 docker]#
[root@192 docker]# docker version





10.卸载


# 关闭docker
sudo systemctl stop dockersudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras# 卸载第三方库包
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
11.配置阿里云镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
https://promotion.aliyun.com/ntms/act/kubernetes.html



sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://hjisj8si.mirror.aliyuncs.com"]
}
EOF# 查看文件内容
cat /etc/docker/daemon.json sudo systemctl daemon-reload
# 重启docker
sudo systemctl restart docker

3.Docker常用命令
帮助启动类命令
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help
镜像命令
# 列出本地主机上的镜像
docker images
#列出本地所有的镜像(含历史映像层)
docker images -a
# 只显示镜像ID
docker images -q# 查找镜像
docker search [POTIONS]镜像名字
#只列出N个镜像,默认是25个
docker search --limit
#只列出5个redis镜像
docker search --limit 5 redis# 下载镜像
docker pull 镜像名字[:TAG] {TAG:镜像的标签版本号}
#没有TAG就是最新版本
docker pull 镜像名字
docker pull 镜像名字:latest
docker pull ubuntu
docker pull redis:6.0.8# 查看镜像/容器/数据卷所占的空间
docker system df#删除某个镜像
docker rmi 某个镜像名字ID
#强制删除某个镜像
docker rmi -f 某个镜像名字ID
#强制删除多个镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG
#强制删除多个镜像
docker rmi -f $(docker images -qa)


面试题:谈谈虚悬镜像是什么,怎么删除?
仓库名、标签都是<none>的镜像,俗称虚悬镜像dangling image

对于这样的虚悬镜像一定要删除。
查看虚悬镜像命令
docker images ls -f dangling=true
命令结果:

这种虚悬镜像已经失去了存在价值,可以删除。
删除虚悬镜像命令:
docker image prune

容器命令【演示用ubuntu】
下载一个ubuntu或者Centos镜像演示
1.拉取镜像
#拉取镜像
docker pull centos
docker pull ubuntu
2.新建+启动容器
#新建+启动容器
docker run [OPTIONS] IMAGE [COMMAND][ARG...]
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字" 为容器指定一个名称;
-d : 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i : 以交互模式运行容器,通常与-t同时使用;
-t : 为容器重新分配一个伪输入终端,通常与-i同时使用;也即启动交互式容器(前台有伪终端,等待交互);
3.启动交互式容器(前台命令行)
#启动交互式容器(前台命令行)
docker run -it ubuntu bash
docker run -it ubuntu /bin/bash
docker run -it --name=myu1 ubuntu bash
4.列出当前所有正在运行的容器
#列出当前所有正在运行的容器
docker ps
docker ps [OPTIONS]
OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n :显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
5.退出容器–两种退出方式
#退出容器--两种退出方式
exit run进去容器,exit退出,容器停止
ctrl+p+q run进去容器,ctrl+p+q退出,容器不停止
6.启动已停止运行的容器
#启动已停止运行的容器
docker satrt 容器ID或者名字
7.重启容器
#重启容器
docker resatrt 容器ID或者名字
8.停止容器
#停止容器
docker stop 容器ID或者名字
9.强制停止容器
#强制停止容器
docker kill 容器ID或者名字
10.删除已停止的容器
#删除已停止的容器
docker rm 容器ID
docker rm -f 容器ID
#一次性删除多个容器实例
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm




下载一个Redis6.0.8镜像演示
1.启动守护式容器(后台服务器)
docker pull redis:6.0.8
#启动守护式容器(后台服务器)
-d : 表示服务后台运行模式
docker run -d 容器名
2.前台交互式启动【不建议】
#前台交互式启动【不建议】
docker run -it redis:6.0.8
#启动后台守护式启动(后台运行)
docker run -d redis:6.0.8
3.查看容器日志
#查看容器日志
docker logs 容器ID
4.查看容器内运行的进程
#查看容器内运行的进程
docker top 容器ID
5.查看容器内部细节
#查看容器内部细节
docker inspect 容器ID
6.进入正在运行的容器并以命令交互
#进入正在运行的容器并以命令交互
docker exec -it 容器ID bashShell
或者重新进入【不建议】:
docker attach 容器ID
attach : 直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止
exec : 是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止
推荐大家使用docker exec命令,因为退出容器终端,不会导致容器的停止
[root@192 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e58709da98ef redis "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 6379/tcp vigilant_williams
[root@192 soft]# docker exec -it e58709da98ef /bin/bash
root@e58709da98ef:/data#
root@e58709da98ef:/data# redis-cli -p 6379
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> exit
root@e58709da98ef:/data# exit
exit
[root@192 soft]#


7.从容器内拷贝文件到主机上
#从容器内拷贝文件到主机上
容器->主机
docker cp 容器ID:容器内路径 目的主机路径

[root@192 soft]# docker run -it ubuntu /bin/bash
root@38933ab36249:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@38933ab36249:/# pwd
/
root@38933ab36249:/# cd /tmp
root@38933ab36249:/tmp# touch a2024.txt
root@38933ab36249:/tmp# ll
total 0
drwxrwxrwt. 1 root root 23 Jan 7 10:11 ./
drwxr-xr-x. 1 root root 17 Jan 7 10:08 ../
-rw-r--r--. 1 root root 0 Jan 7 10:11 a2024.txt
root@38933ab36249:/tmp#
[root@192 soft]#
[root@192 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38933ab36249 ubuntu "/bin/bash" 3 minutes ago Up 3 minutes boring_brahmagupta
e58709da98ef redis "docker-entrypoint.s…" 27 minutes ago Up 27 minutes 6379/tcp vigilant_williams
[root@192 soft]# docker cp 38933ab36249:/tmp/a2014.txt /app/soft
Error response from daemon: Could not find the file /tmp/a2014.txt in container 38933ab36249
[root@192 soft]# docker cp 38933ab36249:/tmp/a2024.txt /app/soft
Successfully copied 1.54kB to /app/soft
[root@192 soft]#
[root@192 soft]# ll
总用量 2761172
-rw-r--r--. 1 root root 0 1月 7 18:11 a2024.txt[root@192 soft]# docker exec -it 38933ab36249 /bin/bash
root@38933ab36249:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@38933ab36249:/# exit
exit
[root@192 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38933ab36249 ubuntu "/bin/bash" 6 minutes ago Up 6 minutes boring_brahmagupta
e58709da98ef redis "docker-entrypoint.s…" 31 minutes ago Up 31 minutes 6379/tcp vigilant_williams
[root@192 soft]#
8.导入和导出容器
#导入和导出容器
export 导出容器的内容留作为一个tar归档文件[对应import命令]
docker export 容器ID > 文件名.tarimport 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号cat ubuntu-001.tar | docker import - user/ubuntu:001

[root@192 soft]# docker rm -f 38933ab36249
38933ab36249
[root@192 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e58709da98ef redis "docker-entrypoint.s…" 39 minutes ago Up 39 minutes 6379/tcp vigilant_williams
[root@192 soft]#
[root@192 soft]# cat ubuntu-001.tar | docker import - user/ubuntu:001
sha256:d7ff238c9005c659f4c5819554181bf5c5e56e15c2ad36db66af1acb347423fe
[root@192 soft]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
user/ubuntu 001 d7ff238c9005 15 seconds ago 72.8MB
redis latest 7614ae9453d1 2 years ago 113MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
redis 6.0.8 16ecd2772934 3 years ago 104MB
[root@192 soft]# docker run -it d7ff238c9005 /bin/bash
root@493bd15c2a4c:/# cd /tmp
root@493bd15c2a4c:/tmp# ll
total 0
drwxrwxrwt. 2 root root 23 Jan 7 10:11 ./
drwxr-xr-x. 1 root root 18 Jan 7 10:26 ../
-rw-r--r--. 1 root root 0 Jan 7 10:11 a2024.txt
root@493bd15c2a4c:/tmp#
[root@192 soft]#
常用命令小结
attach Attach to a running container #当前shell 下 attach 连接指定运行镜像
build Build an image from a Dockerfile #通过Dockerfile定制镜像
commit Create a new image from a container changes #提交当前容器为新的镜像
Copy files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container #创建一个新的容器,同run,但不启动容器
diff Inspect changes on a container's filesystem #查看docker容器变化
events Get real time events from the server #从docker服务获取容器实时事件
exec Run a command in an existing container #在已存在的容器上运行命令
export Stream the contents of a container as a tar archive #导出容器的内容流作为一个tar归档文件[对应import]
history Show the history of an image #展示一个镜像形成历史
images List images #列出系统当前镜像
import Create a new filesystem image from the contents of a tarball #从tar包中的内容创建一个新的文件系统映像[对应expor]
info Display system-wide information #显示系统相关信息
inspect Return low-level information on a container #查看容器详细信息
kill Kill a running container # kill指定docker容器
load Load an image from a tar archive #从一个tar包中加载一个镜像[对应save]
login Register or Login to the docker registry server #注册或者登陆一个docker源服务器logout Log out from a Docker registry server #从当前Docker registry退出
logs Fetch the logs of a container #输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT #查看映射端口对应的容器内部源端口
pause Pause all processes within a container #暂停容器
ps List containers#列出容器列表
pull Pull an image or a repository from the docker registry server #从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server #推送指定镜像或者库镜像至docker源服务器
restart Restart a running container #重启运行的容器
rm Remove one or more containers #移除一个或者多个容器
rmi Remove one or more images #移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或-f强制删除]
run Run a command in a new container #创建一个新的容器并运行一个命令
save Save an image to a tar archive #保存一个镜像为一个tar包[对应load]
search Search for an image on the Docker Hub #在docker hub中搜索镜像
start Start a stopped containers #启动容器
stop Stop a running containers #停止容器
tag Tag an image into a repository #给源中镜像打标签
top Lookup the running processes of a container #查看容器中运行的进程信息
unpause Unpause a paused container #取消暂停容器
version Show the docker version information #查看docker版本号
wait Block until a container stops, then print its exit code #截取容器停止时的退出状态值
4.Docker镜像
镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
分层的镜像
以我们的pu为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载>
UnionFS联合文件系统
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot fle system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的LinuxUnix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root fle system),在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, bin, letc等标准目录和文件。roots就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别,因此不同的发行版可以公用bootfs。
为什么Docker镜像采用这种分层结构呢?
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
比如说有多个镜像都从相同的 base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像;同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
重点理解
Docker镜像层都是只读的,容器层是可写的
当容器启动时一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层"之下的都叫“镜像层”。
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
docker镜像commit操作案例–演示ubuntu安装vim
docker commit 提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID要创建的目标镜像名:[标签名]
从Hub上下载ubuntu镜像到本地并成功运行
docker pull ubuntu
原始的默认ubuntu镜像是不带着vim命令的
[root@192 soft]# docker run -it ubuntu /bin/bash
root@7878b5ae864f:/#
root@7878b5ae864f:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@7878b5ae864f:/# vim a.txt
bash: vim: command not found
外网连通的情况下,安装vim
#先更新我们的包管理工具
apt-get update
# 然后安装我们需要的vim
apt-get install vim


root@7878b5ae864f:/# cd /tmp
root@7878b5ae864f:/tmp# vim a.txt
root@7878b5ae864f:/tmp# cat a.txt
this is a docker
安装完成后,commit我们自己的新镜像
docker commit -m="vim cmd add ok" -a="lb" 139727b83d29 itcast/myubuntu:1.1
-a: 指定镜像作者
-m: 自定义的提交描述信息
-139727b83d29: 容器名字,这里也可以用容器ID代替
-itcast/myubuntu:1.1: 指定要创建目标镜像的自定义名字(这里为itcast/myubuntu)和自定义版本(1.1)
[root@192 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
139727b83d29 ubuntu "/bin/bash" 3 minutes ago Up 3 minutes flamboyant_hellman
[root@192 soft]# docker commit -m="vim cmd add ok" -a="ldy" 139727b83d29 itcast/myubuntu:1.1
sha256:1fd9ce6dfd6992d8c7033dccb9d2898e4dc2b99f1babf631db620474e11e2336
[root@192 soft]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
itcast/myubuntu 1.1 1fd9ce6dfd69 58 seconds ago 189MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
启动我们的新镜像并和原来的对比
原来72.8MB 现在189MB
总结
Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。新镜像是从base镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。
5.本地镜像发布到阿里云
本地镜像发布到阿里云流程

镜像的生成方法
基于当前容器创建一个新的镜像,新功能增强
docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
commit我们自己的新镜像
docker commit -m="vim cmd add ok" -a="lb" 139727b83d29
-a: 提交的镜像作者
-m: 提交的说明文字
将本地镜像推送到阿里云

阿里云开发者平台:https://promotion.aliyun.com/ntms/act/kubernetes.html
创建仓库镜像:选择控制台,进入容器镜像服务;选择个人实例;命名空间;仓库名称;进入管理界面获得脚本


将阿里云的镜像下载本地

6.CentOS7安装DockerCompose
6.1.下载
Linux下需要通过命令下载:
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

如果下载速度较慢,或者下载失败,可以使用课前资料提供的docker-compose文件:

上传到/usr/local/bin/目录也可以。
6.2.修改文件权限
修改文件权限:
# 修改权限
chmod +x /usr/local/bin/docker-compose
6.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

7.本地镜像发布到私有库–Docker Registry
搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。
官网地址:https://hub.docker.com/_/registry
1.下载镜像–创建registry容器并开放端口
docker pull registry
- 运行私有库Registry,相当于本地有个私有Docker hub
Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
搭建方式比较简单,命令如下:
docker run -d \--restart=always \--name registry \-p 5000:5000 \-v registry-data:/var/lib/registry \--privileged=true \registry# -p指定端口,一内一外
# -v表示挂载,前者是宿主机,后者是容器
# Docker挂载主机目录访问如果出现cannot open directory .: Permission denied解决办法:在挂载目录后多加一个--privileged=true参数即可
如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,
在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用–prvileged=true命令,扩大容器的权限解决挂载目录没有权限的
问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。
命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。
访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像

2.案例演示创建一个新镜像,ubuntu安装ifconfig命令

[root@192 soft]# docker run -it ubuntu /bin/bash
root@e65d61ff09d8:/# ifconfigroot@e65d61ff09d8:/# apt-get -y install net-toolsroot@e65d61ff09d8:/# ifconfig

[root@192 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e65d61ff09d8 ubuntu "/bin/bash" 3 minutes ago Up 3 minutes objective_leakey
daafa6a212e1 registry "/entrypoint.sh /etc…" 7 minutes ago Up 7 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp registry
98d2c389f54a 1fd9ce6dfd69 "/bin/bash" 26 minutes ago Up 26 minutes objective_meninsky
[root@192 soft]#
[root@192 soft]# docker commit -m="ifconfig cmd add" -a="ldy" e65d61ff09d8 ubuntu:1.2
sha256:811d655579989129269df684b6f4f1fcda542f69988de2005e19a9b610bfd050
[root@192 soft]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 1.2 811d65557998 5 seconds ago 122MB
registry.cn-hangzhou.aliyuncs.com/dockerk8speed/myubuntu1.1 1.1 1fd9ce6dfd69 2 hours ago 189MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
3.curl验证私服库上有什么镜像
指令格式如下所示:
curl -XGET http://主机映射的网络地址:主机映射网络端口/v2/_catalog
防踩坑:如果记得自己映射的主机Registy网络地址就可以直接输入;如果不记得,可以使用docker ps -a查看私服库Registry的网络映射信息(映射网络地址和映射端口)。
[root@192 soft]# curl -XGET http://192.168.229.129:5000/v2/_catalog
{"repositories":[]}
[root@192 registry-ui]# curl -XGET http://192.168.229.129:8080/v2/_catalog
{"repositories":["nginx"]}
可以看到,目前私服库http://192.168.229.129:5000/v2/_catalog没有任何镜像上传过。。。。。。。【空的】
如下图所示,我的本地私有库Registry的网络地址为0.0.0.0,映射端口为5000。

4.将新镜像ubuntu;修改符合私服规范的Tag
推送镜像到私有镜像服务必须先tag,步骤如下:
重新tag本地镜像,名称前缀为私有仓库的地址:192.168.229.129:5000docker tag nginx:latest 192.168.229.129:5000/nginx:1.0
使用命令docker tag 将 tag nginx:latest 这个镜像修改为 192.168.229.129:5000/nginx:1.0
#自己host主机ip地址
按照公式:docker tag 镜像ID或镜像名:Tag Host:Port/Repository:Tag
上面代码的参数含义如下所示:
(1)镜像ID或镜像名:要上传到私有库Registry的镜像ID或名字;
(2)Tag:要上传的镜像版本号;
(3)Host:本地私有库的映射网址(本文为0.0.0.0);
(4)Post:本地私有库的映射端口(本文为5000);
(5)Repository:Tag:上传到私有库Registry后自定义的镜像名字、版本号。
[root@192 soft]# docker tag ubuntu:1.2 192.168.229.129:5000/ubuntu:1.2
[root@192 soft]#
[root@192 soft]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.229.129:5000/ubuntu 1.2 811d65557998 7 minutes ago 122MB
ubuntu 1.2 811d65557998 7 minutes ago 122MB
registry.cn-hangzhou.aliyuncs.com/dockerk8speed/myubuntu1.1 1.1 1fd9ce6dfd69 2 hours ago 189MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
[root@192 soft]#
5.修改配置文件使之支持http-配置Docker信任地址
安装的docker只支持阿里云镜像加速网址的http连接,为了实现镜像上传到私有库Registry,我们还要配置支持本地安装私有库Registry的http连接
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
# 打开要修改的文件
vi /etc/docker/daemon.json
# registry-mirrors配置的是国内阿里提供的镜像加速地址,不用加速的话访问官网的会很慢。
# vim命令添加内容:http://192.168.229.129:8080为自己设置的私服库地址
"insecure-registries":["http://192.168.229.129:8080"]
#上述理由: docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====>修改完后如果不生效.建议重启docker
# 重新加载
systemctl daemon-reload
# 重启docker
systemctl restart docker



6.带有图形化界面版本–更改私有库
使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:
version: '3.0'
services:registry:image: registryvolumes:- ./registry-data:/var/lib/registryui:image: joxit/docker-registry-ui:staticports:- 8080:80environment:- REGISTRY_TITLE=个人私有仓库- REGISTRY_URL=http://registry:5000depends_on:- registry
[root@192 soft]# mkdir registry-ui
[root@192 soft]# cd registry-ui/
[root@192 registry-ui]# ll
总用量 0
[root@192 registry-ui]# touch docker-compose.yml
[root@192 registry-ui]# vim docker-compose.yml
[root@192 registry-ui]#
[root@192 registry-ui]# cat docker-compose.yml
version: '3.0'
services:registry:image: registryvolumes:- ./registry-data:/var/lib/registryui:image: joxit/docker-registry-ui:staticports:- 8080:80environment:- REGISTRY_TITLE=个人私有仓库- REGISTRY_URL=http://registry:5000depends_on:- registry
[root@192 registry-ui]# ll
总用量 4
-rw-r--r--. 1 root root 322 1月 8 07:27 docker-compose.yml
[root@192 registry-ui]# docker-compose up -d
Creating network "registry-ui_default" with the default driver
Pulling ui (joxit/docker-registry-ui:static)...
static: Pulling from joxit/docker-registry-ui
540db60ca938: Pull complete
197dc8475a23: Pull complete
39ea657007e5: Pull complete
37afbf7d4c3d: Pull complete
0c01f42c3df7: Pull complete
d590d87c9181: Pull complete
3333c94ae44f: Pull complete
33d7cca6fc9f: Pull complete
076b2dd9bdd1: Pull complete
b70198f04ee7: Pull complete
1fb6c5acc953: Pull complete
Digest: sha256:b0657b6be748173583516e411bd71552e54cb7d5dda94964726297ce8774415c
Status: Downloaded newer image for joxit/docker-registry-ui:static
Creating registry-ui_registry_1 ... done
Creating registry-ui_ui_1 ... done
[root@192 registry-ui]#
[root@192 registry-ui]#
[root@192 registry-ui]# docker-compose logs -f
Attaching to registry-ui_ui_1, registry-ui_registry_1
ui_1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
ui_1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
ui_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
ui_1 | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
ui_1 | 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf differs from the packaged version
ui_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
ui_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
ui_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/90-docker-registry-ui.sh
ui_1 | /docker-entrypoint.sh: Configuration complete; ready for start up
registry_1 | time="2024-01-07T23:31:22.196329571Z" level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1
registry_1 | time="2024-01-07T23:31:22.196463852Z" level=info msg="redis not configured" go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1
registry_1 | time="2024-01-07T23:31:22.200039301Z" level=info msg="Starting upload purge in 12m0s" go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1
registry_1 | time="2024-01-07T23:31:22.203727763Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1
registry_1 | time="2024-01-07T23:31:22.20447663Z" level=info msg="listening on [::]:5000" go.version=go1.11.2 instance.id=513135ab-7e70-40dc-8e08-70a6164afe97 service=registry version=v2.7.1

7.push推送到私服库
命令格式为:
docker push 符合私服规范的Tag的镜像名称或ID:版本号
docker tag nginx:1.0 192.168.229.129:8080/nginx:1.0
docker push 192.168.229.129:8080/nginx:1.0
docker tag ubuntu:1.2 192.168.229.129:8080/ubuntu:1.2
docker push 192.168.229.129:8080/ubuntu:1.2
8.curl验证私服库上有什么镜像
上传私服库完成,在终端输入命令curl -XGET http://192.168.229.129:8080/v2/_catalog查看私服库上是否有推送的镜像
[root@192 soft]# curl -XGET http://192.168.229.129:8080/v2/_catalog
{"repositories":["nginx","ubuntu"]}
9.pull到本地并运行
使用docker pull命令从私有库拉取镜像到docker中:
docker pull Registry的网络映射:Registry的端口映射/私有库中的镜像名字:版本号
docker pull 192.168.229.129:8080/nginx:1.0
防踩坑:上面的curl指令只显示了私服库上的镜像名字,如为了获得版本号,需要如下指令,需要注意的ubuntu-advanced是要拉取的镜像名字:
curl -XGET http://192.168.229.129:8080/v2/nginx/tags/list

8.Docker容器数据卷
将docker容器内的数据保存进宿主机的磁盘中
1.运行一个带有容器卷存储功能的实例
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
将运用与运行的环境打包镜像,run后形成容器实例运行,但是我们对数据的要求希望是持久化的
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接实时生效,爽
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
2.宿主vs容器之间映射添加容器卷
绑定映射目录
#读写默认
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it --name myubt --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash

查看数据卷是否挂载成功
docker inspect 容器ID

容器和宿主机之间数据共享
1 docker修改,主机同步获得
2 主机修改,docker同步获得
3 docker容器stop,主机修改,docker容器重启看数据成功同步。


3.容器数据卷读写规则映射添加说明
# 可读可写
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
# 容器实例内部被限制,只能读取不能写
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
ro = read only
此时如果宿主机写入内容,可以同步给容器内,容器可以读取到。

4.卷的继承和共享
容器1完成和宿主机的映射
docker run -it --privileged=true -v /tmp/myHostData:/tmp/myDockerData --name u1 ubuntu /bin/bash

容器2继承容器1的卷规则
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntudocker run -it --privileged=true --volumes-from u1 --name u2 ubuntu


9.Docker常规安装简介
1.总体步骤
搜索镜像
拉取镜像
查看镜像
启动镜像 - 服务端口映射
停止容器
移除容器
2.安装Tomcat【新版本webapps已改为webapps.dist】
https://hub.docker.com/
1.docker hub上面查找tomcat镜像


2.从docker hub上拉取tomcat镜像到本地

3.docker images查看是否有拉取到的tomcat

4.使用tomcat镜像创建容器实例(也叫运行镜像)
docker run -it -p 8080:8080 tomcat-p :小写,主机端口:docker容器端口
-P :大写,随机分配端口
-i :交互
-t :终端
-d :后台

5.访问猫首页

可能没有映射端口或者没有关闭防火墙
把webapps.dist目录转成webapps
6.免修改版说明
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8


3.安装mysql:5.7
简单版
1.查询拉取mysql镜像
docker search mysql# 不加版本号5.7,默认拉取的是最新版
docker pull mysql:5.7docker images mysql:5.7


2.使用mysql镜像
docker run -p 3306:3306 --name mq -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7docker psdocker exec -it 容器ID /bin/bashmysql -u root -p

3.建库建表插入数据

4.外部win10连接运行在docker上的Mysql容器实例服务

5.中文字符集问题
show variables like 'character%';


mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
实战版本
1.新建mysql容器实例
docker run \
--name mysql \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /app/mysql/log:/var/log/mysql \
-v /app/mysql/data:/var/lib/mysql \
-v /app/mysql/conf:/etc/mysql/conf.d \
-d \
mysql:5.7
--name : 起名字
--privilege=true : 容器数据卷权限开启
-p : 端口映射
-d : 后台运行
或者
docker run \
--name mysql \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25
编写hmy.cnf
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000

2.新建my.cnf–通过容器卷同步给mysql容器实例
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

3.重新启动mysql容器实例再重新进入并查看字符编码

4.再新建库新建表再插入中文测试
show databases;create database db01;
use db01;
create table t1(id int,name varchar(20));
insert into t1 values(1,'zs'),(2,'lisi'),(3,'王五');select * from t1;show variables like 'character%';drop database db01;

4.安装redis
1.下载redis镜像到本地标签为6.0.8
docker search redis --limit 5docker pull redisdocker images redis

2.入门命令

3.命令提醒:容器卷记得加入 --privileged=true
4.在Centos宿主机下新建目录/app/redis
mkdir -p /app/redis
5.将一个redis.conf文件模板拷贝进/app/redis

- 开启redis验证
requirepass 123456
- 允许redis外地连接,必须注释掉 #bind 127.0.0.1

- daemonize no 后台启动设置为no
将daemonize yes注释起来或者daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败

- 开启redis数据持久化appendonly yes可选

6. /app/redis目录下修改redis.conf文件
默认出厂的原始redis.conf

7.使用redis6.0.8镜像创建容器(也叫运行镜像)
docker run \
--name mr \
--privileged=true \
-p 6379:6379 \
-v /app/redis/redis.conf:/etc/redis/redis.conf \
-v /app/redis/data:/data \
-d redis:6.0.8 \
redis-server /etc/redis/redis.conf命令说明
docker run \ # 创建并运行docker 容器实例
--name mr \ # 给容器起个名称
--privileged=true \ # Docker会赋予容器几乎与主机相同的权限,即获取宿主机root用户权限
--appendonly yes \ # 开启AOF持久化功能
-v /app/redis/redis.conf:/etc/redis/redis.conf \ #容器卷,宿主机地址:docker容器内部地址 redis配置文件挂载
-v /app/redis/data:/data \ #redis数据文件挂载
--net host \ # 使用宿主机的ip和端口,指定网络类型为host,即与宿主机使用同一网络,默认
-d redis:6.0.8 \ # 后台运行 redis镜像和版本号
redis-server /etc/redis/redis.conf \ #运行容器 并使用配置文件启动容器内的 redis-server
--cluster-enabled yes \ # 是否开启redis集群
--port 6386 \ # redis端口号
# -p 6380:6379 \ #宿主机端口号:容器端口 端口映射
# --requirepass 123456 设置密码 (如果你是通过docker 容器内部连接的话,就随意,可设可不设。但是如果想向外开放的话,一定要设置,不然容易中病毒)


8.测试redis-cli连接上来

9.请证明docker启动使用了我们自己指定的配置文件


10.测试redis-cli连接上来第2次

5.安装Nginx
docker search nginx --limit 5docker pull nginxdocker run --name mn -p 80:80 -d nginx# docker run 启动一个镜像
# -d 表示后台允许
# --name mn 表示为当前容器起一个别名
# -p 80:80 表示将本机的80端口映射到nginx镜像的80端口
进入Nginx容器当中
docker exec -it nginx /bin/bash
命令详解:
# docker exec 在运行的容器中执行命令
# -i 以交互模式运行容器,通常与 -t 同时使用;例如-it
# -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;例如-it
# nginx 容器名
# /bin/bash 其实就是表示载入容器后运行bash(命令语言解释程序), 因为docker中必须要保持一个进程(运行的程序)的运行,要不然整个容器就会退出,所以说,bash就担任起了docker中运行的那个进程的角色!
#而/bin/bash则是bash在linux下的位置
endl
相关文章:
Docker与微服务实战(基础篇)
Docker与微服务实战(基础篇) 1、Docker简介2、Docker安装步骤1.Centos7及以上的版本2.卸载旧版本3.yum安装gcc相关4.安装需要的软件包5.设置stable镜像仓库【国内aliyun】6.更新yum软件包索引--以后安装更快捷7.安装Docker-Ce8.启动Docker9.测试10.卸载1…...
「实用分享」如何用Telerik UI组件创建可扩展的企业级WPF应用?
Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成Visual Studio…...
【Docker基础三】Docker安装Redis
下载镜像 根据自己需要下载指定版本镜像,所有版本看这:Index of /releases/ (redis.io) 或 https://hub.docker.com/_/redis # 下载指定版本redis镜像 docker pull redis:7.2.0 # 查看镜像是否下载成功 docker images 创建挂载目录 # 宿主机上创建挂…...
【Flink精讲】Flink数据延迟处理
面试题:Flink数据延迟怎么处理? 将迟到数据直接丢弃【默认方案】将迟到数据收集起来另外处理(旁路输出)重新激活已经关闭的窗口并重新计算以修正结果(Lateness) Flink数据延迟处理方案 用一个案例说明三…...
vue项目心得(复盘)
在编写项目过程中,首先是接手一个需要优化的项目,需要查看vue.config.js环境配置地址,确认好测试地址后进行开发,目前在开发过程中,遇到的最多的问题就是关于组件间的, 组件间传值 1、父组件异步传值&…...
Linux——firewalld防火墙(一)
一、Linux防火墙基础 Linux 的防火墙体系主要工作在网络层.针对TCP/P数据包实时过滤和限制.属于典型的包过滤防火墙(或称为网络层防火墙)。Linux系统的防火墙体系基于内核编码实现.具有非常稳定的性能和高效率,也因此获得广泛的应用.在CentOS 7系统中几种…...
JMeter之Windows安装
JMeter之Windows安装 一、安装JDK二、安装JMeter1、下载JMeter2、配置环境变量3、验证JMeter 三、扩展知识1、汉化 一、安装JDK 略 二、安装JMeter 1、下载JMeter 官网地址:https://jmeter.apache.org/download_jmeter.cgi 放到本地目录下 2、配置环境变量 变量…...
用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战
Retrieval-Augmented Generation(RAG)是一种强大的技术,能够提高大型语言模型(LLM)的性能,使其能够从外部知识源中检索信息以生成更准确、具有上下文的回答。 本文将详细介绍 RAG 在 LangChain 中的应用&a…...
正则表达式的语法
如果要想灵活的运用正则表达式,必须了解其中各种元素字符的功能,元字符从功能上大致分为: 限定符 选择匹配符 分组组合和反向引用符 特殊字符 字符匹配符 定位符 我们先说一下元字符的转义号 元字符(Metacharacter)-转义号 \\ \\ 符号…...
MyBatis分页插件的实现原理
MyBatis 分页插件的实现原理是通过拦截器(Interceptor)来实现的。拦截器可以在 SQL 执行前后对 SQL 进行拦截和处理。 简单来说,就是通过在查询语句中添加额外的参数和逻辑,以支持分页功能。它的核心思想是将分页参数传递给插件&…...
Winform、WPF如何解决前端卡死问题
在WinForms和WPF中,前端卡死问题通常是由于长时间的计算或阻塞操作导致的。以下是一些解决前端卡死问题的常见方法: 使用异步操作:将长时间的计算或阻塞操作放在后台线程中执行,以避免阻塞UI线程。可以使用Task、async/await等异步…...
python内app自动化测试的局限性,该如何破局?
Python在App自动化测试方面非常流行,尤其对于移动应用(Android和iOS)的测试,可以借助于像Appium、Robot Framework等工具进行跨平台自动化。然而,即使使用Python这样的强大语言,App自动化测试也存在一些局限…...
k8s的node亲和性和pod亲和性和反亲和性 污点 cordon drain
node亲和性和pod亲和性和反亲和性 污点 cordon drain 集群调度: schedule的调度算法 预算策略 过滤出合适的节点 优先策略 选择部署的节点 nodeName:硬匹配,不走调度策略,node01 nodeSelector:根据节点的标签选择,会走调度的算法 只…...
IntelliJ IDEA如何使用固定地址公网远程访问本地Mysql数据库
文章目录 1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql小结 5. 固定连接公网地址6. 固定地址连接测试 IDEA作为Java开发最主力的工具,在开发过程中需要经常用到数据库,如Mysql数据库,但是在IDEA中只能连接本…...
GIT - 清除历史 Commit 瘦身仓库
目录 一.引言 二.仓库清理 ◆ 创建一个船新分支 ◆ 提交最新代码 ◆ 双指针替换分支 三.总结 一.引言 由于项目运行时间较长,分支较多,且分支内包含很多不同的大文件,随着时间的推移,历史 Git 库的容量日渐增发,…...
物联网产品中,终端、网关、协议、PaaS、SaaS之间的关系
在互联网产品中,经常提到的终端、网关、协议、PaaS、SaaS之间,到底有什么关系呢? 一、基本概念 在百度/其他地方搜集的信息中,对于终端、网关、协议、PaaS、SaaS的解释各有不同,整理如下: 终端࿱…...
6款实用的Git可视化管理工具
前言 俗话说得好“工欲善其事,必先利其器”,合理的选择和使用可视化的管理工具可以降低技术入门和使用门槛。我们在团队开发中统一某个开发工具能够降低沟通成本,提高协作效率。今天给大家分享6款实用的Git可视化管理工具。 Git是什么&…...
python_selenium零基础爬虫学习案例_知网文献信息
案例最终效果说明: 去做这个案例的话是因为看到那个博主的分享,最后通过努力,我基本实现了进行主题、关键词、更新时间的三个筛选条件去获取数据,并且遍历数据将其导出到一个CSV文件中,代码是很简单的,没有…...
MindSpore Serving基于昇腾910B实现大模型部署
一、Why MindSpore Serving 大模型时代,作为一个开发人员更多的是关注一个大模型如何训练好、如何调整模型参数、如何才能得到一个更高的模型精度。而作为一个整体项目,只有项目落地才能有其真正的价值。那么如何才能够使得大模型实现落地?如…...
mysql原理--InnoDB的Buffer Pool
1.缓存的重要性 对于使用 InnoDB 作为存储引擎的表来说,不管是用于存储用户数据的索引(包括聚簇索引和二级索引),还是各种系统数据,都是以 页 的形式存放在 表空间 中的,而所谓的 表空间 只不过是 InnoDB 对…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...







