首页
恋爱日记
数据统计
留言板
更多
友情链接
Search
1
CentOS7安装部署weblogic12.1.1
3,130 阅读
2
Docker真的被Kubernetes放弃了吗?
2,825 阅读
3
一款可以自定义VScode背景的插件
2,684 阅读
4
Nginx搭建本地YUM仓库
2,352 阅读
5
CentOS 7安装fail2ban+Firewalld防止SSH爆破与CC攻击
2,157 阅读
Prometheus网站监控面板
Vscode
Typecho优化
Ops工具
Linux
Shell
Nginx
Weblogic
云原生
Kubernetes
Docker
Ceph
监控
Promethues
Zabbix
Grafana
数据库
MySQL
登录
Search
废柴阿尤
累计撰写
25
篇文章
累计收到
14
条评论
首页
栏目
Prometheus网站监控面板
Vscode
Typecho优化
Ops工具
Linux
Shell
Nginx
Weblogic
云原生
Kubernetes
Docker
Ceph
监控
Promethues
Zabbix
Grafana
数据库
MySQL
页面
恋爱日记
数据统计
留言板
友情链接
搜索到
25
篇与
的结果
2021-10-02
CentOS 7安装fail2ban+Firewalld防止SSH爆破与CC攻击
说明:很多站长会遇到网站被CC攻击和SSH爆破的情况,这个时候就需要做下防御措施了,这里针对CentOS 7再分享个简单防CC攻击和SSH爆破的方法。前言fail2ban可以监视你的系统日志,然后匹配日志的错误信息执行相应的屏蔽动作。网上大部分教程都是关于fail2ban+iptables组合,考虑到CentOS 7已经自带Firewalld,所以这里我们也可以利用fail2ban+Firewalld来防CC攻击和SSH爆破。本教程编辑文件使用vim命令,如果不会用的,可以使用比较简单的nano,或者编辑好使用 FTP工具,如Xshell登录VPS操作。准备工作1、检查 Firewalld 是否启用#如果您已经安装iptables建议先关闭 service iptables stop #查看Firewalld状态 firewall-cmd --state #启动firewalld systemctl start firewalld #设置开机启动 systemctl enable firewalld.service启用Firewalld后会禁止所有端口连接,因此请务必放行常用的端口,以免被阻挡在外,以下是放行SSH端口(22)示例,供参考:#放行22端口 firewall-cmd --zone=public --add-port=80/tcp --permanent #重载配置 firewall-cmd --reload #查看已放行端口 firewall-cmd --zone=public --list-ports2、安装 fail2ban fail2ban可以监控系统日志,并且根据一定规则匹配异常IP后使用Firewalld将其屏蔽,尤其是针对一些爆破/扫描等非常有效。#CentOS内置源并未包含fail2ban,需要先安装epel源 yum -y install epel-release #安装fial2ban yum -y install fail2ban安装成功后fail2ban配置文件位于/etc/fail2ban,其中jail.conf为主配置文件,相关的匹配规则位于filter.d目录,其它目录/文件一般很少用到,如果需要详细了解可自行搜索。3、配置规则{tabs}{tabs-pane label="新建jail.local来覆盖fail2ban的一些默认规则:"}#新建配置 vi /etc/fail2ban/jail.local #默认配置 [DEFAULT] ignoreip = 127.0.0.1/8 bantime = 86400 findtime = 600 maxretry = 5 #这里banaction必须用firewallcmd-ipset,这是firewall支持的关键,如果是用Iptables请不要这样填写 banaction = firewallcmd-ipset action = %(action_mwl)s{/tabs-pane}{tabs-pane label="参数说明"}ignoreip:IP白名单,白名单中的IP不会屏蔽,可填写多个以(,)分隔 bantime:屏蔽时间,单位为秒(s) findtime:时间范围 maxretry:最大次数 banaction:屏蔽IP所使用的方法,上面使用firewalld屏蔽端口{/tabs-pane}{/tabs}防止SSH爆破如果您还在使用默认SSH端口(22),可能每天都会被扫描,我们可以修改端口尽量避免被扫。直接输入命令:vi /etc/ssh/sshd_config编辑配置文件,然找到#Port22这一行,将#号去掉,并将22修改为您想设置的其它端口号,最后保存退出,CentOS7最后再输入命令systemctl restart sshd.service重启sshd即可。当然你也可以使用fail2ban将恶意IP屏蔽。{tabs}{tabs-pane label="继续修改 jail.local 这个配置文件,在后面追加如下内容"}[sshd] enabled = true filter = sshd port = 22 action = %(action_mwl)s logpath = /var/log/secure{/tabs-pane}{tabs-pane label="参数说明"}[sshd]:名称,可以随便填写 filter:规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则 port:对应的端口 action:采取的行动 logpath:需要监视的日志路径{/tabs-pane}{/tabs}到这一步,我们 jail.local 的规则看起来可能像下面这样子:[DEFAULT] ignoreip = 127.0.0.1/8 bantime = 86400 findtime = 600 maxretry = 5 banaction = firewallcmd-ipset action = %(action_mwl)s [sshd] enabled = true filter = sshd port = 22 action = %(action_mwl)s logpath = /var/log/secure上面的配置意思是如果同一个IP,在10分钟内,如果连续超过5次错误,则使用Firewalld将他IP ban了。输入systemctl start fail2ban启动fail2ban来试试效果。使用另一台服务器不断尝试连接SSH,并且不断的将密码输入错误,你会发现连续超过5次后直接连不上,说明IP被ban了,可以输入:fail2ban-client status sshd查看被ban的IP,如下截图。防止CC攻击这里仅以Nginx为例,使用fail2ban来监视nginx日志,匹配短时间内频繁请求的IP,并使用firewalld将其IP屏蔽,达到CC防护的作用。{tabs}{tabs-pane label="新建一个nginx日志匹配规则"}vi /etc/fail2ban/filter.d/nginx-cc.conf #填写如下内容 [Definition] failregex = <HOST> -.*- .*HTTP/1.* .* .*$ ignoreregex ={/tabs-pane}{tabs-pane label="继续修改 jail.local 追加如下内容"}[nginx-cc] enabled = true port = http,https filter = nginx-cc action = %(action_mwl)s maxretry = 20 findtime = 60 bantime = 3600 logpath = /usr/local/nginx/logs/access.log{/tabs-pane}{/tabs}上面的配置意思是如果在60s内,同一IP达到20次请求,则将其IP ban 1小时,上面只是为了测试,请根据自己的实际情况修改。logpath为nginx日志路径。防止Wordpress爆破如果您经常分析日志会发现有大量机器人在扫描wordpress登录页面wp-login.php,虽然对方可能没成功,但是为了避免万一还是将他IP干掉为好。{tabs}{tabs-pane label="新建一个nginx日志匹配规则"}vi /etc/fail2ban/filter.d/wordpress.conf #填写如下内容 [Definition] failregex = ^ -.* /wp-login.php.* HTTP/1\.." ignoreregex ={/tabs-pane}{tabs-pane label="继续修改 jail.local 追加如下内容"}[wordpress] enabled = true port = http,https filter = wordpress action = %(action_mwl)s maxretry = 20 findtime = 60 bantime = 3600 logpath = /usr/local/nginx/logs/access.log{/tabs-pane}{/tabs}当然,别忘记输入systemctl restart fail2ban重启fail2ban使其生效。常用命令#启动 systemctl start fail2ban #停止 systemctl stop fail2ban #开机启动 systemctl enable fail2ban #查看被ban IP,其中sshd为名称,比如上面的[wordpress] fail2ban-client status sshd #手动封锁banip,例如封锁8.8.8.8,sshd为监狱名 fail2ban-client set sshd banip 8.8.8.8 #删除被ban IP,例如解封8.8.8.8,sshd为监狱名 fail2ban-client set sshd unbanip 8.8.8.8 #查看日志 tail /var/log/fail2ban.log总结fail2ban已经内置很多匹配规则,位于filter.d目录下,包含了常见的SSH/FTP/Nginx/Apache等日志匹配,如果都还无法满足您的需求,您也可以自行新建规则来匹配异常IP。使用fail2ban+Firewalld来阻止恶意IP是行之有效的办法,可极大提高服务器安全。
2021年10月02日
2,157 阅读
0 评论
1,268 点赞
2021-09-06
Nginx常用屏蔽规则,让网站更安全
前言Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务,目前很大一部分网站均使用了 Nginx 作为 WEB 服务器,Nginx 虽然非常强大,但默认情况下并不能阻挡恶意访问,这里有一份常用的 Nginx 屏蔽规则,希望对你有所帮助。在开始之前,希望您已经熟悉Nginx常用命令(如停止、重启等操作)及排查nginx错误日志,以免出现问题不知所措。如无特殊注明,以下的命令均添加到·server·段内,修改nginx 配置之前务必做好备份,修改完毕后需要重载一次nginx,否则不会生效。防止文件被下载比如将网站数据库导出到站点根目录进行备份,很有可能也会被别人下载,从而导致数据丢失的风险。以下规则可以防止一些常规的文件被下载,可根据实际情况增减。location ~ \.(zip|rar|sql|bak|gz|7z)$ { return 444; }屏蔽非常见蜘蛛(爬虫)如果经常分析网站日志你会发现,一些奇怪的 UA 总是频繁的来访问网站,而这些 UA 对网站收录毫无意义,反而增加服务器压力,可以直接将其屏蔽。if ($http_user_agent ~* (SemrushBot|python|MJ12bot|AhrefsBot|AhrefsBot|hubspot|opensiteexplorer|leiki|webmeup)) { return 444; }禁止某个目录执行脚本比如网站上传目录,通常存放的都是静态文件,如果因程序验证不严谨被上传木马程序,导致网站被黑。以下规则请根据自身情况改为您自己的目录,需要禁止的脚本后缀也可以自行添加。#uploads|templets|data 这些目录禁止执行PHP location ~* ^/(uploads|templets|data)/.*.(php|php5)$ { return 444; }屏蔽某个IP或IP段如果网站被恶意灌水或 CC 攻击,可从网站日志中分析特征 IP,将其 IP 或 IP 段进行屏蔽。#屏蔽192.168.5.23这个IP deny 192.168.5.23; #屏蔽192.168.5.* 这个段 deny 192.168.5.0/24;其它说明再次强调, 修改nginx配置之前务必做好备份,修改完毕后需要重载一次nginx,否则不会生效 。上面大部分规则返回444状态码而不是403,因为444状态码在nginx中有特殊含义。nginx的 444状态是直接由服务器中断连接,不会向客户端再返回任何消息,比返回403更加暴力。若有不足还请补充和指正。
2021年09月06日
1,530 阅读
0 评论
629 点赞
2020-10-09
Linux运维最常用命令汇总
文件和目录操作命令描述重要参数ls列出目录内容-l(详细列表)、-a(显示隐藏文件)cd切换目录无pwd显示当前工作目录无touch创建空文件无mkdir创建目录-p(递归创建)cp复制文件或目录-r(递归复制)、-i(交互式复制)表格表格表格表格表格表格表格表格表格表格表格表格
2020年10月09日
6 阅读
0 评论
0 点赞
2020-09-15
Docker镜像构建知识:Dockerfile 命令详解
本篇介绍了 Dockerfile 典型的基本结构和它支持的众多指令,并具体讲解通过这些指令来编写定制镜像的 Dockerfile,以及如何生成镜像。1.FROM指定基础镜像FROM 指令用于指定其后构建新镜像所使用的基础镜像。如果本地不存在,则默认会去Docker Hub下载指定镜像。FROM指令必是Dockerfile文件中的首条命令,启动构建流程后,Docker将基于该镜像构建新镜像,FROM后的命令也会基于这个基础镜像。FROM 语法格式为: FROM <image>或 FROM <image>:<tag>或 FROM <image>:<digest>通过FROM指定的镜像,可以是任何有效的基础镜像。FROM有以下限制:FROM必须是Dockerfile中第一条非注释命令在一个Dockerfile文件中创建多个镜像时,FROM可以多次出现。只需在每个新命令FROM之前,记录提交上次的镜像 ID。tag 或digest是可选的,如果不使用这两个值时,会使用ltest版本的基础镜像2.RUN执行命令在镜像的构建过程中执行特定的命令,并生成一个中间镜像。格式:#shell格式 RUN <command> #exec格式 RUN ["executable", "param1", "param2"]RUN命令将在当前image中执行任意合法命令并提交执行结果。命令执行提交后,就会自动执行Dockerfile中的下一个指令。层级 RUN指令和生成提交是符合Docker核心理念的做法。它允许像版本控制那样,在任意一个点,对image镜像进行定制化构建。RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache。{message type="error" content="每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\来换行。"/}3.CMD启动容器CMD 用于指定在容器启动时所要执行的命令。CMD 有以下三种格式:CMD ["executable","param1","param2"] CMD ["param1","param2"] CMD command param1 param2省略可执行文件的exec格式,这种写法使CMD中的参数当做ENTRYPOINT的默认参数,此时ENTRYPOINT也应该是exec格式,具体与ENTRYPOINT的组合使用,参考ENTRYPOINT。{alert type="error"}注意:与 RUN 指令的区别:RUN 在构建的时候执行,并生成一个新的镜像,CMD 在容器运行的时候执行,在构建时不进行任何操作。{/alert}{message type="error" content="每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时手动指定了运行的命令(作为run的参数),则会覆盖掉CMD指定的命令。"/}4.LABEL添加元数据LABEL 用于为镜像添加元数据,元数以键值对的形式指定:LABEL <key>=<value> <key>=<value> <key>=<value> ...使用 LABEL 指定元数据时,一条 LABEL 可以指定一条或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条 LABEL 指令指定,以免生成过多的中间镜像。如,通过 LABEL 指定一些元数据:LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"指定后可以通过 docker inspect 查看:docker inspect /test "Labels": { "version": "1.0", "description": "这是一个Web服务器", "by": "IT笔录" },5.EXPOSE设置监听端口为构建的镜像设置监听端口,是容器在运行时监听。格式:EXPOSE <port>[<port>...] #例如:EXPOSE 22 80 8443{alert type="error"}注意:该指令知识起到声明作用,并不会自动完成端口映射。在启动容器时需要使用-P,Docker主机会自动分配一个宿主机的临时端口转发到指定的端口;使用-p(注意大小写),则可以具体指定哪个宿主机的本地端口有会映射过来。{/alert}6.ENV设置环境变量指定环境变量,在镜像生成过程中会被后续 RUN 指令使用,在镜像启动的容器中也会存在。ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>...7.COPY复制格式如下:COPY <源路径>... <目标路径> COPY ["<源路径1>",... "<目标路径>"]复制本地主机的源地址(为 Dockerfile 所在目录的相对路径、文件或目录)下的内容到镜像的目的地址下。目标路径不存在时,会自动创建。 当使用本地目录为源目录时,推荐使用COPY。8.ADD复制该命令将复制指定的源路径下的内容到容器中的目的路径下。ADD 指令和 COPY 的格式和性质基本是一致的。但是在 COPY 基础上增加了一些功能。例如源路径可以是一个 URL,这种情况下,Docker 引擎会试图去下载这个链接的文件到目标路径去。在构建镜像时,复制上下文中的文件到镜像内,格式:ADD <源路径>... <目标路径> ADD ["<源路径>",... "<目标路径>"]9.ENTRYPOINTENTRYPOINT 用于给容器配置一个可执行程序。也就是说,每次使用镜像创建容器时,通过 ENTRYPOINT 指定的程序都会被设置成默认程序。ENTRYPOINT 有以下两种形式:ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2ENTRYPOINT 与 CMD 非常类似,不同的是通过docker run执行的命令不会覆盖 ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给 ENTRYPOINT。Dockerfile 中只允许有一个 ENTRYPOINT 命令,多指定时会覆盖前面的设置,而只执行最后的 ENTRYPOINT 指令。docker run运行容器时指定的参数都会被传递给 ENTRYPOINT ,且会覆盖 CMD 命令指定的参数。如,执行docker run <image> -d时,-d 参数将被传递给入口点。也可以通过docker run --entrypoint重写 ENTRYPOINT 入口点。如:可以像下面这样指定一个容器执行程序:ENTRYPOINT ["/usr/bin/nginx"]完整构建代码:FROM ubuntu:16.04 MAINTAINER MoeWah "admin@mao.sh" RUN apt-get update RUN apt-get install -y nginx RUN echo 'Hello World, 我是个容器' \ > /var/www/html/index.html ENTRYPOINT ["/usr/sbin/nginx"] EXPOSE 80使用 docker build 构建镜像,并将镜像指定为 moewah/test:docker build -t="moewah/test" .构建完成后,使用 moewah/test 启动一个容器:docker run -i -t moewah/test -g "daemon off;"在运行容器时,我们使用了-g "daemon off;",这个参数将会被传递给 ENTRYPOINT,最终在容器中执行的命令为/usr/sbin/nginx -g "daemon off;"。10.VOLUME 定义匿名卷VOLUME 用于创建挂载点,即向基于所构建镜像创始的容器添加卷:VOLUME ["/data"]一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:卷可以容器间共享和重用容器并不一定要和其它容器共享卷修改卷后会立即生效对卷的修改不会对镜像产生影响卷会一直存在,直到没有任何容器在使用它{message type="error" content="VOLUME 让我们可以将源代码、数据或其它内容添加到镜像中,而又不并提交到镜像中,并使我们可以多个容器间共享这些内容。"/}11.WORKDIR指定工作目录WORKDIR 用于在容器内设置一个工作目录:WORKDIR /path/to/workdir通过 WORKDIR 设置工作目录后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行。 如,使用 WORKDIR 设置工作目录:WORKDIR /aWORKDIR bWORKDIR cRUN pwd在以上示例中,pwd 最终将会在/a/b/c目录中执行。在使用 docker run 运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。12.USER指定当前用户指定运行容器时的用户名或 UID,后续的 RUN 等指令也会使用指定的用户身份。语法格式为:USER daemon使用 USER 指定用户时,可以使用用户名、UID 或 GID,或者两者的组合。以下都是合法的指定:USER user USER user:group USER uid USER uid:gid USER user:gid USER uid:group13.ARG指定一些镜像内使用的参数(例如版本号信息等),这些参数在执行docker build命令时才以--build-arg<varname>=<value>格式传入。语法格式为:ARG <name>[=<default value>] docker build --build-arg site=moewah.com -t moewah/test .14.ONBUILD配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令。语法格式为:ONBUILD [INSTRUCTION]例如,Dockerfile 使用如下的内容创建了镜像image-A:[...] ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build --dir /app/src [...]如果基于 image-A 创建新的镜像时,新的 Dockerfile 中使用FROM image-A指定基础镜像,会自动执行 ONBUILD 指令的内容,等价于在后面添加了两条指令:FROM image-A ADD . /app/src RUN /usr/local/bin/python-build --dir /app/src使用 ONBUILD 指令的镜像,推荐在标签中注明,例如ruby:1.9-onbuild。15.STOPSIGNALSTOPSIGNAL 用于设置停止容器所要发送的系统调用信号:STOPSIGNAL signal所使用的信号必须是内核系统调用表中的合法的值,如:SIGKILL。16.SHELL指定其他命令使用 shell 时的默认 shell 类型。SHELL ["executable", "parameters"]默认值为["/bin/sh","-c"]。{message type="error" content="对于Windows系统,建议在Dockerfile开头添加# escape=来指定转移信息。"/}17.Dockerfile示例{tabs}{tabs-pane label="构建 Nginx 运行环境"}# 指定基础镜像 FROM sameersbn/ubuntu:14.04.20161014 # 维护者信息 MAINTAINER moewah "admin@mao.sh" # 设置环境 ENV RTMP_VERSION=1.1.10 \ NPS_VERSION=1.11.33.4 \ LIBAV_VERSION=11.8 \ NGINX_VERSION=1.10.1 \ NGINX_USER=www-data \ NGINX_SITECONF_DIR=/etc/nginx/sites-enabled \ NGINX_LOG_DIR=/var/log/nginx \ NGINX_TEMP_DIR=/var/lib/nginx \ NGINX_SETUP_DIR=/var/cache/nginx # 设置构建时变量,镜像建立完成后就失效 ARG BUILD_LIBAV=false ARG WITH_DEBUG=false ARG WITH_PAGESPEED=true ARG WITH_RTMP=true # 复制本地文件到容器目录中 COPY setup/ ${NGINX_SETUP_DIR}/ RUN bash ${NGINX_SETUP_DIR}/install.sh # 复制本地配置文件到容器目录中 COPY nginx.conf /etc/nginx/nginx.conf COPY entrypoint.sh /sbin/entrypoint.sh # 运行指令 RUN chmod 755 /sbin/entrypoint.sh # 允许指定的端口 EXPOSE 80/tcp 443/tcp 1935/tcp # 指定网站目录挂载点 VOLUME ["${NGINX_SITECONF_DIR}"] ENTRYPOINT ["/sbin/entrypoint.sh"] CMD ["/usr/sbin/nginx"]{/tabs-pane}{tabs-pane label="构建 Tomcat 环境"}# 指定基于的基础镜像 FROM ubuntu:13.10 # 维护者信息 MAINTAINER moewah "admin@mao.sh" # 镜像的指令操作 # 获取APT更新的资源列表 RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list # 更新软件 RUN apt-get update # Install curl RUN apt-get -y install curl # Install JDK 7 RUN cd /tmp && curl -L 'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz' -H 'Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile' | tar -xz RUN mkdir -p /usr/lib/jvm RUN mv /tmp/jdk1.7.0_65/ /usr/lib/jvm/java-7-oracle/ # Set Oracle JDK 7 as default Java RUN update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/bin/java 300 RUN update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-7-oracle/bin/javac 300 # 设置系统环境 ENV JAVA_HOME /usr/lib/jvm/java-7-oracle/ # Install tomcat7 RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz RUN mv /tmp/apache-tomcat-7.0.8/ /opt/tomcat7/ ENV CATALINA_HOME /opt/tomcat7 ENV PATH $PATH:$CATALINA_HOME/bin # 复件tomcat7.sh到容器中的目录 ADD tomcat7.sh /etc/init.d/tomcat7 RUN chmod 755 /etc/init.d/tomcat7 # Expose ports. 指定暴露的端口 EXPOSE 8080 # Define default command. ENTRYPOINT service tomcat7 start && tail -f /opt/tomcat7/logs/catalina.out{/tabs-pane}{tabs-pane label="tomcat7.sh命令文件"}export JAVA_HOME=/usr/lib/jvm/java-7-oracle/ export TOMCAT_HOME=/opt/tomcat7 case $1 in start) sh $TOMCAT_HOME/bin/startup.sh ;; stop) sh $TOMCAT_HOME/bin/shutdown.sh ;; restart) sh $TOMCAT_HOME/bin/shutdown.sh sh $TOMCAT_HOME/bin/startup.sh ;; esac exit 0{/tabs-pane}{/tabs}写在最后:原则和建议首先,要尽量吃透每个指令的含义和执行效果,自己多编写一些简单的例子进行测试,弄清楚了在撰写正式的 Dockerfile。此外,Docker Hub 官方仓库中提供了大量的优秀镜像和对应的 Dockerfile,可以通过阅读它们来学习如何撰写高效的 Dockerfile。容器轻量化。从镜像中产生的容器应该尽量轻量化,能在足够短的时间内停止、销毁、重新生成并替换原来的容器。使用 .gitignore。在大部分情况下,Dockerfile 会和构建所需的文件放在同一个目录中,为了提高构建的性能,应该使用 .gitignore 来过滤掉不需要的文件和目录。为了减少镜像的大小,减少依赖,仅安装需要的软件包。一个容器只做一件事。解耦复杂的应用,分成多个容器,而不是所有东西都放在一个容器内运行。如一个 Python Web 应用,可能需要 Server、DB、Cache、MQ、Log 等几个容器。一个更加极端的说法:One process per container。减少镜像的图层。不要多个 Label、ENV 等标签。对续行的参数按照字母表排序,特别是使用apt-get install -y安装包的时候。使用构建缓存。如果不想使用缓存,可以在构建的时候使用参数--no-cache=true来强制重新生成中间镜像。
2020年09月15日
1,534 阅读
0 评论
537 点赞
2020-06-26
Git 常用命令及使用详解
{timeline}{timeline-item color="#19be6b"}0x00 写在前面{/timeline-item}{timeline-item color="#ed4014"}0x01 Git 配置{/timeline-item}{timeline-item color="#ed4014"}0x02 基础操作{/timeline-item}{timeline-item color="#ed4014"}0x03 分支管理{/timeline-item}{timeline-item color="#ed4014"}0x04 远程仓库{/timeline-item}{/timeline}0x00 写在前面现在大部分的开发团队都以 Git 作为自己的版本控制工具,需要对 Git 的使用非常的熟悉。这篇文章中本人整理了自己在开发过程中经常使用到的 Git 命令,方便在偶尔忘记时速查。使用 GUI 工具的同学,也可以对照起来看看。0x01 Git 配置1、在安装完成 Git 后,开始正式使用前,是需要有一些全局设置的,如用户名、邮箱。 设置的主要命令是git config:git config --global user.name "your name" // 设置全局用户名 git config --global user.email "your email" // 设置邮箱其中,--global指定为全局配置,不使用该参数,则为当前所在仓库配置。2、除了用户名、邮箱之外,还有很多的配置可以用来自定义 Git,如:git config --global color.ui true // 让 Git 显示不同的颜色 git config core.ignorecase true // 让 Git 对仓库中的文件大小写敏感3、查看所有的已经做出的配置:git config -l0x02 基础操作1. 创建 Git 版本库 在本地创建 Git 版本库,需要使用git init命令。首先,你需要新建一个存放版本库的目录,然后进入到该目录所在路径,然后执行:git init然后查看目录结构中,就可以看到包含有 .git 子目录,这就说明创建版本库成功了。2. 将文件添加到版本库 要将一个文件纳入到版本库管理,首先要将其添加到暂存区 (这里不做深入介绍),然后才能提交到仓库中。2.1 将文件添加到暂存区,使用的是 git add:git add Readme.md // 添加单个文件到暂存区 git add . // 将当前目录下所有修改添加到暂存区,除按照规则忽略的之外{message type="error" content="注意:这边空文件夹是不会被添加到暂存区中的。"/}2.2 将暂存区中的文件,提交到仓库中。需要使用git commit:git commit // 如果暂存区有文件,则将其中的文件提交到仓库 git commit -m 'your comments' // 带评论提交,用于说明提交内容、变更、作用等{message type="error" content="注意:这边直接用 git commit 提交,会先弹出添加评论的页面。"/}3. 查看仓库的状态 不论我们是新建了文件,将文件加入暂存区,或者其他的修改等等,我们都可以通过:git status来随时查看仓库中文件的状态。这个应该是使用 Git 做版本控制过程中,我使用最多的一个命令。4. 查看仓库中的具体修改很经常的,我们对某个文件做了修改,但过不久就忘记了。这时候就可以通过 git diff 来查看具体的修改内容。git diff // 查看版本库中所有的改动 git diff Readme.md // 查看具体文件的改动5. 查看提交历史记录有的时候,你会需要查看自己做过哪些提交,来回顾自己完成的部分。或者需要寻找某个具体的提交来查看当时的代码。这里需要用到:git log // 显示所有提交的历史记录 git log --pretty=oneline // 单行显示提交历史记录的内容在git log的输出内容中,可以看到每次提交的 ID,是一个 40 位的字符串。6. 版本回退有了git log来查看提交的历史记录,我们就可以通过git reset --hard来回退到我们需要的特定版本,然后使用当时的代码进行各种操作。git reset --hard HEAD^ // 回退到上一个提交版本 git reset --hard HEAD^^ // 回退到上上一个提交版本 git reset --hard 'commit_id' // 会退到 commit_id 指定的提交版本7. 回到未来的某个提交当退回到某个提交的版本以后,再通过git log是无法显示在这之后的提交信息的。但是,通过git reflog可以获取到操作命令的历史。因此,想要回到未来的某个提交,先通过git reflog从历史命令中找到想要回到的提交版本的 ID,然后通过git reset --hard来切换。git reflog git reset --hard 'commit_id'8. 撤销修改撤销修改同样包括两方面的内容,由于仓库中的文件在提交之前,可能在工作区中,尚未在版本控制范围内,也可能在暂存区中。8.1 丢弃工作区中文件的修改git checkout -- Readme.md // 如果 Readme.md 文件在工作区,则丢弃其修改 git checkout -- . // 丢弃当前目录下所有工作区中文件的修改{message type="error" content="注意:git checkout --中的--是必须的。"/}8.2 丢弃已经进入暂存区的修改git reset HEAD Readme.md // 将 Readme.md 恢复到 HEAD 提交版本的状态9. 删除文件在文件未添加到暂存区之前,对想删除文件可以直接物理删除。或者通过 git checkout -- file 来丢弃。如果文件已经被提交,则需要 git rm 来删除:git rm Readme.md // 删除已经被提交过的 Readme.md{message type="error" content="注意:git rm只能删除已经提交到版本库中的文件。其他状态的文件直接用这个命令操作是出错的。"/}0x03 分支管理分支是版本控制系统中很重要的一个概念,在 Git 中新建、合并等分支的操作非常轻量便捷,因此我们会很经常的用到。1. 查看分支查看分支使用git branch:git branch // 查看本地分支信息 git branch -v // 查看相对详细的本地分支信息 git branch -av // 查看包括远程仓库在内的分支信息{message type="error" content="注意:在git branch的输出内容中,有一个分支,前面带有*号,这标识我们当前所在的分支。"/}2. 创建分支当我们要修复一个 Bug,或者开发一个新特性,甚至是在初学的时候怕打乱原来的代码,都可以新建一个分支来避免对原来代码的影响。git branch dev // 新建一个名称为 dev 的分支3. 切换分支当我们创建完分支以后,我们需要切换到新建的分支,否则,所有的修改,还是在原来的分支上。事实上,所有的改动,只能影响到当前所在的分支。git checkout dev // 新建完 dev 分支以后,通过该命令切换到 dev 分支4. 创建并切换分支git checkout -b dev // 新建 dev 分支,并切换到该分支上这个命令合并了前两个独立的命令,平常使用中一般这样使用。5. 合并分支当我们修复完成一个Bug,或者开发完成一个新特性,我们就会把相关的Bug或者特性的上修改合并回原来的主分支上,这时候就需要git merge来做分支的合并。首先需要切换回最终要合并到的分支,如master:git checkout master // 切换回 master 分支 git merge dev // 将 dev 分钟中的修改合并回 master 分支合并回主分支的时候,后面可能会面临到冲突的问题。冲突的解决暂不在这里说明。6. 删除分支当之前创建的分支,完成了它的使命,如Bug修复完,分支合并以后,这个分支就不在需要了,就可以删除它。git branch -d dev // 删除 dev 分支0x04 远程仓库上面的所有命令都是针对本地仓库的操作。当我们希望多个人来协作时,会将代码发布到一个统一的远程仓库,然后多个人在本地操作以后,在推送到远程仓库。其他人协作时,需要先同步远程仓库的内容,再推送自己的修改。1. 从远程仓库克隆如果你本地没有仓库,希望从已有的远程仓库上复制一份代码,那么你需要git clone。git clone https://github.com/git/git.git // 通过 https 协议,克隆 Github 上 git 仓库的源码 git clone linfuyan@github.com/git/git.git // 通过 ssh 协议,克隆 Github 上 git 仓库的源码{message type="error" content="注意:git clone后面的仓库地址,可以支持多种协议,如https,ssh 等。"/}2. 添加远程仓库如果你已经有了一个本地仓库,如之前创建的 git-guide,然后你打算将它发布到远程,供其他人协作。那么使用:git remote add origin your_remote_git_repo // 为本地仓库添加远程仓库3. 推送本地的内容到远程仓库当本地仓库中,代码完成提交,就需要将代码等推送到远程仓库,这样其他协作人员可以从远程仓库同步内容。git push -u origin master // 第一次推送时使用,可以简化后面的推送或者拉取命令使用 git push origin master // 将本地 master 分支推送到 origin 远程分支{message type="success" content="注意:git push -u origin master,第一次使用时,带上-u参数,在将本地的 master 分支推送到远程新的 master 分支的同时,还会把本地的 master 分支和远程的 master 分支关联起来。"/}4. 从远程仓库获取最新内容在多人协作过程中,当自己完成了本地仓库中的提交,想要向远程仓库推送前,需要先获取到远程仓库的最新内容。可以通过git fetch和git pull来获取远程仓库的内容。git fetch origin master git pull origin master{tabs}{tabs-pane label="git fetch和git pull之间的区别:"}git fetch是仅仅获取远程仓库的更新内容,并不会自动做合并。git pull在获取远程仓库的内容后,会自动做合并,可以看成git fetch之后git merge。{/tabs-pane}{/tabs}{message type="error" content="注意:建议多使用git fetch。"/}5. 查看远程仓库信息git remote [-v] // 显示远程仓库信息6. 建立本地分支和远程分支的关联在本地仓库中的分支和远程仓库中的分支是对应的。一般情况下,远程仓库中的分支名称和本地仓库中的分支名称是一致的。有的时候,我们会需要指定本地分支与远程分支的关联。git branch --set-upstream 'local_branch' origin/remote_branch7. 修改本地仓库对应的远程仓库地址当远程的仓库地址发生变化时,需要修改本地仓库对应的远程仓库的地址。主要应用在工程迁移过程中。git remote set-url origin url0x05 标签管理在项目开发过程中,当一个版本发布完成时,是需要对代码打上标签,便于后续检索。获取处于其他的原因,需要对某个提交打上特定的标签。1. 创建标签git tag -a 'tagname' -m 'comment' 'commit_id'-a参数指定标签名,-m添加备注信息,'commit_id'指定打标签的提交。2. 查看所有标签git tag // 查看本地仓库中的所有标签3. 查看具体标签信息git show tagname4. 删除本地标签如果打的标签出错,或者不在需要某个标签,则可以删除它。git tag -d tagname5. 删除远程标签git push origin :refs/tags/tagname git push origin --delete tagname git push origin :tagname6. 推送标签到远程仓库打完标签以后,有需要推送到远程仓库。6.1 推送单个标签到远程仓库git push origin tagname6.2 一次性推送所有标签到远程仓库。git push origin --tags0x06 进阶操作1. 临时保存修改在执行很多的 Git 操作的时候,是需要保持当前操作的仓库/分支处于clean状态,及没有未提交的修改。如git pull,git merge等等,如果有未提交的修改,这些将无法操作。但是做这些事情的时候,你可能修改了比较多的代码,却又不想丢弃它。那么,你需要把这些修改临时保存起来,这就需要用到git stash。1.1 临时保存修改,这样仓库就可以回到 clean 状态。git stash // 保存本地仓库中的临时修改。{message type="error" content="注意:可以多次的git stash来保存不同的临时修改。"/}1.2 查看临时保存。当你临时保存以后,后面还是要取回来的,那它们在哪里呢?git stash list // 显示所有临时修改1.3 当我们处理完其他操作时,想要恢复临时保存的修改。git stash apply // 恢复所有保存的临时修改 git stash pop // 恢复最近一次保存的临时修改1.4 或者,我们后面觉得临时保存不想要了,那可以丢弃它。git stash clear // 丢弃所有保存的临时修改git push origin --tags0x07 写在最后这些是我目前在项目中经常会用到的操作,这里整理下来,可以作为一个手册。对于 Git 的理解或者更多的解释,并不在这里体现。大家可以参考其他更多的资料。例如 Git 的奇技淫巧 & git - 简明指南 & 《Learn Git in 30 Minutes》
2020年06月26日
387 阅读
0 评论
164 点赞
1
...
4
5
首页
复制
搜索
前进
后退
重载网页
和我当邻居