【Docker】Docker学习⑨ - 单机编排之Docker Compose
【Docker】Docker学习⑨ - 单机编排之Docker Compose
- 一、Docker简介
- 二、Docker安装及基础命令介绍
- 三、Docker镜像管理
- 四、Docker镜像与制作
- 五、Docker数据管理
- 六、网络部分
- 七、Docker仓库之单机Dokcer Registry
- 八、Docker仓库之分布式Harbor
- 九、单机编排之Docker Compose
- 1 基础环境准备
- 2 从docker compose启动单个容器
- 3 从docker compose启动多个容器
- 4 定义数据卷挂载
- 5 实现单机版的HA+NGINX+TOMCAT
- 5.1 制作haproxy镜像
- 5.2 准备nginx镜像
- 5.3 准备tomcat镜像
- 5.4 编辑docker compose 文件及环境准备
- 5.5 启动容器
一、Docker简介
- 参考:【Docker】Dokcer学习① - 简介
二、Docker安装及基础命令介绍
- 参考:【Docker】Docker学习② - Docker安装及基础命令介绍
三、Docker镜像管理
- 参考:【Docker】Docker学习③ - Docker镜像管理
四、Docker镜像与制作
- 参考:【Docker】Docker学习④ - Docker镜像与制作
五、Docker数据管理
- 参考:【Docker】Docker学习⑤ - Docker数据管理
六、网络部分
- 参考:【Docker】Docker学习⑥ - 网络部分
七、Docker仓库之单机Dokcer Registry
- 参考:【Docker】Docker学习⑦ - Docker仓库之单机Dokcer Registry
八、Docker仓库之分布式Harbor
- 参考:【Docker】Docker学习⑧ - Docker仓库之分布式Harbor
九、单机编排之Docker Compose
当在宿主机启动较多的容器的时候,如果都是手动操作会觉得比较麻烦而且容易出错,这个时候推荐使用docker单机编排工具docker compose,Dokcer Compose是docker容器的一种编排服务,docker compose是一个管理多个容器的工具,比如可以解决容器之间的依赖关系,就像启动一个web就必须得先把数据库服务先启动一样,docker compose完全可以替代docker run启动容器。
- github地址:https://github.com/docker/compose
1 基础环境准备
- 1.1 安装python环境及pip命令
yum install https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm -yyum install python-pip -ypip install --upgrade pip
- 1.2 安装docker compose
pip install docker-compose
- 1.3 验证版本
docker-compose version
日志:
[root@gbase8c_private ~]# docker-compose version/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.from cryptography.hazmat.backends import default_backenddocker-compose version 1.26.2, build unknowndocker-py version: 4.4.4CPython version: 2.7.5OpenSSL version: OpenSSL 1.0.2k-fips 26 Jan 2017
- 1.4 查看帮助
docker-compose --help[root@gbase8c_private ~]# docker-compose --help/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.from cryptography.hazmat.backends import default_backendDefine and run multi-container applications with Docker.Usage:docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]docker-compose -h|--helpOptions:-f, --file FILE Specify an alternate compose file(default: docker-compose.yml)-p, --project-name NAME Specify an alternate project name(default: directory name)-c, --context NAME Specify a context name--verbose Show more output--log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)--no-ansi Do not print ANSI control characters-v, --version Print version and exit-H, --host HOST Daemon socket to connect to--tls Use TLS; implied by --tlsverify--tlscacert CA_PATH Trust certs signed only by this CA--tlscert CLIENT_CERT_PATH Path to TLS certificate file--tlskey TLS_KEY_PATH Path to TLS key file--tlsverify Use TLS and verify the remote--skip-hostname-check Don't check the daemon's hostname against thename specified in the client certificate--project-directory PATH Specify an alternate working directory(default: the path of the Compose file)--compatibility If set, Compose will attempt to convert keysin v3 files to their non-Swarm equivalent--env-file PATH Specify an alternate environment fileCommands:build Build or rebuild servicesconfig Validate and view the Compose filecreate Create servicesdown Stop and remove containers, networks, images, and volumesevents Receive real time events from containersexec Execute a command in a running containerhelp Get help on a commandimages List imageskill Kill containerslogs View output from containerspause Pause servicesport Print the public port for a port bindingps List containerspull Pull service imagespush Push service imagesrestart Restart servicesrm Remove stopped containersrun Run a one-off commandscale Set number of containers for a servicestart Start servicesstop Stop servicestop Display the running processesunpause Unpause servicesup Create and start containersversion Show the Docker-Compose version information
2 从docker compose启动单个容器
目录可以在任意目录,推荐放在有意义的位置(/usr/local/docker-compos)
- 2.1 一个容器的docker compose文件
设置一个yml格式的配置文件,因此要注意前后缩进
vim /usr/local/docker-compos/docker-compose.yml[root@gbase8c_private docker-compose]# cat docker-compose.yml web1:image: 192.168.56.199/nginx/nginx:v1expose:- 80- 443ports:- "80:80"- "443:443"
- 2.2 启动容器
必须要在docker compose文件所在的目录执行:
docker-compose up #前台启动[root@gbase8c_private docker-compose]# docker-compose up/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.from cryptography.hazmat.backends import default_backendCreating docker-compose_web1_1 ... doneAttaching to docker-compose_web1_1web1_1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configurationweb1_1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/web1_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.shweb1_1 | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.confweb1_1 | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.confweb1_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.shweb1_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.shweb1_1 | /docker-entrypoint.sh: Configuration complete; ready for start upweb1_1 | 2023/12/17 14:41:21 [notice] 1#1: using the "epoll" event methodweb1_1 | 2023/12/17 14:41:21 [notice] 1#1: nginx/1.21.5web1_1 | 2023/12/17 14:41:21 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) web1_1 | 2023/12/17 14:41:21 [notice] 1#1: OS: Linux 3.10.0-1160.71.1.el7.x86_64web1_1 | 2023/12/17 14:41:21 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576web1_1 | 2023/12/17 14:41:21 [notice] 1#1: start worker processesweb1_1 | 2023/12/17 14:41:21 [notice] 1#1: start worker process 29web1_1 | 2023/12/17 14:41:21 [notice] 1#1: start worker process 30^CGracefully stopping... (press Ctrl+C again to force)Stopping docker-compose_web1_1 ... done
- 2.3 web访问测试
- 2.4 后台启动服务
容器在启动的时候,会给容器自定义一个名称
docker-compose up -d
日志:
[root@gbase8c_private docker-compose]# docker-compose up -dStarting docker-compose_web1_1 ... done #容器名称
- 2.5 自定义容器名称
[root@gbase8c_private docker-compose]# cat docker-compose.yml
web1:image: 192.168.56.199/nginx/nginx:v1expose:- 80- 443container_name: nginx-web1 #自定义容器名称ports:- "80:80"- "443:443"
日志:
[root@gbase8c_private docker-compose]# docker-compose stopStopping docker-compose_web1_1 ... done[root@gbase8c_private docker-compose]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES72aed697d033 192.168.56.199/nginx/nginx:v1 "/docker-entrypoint.…" 9 minutes ago Exited (0) 13 seconds ago docker-compose_web1_1[root@gbase8c_private docker-compose]# docker-compose up -dRecreating docker-compose_web1_1 ... done[root@gbase8c_private docker-compose]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf1033c073624 192.168.56.199/nginx/nginx:v1 "/docker-entrypoint.…" 2 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx-web1[root@gbase8c_private docker-compose]#
3 从docker compose启动多个容器
- 3.1 编辑docker-compose文件
cat docker-compose.yml
web1:image: 192.168.56.199/nginx/nginx:v1expose:- 80- 443container_name: nginx-web1 ports:- "80:80"- "443:443"
web2: #每个容器一个IDimage: 192.168.56.199/nginx/nginx:v1expose:- 80- 443container_name: nginx-web2 ports:- "81:80"- "444:443"
日志:
[root@gbase8c_private docker-compose]# docker-compose stopStopping nginx-web1 ... done[root@gbase8c_private docker-compose]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf1033c073624 192.168.56.199/nginx/nginx:v1 "/docker-entrypoint.…" 5 minutes ago Exited (0) 6 seconds ago nginx-web1[root@gbase8c_private docker-compose]# docker-compose up -dStarting nginx-web1 ... doneCreating nginx-web2 ... done[root@gbase8c_private docker-compose]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES341ed2cbd17d 192.168.56.199/nginx/nginx:v1 "/docker-entrypoint.…" 51 seconds ago Up 50 seconds 0.0.0.0:81->80/tcp, 0.0.0.0:444->443/tcp nginx-web2f1033c073624 192.168.56.199/nginx/nginx:v1 "/docker-entrypoint.…" 6 minutes ago Up 50 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx-web1
- 3.2 web访问测试
4 定义数据卷挂载
- 4.1 创建数据目录和文件
mkdir -p /data/nginx
echo "Test Nginx Volume" > /data/nginx/index.html
- 4.2 编辑compose配置文件
cat docker-compose.yml
web1:image: jack/nginx-1.22.1:v1expose:- 80- 443container_name: nginx-web1 volumes:- /data/nginx:/usr/local/nginx/htmlports:- "80:80"- "443:443"
web2: #每个容器一个IDimage: jack/nginx-1.22.1:v1expose:- 80- 443container_name: nginx-web2 ports:- "81:80"- "444:443"
- 4.3 重启容器
docker-compose stop
docker-compose up -d
-
4.4 登录验证Web访问
-
4.5 其他常用命令
##重启单个指定容器
docker-compose restart web1
##重启所有容器
docker-compose restart
##停止和启动单个容器
docker-compose stop web1
docker-compose start web1
##停止和启动所有容器
docker-compose stop
docker-compose start
5 实现单机版的HA+NGINX+TOMCAT
5.1 制作haproxy镜像
- 5.1.1 编辑Dockerfile文件
cd /opt/dockerfile/web/haproxy
cat Dockerfile
#My Dockerfile
From docker.io/centos:latest
MAINTAINER chengk "123@123.com"#Yum Setting
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
#以下为centos8需要
RUN sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
RUN sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*RUN yum install gcc gcc-c++ pcre pcre-devel openssl openssl-devel make vim wget tree lrzsz automake zlib zlib-devel iproute net-tools iotop -y
ADD haproxy-1.8.31.tar.gz /usr/local/src/
RUN cd /usr/local/src/haproxy-1.8.31 && make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy
RUN cp /usr/local/src/haproxy-1.8.31/examples/haproxy.init /etc/init.d/haproxy
RUN cp /usr/local/src/haproxy-1.8.31/haproxy /usr/sbin/haproxy
ADD haproxy.service /usr/lib/systemd/system/haproxy.service
ADD haproxy /etc/sysconfig/haproxy
ADD run_haproxy.sh /root/script/run_haproxy.sh
ADD haproxy.cfg /etc/haproxy/haproxy.cfg
RUN chmod a+x /root/script/run_haproxy.shCMD ["/root/script/run_haproxy.sh"]
EXPOSE 80 9999
- 5.1.2 准备服务启动脚本
cat haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
SourcePath=/etc/init.d/haproxy
[Service]
EnvironmentFile=/etc/sysconfig/haproxy
ExecStart=/etc/init.d/haproxy start
ExecStop=/etc/init.d/haproxy stop
ExecReload=/etc/init.d/haproxy reload[Install]
WantedBy=multi-user.target
- 5.1.3 前台启动脚本
cat run_haproxy.sh
#!/bin/bash
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
tail -f /etc/hosts
- 5.1.4 haproxy参数文件
cat haproxy
OPTIONS=""
- 5.1.5 准备压缩包及其他文件
-rw-r--r-- 1 root root 858 1月 19 20:04 Dockerfile
-rw-r--r-- 1 root root 301 1月 19 20:05 haproxy.service
-rw-r--r-- 1 root root 94 1月 19 20:05 run_haproxy.sh
-rw-r--r-- 1 root root 11 1月 19 20:05 haproxy
-rw-r--r-- 1 root root 2523 1月 19 20:06 CentOS-Base.repo
-rw-r--r-- 1 root root 951 1月 19 20:06 epel.repo
-rw-r--r-- 1 root root 2219503 1月 19 20:07 haproxy-1.8.31.tar.gz
- 5.1.6 执行构建镜像
docker build -t 192.168.56.199/centos/centos_haproxy_1.8.31 /opt/dockerfile/web/haproxy/
docker rm -f `docker ps -a -q`
docker rmi 192.168.56.199/centos/centos_haproxy_1.8.31:v1
docker tag 192.168.56.199/centos/centos_haproxy_1.8.31:latest 192.168.56.199/centos/centos_haproxy_1.8.31:v1
5.2 准备nginx镜像
5.3 准备tomcat镜像
5.4 编辑docker compose 文件及环境准备
- 5.4.1 编辑docker compose文件
cat docker-compose.yml
nginx-web1:image: jack/nginx-1.22.1:v1expose:- 80- 443container_name: nginx-web1 volumes:- /data/nginx:/usr/local/nginx/html- /usr/local/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conflinks:- tomcat-web1- tomcat-web2
nginx-web2: image: jack/nginx-1.22.1:v1expose:- 80- 443container_name: nginx-web2 volumes:- /usr/local/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conflinks:- tomcat-web1- tomcat-web2
tomcat-web1:container_name: tomcat-web1image: tomcat-web:app1user: rootcommand: /apps/tomcat/bin/run_tomcat.shvolumes: - /apps/tomcat/webapps/SalesManager:/apps/tomcat/webapps/SalesManagerexpose:- 8080- 8443
tomcat-web2:container_name: tomcat-web2image: tomcat-web:app1user: rootcommand: /apps/tomcat/bin/run_tomcat.shvolumes: - /apps/tomcat/webapps/SalesManager:/apps/tomcat/webapps/SalesManagerexpose:- 8080- 8443
haproxy-web1:container_name: haproxy-web1image: 192.168.56.199/centos/centos_haproxy_1.8.31:v1command: /root/script/run_haproxy.shvolumes:- /etc/haproxy/haproxy.cfg:/etc/haproxy/haproxy.cfgports:- "9999:9999"- "80:80"links:- nginx-web1- nginx-web2
- 5.4.2 准备nginx静态页面
cat /data/nginx/index.html
Test Nginx Volme
- 5.4.3 准备nginx 配置文件
#本地路径和nginx路径都是/usr/local/nginx/conf/nginx.conf
grep -v "#" /usr/local/nginx/conf/nginx.conf
user nginx;
worker_processes auto;
daemon off;
events {worker_connections 1024;
}
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream tomcat_webserver{server tomcat-web1:8080;server tomcat-web2:8080;}server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}location /SalesManager {proxy_pass http://tomcat_webserver;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-IP $remote_addr; }error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
}
- 5.4.4 准备tomcat页面文件
ll /apps/tomcat/webapps/SalesManager
cat /apps/tomcat/webapps/SalesManager/showhost.jsp
<%@page import="java.util.Enumeration"%>
<br />
host:<%try{out.println(""+java.net.InetAddress.getLocalHost().getHostName());}catch(Exception e){}%>
<br />
<%request.getSession().setAttribute("t1","t2");%>
<%Enumeration en = request.getHeaderNames();while(en.hasMoreElements()){String hd = en.nextElement().toString();out.println(hd+":"+request.getHeader(hd));out.println("<br />");}%>
5.5 启动容器
日志:
[root@gbase8c_private docker-compose]# docker-compose up -d/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.from cryptography.hazmat.backends import default_backendCreating tomcat-web1 ... doneCreating tomcat-web2 ... doneCreating nginx-web2 ... doneCreating nginx-web1 ... doneCreating haproxy-web1 ... done[root@gbase8c_private docker-compose]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES679cadcf5244 192.168.56.199/centos/centos_haproxy_1.8.31:v1 "/root/script/run_ha…" 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:9999->9999/tcp haproxy-web1d7bd6746c7ee jack/nginx-1.22.1:v1 "nginx" 6 seconds ago Up 4 seconds 80/tcp, 443/tcp nginx-web1fb3df1f58075 jack/nginx-1.22.1:v1 "nginx" 6 seconds ago Up 4 seconds 80/tcp, 443/tcp nginx-web2f0d87107431b tomcat-web:app1 "/apps/tomcat/bin/ru…" 7 seconds ago Up 5 seconds 8009/tcp, 8080/tcp, 8443/tcp tomcat-web26424d08ff212 tomcat-web:app1 "/apps/tomcat/bin/ru…" 7 seconds ago Up 5 seconds 8009/tcp, 8080/tcp, 8443/tcp tomcat-web1[root@gbase8c_private docker-compose]# docker-compose logs -f/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.from cryptography.hazmat.backends import default_backendAttaching to haproxy-web1, nginx-web1, nginx-web2, tomcat-web2, tomcat-web1tomcat-web1 | Tomcat started.tomcat-web1 | 127.0.0.1 localhosttomcat-web1 | ::1 localhost ip6-localhost ip6-loopbacktomcat-web1 | fe00::0 ip6-localnettomcat-web1 | ff00::0 ip6-mcastprefixtomcat-web1 | ff02::1 ip6-allnodestomcat-web1 | ff02::2 ip6-allrouterstomcat-web1 | 10.10.0.2 6424d08ff212tomcat-web1 | 1.1.1.1 abc.test.comhaproxy-web1 | 127.0.0.1 localhosthaproxy-web1 | ::1 localhost ip6-localhost ip6-loopbackhaproxy-web1 | fe00::0 ip6-localnethaproxy-web1 | ff00::0 ip6-mcastprefixtomcat-web2 | Tomcat started.haproxy-web1 | ff02::1 ip6-allnodeshaproxy-web1 | ff02::2 ip6-allrouterstomcat-web2 | 127.0.0.1 localhosthaproxy-web1 | 10.10.0.5 nginx-web1 d7bd6746c7eehaproxy-web1 | 10.10.0.4 nginx-web2 fb3df1f58075haproxy-web1 | 10.10.0.6 679cadcf5244tomcat-web2 | ::1 localhost ip6-localhost ip6-loopbacktomcat-web2 | fe00::0 ip6-localnettomcat-web2 | ff00::0 ip6-mcastprefixtomcat-web2 | ff02::1 ip6-allnodestomcat-web2 | ff02::2 ip6-allrouterstomcat-web2 | 10.10.0.3 f0d87107431btomcat-web2 | 1.1.1.1 abc.test.com
相关文章:
【Docker】Docker学习⑨ - 单机编排之Docker Compose
【Docker】Docker学习⑨ - 单机编排之Docker Compose 一、Docker简介二、Docker安装及基础命令介绍三、Docker镜像管理四、Docker镜像与制作五、Docker数据管理六、网络部分七、Docker仓库之单机Dokcer Registry八、Docker仓库之分布式Harbor九、单机编排之Docker Compose1 基础…...
ES6笔记-symbol
ES6 symbol 是什么 ES5的对象属性名是字符串,这容易造成属性名的冲突。symbol是一种机制,保证每个属性的名字都是独一无二的。这样就从根本上防止属性名冲突。 它是一种原始数据类型Symbol,表示独一无二的值。它属于javaScript语言的原生数据类型之一。…...
C++设计模式介绍:优雅编程的艺术
物以类聚 人以群分 文章目录 简介为什么有设计模式? 设计模式七大原则单一职责原则(Single Responsibility Principle - SRP)开放封闭原则(Open/Closed Principle - OCP)里氏替换原则(Liskov Substitution …...
GitLab升级版本(任意用户密码重置漏洞CVE-2023-7028)
目录 前言漏洞分析影响范围查看自己的GitLab版本升级路程 升级过程13.1.1113.8.8 - 14.0.1214.3.614.9.5 - 16.1.6 前言 最近GitLab发了个紧急漏洞需要修复,ok接到命令立刻着手开始修复,在修复之前先大概了解一下这个漏洞是什么东西 漏洞分析 1、组件…...
Unity——八叉树的原理与实现
八叉树原理 八叉树(Octree)是一种用于在三维空间中进行空间分割的数据结构。它将三维空间递归地划分为八个子空间,每个子空间对应于一个八叉树节点。这种分割方式可以有效地组织和管理场景中的对象,提高检索效率,特别…...
android 自定义软键盘的显示和隐藏
记一下,以后不用找在InputMethodService中有这两个方法可以看到软键盘显示状态 //软键盘隐藏 override fun onWindowHidden() {super.onWindowHidden() } //软键盘显示 override fun onWindowShown() {super.onWindowShown() } 在activity中可以通过这种方法看到软键盘显示状…...
基于openssl v3搭建ssl安全加固的c++ tcpserver
1 概述 tcp server和tcp client同时使用openssl库,可对通信双方流通的字节序列进行加解密,保障通信的安全。本文以c编写的tcp server和tcp client为例子,openssl的版本为v3。 2 安装openssl v3 2.1 安装 perl-IPC-Cmd openssl项目中的co…...
11.2 Web开发_CSS入门(❤❤)
11.2 Web开发_CSS入门❤❤ 1. CSS简介1.1 基础案例2. CSS书写的位置2.1 行内式2.2 内嵌式2.3 外链式3. CSS基础选择器3.1 标签选择器3.2 id选择器3.3 类选择器3.4 选择器优先级3.5 通配符选择器4. 多类名5. 样式的两种特性5.1 层叠性...
[docker] Docker的数据卷、数据卷容器,容器互联
一、数据卷(容器与宿主机之间数据共享) 数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容…...
ATF(TF-A)安全通告TF-V11——恶意的SDEI SMC可能导致越界内存读取(CVE-2023-49100)
目录 一、ATF(TF-A)安全通告TFV-11 (CVE-2023-49100) 二、透过事务看本质SDEI是干啥的呢? 三、CVE-2023-49100 1、GICv2 systems 2、GICv3 systems 四、漏洞修复 一、ATF(TF-A)安全通告TFV-11 (CVE-2023-49100) Title 恶意的SDEI SMC可能导致越界内存读取&am…...
如何查找SpringBoot应用中的请求路径(不使用idea)
背景 昨天有个同事向我咨询某个接口的物理表是哪个,由于公司业务较多、这块业务的确不是我负责的,也没有使用idea不能全局搜索(eclipse搜不到jar内的字符串),也就回复了不清楚。 除了自己写代码输出servlet的路径和类外,发现了一…...
56. 合并区间 - 力扣(LeetCode)
题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 题目示例 输入:intervals [[1,3…...
数据结构篇-03:堆实现优先级队列
本文着重在于讲解用 “堆实现优先级队列” 以及优先级队列的应用,在本文所举的例子中,可能使用优先级队列来解并不是最优解法,但是正如我所说的:本文着重在于讲解“堆实现优先级队列” 堆实现优先级队列 堆的主要应用有两个&…...
linux clickhouse 安装
1、官网下载clickhouse安装包 下载地址, clickhouse分lts和stable版本,lts是长期版本,一般选择安装lts版本。 其中clickhouse-server是clickhouse服务,就是用来访问数据存储数据,clickhouse-client是用来通过命令访问数…...
【游戏客户端开发的进阶路线】
*** 游戏客户端开发的进阶路线 春招的脚步越来越近,我们注意到越来越多的同学们都在积极学习游戏开发,希望能在这个充满活力的行业中大展拳脚。 当我们思考如何成为游戏开发领域的佼佼者时,关键在于如何有效规划学习路径。 🤔 我…...
vue3+naiveUI二次封装的v-model 联动输入框
根据官网说明使用 源码 <template><div class"clw-input pt-3"><n-inputref"input":value"modelValue":type"type":title"title"clearable:disabled"disabled":size"size"placeholder&…...
百度Apollo | 实车自动驾驶:感知、决策、执行的无缝融合
🎬 鸽芷咕:个人主页 🔥 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…...
DAY31:贪心算法入门455、53、376
理论基础 贪心算法的基本思路是通过局部最优从而达到全局最优,但是有时候局部最优并不一定导致全局最优,这样就需要动态规划的方法。但一部分题目是能通过贪心得到的。贪心的证明一般用到数学归纳法和反证法。在实际的问题中,没有统一的代码…...
LeetCode:376.摆动序列
个人主页:仍有未知等待探索-CSDN博客 专题分栏:算法_仍有未知等待探索的博客-CSDN博客 题目链接:376. 摆动序列 - 力扣(LeetCode) 一、题目 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称…...
Stable Diffusion插件Recolor实现黑白照片上色
今天跟大家分享一个使用Recolor插件通过SD实现老旧照片轻松变彩色,Recolor翻译过来的含义就是重上色,该模型可以保持图片的构图,它只会负责上色,图片不会发生任何变化。 一:插件下载地址 https://github.com/pkuliyi…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
Docker、Wsl 打包迁移环境
电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本: 2.2.4.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.61 MSRDC 版本: 1.2.5326 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.2609…...
