首页
网站导航
关于
Search
1
解决Typecho Joe主题访问fastly.jsdelivr.net速度慢的方案 | 快速优化技巧
2,188 阅读
2
解决WSL2内存不释放问题的最佳指南
1,398 阅读
3
如何在 Typecho Joe 主题的文章中增加目录
1,170 阅读
4
如何解决Win11电脑桌面上方显示横线问题 | 窗口11教程
1,003 阅读
5
GO语言环境的搭建教程 - 完全指南
1,002 阅读
默认分类
编程语言
GO语言
PHP
Node
javascript
html
rust
java
Css
Python
资源分享
chrome插件
阅读思考
运维架构
redis
Nginx
linux
memcached
mongodb
mysql
windows
docker
k8s
Mq
apache
CI
Git
swoole
elk
系统设计
thinkPhp
beego
登录
Search
标签搜索
重要
go基础
git 命令
go包
phpstorm
sublime
thinkphp6
mysql问题
软件分享
redis命令
php基础
thinkphp3.2
php第三扩展包
小蚯蚓博客
累计撰写
333
篇文章
累计收到
48
条评论
首页
栏目
默认分类
编程语言
GO语言
PHP
Node
javascript
html
rust
java
Css
Python
资源分享
chrome插件
阅读思考
运维架构
redis
Nginx
linux
memcached
mongodb
mysql
windows
docker
k8s
Mq
apache
CI
Git
swoole
elk
系统设计
thinkPhp
beego
页面
网站导航
关于
搜索到
129
篇与
的结果
2024-04-05
Centos7-Linux环境下安装Git2.3高版本超详细图文教程
Git介绍 Git — The stupid content tracker, 傻瓜内容跟踪器。Linus Torvalds 是这样给我们介绍 Git 的。 Git 是用于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什么样的服务端,使用http协议或者git协议等不太一样。并且在push和pull的时候和服务器端还是有交互的。),使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。 安装Git前期准备 使用以下命令检查服务器是否已经安装了Git #查看是否安装git,如果出现下面的则说明已经安装过了git,需要卸载 git --version #卸载git命令 yum remove git 若出现以上版本号,则代表已经安装了git,不需要再次安装了,否则就安装,其实安装的话,分为用yum安装和下载git源码编译安装。但是cetos5以及以下版本中的yum都没有git,无法使用yum安装,而cetos6可以使用yum安装git,但是安装的git是1.7.1版本的,而github需要的git版本最低都不能低于1.7.2。所以如果是cetos7以及以上版本的,推荐使用yum安装,方便,如果是cetos7以下的,请使用git源码编译安装git。下面展示这两种安装步骤: 编译安装Git 使用yum命令安装 #yum源中安装的git版本是1.7.1,Github等需要的Git版本最低都不能低于1.7.2 yum -y install git #查看git的版本号 git --version #因为版本要求,我们一般不用上面的方法,而是下载git源码编译安装 通过编译源码安装Git (支持高版本Git的安装) 安装编译 Git 所需要的依赖: yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker 安装编译源码所需依赖的时候,yum 自动安装了 Git,需要先卸载这个旧版的 Git: yum -y remove git 下载Git,选择你需要的版本下载即可 1.手动下载地址:https://mirrors.edge.kernel.org/pub/software/scm/git/ 2.通过wget命令下载 #进入src目录,或者你想下载到那个目录 cd /usr/local/src #执行下载命令 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.31.1.tar.gz --no-check-certificate 3.官网下载:https://git-scm.com/downloads 下载完成后通过Xshell等工具将压缩包上传到服务器指定目录,我是上传到 /usr/local/src下的 解压到 /usr/local/src 目录下 tar -zxvf git-2.31.1.tar.gz -C /usr/local/src/ 编译安装 #进入解压后的目录 cd /usr/local/src/git-2.31.1/ #执行编译安装 ./configure --prefix=/usr/local/git make make install 设置环境变量 echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/profile source /etc/profile 验证版本后是否正常 [root@honghua-centos-02 ~]# git --version git version 2.31.1 若上述步骤初夏如下显示,则表示当前git为系统自动带git [root@iZbp1flzt6x7pxmxfhmxeeZ git-2.31.1]# git --version git version 1.8.3.1 卸载系统自带的git(前面如果执行了,这里不用在执行了) #卸载系统自带git yum remove git -y #重新执行如下命令更新环境变量 source /etc/profile #再次查看版本,如下表示OK [root@honghua-centos-02 ~]# git --version git version 2.31.1 总结 至此在Centos7-Linux下安装Git 2.3.1已经全部完成,如果按照上述步骤没有成功,那我建议你卸载Git再去看看别人写的步骤把
2024年04月05日
42 阅读
0 评论
0 点赞
2024-04-05
CentOS 7.9安装搜狗输入法教程 - 详细步骤和方法
总览 1.如何在 centos7.x 中使用 搜狗输入法 安装依赖 切换至 root 用户 su root 更新 yum yum update 卸载 ibus rpm -e --nodeps ibus 安装 epel 源 yum -y install epel-release 安装 fcitx 环境、qtwebkit包 和 alien 转换工具等(可以将 .deb 文件转为 .rpm 文件) yum install -y qtwebkit yum install -y fcitx* yum install -y alien yum install -y redhat-lsb # fcitx-configtools 要依赖此包中的内容 下载 2.2.0版本 的 linux 搜狗输入法 cd 至 downloads 目录,或者其他的目录,将这个 .deb 文件下载至此目录 wget http://cdn2.ime.sogou.com/dl/index/1524572264/sogoupinyin_2.2.0.0108_amd64.deb 使用 alien 强制转换 deb 文件 至 rpm 文件 alien -r --scripts sogoupinyin_2.2.0.0108_amd64.deb 强制安装 转换后的搜狗输入法安装文件 rpm -ivh --force sogoupinyin-2.2.0.0108-2.x86_64.rpm 将搜狗输入法词语库转移至 fcitx cp /usr/lib/x86_64-linux-gnu/fcitx/fcitx-sogoupinyin.so /usr/lib64/fcitx/ 为新目录授权 chown -R 776 /usr/share/fcitx-sogoupinyin/ 检查 QT 依赖及 fcitx-configtool、fcitx-pinyin yum -y install fcitx-qt5 fcitx-configtool yum -y install fcitx-pinyin 修改环境变量 vim /etc/profile 在文件末尾添加内容 export XIM_PROGRAM=fcitx export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS="@im=fcitx" 在非 root 用户下开启 fcitx、fcitx-configtools 重新打开终端,并运行 fcitx -r fcitx-configtool 添加 pinyin 注意!是 pinyin 而不是 SogouPinYin!否则会报错! 如果不能显示出任何输入法,则直接重启,再重复 13. 重新启动 reboot 若无法正常使用 请多次尝试 重复 13~14 步骤,并重新检查依赖项是否已经 OK
2024年04月05日
48 阅读
0 评论
0 点赞
2024-04-05
解决 WSL 下 CentOS pycharm 2022.3.X FCITX 输入法不跟随光标问题
概述 在使用pycharm时,输入中文候选框总是在窗口左下角,不能随光标移动,输入时十分不便。网络上已经有一些解决方法,但版本变化后佬们编译好的已经不能立等可取了。 参考链接 很多人在讨论这个问题 解决方法 统一解决方案:更新pycharm 直接更新pycharm到2023.3.2,这个问题已经被官方修复了(PS:整整花了十年修复hhh) 针对不想更新的情况 点击链接下载jbr 解压缩并将其复制到pycharm安装目录下 打开pycharm,使用Ctrl+Shift+A,输入Choose Boot Java Runtime for the IDE 依次点选新建,添加自定义运行时,添加JDK,选择位置,选择解压缩后的文件夹 重启pycharm 针对ibus 没有找到什么有效方法,建议更换输入法(bushi
2024年04月05日
33 阅读
0 评论
0 点赞
2024-03-16
Docker 容器编排 - 最佳实践与技术指南
概述 通过容器编排,可以实现以下这些功能: 依赖管理,当一个容器必须在另一个容器运行完成后,才能运行时,就需要进行依赖管理 副本数控制,容器有时候也需要集群,快的对容器集群进行版本弹性伸缩 配置共享,通过配置文件统一描述需要运行的服务相关信息,自动化的解析配置内容,并构建对应的服务 docker compose Compose 是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用 YML文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从YML文件配置中创建并启动所有服务。 只能单机环境的容器编排,在单机上部署多个容器会变的比较方便。 docker compose 是对docker操作的增强。 安装 安装的时候,需要注意compose 的版本和docker的版本要对应上,不能太低 # 用阿里云的,看了下1.21.2好像是最新的18年最新更新 # $(uname -s)-$(uname -m) 是获取系统和架构 sudo curl -L "http://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 下载最新版本的话,用这个 curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 将可执行权限应用于二进制文件: sudo chmod +x /usr/local/bin/docker-compose 创建软链: sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose 测试是否安装成功: docker-compose --version compose.yml 编写 内容比较多,可以看官方文档:https://docs.docker.com/compose/compose-file/compose-file-v2/ compose.yml配置样例,yaml是个key value配置,value和冒号之间需要有空格。上下行之间有上下级关系的,如果下一行有缩进2个空格,则表示是上一行的子集。 version: "2.1" services: # 相当于一个容器,nginx-demo是随便起的 nginx-demo: image: "nginx" container_name: "nginx_compose" restart: "always" # - 的话相当于数组 networks: - wolfcode_net volumes: - /usr/local/www:/usr/share/nginx/htm # 环境变量配置 environment: APP_ENV: dev # 指定dns解析服务 dns: - 114.114.115.115 # 端口映射 ports: - 80:80 # 配置公共网卡 networks: wolfcode_net: driver: bridge ipam: driver: default config: - subnet: 188.18.0.0/16 gateway: 188.18.0.1 服务services配置 需要运行的容器配置,可以理解为原先用docker run命令后面跟的一系列配置信息,都配在这个下面。 网络networks配置 docker-compose 公共自定义网络管理,配置好以后,可以直接在services中引用该网络配置,这个配置可以多个service使用,例如自定义网卡配置 数据卷volumes docker-compose 下统一数据卷管理,可以给多个services用 compose 命令 配置检查 检查配置文件是否正确,会自动查找当前目录下是否有docker-compose.yml,并且检查是否正确 docker-compose config create 创建服务,这个只是创建容器,默认是没有运行的 # 创建docker-compose.yml里的所有services docker-compose create # 只创建docker-compose.yml里的nginx_demo services docker-compose create nginx-demo up 如果要运行的话,这个是针对第一次,或者如果docker-compose.yml文件有更新,需要重新应用最新的配置内容的话,可以使用下面命令,会自动根据最新配置补齐内容。 如果是已经有的容器,启动的话还是得用start命令 # 运行docker-compose.yml所有服务 docker-compose up -d # 只运行nginx-demo服务 docker-compose up -d nginx-demo ps 查看运行中的容器 docker-compose ps stop 停掉服务 docker-compose stop down 停掉并且删除容器等资源,甚用 docker-compose down start 启动服务 docker-compose start restart 重新启动服务 docker-compose restart scale 扩容缩容 快速启动多个服务,需要注意的是,这个时候不能指定容器名container_name: "nginx_compose",不能和主机绑定端口,不然会冲突,导致失败 services: # container_name: "nginx_compose" # 改为只暴露端口即可 ports: - 80 然后执行 # 如果原来只有3个,会增加2个 docker-compose scale nginx-demo=5 # 如果原来是5个,会自动停止2个 docker-compose scale nginx-demo=3 查看日志 查看所有服务的日志 # 查看所有服务的日志 docker-compose logs 指定查看某个服务的日志 # 查看所有服务的日志 docker-compose logs -f nginx-demo swarm 分布式 是在docker官方的,在k8s后面出来的。可以在多个机器上创建容器,可以微服务部署。在docker 1.12后,已经自带swarm了。 架构图如下所示,有个机器当做主节点,管理众多的从节点机器。 有多个管理节点,每个管理节点管理了多个worker节点,如果管理节点都挂了,基于raft协议,从工作节点里选一个当做管理节点。 我们可以利用swarm,配置很多个服务services,然后把这个服务交给节点node创建,node节点以task的形式创建。 服务的生命周期 集群搭建 集群创建 在master节点上创建管理节点,需要注意的是,管理节点也算是个工作节点 # 指定主节点的ip地址,这个地址是这台机器的地址 docker swarm init --advertise-addr 192.168.113.120 去对应的工作节点上执行上述命令即可加入集群。最好先把防火墙关闭了,不然有可能没法访问。 如何查看有几个节点呢 # master 节点上执行 docker node ls 服务创建 每个节点都创建2个nginx docker service create --replicas 2 -p 80:80 --name nginx_swarm nginx 如果有问题题话,可以删除重新创建,注意防火墙网络问题 docker service ls docker service rm 服务名称 这样就可以用相关的命令在master节点整个集群容器的数量。 拓展 最后可以用portainer来可视化管理
2024年03月16日
52 阅读
0 评论
0 点赞
2024-03-15
Docker 仓库 (Registry) - 扩展Docker 软件的资源存储
概述 通过仓库,可以把镜像存在公司的内网,速度比较快,并且比较安全。 常见的仓库 docker hub 地址是:https://hub.docker.com 阿里云私有 https://cr.console.aliyun.com/cn-hangzhou/instance/repositories,这里面都有使用说明 推送 首先要登录 # 执行后,会提示输入密码,输入阿里云密码就好了 docker login --username=iwuqiyin registry.cn-hangzhou.aliyuncs.com 镜像打tag,自己registry的tag会比较有点长 docker tag 5d0da3dc9764 registry.cn-hangzhou.aliyuncs.com/iwuqiyin/snapshot:1.0.0 最后推送即可 docker push registry.cn-hangzhou.aliyuncs.com/iwuqiyin/snapshot:1.0.0 拉取 # 登录 docker login --username=iwuqiyin registry.cn-hangzhou.aliyuncs.com # pull docker pull registry.cn-hangzhou.aliyuncs.com/iwuqiyin/snapshot:1.0.0 自主搭建(私服仓库) nexus,这是java生态 容器启动 # 8868是网页 5000是推送的,5001是拉取 docker run -d --restart=always -p 8868:8081 -p 5000:5000 -p 5001:5001 --name nexus -v /opt/docker/nexus:/nexus-data sonatype/nexus3 然后访问:http://主机ip:8868,即可,这个估计要等下才能访问,可以通过`docker logs -f -n 50 nexus`,看下是否启动成功 详细设置使用,自行百度 # http的服务docker默认不允许,需要配置这个允许,配置完要重启 vim /etc/docker/daemon.json 镜像推送拉取的流程,和阿里云的一样。私有的仓库,像基础镜像,如果本地仓库没有,就会通过代理从远程下载到本地仓库,然后下次本地仓库就会有这个镜像了。 详细:https://www.bilibili.com/video/BV1PT411d7ci/?p=42&spm_id_from=pageDriver&vd_source=c38eab5c82d0c7cca57364b72f733942 harbor 除了Docker Hub以外最早的一个比较受欢迎的 Docker企业级Registry服务器。对资源要求比较高,内存至少要4GB,功能比较强大。 详细:https://www.bilibili.com/video/BV1PT411d7ci/?p=44&spm_id_from=pageDriver&vd_source=c38eab5c82d0c7cca57364b72f733942
2024年03月15日
58 阅读
0 评论
0 点赞
2024-03-15
Dockerfile 使用 - 最佳实践和技巧
概述 Docker 为我们提供的一个用于自定义构建镜像的一个配置文件:描述如何构建一个对象。 利用Docker提供的build命令,指定Dockerfile文件,就可以按照配置的内容将镜像构建出来。 构建镜像 commit 基于现有的容器,来构建一个新的镜像,我们可以修改nginx默认容器里的某些内容,比如改写配置,然后重新打包成镜像,这样的话新生成的镜像,下次运行容器的话,就是我们改好的那个,这个只要了解下即可,工作中用的少。 # -a 镜像作者 -m 镜像描述 nginx_commit是要打包成镜像的容器名称 打包成的镜像名称 docker commit -a "xiaoliu" -m "my nginx container" nginx_commit mynginx:latest build dockerfile的规则 # -t 表示基于dokcerfile来构建 .表示从当前目录找dockerfile docker build -t myImageName:1.0.0 . 常用指令 FROM 指定以什么镜像作为基础镜像,在改进项的基础之上构建新的镜像,如果不想以任何镜像作为基础:FROM scratch,语法: FROM <image> FROM <image>:<tag> FROM <image>:<digest> 以上为三种写法,后两者为指定具体版本,第一种则使用latest也就是最新版 MAINTAINER(可选) 维护者,述这个镜像的作者,以及联系方式(可选),一般开源的软件才需要 MAINTAINER wuqiyin<silverwq@qq.com> LABEL(可选) 为镜像设置标签,一个Dockerfile中可以配置多个LABEL,语法: LABEL <key>=<value> 例如: LABEL "example.label"="Example Label" LABEL label-value=LAWEL LABEL version="1.0.0" LABEL description="可以写成多行,使用\ 符号可以拼接多行的value" ENV 设置容器的环境变量,可以设置多个,语法: ENV <key> <value> ENV <key>=<values <key>=<value> ... 两种语法的区别为: 第一种一次只能设置一个环境变量 第二种可ockerfile以一次设置多个 RUN 构建镜像的过程中要执行的命令,语法: RUN <command> RUN["executable","param1","param2","paramN"] 第一种写法就是直接写Shell脚本即可 第二种写法类似函数调用,第一个参数为可执行文件,后面的都是参数 ADD 复制命令,把主机中src的文件复制到镜像的dest位置,语法: # ADD *.jar /app.jar # 可以相对目录,模糊匹配 ADD <src> <dest> ADD ["<src>", "<dest>] 需要注意的是,如果add的是压缩包,则会自动解压 # 当前目录的解压到容器的/usr/local/src ADD nginx-1.21.tar.gz /usr/local/src WORKDIR 设置容器中的工作目录,如果该目录不存在,那么会自已创建,然后进入该目录 VOLUME 设置挂载目录,可以将主机中的指定目录挂载到容器中,语法: VOLUMET ["<dir>"] VOLUME <dir> VOLUME <dir> <dir> 例如 VOLUME /data 这里的挂载的/data目录就会在运行时自动挂载为匿名卷,任何向容器的 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。这个匿名卷不同于启动命令行里指定的匿名卷,容器被删除的时候,匿名卷也不会被删除 EXPOSE 该镜像运行容器后,需要暴露给外部的端口,但仅仅表示该容器内暴露了该端口,并不会与主机端口有映射关系,如果想将容器暴露的端口与主机映射则需要使用-p或-P参数来映射,可以暴露多个端口 语法: EXPOSE <port>/<tcp/udp> 这个最好都要暴露端口,不然的话使用-P参数的时候,不会自动绑定 # -P参数不会自动绑定 docker run -d -P 自定义镜像名称 CMD 该镜像启动容器时默认执行的命令或参数 语法: # 例如:CMD ["sh","-c","ping 127.0.0.1"] CMD ["executable","param1","param2"] CMD ["param1","param2"] # 例如:CMD ping 127.0.0.1 CMD <command> <param1> <param2> 以上为该命令的三种写法,第三种与普通Shel命令类似,第一、二两种都是可执行文件+参数的形式,另外数组内的参数必须使用双引号。 如果dockerfile里有多个cmd,只会最后一个生效,并不会报错 ENTRYPOINT 运行容器时的启动命令,感觉与CMD命令会很像,实际上还是有很大区别,简单对比一下: 相同点: 在整个Dockerfile中只能设置一次,如果写了多次则只有最后一次生效 不同点: ENTRYPOINT不会被运行容器时指定的命令所覆盖,而CMD会被覆盖,例如 docker run xxx /bin/bash,这里的/bin/bash会把cmd里的命令给覆盖了,但是entrypoint里的不会被覆盖 如果同时设置了这两个指令,且CMD仅仅是选项而不是参数,CMD中的内容会作为ENTRYPOINT的参数(一般不这么做) 如果两个都是完整命令,那么只会执行最后一条 语法: ENTRYPOINT ["executable","param1","param2"] # 例如:ENTRYPOINT ping 127.0.0.1 ENTRYPOINT <command> <param1> <param2> ARG 设置变量,在镜像中定义一个变量,当使用docker build命令构建镜像时,带上 --build-arg <name>=<value> 来指定参数值,如果该变量名在Dockerile中不存在则会抛出一个警告 语法: ARG <name>[=<default value>] USER 设置容器的用户,可以是用户名或UID,如果容器设置了以daemon用户去运行,那么RUN、CMD和ENTRYPOINT都会以这个用户去运行,一定要先确定容器中有这个用户,并且拥有对应的操作权限。 语法: USER <username> USER <PID> ONBUILD 表示在构建镜像时做某操作,不过不对当前Dockerfile的镜像生效,而是对以当前Dockerfile镜像作为基础镜像的子镜像生效,主要是为子镜像做一些操作 语法: ONBUILD [INSTRUCTION] 例: 当前镜像为A,设置了如下指令 ONBUILD RUN ls -al 镜像B:FROM 镜像A STOPSINNAL STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。此信号可以是与内核的系统调用表中的位置匹配的有效无符号数,例如9,或SIGNAME格式的信号名,例如SIGKILL。 构建镜像默认的stop-signal是SIGTERM,在docker stop的时候会给容器内PID为1的进程发送这个signal,通过--stop-signal可以设置自己需要的signal,主要的目的是为了让容器内的应用程序在接收到signal之后可以先做一些事情,实现容器的平滑退出,如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,这个时间默认是10%。 STOPSIGNAL <signal> HELATHCHECK 容器健康状况检查,可以指定周期检查容器当前的健康状况,该命令只能出现一次,如果有多次则只有最后一次生效。 语法: THEALTHCHECK [OPTIONS] CMD command HEALTHCHECK NONE 第一种:在容器内部按照指定周期运行指定命令来检测容器健康状况 第二种:取消在基础镜像 OPTIONS选项: --interval=DURATION 两次检查的间隔时间,默认30S --timeout=DURATION 命令执行的超时时间,默认30s --retries=N 当连续失败指定次数,容器会被认定为不健康,默认为3次 返回参数: 0表示success,监控状态 1表示failed,不健康状态 2表示reserved,保留值 dokerfile 样例 普通样例 # 1. 先指定当前镜像的基础镜像 ARG jdkversion=8 # docker built -t --build-arg jdkversion=11 FROM openjdk:$jdkversion # 要提前新增用户 RUN user add wolfcode #拓展:表示后续容器中所有执行命令的操作都是以wolfcode这个用户操作的 USER wolfcode # 2.描述这个镜像的作者,以及联系方式(可选) MAINTAINER wuqiyin<silverwq@qq.com> # 3.镜像的标签信息(可选) LABEL version="1.0" LABEL description="这是我的第一个Dockerfile" # 4. 环境变量 ENV JAVA_ENV=dev ENV APP_NAME test-dockerfile # 5. 在构建镜像的时候,需要执行的 shell 命令 RUN ls -al RUN mkdir /www/dockerfile/test # 6.将主机中的指定文件复制到容器的目标位置,可以简单理解为 CP 命令 ADD /usr/local/www /www # 7.设置容器中的工作目录,如果该目录不存在,那么会自已创建,然后进入该目录 WORKDIR /app # 在设置完工作目录后,执行pwd 命令,打印的目录就是/app RUN pwd # 8.镜像数据卷绑定,将主机中的指定目录挂载到容器中,也就说容器内部也会有个一模一样的目录,他们自己是相通的 VOLUME ["/usr/local/www"] # 9.设置容器启动后要暴露的端口 EXPOSE 8080/tcp # CMD和ENTRYPOINT选择其一即可,作用是描述镜像构建完成后,启动容器时默认执行的脚本 # CMD ping 127.0.0.1 CMD ["sh","-c","ping 127.0.0.1"] # 健康检查,每隔10s,检查容器是否正常,每次检查的操作不能超过3s,并且如果失败了,最多不能超过3次 HEAlTHCHECK --interval=10 --timeout=3 --retries=5 CMD ps -ef | grep java | exit 1 nginx 源码构建 #基准镜像 FROM centos:7 #作者信息 LABEL version="nginx v1" LABEL "emill"="243254384@qq.com" #调整系统时间差 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #工作目录 WORKDIR /usr/local/src/ #定义环境变量 ENV NG_VERSION nginx-1.21.0 #安装epel仓库 RUN yum -y install epel-release #安装wget RUN yum -y install wget #下载nginx文件并解压 RUN wget http://nginx.org/download/$NG_VERSION.tar.gz && tar xzvf $NG_VERSION.tar.gz #安装编译依赖包 RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y pcre-devel libxslt-devel gd-devel GeoIP GeoIP-devel GeoIP-data #清理仓库 RUN yum clean all #创建nginx用户 RUN useradd -M -s /sbin/nologin nginx #切换工作目录 WORKDIR /usr/local/src/$NG_VERSION #编译安装nginx RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install #复制测试页面到容器中 # 本地需要有index.html文件 ADD index.html /usr/local/nginx/html #设置容器中要挂在到宿主机的目录 VOLUME /usr/local/nginx/html #设置sbin环境变量 ENV PATH /usr/local/nginx/sbin:$PATH #暴露80端口 EXPOSE 80/tcp ENTRYPOINT ["nginx"] CMD ["-g","daemon off;"] # 不要守护进程方式运行,不然docker会没有进程占用,就会退出容器 #当ENTRYPOINT和CMD连用时,CMD的命令是ENTRYPOINT命令的参数,两者连用相当于nginx -g "daemon off;"而当一起连用的时候命令格式最好一致(这里选择的都是json格式的是成功的,如果都是sh模式可以试一下) 将上述dockerfile保存,然后执行 docker build -t wuqiyin_nginx:1.0.0 .
2024年03月15日
52 阅读
0 评论
0 点赞
2024-03-14
Docker 网络通信: 最佳实践和解决方案
概述 容器内部的网络是独立的,但是有时候又需要不同容器之间的网络进行共享通信。 网络模式 docker 里的网络模式就桥接、host、none三种 docker network ls bridge 桥接 在主机中创建一个docker0的虚拟网桥,主机网卡和docker0连接,在docker0(可以理解为虚拟的交换机)上创建多对虚拟网卡,有一半在主机上vethxxx,一半在容器内eth0。 外部主机通过访问宿主机的网卡ens160,然后ens160可以访问桥接网卡docker0,docker0上通过ip转发的方式,转发到相应的veth网卡上,这个veth网卡都有相应的容器eth0网卡和它互相通信连接,这样就实现了网络链路的打通。 特点: 容器之间是在同一个子网里,可以互相访问到 外部网络必须通过主机桥接才能访问到容器,容器得到很好的隔离 容器之间只能通过ip访问,如果想要通过容器名称访问,需要指定-link参数,而且只能单向访问 实验 以桥接模式启动容器 # --net bridge 指定桥接模式 docker run -d --rm -P --name docker_net1 --net bridge centos ping 127.0.0.1 docker run -d --rm -P --name docker_net2 --net bridge centos ping 127.0.0.1 通过这种模式启动的话docker_net1只能通过ip访问到docker_net2,而不能通过容器名称访问。 docker exec -it docker_net1 ping 172.17.0.3 查看docker_net2的ip地址 不过工作中,实际不会通过ip来访问,希望通过容器名称访问,这样比较方便。 docker run -d --rm -P --name docker_net1 centos ping 127.0.0.1 # --link关联到docker_net1 docker run -d --rm -P --name docker_net2 --link docker_net1 centos ping 127.0.0.1 这种模式,只能docker_net2访问到docker_net1,docker_net1 无法访问到docker_net2,只能单向访问。 # 这样docker_net2就可以访问docker_net1 docker exec -it docker_net2 ping docker_net1 -link的实现原理是,在docker_net2里设置了host host 主机模式 容器不再拥有自己的网络空间,而是直接与主机共享网络空间,那么基于该模式创建的容器对应的ip实际就是与主机同一个子网,同一个网段。基于主机模式,相当于把容器给暴露出去了,因为和宿主机同个子网,不仅宿主机可以访问容器,外部网络也可以直接范围容器。 这种模式用的比较少,这种模式,相当于把容器当做了一个机器了,会牺牲容器的安全性,没有隔离。 none 模式 Docker会拥有自已的网络空间,不与主机共享,在这个网络模式下的容器,不会被分配网卡、ip、路由等相关信息。 特点:完全隔离,与外部任何机器都无网络访问,只有自已的lo本地网络127.0.0.1,容器和容器之间也无法通过网络访问,所以安全性很高。 container 模式 不会创建自已的网络空间,而是与其他容器共享网络空间,直接使用指定容器的ip/端口等。 所以可以和某个容器共享网络,例如下图中,容器1和容器2共享,容器3和容器2共享网络。 这个方式也是用的比较少。 自定义模式(推荐) 不使用docker自带的网络模式,而是自己去定制话自己特有的网络模式。 使用下面命令创建自己的网络,驱动一般还是用桥接模式,--subnet 指定子网,可以和宿主机不一样,--gateway 指定网关地址,然后跟上一个网络名称wqynetwork docker network create --driver bridge --subnet 192.168.254.0/24 --gateway 192.168.254.1 wqynetwork 然后查看,是否创建成功 docker network ls 或者可以使用inspect查看详细信息 docker network inspect wqynetwork 自定义网络创建成功后,会创建一个自定义的桥接网卡 有了这个桥接网卡后,基于这个网卡创建的容器之间是可以相互连接的。 实验下 启动一个centos的容器,--net 指定我们自定义的网络,ping 命令表示容器启动之后执行的命令,因为容器启动之后,如果发现没有任何事情可以做,就会停止了,需要ping 来卡在,这样centos的容器就不会关闭了 # 启动两个容器 docker run -d --rm -P --name nginx_network2 --net wqynetwork centos ping 127.0.0.1 docker run -d --rm -P --name nginx_network1 --net wqynetwork centos ping 127.0.0.1 这个时候nginx_network1就可以直接访问到nginx_network2的网络了,因为他们是在同一个网络环境下的 # 通过容器名称来访问 docker exec -it nginx_network1 ping nginx_network2 # 通过nginx_network2的ip来访问也是可以的 docker exec -it nginx_network1 ping 192.168.254.2 不同模式下的连接问题 如下图中,容器1和容器2是不同的连接模式,容器1是默认的docker0网卡,容器2是自定义的wolfcode网络,他们之间无法直接连接。 如果想要让他们之间能通信的话,可以使用下面的这个命令就可以实现通信 # 把wolfcode网卡加到了容器1 docker network connect wolfcode nginx_network1 这样他们之间就可以通信了 # 容器2就可以访问容器1了 docker exec -it nginx_network2 ping nginx_network1
2024年03月14日
47 阅读
0 评论
0 点赞
2024-03-14
Docker 数据卷 (Volume) - 最佳实践和使用技巧
为什么需要数据卷 因为容器内的文件系统和宿主机的文件系统之间是隔离的,通过数据卷,可以把容器内和宿主机的文件目录关联起来。 数据卷可以理解为一卷相同的数据,会放在同一个位置。 绑定方式 匿名绑定 匿名绑定的方式,只需要指定容器内的目录即可,不需要指定容器外的目录,当容器被删除后,这个容器外的数据也会被删除,所以用的很少 docker run --rm -d -p 80:80 --name nginx_volume -v /usr/share/nginx/html nginx 查看容器的挂载信息,可以进入/var/lib/docker/volumes/d5c4ded82f96bdbbd1521b11b8dcc010c1a2298240f39277b20c0719b685d985/_data目录修改index.html文件即可 docker inspect nginx_volume 或者通过下面命令,也可以查看数据卷信息 docker volume ls 需要注意的是,如果通过-f强制删除容器的话,数据卷也不会被删除 docker rm -f nginx_volume 如果使用Dockerfile里的VOLUME指定的的匿名绑定,容器被删除的时候,也不会被删除 具名绑定 具名绑定,需要指定数据卷的名称,例如nginx-html,这种方式,如果容器删除,相应的数据不会被删除。 如果我们不关心数据存在宿主机的哪个位置的话,这个方式用起来比较方便。 docker run --rm -d -p 80:80 --name nginx_volume -v nginx-html:/usr/share/nginx/html nginx 查看挂载到哪个目录 docker inspect nginx_volume 因为容器删除后,没有删除数据卷,可以手动删除 docker volume rm nginx-html bind mount 可以把宿主机的某个目录,映射到容器里的某个目录去。如果宿主机的目录有内容的话,容器里的目录就直接用这个目录。如果宿主机的目录没有内容,则宿主机默认使用容器里目录的内容。如果有多个目录需要映射,则用多个-v。 docker run --rm -d -p 80:80 --name nginx_volume -v /usr/local/www:/usr/share/nginx/html -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf nginx 这种方式好像没有创建数据卷,通过如下方式,看不到数据卷信息 docker volume ls volume 数据卷管理 创建一个volume docker volume create volume-name 查看有什么volume docker volume ls 查看volume 的详情 docker volume inspect volume-name 删除 volume docker volume rm volume-name
2024年03月14日
53 阅读
0 评论
0 点赞
2024-03-14
docker 基础命令
概述 docker 命令有点借鉴git命令的意思,有docker pull,docker push等。 镜像相关 查找镜像 默认的镜像仓库都在国外:hub.docker.com,可以改成阿里云的镜像仓库,可以见安装教程文章。 通过search命令,可以搜索一些镜像信息,例如搜索redis镜像 docker search redis 镜像拉取 拉取最新版本的镜像 # 要跟上完整的名称,默认拉取的是最新的版本 docker pull supermanito/helloworld 如下图所示,这个镜像分成了2层,所以拉取的时候看到了2个 关于镜像分层存储,主要是为了节省存储空间,例如: 拉取指定版本的镜像,例如v3版本的redis docker pull redis:3 查看本地镜像 docker images 删除镜像 rm 默认是删除容器,rmi表示删除镜像 docker rmi 镜像的ImageId 有时候一个镜像id对应多个容器,这个时候删除要通过镜像仓库名称的方式删除,不然会报错,因为同一个镜像id有多个 容器 创建并且运行一个镜像 首先查找本地的nginx镜像,如果本地没有nginx镜像,则会从远程拉取。使用run命令,加上镜像名称,即可运行起来 docker run nginx 用上述这个命令直接运行的话,有几个问题: nginx 容器会前台运行 宿主机的网络和nginx容器时候隔离开的,宿主机无法访问到容器里的网络 端口映射和后台启动 为了解决上面两个问题,可以使用-d后台运行,-p将主机的端口:映射到容器的端口里,docker使用的是iptables防火墙路由映射的功能 docker run -d -p 80:80 nginx 查看端口映射信息 docker ps 如果说,容器内有多个端口,想要一次性暴露出来,这些端口绑定到宿主机的随机端口上,可以用-P参数 docker run -d -P nginx 下图中的32768是随机端口。 设置容器名称 因为容器id比较不好记住,操作的时候不方便,所以启动的时候,可以指定名称,这样对容器的操作比较方便 docker run -d -p 81:80 --name nginxName nginx 然后,就可以通过名字来操作了 docker stop nginxName 容器退出时候自动删除容器 有时候,容器依赖一些配置,如果没有配置的话,就启动不起来,但是即使启动失败了,执行docker run 命令后,容器还是会创建了,这个时候产生的容器没啥用,还得手动去删除。所以这个时候可以使用--rm参数,容器退出后自动删除,对于测试的时候可以用,但是redis,mysql这种存储数据的最好不要用 docker run --rm supermanito/helloworld 容器因为一些原因,关闭了,需要重启 指定容器关闭时的重启策略,有三种可选策略,通过--restart参数设置 no(默认):表示不重启 on-failure:当失败时重启,还可以加上3指定最多重启3次,如果3次都失败就不再重启了,这种是针对异常关闭,如果是docker stop命令,不会重启 always:只要已关闭就自动重启,服务器重启后也能自动启动 # 容器关闭后,重启三次 docker run -d --name nginx01 -P --restart on-failure:3 nginx # docker一旦启动,容器就自动起来,不然的话默认是关闭的,需要手动启动各个容器 docker run -d --name nginx01 -P --restart always nginx 设置容器里的环境变量 有时候,我们需要通过环境变量判断一些程序逻辑,这个时候在docker启动的时候,通过-e参数(也可以--env来指定)进行指定就好了 # 设置了两个环境变量,多个环境变量,需要多个-e指定 docker run -d -P --name nginx_env -e JAVA_ENV=dev -e JAVA_VM=G1 nginx 查看容器的一些基础信息,包括环境变量: docker inspect nginx_env 我们还可以通过docker exec命令,把命令发送给容器执行,-it表示让容器启动一个终端来执行命令,要执行的env命令放在最后 [root@localhost ~]# docker exec -it nginx_env env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=9689859c69d1 TERM=xterm JAVA_ENV=dev JAVA_VM=G1 NGINX_VERSION=1.21.5 NJS_VERSION=0.7.1 PKG_RELEASE=1~bullseye HOME=/root 限制容器的资源限制 可以限制的内容很多,可以通过docker run --help查看run的一些参数信息 # -m 限制内存为8m,单位还可以是k,g,cpu设置为1个 docker run -d -rm -m 8m --cpus 1 nginx 那我们怎么知道,容器有没被限制呢,可以通过查看容器的实时状态查看 docker stats 容器id 查看运行中的容器 查看正在运行中的所有容器 docker ps 查看所有状态的容器 docker ps -a 删除容器 这个容器id,可以是完整的容器id,也可以是前缀好,只要能唯一定位到容器即可 docker rm 容器id # 一次删除多个 docker rm 74350eb761cc c7353a2bf490 强行删除进行中的容器 运行中的容器可以删除吗?正常是不要这么操作,正常要先停止容器,然后再删除就好了。如果非要删除进行中的,可以-f参数 docker rm -f 74350eb761cc 停止容器 docker stop 容器id 启动容器 docker start 容器id 查看容器日志 以下就可以输出容器的日志信息,比如nginx容器的信息,以下命令一次性输出所有 docker logs 容器id docker logs c1bd1b7f7f9a 如果想要实时查看最近的20条,可以用-f,是flow的简写 docker logs -f -n 20 ngix01 进入容器内部 因为容器相当于一个小虚拟机,容器内和容器外,文件系统是隔离开的,可以进入容器内部 docker exec -it nginx01 /bin/bash 如果要退出的话,只需要输入exit就好。 容器内和容器外的文件隔离方式其实也很简单,就从宿主机上专门申请一块磁盘目录,用于容器的存储
2024年03月14日
52 阅读
0 评论
0 点赞
2024-03-08
K8s 快速入门
概述 k8s 是kubernets的简称,k和s之间有8个单词,因为单词太长,所以简称k8s。kubernets的单词意思是舵手,是用于管理多主机上docker容器的。 说k8s解决的问题之前,先说下早期的部署方案的问题: 传统的部署,一台机器上部署多个应用,会有资源竞争的问题,比如网络、cpu、内存、磁盘文件目录占用等一些列问题 虚拟化部署,在服务器上不同的应用,用不同的虚拟机,这样可以解决方式1的环境不隔离的问题。因为虚拟可以分配好固定的资源,这样就不会争抢资源。但是会有资源占用的问题,因为虚拟机里装了系统,会占用资源。启动一个虚拟机估计要几分钟。 容器化部署,容器可以实现类似虚拟机一样的资源隔离效果,并且他没有自己的操作系统,用的还是宿主机的操作系统。2秒内即可启动容器。 k8s部署,因为docker容器有诸多问题,因为容器经常要销毁,然后重启一个,重启后,会有ip变了等问题,k8s提供了以下这些能力 自我修复:容器内的应用出现问题的话,比如内存溢出问题,会自动销毁容器,然后基于原来的容器,再重新启一个 弹性伸缩:监控负载比较大的时候,自动的增加容器数量,等负载降下来后,自动删除负载 自动部署和回滚:可以实现滚动更新,更新的时候,新起来一个,然后把旧的再下掉,这样用户就无感知了。如果更新有问题,还可以回退到上一个版本 服务发现和负载均衡:以前常规的需要nginx反向代理,实现负载均衡,现在k8s默认就有这个功能 机密和配置管理:很多应用有自己的配置,比如mysql有自己的配置,k8s有一套配置管理,可以实现这些配置管理 存储编排:把所有的机器的存储资源,管理成一个个抽象的虚拟磁盘,容器统一访问到虚拟磁盘,由虚拟磁盘映射到真正的物理磁盘 k8s的基本架构 通过命令行工具kubetl或者可视化界面dashboard来操作k8s。通过这两种方式操作k8s,都是通过http请求api-server,然后对应到controller-mannager控制器上,控制器有多种类型,可以理解为mvc里的c,比如 kube-controller-mannager,这里的各种控制器,用于管理k8s中的各类资源 cloud-controller-mananger,这个主要用于对接到第三方云平台,k8s 访问到第三方的平台 然后各个控制器进行一些操作,例如kube-controller-mannager可以进行创建pod,这个时候就要经过kube-scheduler调度器,它可把这个pod放到合适的节点上去,比如mysql pod需要存储性能好,kube-schedule就会将mysql部署到该pod上 k8s架构里,至少要有两个机器,一个是左侧的master节点,负责一些基础管理,然后要有右边的节点。对pod的操作,首先要访问master的api-server,然后master操作右边的节点node。 基础概念 服务分类 服务可以分为有状态应用和无状态应用: 有状态应用表示可以存数据,例如redis,扩容的时候,有数据迁移等问题,不然新增的redis节点就没有数据了 无状态的应用没有存任何数据,只是简单转发和计算,例如nginx服务,如果新增nginx,没有任何影响 资源和对象 资源相当于yaml配置,对象是基于这个配置创建出来的实例。 对象的规约和状态 spec规约相当于期望,表示我们期望会这样,比如配置pod的spec,希望里面有几个容易。 status状态:表示对象的实际状态,可能实际情况和配置的不一样,k8s会尽量的保证对象和我们配置的一样。 资源分类 k8s 会对资源范围进行划分 集群级别的资源,集群内的所有应用都可以访问到这部分资源。 namespace,命名空间本身也属于一个资源,属于集群底下的 Node,节点相当于一个服务器,k8s主要是用于管理这些节点,而不是创建节点 clusterRole,用于集群权限管理,声明了集群的角色,表示集群里有这些角色,这些角色有什么权限 clusterRoleBinding,表示这个角色绑定到集群级别的资源上,所以这些角色就可以操作这些集群 命名空间级别的资源,k8s把集群内再划分成多块,比如命名空a和命名空间b,只有自己命名空间内的资源才是可以共享的 pod,可以看作是容器组,一个pod里可以有多个容器,当一个pod被创建的时候,会有个默认的容器pause,用于实现pod里容器之间的资源共享。 例如php和mysql部署在同一个pod里,php就可以通过localhost直接访问到mysql了。 pod: 里又有控制器和replicas副本,副本其实就负载量大的时候,自动创建的新的pod。控制器又有很多类型,例如 用于创建无状态的服务,例如goland的服务。eployment这个控制器可实现自动创建pod,滚动升级,以及回滚,扩容、缩容等。 部署有状态服务,用statefulset控制器创建,里面有headless services 的dns解决网络问题,里面的volumeClaimTempale,解决存储的问题 守护进程,在匹配到的无状态服务或者有状态服务里,利用daemonSet嵌入一个守护进程,做日志收集等,这样就不用自己去容器里装这些日志组件了 创建定时任务,Job和CronJob控制器 服务发现:实现k8s集群内部网络调用,可以用service和ingress,访问集群里的pod 存储:volume虚拟磁盘,共享pod中容器的数据 特殊类型的配置:configMap配置修改,会自动更新到pod里面,实现配置暴露出来。 元空间,每个资源都有一些自己的元空间的资源,例如每个pod都有自己元空间资源,该pod内部可以共享这些资源,例如如下三个资源 Horizontal pod autoscaler(HPA),可以监控cpu的使用率,比如30s检测一次,发现cpu大于50%,自动扩容。 podtemplate模板,扩容的时候,基于这个模板进行扩容,这样扩容出来的实例就一样了。 limitrange用于资源限制,比如可以限制内存最多5GB
2024年03月08日
72 阅读
0 评论
0 点赞
1
2
...
13