当前位置: 首页 > news >正文

单机编排docker compose

Docker之旅(8)-单机编排docker compose

当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容易出错,
并且每个容器之间也会有先后启动的顺序依赖等。这个时候推荐使用 docker 单机
编排工具 docker-composedocker-compose 是 docker 容器的一种单机编排服务,
docker-compose 是一个管理多个容器的工具,比如可以解决容器之间的依赖关系,
就像启动一个 nginx 前端服务的时候会调用后端的 tomcat,那就得先启动 tomcat,
但是启动 tomcat 容器还需要依赖数据库,那就还得先启动数据库,docker-compose
就可以解决这样的嵌套依赖关系,其完全可以替代 docker run 对容器进行创建、启动
和停止。

docker-compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快
速编排,docker-compose 将所管理的容器分为三层,分别是工程(project),服务
(service)及容器(container)。

docker-compose 是一个用于定义和运行多个容器 Docker 应用程序的工具。使用
Compose,可以使用 YAML 文件来配置应用程序的服务。然后,使用一个命令,从
配置中创建并启动所有服务。所以在使用 docker-compose 时编写比较规范的.yaml
或则.yml 文件是比较重要的。Compose 文件就是一个 YAML 文件,用其来定义
服务、网络和数据卷等。docker-compose 默认会在当前目录找该文件,即
./docker-compose.yml

Docker-compose 项目地址

docker-compose.yaml 文件示例:

version: "3.7"
services:redis:image: redis:alpineports:- "6379"networks:- frontenddeploy:replicas: 2update_config:parallelism: 2delay: 10srestart_policy:condition: on-failuredb:image: postgres:9.4volumes:- db-data:/var/lib/postgresql/datanetworks:- backenddeploy:placement:constraints: [node.role == manager]vote:image: dockersamples/examplevotingapp_vote:beforeports:- "5000:80"networks:- frontenddepends_on:- redisdeploy:replicas: 2update_config:parallelism: 2restart_policy:condition: on-failureresult:image: dockersamples/examplevotingapp_result:beforeports:- "5001:80"networks:- backenddepends_on:- dbdeploy:replicas: 1update_config:parallelism: 2delay: 10srestart_policy:condition: on-failureworker:image: dockersamples/examplevotingapp_workernetworks:- frontend- backenddeploy:mode: replicatedreplicas: 1labels: [APP=VOTING]restart_policy:condition: on-failuredelay: 10smax_attempts: 3window: 120splacement:constraints: [node.role == manager]visualizer:image: dockersamples/visualizer:stableports:- "8080:8080"stop_grace_period: 1m30svolumes:- "/var/run/docker.sock:/var/run/docker.sock"deploy:placement:constraints: [node.role == manager]networks:frontend:backend:volumes:db-data:

一. 安装 docker-compose

1.1 安装 python-pip 包管理器

在 linux 平台,安装python-pip 包会安装 pip 命令,pip 命令是一个
pyhton 安装包的安装管理工具,其类似于 ubuntu 的 apt 或者 redhat
的 yum,但是 pip 只安装 python 相关的安装包。pip 工具可以在多种
操作系统安装和使用。

Ubuntu1804 安装

root@ubuntu-suosuoli-node1:~# apt update
root@ubuntu-suosuoli-node1:~# apt install python3-pip

CentOS 安装

~$ yum install epel-release
~$ yum install -y python3-pip

1.2 安装 docker-compose

Ubuntu 1804

root@ubuntu-suosuoli-node1:~# pip3 install docker-compose
root@ubuntu-suosuoli-node1:~# docker-compose version
docker-compose version 1.25.4, build unknown
docker-py version: 4.2.0
CPython version: 3.6.9
OpenSSL version: OpenSSL 1.1.1  11 Sep 2018root@ubuntu-suosuoli-node1:~# docker-compose --help
Define and run multi-container applications with Docker.Usage:docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]docker-compose -h|--help# 常用选项:
-f,–file FILE         #指定Compose模板文件,默认为docker-compose.yml。
-p,–project-name NAME #指定项目名称,默认将使用当前所在目录名称作为项目名。
--verbose              #显示更多输出信息
--log-level LEVEL      #定义日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
--no-ansi              #不显示ANSI控制字符
-v, --version          #显示版本
config  -q #查看当前配置,没有错误不输出任何信息
build     # 通过docker-compose构建镜像
bundle    # 从当前docker compose文件生成一个以当前目录为名称的从Compose 文件生成一个分布式应用程序捆绑包(DAB)。
create    # 创建服务
down      # 停止和删除所有容器、网络、镜像和卷events    # 从容器接收实时事件,可以指定json日志格式,如# docker-compose  events --jsonexec      # 进入指定容器进行操作
help      # 显示帮助细信息
images    # 显示当前服务器的docker镜像信息,和docker images基本一致
kill      # 强制终止运行中的容器
logs      # 查看容器的日志
pause     # 暂停服务port      # 查看端口# docker-compose port  --protocol=tcp nginx 80ps        # 列出容器
pull      # 重新拉取镜像
push      # 上传镜像
restart   # 重启服务
rm        # 删除已经停止的服务
run       # 一次性运行容器,等于docker run --rmscale     # 设置指定服务运行的容器个数# docker-compose  scale nginx=2start     # 启动服务
stop      # 停止服务
top       # 显示容器运行状态
unpause   # 取消暂定
up        # 创建并启动容器
version   # 显示docker-compose版本信息

CentOS

~$ pip3 install docker-compose
~$ docker-compose version
~$ docker-compose --help

注:官方二进制下载地址:https://github.com/docker/compose/releases

二. 使用 docker-compose 启动单个容器

编写 yaml 格式的 compose 文件时,可以在任意目录新建.yaml文件,并从
该目录启动容器。

2.1 编写构建单个容器的 compose 文件

编写 yml 格式的 docker-compose 文件,启动一个 nginx 服务,yaml 文档
的语法严格要求上下各行缩进的关系。

root@ubuntu-suosuoli-node1:~# mkdir  /data/compose
root@ubuntu-suosuoli-node1:~# cd /data/compose
root@ubuntu-suosuoli-node1:/data/compose# vim docker-compose.yaml
service-nginx:image: nginx:compiled_V1expose:- 80- 443ports:- "80:80"- "443:443"

2.2 启动容器

在 docker compose 文件所在的目录执行docker-compose up -d
不加-d选项表示前台启动容器。

root@ubuntu-suosuoli-node1:/data/compose# docker-compose up -d
Creating compose_service-nginx_1 ... done

2.3 访问 web 测试

root@ubuntu-suosuoli-node1:/data/compose# ip addr show eth0 | grep inetinet 192.168.100.13/24 brd 192.168.100.255 scope global dynamic eth0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TFHUsHFv-1692318413948)(png/2020-02-29-11-27-43.png)]

2.4 compose 启动的容器名

容器的在启动的时候,会给容器自定义一个名称,在 service name 后面加_1
在前面加当前目录名compose_

root@ubuntu-suosuoli-node1:/data/compose# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
9060a76a2dc4        nginx:compiled_V1   "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp, 443/tcp   compose_service-nginx_1

2.5 自定义容器名使用comtainer_name

root@ubuntu-suosuoli-node1:/data/compose# vim docker-compose.yaml
service-nginx:image: nginx:compiled_V1container_name: service-nginxexpose:- 80- 443ports:- "80:80"- "443:443"
root@ubuntu-suosuoli-node1:/data/compose# docker-compose down
Stopping compose_service-nginx_1 ... done
Removing compose_service-nginx_1 ... done
root@ubuntu-suosuoli-node1:/data/compose# docker-compose up -d
Creating service-nginx ... done
root@ubuntu-suosuoli-node1:/data/compose# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES
f8e402b17985        nginx:compiled_V1   "nginx -g 'daemon of…"   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   service-nginx

2.6 查看容器进程

root@ubuntu-suosuoli-node1:/data/compose# docker-compose psName              Command          State                    Ports
---------------------------------------------------------------------------------------
service-nginx   nginx -g daemon off;   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp

三. 使用 docker-compose 启动多个容器

3.1 编写构建多个容器的 compose 文件

root@ubuntu-suosuoli-node1:/data/compose# vim docker-compose.yaml
service-nginx:image: nginx:compiled_V1container_name: service-nginxexpose:- 80- 443ports:- "80:80"- "443:443"service-tomcat-app1:images: tomcat-business:app1container_name: tomcat-app1expose:- 8080ports:- "8080:8080"

3.2 重启容器

root@ubuntu-suosuoli-node1:/data/compose# docker-compose stop
Stopping service-nginx ... done
root@ubuntu-suosuoli-node1:/data/compose# docker-compose down
Removing service-nginx ... doneroot@ubuntu-suosuoli-node1:/data/compose# docker-compose up -d
Creating tomcat-app1   ... done
Creating service-nginx ... doneroot@ubuntu-suosuoli-node1:/data/compose# ss -tnl | grep 80
LISTEN   0         20480                     *:8080                   *:*
LISTEN   0         20480                     *:80                     *:*
...
root@ubuntu-suosuoli-node1:/data/compose# lsof -i:80
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 15625 root    4u  IPv6 715730      0t0  TCP *:http (LISTEN)
root@ubuntu-suosuoli-node1:/data/compose# lsof -i:8080
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 15637 root    4u  IPv6 715754      0t0  TCP *:http-alt (LISTEN)

3.4 单机编排常用命令

3.4.1 重启单个容器

使用docker-compose restart service_name重启某个容器

root@ubuntu-suosuoli-node1:/data/compose# cat docker-compose.yaml
service-nginx:image: nginx:compiled_V1container_name: service-nginxexpose:- 80- 443ports:- "80:80"- "443:443"service-tomcat-app1:image: tomcat-business:app1container_name: tomcat-app1expose:- 8080ports:- "8080:8080"
root@ubuntu-suosuoli-node1:/data/compose# docker-compose  restart service-nginx
Restarting service-nginx ... done
root@ubuntu-suosuoli-node1:/data/compose# docker-compose  restart service-tomcat-app1
Restarting tomcat-app1 ... done

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sz4VQ3Q8-1692318413950)(png/2020-02-29-11-48-48.png)]

3.4.2 重启所有容器

使用docker-compose restart重启所有容器

root@ubuntu-suosuoli-node1:/data/compose# docker-compose restart
Restarting service-nginx ... done
Restarting tomcat-app1   ... done

3.4.3 停止后启动单个容器

root@ubuntu-suosuoli-node1:/data/compose# docker-compose stop service-nginx
Stopping service-nginx ... done
root@ubuntu-suosuoli-node1:/data/compose# docker-compose start service-nginx
Starting service-nginx ... done

3.4.4 停止和启动所有容器

root@ubuntu-suosuoli-node1:/data/compose# docker-compose stop
Stopping service-nginx ... done
Stopping tomcat-app1   ... done
root@ubuntu-suosuoli-node1:/data/compose# docker-compose start
Starting service-nginx       ... done
Starting service-tomcat-app1 ... done

四. 定义数据卷

4.1 创建文件和目录

root@ubuntu-suosuoli-node1:/data/compose# ll /data/app1
total 12
drwxr-xr-x  2 root root 4096 Feb 25 17:25 ./
drwxr-xr-x 10 root root 4096 Feb 29 11:07 ../
-rw-r--r--  1 root root   16 Feb 25 20:47 index.html
root@ubuntu-suosuoli-node1:/data/compose# cat /data/app1/index.html
This is app1...

4.2 编写 compose 文件

root@ubuntu-suosuoli-node1:/data/compose# vim volume-compose.yaml
service-nginx:image: nginx:compiled_V1container_name: nginx-web1volumes:- /data/app1/:/usr/local/nginx/html/expose:- 80- 443ports:- "80:80"- "443:443"service-tomcat-app1:image: tomcat-business:app1container_name: tomcat-app1expose:- 8080ports:- "8080:8080"

4.3 重启容器

root@ubuntu-suosuoli-node1:/data/compose# docker-compose down
Stopping service-nginx ... done
Stopping tomcat-app1   ... done
Removing service-nginx ... done
Removing tomcat-app1   ... doneroot@ubuntu-suosuoli-node1:/data/compose# docker-compose -f ./volume-compose.yaml up -d
Creating tomcat-app1 ... done
Creating nginx-web1  ... done

4.4 访问 web 验证

root@ubuntu-suosuoli-node1:/data/compose# docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                                        NAMES
2e7244785408        nginx:compiled_V1      "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp     nginx-web1
d8c537c89088        tomcat-business:app1   "/apps/tomcat/bin/ru…"   3 minutes ago       Up 3 minutes        8005/tcp, 8009/tcp, 0.0.0.0:8080->8080/tcp   tomcat-app1
root@ubuntu-suosuoli-node1:/data/compose# docker exec -it nginx-web1 /bin/bash
[root@2e7244785408 /]# cat /usr/local/nginx/html/index.html
This is app1...
[root@2e7244785408 /]# exit
exit
root@ubuntu-suosuoli-node1:/data/compose# cat /data/app1/index.html
This is app1...

五. 单机版 nginx+tomcat 部署示例

编写 docker-compose.yml 文件,实现单机版本的 nginx+tomcat 的动静分离 web
站点,要求从 nginx 作为访问入口,当访问指定 URL 的时候转发至 tomcat 服务
器响应。

5.1 制作 HAProxy 镜像

5.1.1 HAProxy 镜像上下文

root@ubuntu-suosuoli-node1:/opt/dockerfile/dockerfile-example/system/centos/haproxy# ll
total 24
drwxr-xr-x 2 root root 4096 Feb 25 10:41 ./
drwxr-xr-x 3 root root 4096 Feb 20 16:59 ../
-rwxr--r-- 1 root root   48 Feb 20 17:15 docker_build_cmd.sh*
-rw-r--r-- 1 root root  768 Feb 20 17:34 Dockerfile
-rw-r--r-- 1 root root    0 Feb 25 10:41 haproxy-2.0.5.tar.gz
-rw-r--r-- 1 root root  714 Feb 20 17:13 haproxy.cfg
-rwxr-xr-x 1 root root   77 Feb 20 17:36 run_haproxy.sh*

5.1.2 Dockerfile

root@ubuntu-suosuoli-node1:/opt/dockerfile/dockerfile-example/system/centos/haproxy# cat Dockerfile
# A HAProxy image based on centos-base:v1 with some tools installedFROM centos-base:v1RUN yum install -y yum install gcc gcc-c++ glibc glibc-devel \pcre pcre-devel openssl openssl-devel systemd-devel net-tools \vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump \wget ntpdateADD haproxy-2.0.5.tar.gz /usr/local/src/RUN cd /usr/local/src/haproxy-2.0.5 && \make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 \USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy && \make install PREFIX=/usr/local/haproxy && \cp haproxy /usr/sbin/ && \mkdir /usr/local/haproxy/runADD haproxy.cfg /etc/haproxy/ADD run_haproxy.sh /usr/binEXPOSE 80 9999CMD ["/usr/bin/run_haproxy.sh"]

5.1.3 HAProxy 配置文件

root@ubuntu-suosuoli-node1:/opt/dockerfile/dockerfile-example/system/centos/haproxy# cat haproxy.cfg
global
chroot /usr/local/haproxy
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
nbproc 1
pidfile /usr/local/haproxy/run/haproxy.pid
log 127.0.0.1 local3 infodefaults
option http-keep-alive
option  forwardfor
mode http
timeout connect 300000ms
timeout client  300000ms
timeout server  300000mslisten statsmode httpbind 0.0.0.0:9999stats enablelog globalstats uri     /haproxy-statusstats auth    haadmin:stevenuxlisten  web_port_80bind 0.0.0.0:80mode httplog globalbalance roundrobinserver web1  127.0.0.1:8800  check inter 3000 fall 2 rise 5listen  web_port_443bind 0.0.0.0:443mode httplog globalbalance roundrobinserver web1  127.0.0.1:8443  check inter 3000 fall 2 rise 5

5.1.4 HAProxy 运行脚本

root@ubuntu-suosuoli-node1:/opt/dockerfile/dockerfile-example/system/centos/haproxy# cat run_haproxy.sh
#!/bin/bash
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
tail -f /etc/hosts

5.1.5 镜像构建脚本

root@ubuntu-suosuoli-node1:/opt/dockerfile/dockerfile-example/system/centos/haproxy# cat docker_build_cmd.sh
#!/bin/bash
docker build -t haproxy-ubuntu:v1 .

5.1.6 构建 HAProxy 镜像

root@ubuntu-suosuoli-node1:/opt/dockerfile/dockerfile-example/system/centos/haproxy# ./docker_build_cmd.sh
Sending build context to Docker daemon  2.546MB
Step 1/8 : FROM centos-base:v1---> 729c515f2078
Step 2/8 : RUN yum install -y yum install gcc gcc-c++ glibc glibc-devel     pcre pcre-devel openssl openssl-devel systemd-devel net-tools     vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump     wget ntpdate---> Using cache---> e8cfccf03783
Step 3/8 : ADD haproxy-2.0.5.tar.gz /usr/local/src/---> Using cache---> a6b31b35ffec
Step 4/8 : RUN cd /usr/local/src/haproxy-2.0.5 &&     make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1     USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy &&     make install PREFIX=/usr/local/haproxy &&     cp haproxy /usr/sbin/ &&     mkdir /usr/local/haproxy/run---> Using cache---> 48628430e4a9
Step 5/8 : ADD haproxy.cfg /etc/haproxy/---> c28219089d8e
Step 6/8 : ADD run_haproxy.sh /usr/bin---> 4e61a58ce316
Step 7/8 : EXPOSE 80 9999---> Running in cfe69dd4b8e6
Removing intermediate container cfe69dd4b8e6---> aea10882c7be
Step 8/8 : CMD ["/usr/bin/run_haproxy.sh"]---> Running in 5c9e9907ee16
Removing intermediate container 5c9e9907ee16---> 12599307af4a
Successfully built 12599307af4a
Successfully tagged haproxy-ubuntu:v1

5.2 准备 nginx 镜像

5.2.1 镜像上下文

root@ubuntu-suosuoli-node1:/opt/dockerfile/dockerfile-example/web/nginx/ubuntu-nginx# pwd
/opt/dockerfile/dockerfile-example/web/nginx/ubuntu-nginx
root@ubuntu-suosuoli-node1:/opt/dockerfile/dockerfile-example/web/nginx/ubuntu-nginx# ll
total 1044
drwxr-xr-x 2 root root    4096 Feb 20 16:35 ./
drwxr-xr-x 4 root root    4096 Feb 25 09:57 ../
-rwxr--r-- 1 root root      45 Feb 20 16:34 docker_build_cmd.sh*
-rw-r--r-- 1 root root     610 Feb 20 16:33 Dockerfile
-rw-r--r-- 1 root root 1032630 Feb 20 16:35 nginx-1.16.1.tar.gz
-rw-r--r-- 1 root root    2674 Feb 20 16:34 nginx.conf
-rw-r--r-- 1 root root   10240 Feb 20 16:35 suosuoli.tar.gz

5.2.2 构建镜像

root@ubuntu-suosuoli-node1:/opt/dockerfile/dockerfile-example/web/nginx/ubuntu-nginx# ./docker_build_cmd.sh
Sending build context to Docker daemon  1.051MB
Step 1/8 : FROM ubuntu-base:v1---> cea7344c8fbf
Step 2/8 : ADD nginx-1.16.1.tar.gz /usr/local/src---> Using cache---> b53d38ca4edc
Step 3/8 : RUN cd /usr/local/src/nginx-1.16.1 &&     ./configure --prefix=/apps/nginx &&     make && make install &&     ln -sv /apps/nginx/sbin/nginx /usr/bin &&     rm -rf /usr/local/src/nginx-1.16.1 &&     rm -rf /usr/local/src/nginx-1.16.1.tar.gz---> Using cache---> dd6e13932516
Step 4/8 : ADD nginx.conf /apps/nginx/conf/nginx.conf---> Using cache---> ff665ea05f69
Step 5/8 : ADD suosuoli.tar.gz /data/nginx/html---> Using cache---> dd367b0be1b3
Step 6/8 : RUN groupadd -g 2019 nginx &&     useradd -g nginx -s /usr/sbin/nologin -u 2019 nginx &&     chown -R nginx.nginx /apps/nginx /data/nginx---> Using cache---> 67c4a641d0f8
Step 7/8 : EXPOSE 80 443---> Using cache---> 9747a7021fdd
Step 8/8 : CMD ["nginx"]---> Using cache---> ce5d71aaf355
Successfully built ce5d71aaf355
Successfully tagged nginx-ubunt:v1

由于之前构建过,所以都使用了 cache。

5.3 准备 tomcat 镜像

5.3.1 镜像上下文

root@ubuntu-suosuoli-node1:/opt/dockerfile/dockerfile-example/web/tomcat# pwd
/opt/dockerfile/dockerfile-example/web/tomcat
root@ubuntu-suosuoli-node1:/opt/dockerfile/dockerfile-example/web/tomcat# ll tomcat-app1/
total 24
drwxr-xr-x 3 root root 4096 Feb 20 14:18 ./
drwxr-xr-x 4 root root 4096 Feb 20 13:35 ../
drwxr-xr-x 2 root root 4096 Feb 20 13:54 app1/
-rwxr--r-- 1 root root   51 Feb 20 13:56 docker_build_cmd.sh*
-rw-r--r-- 1 root root  491 Feb 20 13:56 Dockerfile
-rwxr-xr-x 1 root root  198 Feb 20 14:18 run_tomcat.sh*

5.3.2 构建

root@ubuntu-suosuoli-node1:/opt/dockerfile/dockerfile-example/web/tomcat# ./docker_build_cmd.sh
Sending build context to Docker daemon  9.726MB
Step 1/11 : FROM jdk-base:v8.241---> d024ec787a4f
Step 2/11 : LABEL author="lisuo"       personal_site="www.suosuoli.cn"       contact="stvobs@163.com"---> Using cache---> 057c65610c25
Step 3/11 : ENV TZ "Asia/Shanghai"---> Using cache---> 333346e4d836
Step 4/11 : ENV LANG en_US.UTF-8---> Using cache---> f11866983f76
Step 5/11 : ENV TOMCAT_MAJOR_VERSION 8---> Using cache---> c4ebfee765a0
Step 6/11 : ENV TOMCAT_MINOR_VERSION 5.42---> Using cache---> aed0454ea780
Step 7/11 : ENV CATALINA_HOME /apps/tomcat---> Using cache---> 36c8238a5aff
Step 8/11 : ENV APP_DIR ${CATALINA_HOME}/webapps---> Using cache---> d90c45859526
Step 9/11 : RUN mkdir /apps---> Using cache---> 6487926fb016
Step 10/11 : ADD apache-tomcat-8.5.42.tar.gz /apps---> Using cache---> 5bf1f8919814
Step 11/11 : RUN ln -sv /apps/apache-tomcat-8.5.42 /apps/tomcat---> Using cache---> 6533b305cfc0
Successfully built 6533b305cfc0
Successfully tagged tomcat-base:v8.5.42

由于之前构建过,所以都使用了 cache。

5.4 准备 compose 文件和配置文件

5.4.1 准备 compose 文件

root@ubuntu-suosuoli-node1:/data/compose# cat nginx-tomcat-compose.yaml
service-haproxy:image: haproxy-ubuntu:v1container_name: haproxy-v1expose:- 80- 443- 9999ports:- "80:80"- "443:443"- "9999:9999"links:- service-nginxservice-nginx:image: nginx:compiled_V1container_name: nginx-webvolumes:- /data/nginx/suosuoli:/usr/local/nginx/html/suosuoli- /data/nginx/static:/usr/local/nginx/html/staticexpose:- 80- 443#  ports:#    - "8800:80"#    - "8443:443"links:- service-tomcat-app1- service-tomcat-app2service-tomcat-app1:image: tomcat-business:app1container_name: tomcat-app1volumes:- /data/tomcat/webapps/suosuoli:/apps/tomcat/webapps/expose:- 8080#  ports:#    - "8081:8080"service-tomcat-app2:image: tomcat-business:app2container_name: tomcat-app2volumes:- /data/tomcat/webapps/suosuoli:/apps/tomcat/webapps/expose:- 8080#  ports:#    - "8082:8080"

5.4.2 准备 nginx 静态文件

root@ubuntu-suosuoli-node1:~# cd /data/nginx/static/
root@ubuntu-suosuoli-node1:/data/nginx/static# rzroot@ubuntu-suosuoli-node1:/data/nginx/static# ll
total 40
drwxr-xr-x 2 root root  4096 Feb 29 13:23 ./
drwxr-xr-x 4 root root  4096 Feb 29 13:20 ../
-rw-r--r-- 1 root root 30470 Oct 25 08:06 amazed.png
root@ubuntu-suosuoli-node1:/data/nginx/static# vim index.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>js_start</title><h1 id="h">Hello, this is a js test message...</h1></head><body><canvasid="myCanvas"width="600"height="400"style="border: 8px solid #009"></canvas><script>const canvas = document.getElementById("myCanvas");const context = canvas.getContext("2d");let x = 50;let y = 50;let xChange = 0.6;let yChange = 0.3;function blob(xloc, yloc, sizeroke();if (x >= canvas.width - 40|| x <= 40) {xChange *= -1;}if (y >= canvas.height - 40|| y <= 40) {yChange *= -1;}x += xChange;y += yChange; }setInterval(function () {blob(x, y, 40, "green")}, 1);document.getElementById("mod").value = "click";</script></body>
</html>

5.4.3 准备 nginx.conf 文件

user  nginx;
worker_processes  1;
daemon off;
error_log  logs/error.log  notice;
pid        logs/nginx.pid;
events {worker_connections  1024;
}
http {include       mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
upstream tomcat_server {server service-tomcat-app1:8080;server service-tomcat-app2:8080;
}access_log  logs/access.log  main;sendfile        on;keepalive_timeout  65;server {listen       80;server_name  localhost;access_log  logs/host.access.log  main;location / {root   html;index  index.html index.htm;}location /suosuoli {root /usr/local/nginx/html;index index.html
}location /app {proxy_pass http://tomcat_server;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 页面

root@ubuntu-suosuoli-node1:~# mkdir -pv /data/tomcat/webapps/suosuoli
root@ubuntu-suosuoli-node1:~# cd /data/tomcat/webapps/suosuoli
root@ubuntu-suosuoli-node1:/data/tomcat/webapps/suosuoli# vim host-info.jsp
<%@page import="java.util.Enumeration"%>
<br />
host: <%try{out.println(""+java.net.InetAddress.getLocalHost().getHostName());}catch(Exception e){}%>
<br />
remoteAddr: <%=request.getRemoteAddr()%>
<br />
remoteHost: <%=request.getRemoteHost()%>
<br />
sessionId: <%=request.getSession().getId()%>
<br />
serverName:<%=request.getServerName()%>
<br />
scheme:<%=request.getScheme()%>
<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.4.5 启动容器

root@ubuntu-suosuoli-node1:/data/tomcat/webapps/suosuoli# cd  /data/compose/
root@ubuntu-suosuoli-node1:/data/compose# docker-compose -f nginx-tomcat-compose.yaml up -d
Creating tomcat-app2 ... done
Creating tomcat-app1 ... done
Creating nginx-web   ... done
Creating haproxy-v1  ... done

5.5 验证容器是否启动

root@ubuntu-suosuoli-node1:/data/compose# docker-compose psName                  Command               State                                Ports
-----------------------------------------------------------------------------------------------------------------------
haproxy-v1    /usr/bin/run_haproxy.sh          Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:9999->9999/tcp
nginx-web     nginx                            Up      443/tcp, 80/tcp
tomcat-app1   /apps/tomcat/bin/run_tomcat.sh   Up      8005/tcp, 8009/tcp, 8080/tcp
tomcat-app2   /apps/tomcat/bin/run_tomcat.sh   Up      8005/tcp, 8009/tcp, 8080/tcproot@ubuntu-suosuoli-node1:/data/compose# docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                                                              NAMES
33cc1026bbc6        haproxy-ubuntu:v1      "/usr/bin/run_haprox…"   20 minutes ago      Up 20 minutes       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:9999->9999/tcp   haproxy-v1
994b9226d1b3        nginx-ubunt:v1         "nginx"                  20 minutes ago      Up 4 minutes        80/tcp, 443/tcp                                                    nginx-web
e601c88b1e45        tomcat-business:app1   "/apps/tomcat/bin/ru…"   20 minutes ago      Up 20 minutes       8005/tcp, 8009/tcp, 8080/tcp                                       tomcat-app1
59008c4131cf        tomcat-business:app2   "/apps/tomcat/bin/ru…"   20 minutes ago      Up 20 minutes       8005/tcp, 8009/tcp, 8080/tcp                                       tomcat-app2root@ubuntu-suosuoli-node1:/data/compose# docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                                                              NAMES
33cc1026bbc6        haproxy-ubuntu:v1      "/usr/bin/run_haprox…"   20 minutes ago      Up 20 minutes       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:9999->9999/tcp   haproxy-v1
994b9226d1b3        nginx-ubunt:v1         "nginx"                  20 minutes ago      Up 4 minutes        80/tcp, 443/tcp                                                    nginx-web
e601c88b1e45        tomcat-business:app1   "/apps/tomcat/bin/ru…"   20 minutes ago      Up 20 minutes       8005/tcp, 8009/tcp, 8080/tcp                                       tomcat-app1
59008c4131cf        tomcat-business:app2   "/apps/tomcat/bin/ru…"   20 minutes ago      Up 20 minutes       8005/tcp, 8009/tcp, 8080/tcp                                       tomcat-app2

5.6 查看启动日志

root@ubuntu-suosuoli-node1:/data/compose# docker-compose logs -f
Attaching to haproxy-v1, nginx-web, tomcat-app1, tomcat-app2
haproxy-v1             | 127.0.0.1	localhost
haproxy-v1             | ::1	localhost ip6-localhost ip6-loopback
haproxy-v1             | fe00::0	ip6-localnet
haproxy-v1             | ff00::0	ip6-mcastprefix
haproxy-v1             | ff02::1	ip6-allnodes
haproxy-v1             | ff02::2	ip6-allrouters
haproxy-v1             | 172.17.0.4	nginx-web 01870c340091
haproxy-v1             | 172.17.0.4	service-nginx 01870c340091 nginx-web
haproxy-v1             | 172.17.0.5	932d6c63f681
tomcat-app1            | Tomcat started.
tomcat-app1            | 127.0.0.1	localhost
tomcat-app1            | ::1	localhost ip6-localhost ip6-loopback
tomcat-app1            | fe00::0	ip6-localnet
tomcat-app1            | ff00::0	ip6-mcastprefix
tomcat-app1            | ff02::1	ip6-allnodes
tomcat-app1            | ff02::2	ip6-allrouters
tomcat-app1            | 172.17.0.3	8b9f99ba5279
tomcat-app1            | 192.168.100.18 test.suosuoli.cn
tomcat-app2            | Tomcat started.
tomcat-app2            | # Third party programs must not access this file directly, but only through the
tomcat-app2            | # symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
tomcat-app2            | # replace this symlink by a static file or a different symlink.
tomcat-app2            | #
tomcat-app2            | # See man:systemd-resolved.service(8) for details about the supported modes of
tomcat-app2            | # operation for /etc/resolv.conf.
tomcat-app2            |
tomcat-app2            | nameserver 192.168.100.2
tomcat-app2            | search localdomain
tomcat-app2            | nameserver 223.6.6.6

相关文章:

单机编排docker compose

Docker之旅(8)-单机编排docker compose 当在宿主机启动较多的容器时候&#xff0c;如果都是手动操作会觉得比较麻烦而且容易出错&#xff0c; 并且每个容器之间也会有先后启动的顺序依赖等。这个时候推荐使用 docker 单机 编排工具 docker-compose&#xff0c;docker-compose …...

C++ 面向对象三大特性——多态

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C 继承 ☂️<3>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<4>前言&#xff1a;面向对象三大特性的&#xff0c;封装&#xff0c;继承&#xff0c;多态&#xff…...

相同数字的积木游戏

题目描述 题目描述 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木&#xff0c;每个积木块上都有一个数字&#xff0c;积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排&#xff0c;请小薇找到这排积木中数字相同目所处位置最远的2块积木块&#xff0c;计算…...

安防监控视频云存储EasyCVR平台H.265转码功能更新:新增分辨率配置

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…...

图数据库_Neo4j学习cypher语言_常用函数_关系函数_字符串函数_聚合函数_数据库备份_数据库恢复---Neo4j图数据库工作笔记0008

然后再来看一些常用函数,和字符串函数,这里举个例子,然后其他的 类似 可以看到substring字符串截取函数 可以看到截取成功 聚合函数 这里用了一个count(n) 统计函数,可以看到效果 关系函数,我们用过就是id(r) 可以取出对应的r的id来这样.....

LeetCode150道面试经典题-- 加一(简单)

1.题目 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 2.示例 示例 1&#xff1a; 输入&am…...

Centos7 配置Docker镜像加速器

docker实战(一):centos7 yum安装docker docker实战(二):基础命令篇 docker实战(三):docker网络模式(超详细) docker实战(四):docker架构原理 docker实战(五):docker镜像及仓库配置 docker实战(六):docker 网络及数据卷设置 docker实战(七):docker 性质及版本选择 认知升…...

微信小程序中pdf的上传、下载及excel导出

微信小程序中pdf的上传、下载及excel导出 pdf上传上传1&#xff1a;上传2&#xff1a; pdf下载导出excel pdf上传 上传两种方法&#xff1a; 上传1&#xff1a; 1.用vant weapp组件&#xff1a; //pdf上传--vant weapp组件 <view class"content"><van-u…...

Python_11 类的方法

一、查缺补漏 1. 实例方法必须用类实例化对象()来调用&#xff0c;用类来调用时会执行&#xff0c;但是self中不是实例化类地址而是传的字符串 二、类中的方法 1. 实例方法 1. 定义在类里面的普通方法(函数) 2. 第一个参数必须是类实例&#xff0c;在方法调用的时候会自动…...

CentOS系统环境搭建(一)——Centos7更新

Centos7更新 更新 yum&#xff08;包括centos内核&#xff09; yum update执行后&#xff0c;系统将更新到centos 7.9。 从这一篇文章开始开始&#xff0c;我将开始在centos系统环境搭建&#x1f517;https://blog.csdn.net/weixin_43982359/category_12411496.html中开始对C…...

Mariadb高可用MHA

目录 前言 一、概述 &#xff08;一&#xff09;、概念 &#xff08;二&#xff09;、组成 &#xff08;三&#xff09;、特点 &#xff08;四&#xff09;、工作原理 二、案例 &#xff08;一&#xff09;、构建MHA 1.所有节点ssh免密登录 2、MySQL主从复制 &#x…...

SASS 学习笔记 II

SASS 学习笔记 II 上篇笔记&#xff0c;SASS 学习笔记 中包含&#xff1a; 配置 变量 嵌套 这里加一个扩展&#xff0c;嵌套中有一个 & 的用法&#xff0c;使用 & 可以指代当前 block 中的 selector&#xff0c;后面可以追加其他的选择器。如当前的 scope 是 form&a…...

提高 Snowflake 工作效率的 6 大工具

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 Snowflake 彻底改变了企业存储、处理和分析数据的方式&#xff0c;提供了无与伦比的灵活性、可扩展性和性能。但是&#xff0c;与任何强大的技术一样&#xff0c;要真正利用其潜力&#xff0c;必须拥有…...

选项方式读取配置IOption、IOptionSnapshot、IOpstionMonitor的区别

IOption, IOptionsSnapshot, 和 IOptionsMonitor 都是 ASP.NET Core 中用于访问配置选项的接口。它们在不同的场景下用于获取配置选项值,并具有不同的生命周期和行为。 IOption: IOption 是一个泛型接口,表示一个配置选项的包装器。它通常在应用程序启动时被解析并注入到需…...

linux基础面试题整理

目录标题 1.说下企业为什么用linux而不用windows&#xff1f;2.linux学过什么&#xff0c;怎么学习的&#xff1f;3.linux基本命令4.linux查看端口、进程、文件类型、挂载5.使用top命令之后前五行会显示什么内容&#xff1f;6.linux怎么查找一个文件7.vim进去后的各种操作 1.说…...

IDEA开发项目时一直出现http404错误的解决方法

系列文章目录 安装cv2库时出现错误的一般解决方法_cv2库安装失败 SQL&#xff1e; conn sys/root as sysdbaERROR:ORA-12560: TNS: 协议适配器错误的解决方案 虚拟机启动时出现“已启用侧通道缓解”的解决方法 Hypervisor launch failed&#xff1b; Processor does not pr…...

NLPR、SenseTime 和 NTU 加速自动视频纵向编辑

视频人像编辑技术已经在电视、视频和电影制作中得到了应用&#xff0c;并有望在不断发展的网真场景中发挥关键作用。最先进的方法已经可以逼真地将同源音频合成为视频。现在&#xff0c;来自北京模式识别国家实验室&#xff08;NLPR&#xff09;、商汤科技研究和南洋理工大学的…...

layui下拉框select 弹出层在最外层

出现问题如图所示 想要的效果是如下 这样的效果只需一行代码就能解决 .layui-layer-page .layui-layer-content{overflow: visible!important;}...

fnn手动实现和nn实现(包括3种激活函数、隐藏层)

原文网址&#xff1a;https://blog.csdn.net/m0_52910424/article/details/127819278 fnn手动实现: import time import matplotlib.pyplot as plt import numpy as np import torch import torch.nn as nn import torchvision from torch.nn.functional import cross_entrop…...

Lua + mysql 实战代码

--[[luarocks lua语言的包管理器luasql https://luarocks.org/brew install luarocksluarocks install luasql-mysql 注意此处&#xff0c;如果你是 mariadb&#xff0c;然后要求指定 MYSQL_DIR 参数的时候&#xff0c;千万不要指到 mariadb 的安装目录&#xff0c;而是要指…...

智慧工地监管云平台源码 建筑施工一体化信息管理系统源码

智慧工地管理云平台系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段&#xff0c;实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 智慧工地平台系统工作原理&#xff1a; 1、感知设备的…...

三.net core 自动化发布到docker (创建一个dotnet工程发布)

创建Jenkins-create a job 输入名称&#xff08;建议不要带“”这类的字符&#xff09;&#xff0c;选择自由风格的类型&#xff08;红框标注的&#xff09;&#xff0c;点击确定 用于测试,下面选项基本没有选择-配置代码地址 选择执行shell #!/bin/bash # 获取短版本号 GITHA…...

【Spring Cloud 八】Spring Cloud Gateway网关

gateway网关 系列博客背景一、什么是Spring Cloud Gateway二、为什么要使用Spring Cloud Gateway三、 Spring Cloud Gateway 三大核心概念4.1 Route&#xff08;路由&#xff09;4.2 Predicate&#xff08;断言&#xff09;4.3 Filter&#xff08;过滤&#xff09; 五、Spring …...

Android JNI传递CallBack接口并接收回调

在JNI中&#xff0c;可以通过传递一个Java接口对象的引用给C代码&#xff0c;并在C代码中调用该接口对象的方法&#xff0c;实现JAVA层监听C数据变化&#xff0c;下面是一个简单的示例&#xff1a; 在Java代码中定义一个CallBack接口和JNI方法 class TestLib {companion objec…...

机器学习:特征工程之特征预处理

目录 特征预处理 1、简述 2、内容 3、归一化 3.1、鲁棒性 3.2、存在的问题 4、标准化 ⭐所属专栏&#xff1a;人工智能 文中提到的代码如有需要可以私信我发给你&#x1f60a; 特征预处理 1、简述 什么是特征预处理&#xff1a;scikit-learn的解释&#xff1a; provide…...

高级艺术二维码制作教程

最近不少关于二维码制作的&#xff0c;而且都是付费。大概就是一个好看的二维码&#xff0c;扫描后跳转网址。本篇文章使用Python来实现&#xff0c;这么简单花啥钱呢&#xff1f;学会&#xff0c;拿去卖便宜点吧。 文章目录 高级二维码制作环境安装普通二维码艺术二维码动态 …...

每日一题leetcode--使循环数组所有元素相等的最少秒数

相当于扩散&#xff0c;每个数可以一次可以扩散到左右让其一样&#xff0c;问最少多少次可以让整个数组都变成一样的数 使用枚举&#xff0c;先将所有信息存到hash表中&#xff0c;然后逐一进行枚举&#xff0c;计算时间长短用看下图 考虑到环形数组&#xff0c;可以把首项n放…...

tauri-react:快速开发跨平台软件的架子,支持自定义头部UI拖拽移动和窗口阴影效果

tauri-react 一个使用 taurireacttsantd 开发跨平台软件的模板&#xff0c;支持窗口头部自定义和窗口阴影&#xff0c;不用再自己做适配了&#xff0c;拿来即用&#xff0c;非常 nice。而且已经封装好了 tauri 的 http 请求工具&#xff0c;省去很多弯路。 开原地址&#xff…...

k8s 自身原理之 Service

好不容易&#xff0c;终于来到 k8s 自身的原理之 关于 Service 的一部分了 前面我们用 2 个简图展示了 pod 之间和 pod 与 node 之间是如何通信息的&#xff0c;且通信的数据包是不会经过 NAT 网络地址转换的 那么 Service 又是如何实现呢&#xff1f; Service 我们知道是用…...

arduino Xiao ESP32C3 oled0.96 下雪花

Xiao ESP32C3使用oled 0.96实现下雪的功能 雪花下落的时候, 随机生成半径和位置 sandR和sandX,sandY 保存雪花下落位置的时候, 将其周边一圈设置为-1, 标记为有雪花 其他雪花下落的时候, 其他雪花的一圈如果遇到-1, 则停止下落, 并重复2 #include "oled.h" void …...

ElasticSearch索引库、文档、RestClient操作

文章目录 一、索引库1、mapping属性2、索引库的crud 二、文档的crud三、RestClient 一、索引库 es中的索引是指相同类型的文档集合&#xff0c;即mysql中表的概念 映射&#xff1a;索引中文档字段的约束&#xff0c;比如名称、类型 1、mapping属性 mapping映射是对索引库中文…...

Effective Java 案例分享(九)

46、使用无副作用的Stream 本章节主要举例了Stream的几种用法。 案例一&#xff1a; // Uses the streams API but not the paradigm--Dont do this! Map<String, Long> freq new HashMap<>(); try (Stream<String> words new Scanner(file).tokens()) …...

SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程

首先&#xff0c;如果在某个类或某个方法被标记为Transactional时&#xff0c;Spring boot底层会在创建这个bean时生成代理对象&#xff08;默认使用cglib) 示例&#xff1a; 当调用studentService的addStudent方法时&#xff0c;会直接跳到CglibAopProxy类去执行intercept方…...

JVM——引言+JVM内存结构

引言 什么是JVM 定义: Java VirtualMachine -java 程序的运行环境 (ava 二进制字节码的运行环境) 好处: 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收功能数组下标越界检查&#xff0c;多态 比较: jvm jre jdk 学习jvm的作用 面试理解底层实现原理中…...

open cv学习 (十)图形检测

图形检测 demo1 # 绘制几何图像的轮廓 import cv2img cv2.imread("./shape1.png")gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 将图像二值化 t, binary cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 检测图像中的所有轮廓 contours, hierarchy cv2.f…...

【C语言】字符函数和字符串函数

目录 1.求字符串长度strlen 2.长度不受限制的字符串函数 字符串拷贝strcpy 字符串追加strcat 字符串比较strcmp 3.长度受限制的字符串函数介绍strncpy strncat ​编辑strncmp 4.字符串查找strstr 5.字符串分割strtok 6.错误信息报告 strerror perror 7.字符分类函…...

前馈神经网络正则化例子

直接看代码&#xff1a; import torch import numpy as np import random from IPython import display from matplotlib import pyplot as plt import torchvision import torchvision.transforms as transforms mnist_train torchvision.datasets.MNIST(root…...

spring的核心技术---bean的生命周期加案例分析详细易懂

目录 一.spring管理JavaBean的初始化过程&#xff08;生命周期&#xff09; Spring Bean的生命周期&#xff1a; 二.spring的JavaBean管理中单例模式及原型&#xff08;多例&#xff09;模式 2.1 . 默认为单例&#xff0c;但是可以配置多例 2.2.举例论证 2.2.1 默认单例 2.2…...

【Maven教程】(一)入门介绍篇:Maven基础概念与其他构建工具:理解构建过程与Maven的多重作用,以及与敏捷开发的关系 ~

Maven入门介绍篇 1️⃣ 基础概念1.1 构建1.2 maven对构建的支持1.3 Maven的其他作用 2️⃣ 其他构建工具2.1 IDE2.2 Make2.3 Ant2.4 Jenkins 3️⃣ Maven与敏捷开发&#x1f33e; 总结 1️⃣ 基础概念 "Maven"可以翻译为 “知识的积累者” 或 “专家”。这个词源于波…...

今天,谷歌Chrome浏览器部署抗量子密码

谷歌已开始部署混合密钥封装机制&#xff08;KEM&#xff09;&#xff0c;以保护在建立安全的 TLS 网络连接时共享对称加密机密。 8月10日&#xff0c;Chrome 浏览器安全技术项目经理Devon O’Brien解释说&#xff0c;从 8 月 15 日发布的 Chrome 浏览器 116 开始&#xff0c;谷…...

SUMO traci接口控制电动车前往充电站充电

首先需要创建带有停车位的充电站(停车场和充电站二合一)&#xff0c;具体参考我的专栏中其他文章。如果在仿真的某个时刻&#xff0c;希望能够控制电动车前往指定的充电站充电&#xff0c;并且在完成充电后继续前往车辆原来的目的地&#xff0c;那么可以使用以下API&#xff1a…...

现代CSS中的换行布局技术

在现代网页设计中&#xff0c;为了适应不同屏幕尺寸和设备类型&#xff0c;换行布局是一项重要的技术。通过合适的布局技术&#xff0c;我们可以实现内容的自适应和优雅的排版。本文将介绍CSS中几种常见的换行布局技术&#xff0c;探索它们的属性、代码示例和解析&#xff0c;帮…...

简单理解Python中的深拷贝与浅拷贝

I. 简介 深拷贝会递归的创建一个完全独立的对象副本&#xff0c;包括所有嵌套的对象&#xff0c;而浅拷贝只复制嵌套对象的引用&#xff0c;不复制嵌套对象本身。 简单来说就是两者都对原对象进行了复制&#xff0c;因此使用is运算符来比较新旧对象时&#xff0c;返回的都是F…...

C++之std::pair<uint64_t, size_t>应用实例(一百七十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

前端打开后端返回的HTML格式的数据

前端打开后端返回的 HTML格式 的数据&#xff1a; 后端返回的数据格式如下示例&#xff1a; 前端通过 js 方式处理&#xff08;核心代码如下&#xff09; console.log(回调, path); // path 是后端返回的 HTML 格式数据// 必须要存进localstorage&#xff0c;否则会报错&am…...

How to deal with document-oriented data

Schema designData models for e-commerceNuts and bolts of databases, collection, and documents. Principles of schema design What are your application access pattern?Whats the basic unit of data? the basic unit of data is the BSON documentWhat are the ca…...

Http 状态码汇总

文章目录 Http 状态码汇总1xx&#xff08;信息性状态码&#xff09;2xx&#xff08;成功状态码&#xff09;3xx&#xff08;重定向状态码&#xff09;4xx&#xff08;客户端错误状态码&#xff09;5xx&#xff08;服务器错误状态码&#xff09; Http 状态码汇总 1xx&#xff08…...

mysql自定义实体类框架

根据表结构自动生产实体类和方法,根据反射与io生成,可自定义扩展方法 package com.digital.web.front; /*** pom依赖* <dependency>* <groupId>mysql</groupId>* <artifactId>mysql-connector-java</artifactId>* <version>5.1.27</ve…...

批量将Excel中的第二列内容从拼音转换为汉字

要批量将Excel中的第二列内容从拼音转换为汉字&#xff0c;您可以使用Python的openpyxl库来实现。下面是一个示例代码&#xff0c;演示如何读取Excel文件并将第二列内容进行拼音转汉字&#xff1a; from openpyxl import load_workbook from xpinyin import Pinyin # 打开Exce…...

消息推送:精准推送,提升运营效果,增添平台活力

对于app开发者而言&#xff0c;没有什么途径比消息推送更能直接、即时地触及目标用户群体了。消息推送与我们的日常生活息息相关&#xff0c;各种APP的状态和通知都通过消息推送来告知用户&#xff0c;引起用户的注意&#xff0c;吸引用户点开app。总而言之&#xff0c;推送服务…...