首页
统计
关于
Search
1
Sealos3.0离线部署K8s集群
1,272 阅读
2
类的加载
832 阅读
3
Spring Cloud OAuth2.0
827 阅读
4
SpringBoot自动装配原理
735 阅读
5
集合不安全问题
631 阅读
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Canvas
Linux
容器
Docker
Containerd
Kubernetes
Python
FastApi
OpenCV
数据分析
牛牛生活
登录
Search
标签搜索
Java
CSS
mysql
RabbitMQ
JavaScript
Redis
OpenCV
JVM
Mybatis-Plus
Camunda
多线程
CSS3
Python
Canvas
Spring Cloud
注解和反射
Activiti
工作流
SpringBoot
ndarray
蘇阿細
累计撰写
435
篇文章
累计收到
4
条评论
首页
栏目
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Canvas
Linux
容器
Docker
Containerd
Kubernetes
Python
FastApi
OpenCV
数据分析
牛牛生活
页面
统计
关于
搜索到
435
篇与
的结果
2021-04-05
2.主键生成策略
主键生成策略ID_WORKER 全局唯一ID(默认)雪花算法:snowflake是Twitter开源的分布式ID生成算法,类型为long。其核心思想为:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit是机器ID),12bit作为毫秒内的流水号,最后一位是符号位,永远为0AUTO 主键自增在实体类ID主键上配置: @TableId(type = IdType.AUTO)同时数据库也许设置ID自增:IdType类型:public enum IdType { AUTO(0), //主键自增 NONE(1), //无 INPUT(2), //用户自行输入 ID_WORKER(3), //全局唯一(默认) UUID(4), //UUID ID_WORKER_STR(5); //分布式全局唯一ID注:mybatis-plus新版已不再推荐使用 ID_WORK
2021年04月05日
173 阅读
0 评论
0 点赞
2021-04-05
1.插入操作
CRUD实例测试1.新建数据库DROP TABLE IF EXISTS user; CREATE TABLE user ( id BIGINT(20) NOT NULL COMMENT '主键ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT(11) NULL DEFAULT NULL COMMENT '年龄', email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (id) ); INSERT INTO user (id, name, age, email) VALUES (1, 'Jone', 18, 'test1@baomidou.com'), (2, 'Jack', 20, 'test2@baomidou.com'), (3, 'Tom', 28, 'test3@baomidou.com'), (4, 'Sandy', 21, 'test4@baomidou.com'), (5, 'Billie', 24, 'test5@baomidou.com');2.导入依赖尽量不要同时导入mybatis和mybatis-plus,可能存在版本差异的问题<!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> </dependency>3.插入pojopackage com.sw.mybatisplus.pojo; import lombok.Data; import java.io.Serializable; @Data public class User implements Serializable { private long id; private String name; private int age; private String email; } mapperpackage com.sw.mybatisplus.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.sw.mybatisplus.pojo.User; import org.springframework.stereotype.Repository; /** * @Author suaxi * @Date 2021/4/4 14:46 */ @Repository public interface UserMapper extends BaseMapper<User> { } Junit单元测试package com.sw.mybatisplus; import com.sw.mybatisplus.mapper.UserMapper; import com.sw.mybatisplus.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest class MybatisPlusApplicationTests { @Autowired private UserMapper userMapper; @Test void contextLoads() { //此处的参数是一个Wrapper(条件构造器) List<User> userList = userMapper.selectList(null); userList.forEach(System.out::println); } } 控制台打印sql# 在application.yml配置文件中添加 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 或者 logging: level: com.xxx.xxx.mapper: debug插入@Test void insertTest(){ User user = new User(); user.setName("孙笑川"); user.setAge(33); user.setEmail("123321@qq.com"); int result = userMapper.insert(user); System.out.println(result); System.out.println(user); //插入时没有手动设置,但此处的打印结果自动回填了id的值 //User(id=0, name=孙笑川, age=33, email=123321@qq.com) }
2021年04月05日
48 阅读
0 评论
0 点赞
2021-04-05
MyBatis-Plus
MyBatis-Plus特性无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
2021年04月05日
173 阅读
0 评论
0 点赞
2021-04-04
Docker Swarm
Docker Swarm初始化节点:docker swarm init加入节点:docker swarm join# 获取令牌 docker swarm join-token manager # leader docker swarm join-token worker # worker节点信息:Raft协议保证大多数节点存活才可使用,只要>1就可以,集群至少大于3台测试(双主双从):1.docker-1宕机,另一个主节点也不可用2.docker swarm leave 节点离开集群3.集群中的worker节点无法使用manager命令,管理工作一律由manager主节点执行注:至少保证1台管理节点存活docker service --help灰度发布(金丝雀发布)docker run # 容器启动,不具备扩缩容功能 docker service # 以服务的形式发布,可以扩缩容,滚动更新当单个Nginx服务负载较大时,需增加3个服务docker service update --replicas 3 mynginx==只要是一个服务,在集群中的任意一个节点都可以访问,服务可以由多个副本动态扩缩容来实现高可用==移除服务:docker service rm [服务名]小结Swarm:集群的管理和编号Node:docker节点,多个节点组成一个网络集群(分为管理和工作者)Service:服务,可以在管理节点或工作节点运行(compose的核心)Task:容器中的命令(细节任务)service运行模式--mode string # default "replicated" 默认运行于副本节点 docker service create --mode replicated --name test01 centos:7.6 # 运行在副本(默认) docker service create --mode global --name test01 centos:7.6 # 全局节点运行网络模式 PublishMode: ingressSwarmOverlayingress:Overlay的特殊模式,负载均衡(IPVS VIP)
2021年04月04日
153 阅读
0 评论
0 点赞
2021-04-04
Docker Compose
定义:Docker Compose是一个用于定义和运行多容器Docker的应用程序工具安装:# 1.下载 # 官方链接(速度较慢) curl -L $(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep "browser_download_url" | grep -i "$(uname -s)-$(uname -m)" | grep -v ".sha" | cut -d '"' -f 4) -o /usr/local/bin/docker-compose # 国内链接 curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose # 2.授权 sudo chmod +x /usr/local/bin/docker-compose # 3.安装 sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose # 4.安装成功后--version查看版本 docker-compose --versionpython应用——计数器1.应用app.py2.Dockerfile 打包镜像3.docker-compose.yml(定义整个服务,需要的环境)4.docker-compose up启动项目yml规则# 3层 version: '' # 版本 service: # 服务 服务1: web # 服务配置 images build network ...... 服务2: redis ...... 服务3:database ...... # 其他配置 volumes: networks: configs:
2021年04月04日
311 阅读
0 评论
0 点赞
2021-03-25
Docker网络
1.Docker0# Docker如何处理容器访问? [root@VM-0-14-centos /]# docker run -d -P tomcat01 tomcat # 容器启动时,docker会分配eth0,该分配的地址能ping通 [root@VM-0-14-centos /]# docker exec -it tomcat01 ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever # linux可以ping通容器内部 [root@VM-0-14-centos /]# ping 172.17.0.2 PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data. 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.060 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.033 ms 64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.059 ms 原理 每启动一个docker容器,docker就会自动给容器分配一个ip,安装docker的时候,会产生一个docker0网卡,使用桥接模式,采用evth-pair技术evth-pair:虚拟设备接口,成对出现,一段连接协议,一段彼此相连,因此容器之间也可以互相ping通网络模型:图片来源:狂神说Java结论:容器之间在没有指定网络的情况下,都是通过docker0来进行路由通信,它会给每一个容器分配一个ip2.--link# 容器之间无法ping通 [root@VM-0-14-centos ~]# docker exec -it tomcat01 ping tomcat02 ping: tomcat02: Name or service not known # 通过--link可以解决容器间网络连通的问题 [root@VM-0-14-centos ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat bffb39894b46d3a3ace237eac4d5eb0163b4233458c306f8e6172856516a1617 [root@VM-0-14-centos ~]# docker exec -it tomcat03 ping tomcat02 PING tomcat02 (172.17.0.3) 56(84) bytes of data. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.108 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.065 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.066 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.069 ms 原理探究# 查看tomcat03的hosts配置文件 [root@VM-0-14-centos ~]# docker exec -it tomcat03 cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.3 tomcat02 d207c5f1abfe # 通过--link命令直接绑定了tomcat02的地址 172.17.0.4 bffb39894b46 注:现阶段的docker不再推荐使用--link3.自定义网络# 查看docker网络 [root@VM-0-14-centos ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 897e6dc978cd bridge bridge local a7455f4daeeb host host local 3600da2c2a04 none null local 网络模式:bridge:桥接(docker默认)none:不配置网络host:和宿主机共享网络container:容器网络连通(不推荐)# 之前的启动命令默认包含了 --net bridge 命令(也就是docker0) run -d -P --name tomcat01 --net bridge tomcat# 自定义一个mynet # --driver bridge # --subnet 192.168.0.0/16 192.168.0.2~192.168.255.255 # --gateway 192.168.0.1 [root@VM-0-14-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet c0e45563fdc70e8bd9ed21405be5b13e9552f6c08347ea51f1fb16d82d40fb5c [root@VM-0-14-centos ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 897e6dc978cd bridge bridge local a7455f4daeeb host host local c0e45563fdc7 mynet bridge local 3600da2c2a04 none null local 自定义 mynet 测试# 启动两个tomcat容器,并指定好我们自定义的mynet [root@VM-0-14-centos ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat 3703838b344e6390caa1a519365be204db614bf6049a08ef20c6f2b9a312fabf [root@VM-0-14-centos ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat 7750aa78a0cba0901e7ab7f0ab424900a397a9e0b1be184bf7859a6cbc2d7938 查看网络信息:Ping测试:# 直接ping容器名或者ip,都可以ping通 [root@VM-0-14-centos ~]# docker exec -it tomcat-net-01 ping tomcat-net-02 PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data. 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.097 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.066 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.067 ms ^C --- tomcat-net-02 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2ms rtt min/avg/max/mdev = 0.066/0.076/0.097/0.017 ms [root@VM-0-14-centos ~]# docker exec -it tomcat-net-01 ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.076 ms 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.071 ms 64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.066 ms 64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.075 ms ^C --- 192.168.0.3 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 0.066/0.072/0.076/0.004 ms [root@VM-0-14-centos ~]# docker帮用户自动维护好了自定义网络之间的对应关系,而默认的docker0却没有,所以推荐使用自定义网络,使不同的集群使用不同的网络,以保证集群的安全和健康4.网络连通使用 docker network connect [OPTIONS] NETWORK CONTAINER命令测试打通docker0下的 tomcat01 到 mynet# 执行connect命令,并查看mynet的信息 [root@VM-0-14-centos ~]# docker network connect mynet tomcat01 [root@VM-0-14-centos ~]# docker network inspect mynet# tomcat01 ping mynet下的tomcat-net-01 测试 [root@VM-0-14-centos ~]# docker exec -it tomcat01 ping tomcat-net-01 PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data. 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.065 ms 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.069 ms 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.064 ms ^C --- tomcat-net-01 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.064/0.066/0.069/0.002 ms [root@VM-0-14-centos ~]# docker exec -it tomcat01 ping tomcat-net-02 PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data. 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.066 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.067 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.069 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.068 ms ^C --- tomcat-net-02 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3ms rtt min/avg/max/mdev = 0.066/0.067/0.069/0.008 ms
2021年03月25日
129 阅读
0 评论
0 点赞
2021-03-24
Dockerfile
dockerfile用于构建docker镜像(命令参数脚本)1.dockerfile构建过程:# 1.指令关键字必须大写 # 2.从上往下顺序执行 # 3.# 表示注释 # 4.每一个指令都会创建一个新的镜像层,并提交DockerFile:构建文件,定义执行的内容DockerImages:通过DockerFile构建生成的镜像,即最终发布和运行的产品DockerContainer:运行镜像并提供服务2.DockerFile指令FROM # 基础镜像 MAINTAINER # 作者:姓名+邮箱 RUN # 镜像构建时需要运行的命令 ADD # 添加需要使用的文件(会自动解压) WORKDIR # 镜像工作目录 VOLUME # 挂载目录 EXPOSE # 暴露端口 CMD # 指定容器启动时要运行的命令(只有最后一个才生效,可被替代) ENTRYPOINT # 同理CMD,但可命令可以追加,类似于StringUtils.append() ONBUILD # 当构建一个被继承的dockerfile时,就会运行onbuild指令(触发指令) COPY # 类似于ADD,将需要的文件拷贝到镜像中 ENV # 构建时设置环境变量3.centos 测试实例DockerHub中大部分的镜像都是基于scratch这个基础镜像构建而来# 1.编写dockerfile配置文件 FROM centos MAINTAINER suaxi<281463547@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "-----end-----" CMD /bin/bash # 2.构建镜像 docker build -f dockerfile文件路径 -t 镜像名:[TAG] . [root@suaxi dockerfile]# docker build -f dockerfile-centos -t mycentos:1.0 . # 3.测试运行镜像构建历史:docker history 容器idCMD和ENTRYPOINT的区别测试CMD# 1.编写dockerfile文件 FROM centos CMD ["ls","-a"] # 2.构建镜像 [root@suaxi dockerfile]# docker build -f docker-cmd-test -t cmdtest . # 3.运行,执行了ls -a 命令 [root@suaxi dockerfile]# docker run 92054cb6235d . .. .dockerenv bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var # 现在项追加一个 -l 命令 ls -al [root@suaxi dockerfile]# docker run 92054cb6235d -l docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown. # 在使用CMD指令的情况下,后追加的 -l 命令替换了之前的CMD["ls","-a"]命令,所以报错测试ENTRYPOINT# 1.编写dockerfile文件 FROM centos ENTRYPOINT ["ls","-a"] # 第2、3步的build和run与之前的一样 [root@suaxi dockerfile]# docker build -f docker-entrypoint-test -t entrypointtest . Sending build context to Docker daemon 4.096kB Step 1/2 : FROM centos ---> 300e315adb2f Step 2/2 : ENTRYPOINT ["ls","-a"] ---> Running in bf423c7dc041 Removing intermediate container bf423c7dc041 ---> e25354d47b76 Successfully built e25354d47b76 Successfully tagged entrypointtest:latest [root@suaxi dockerfile]# docker run e25354d47b76 . .. .dockerenv bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var # 同理追加 -l 命令 [root@suaxi dockerfile]# docker run e25354d47b76 -l total 56 drwxr-xr-x 1 root root 4096 Mar 23 14:12 . drwxr-xr-x 1 root root 4096 Mar 23 14:12 .. -rwxr-xr-x 1 root root 0 Mar 23 14:12 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin drwxr-xr-x 5 root root 340 Mar 23 14:12 dev drwxr-xr-x 1 root root 4096 Mar 23 14:12 etc drwxr-xr-x 2 root root 4096 Nov 3 15:22 home lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64 drwx------ 2 root root 4096 Dec 4 17:37 lost+found drwxr-xr-x 2 root root 4096 Nov 3 15:22 media drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt dr-xr-xr-x 100 root root 0 Mar 23 14:12 proc dr-xr-x--- 2 root root 4096 Dec 4 17:37 root drwxr-xr-x 11 root root 4096 Dec 4 17:37 run lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv dr-xr-xr-x 13 root root 0 Mar 22 13:57 sys drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr drwxr-xr-x 20 root root 4096 Dec 4 17:37 var # 可以发现,使用ENTRYPOINT指令,-l命令直接追加在了ls -a之后,且正确执行4.Tomcat 测试实例1.准备文件:2.编写Dockerfile文件注:Dockerfile为官方命名,build时会自动查找该文件,不需要 -f 指定文件路径FROM centos MAINTAINER suaxi<281463547@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u281-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.27.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_281 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.27 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.27 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.27/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.27/logs/catalina.out 3.构建镜像[root@suaxi dockerfile]# docker build -t diycentos .4.启动镜像[root@suaxi dockerfile]# docker run -d -p 8088:8080 --name tomcattest -v /home/test/tomcat/test:/usr/local/apache-tomcat-9.0.27/webapps/test -v /home/test/build/tomcat/logs:/usr/local/apache-tomcat-9.0.27/logs diycentos 5.访问测试6.发布项目(挂载目录之后在本地编写项目即可)在挂在路径下新建WEB-INF/web.xml文件<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> </web-app> cd ..返回上一级,新建index.html文件<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Docker</title> </head> <body> <h1>Docker Tomcat diy test</h1> </body> </html> 外网访问测试成功
2021年03月24日
213 阅读
0 评论
0 点赞
2021-03-23
容器数据卷
容器数据卷:将应用和环境打包成一个镜像目的:将容器中的目录,挂在的Linux本地(容器的持久化和同步操作、容器间数据共享)方式一:直接使用 -v 命令挂载docker run -it -v 主机目录:容器内目录 # 测试 [root@suaxi ~]# docker run -it -v /home/test:/home centos /bin/bash 从容器同步到主机:从主机同步到容器:(在容器停止后,主机修改了绑定路径下的文件,容器再次启动后,双向绑定依然生效)1.安装MySQl# 拉取镜像 [root@suaxi ~]# docker pull mysql # 官方文档命令 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag # 启动(注意:docker启动mysql需使用-e命令配置密码) -d 后台运行 -p 端口映射 -v 数据卷挂载 -e 环境配置 --name 给容器起个别名 [root@suaxi ~]# docker run -d -p 8088:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql # 后续再使用navicat等工具连接docker中的mysql实际测试一下配置是否生效删除容器之后,同步到本地的数据依然存在,即实现数据的持久化。2.具名挂载、匿名挂载# 匿名挂载 -v 容器内的路径 -P 大写的P,随机映射端口 [root@suaxi ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx # 具名挂载 -v 卷名:容器内路径 [root@suaxi ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx # 查看刚才挂载的卷 [root@suaxi ~]# docker volume inspect juming-nginx 所有docker容器内的卷,在没有指定目录的情况下都在 /var/lib/docker/volumes/xxx/通过具名挂载,可以方便的找到挂载的卷及相关数据、信息# 区分匿名/具名挂载、指定路径挂载 -v 容器内路径 # 匿名挂载 -v 卷名:容器内路径 # 具名挂载 -v /主机路径:容器内路径 # 指定路径挂载# 通过 -v 容器内路径:ro/rw 改变读写权限 ro read only # 只读 rw read/write # 可读可写 [root@suaxi ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx [root@suaxi ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx # ro 只能通过主机来操作,容器内只具有读的权限方式二:Dockerfile通过脚本生成镜像# 1.创建dockerfile文件 # 2.编写脚本,命令(都是大写)参数 FROM centos VOLUME ["volume01","volume02"] CMD echo "----create complete----" CMD /bin/bash启动并进入容器:脚本命令中挂载的目录是匿名挂载:测试挂载目录下的双向绑定是否成功:1.数据卷容器多个mysql同步数据图片来源:狂神说Java# 通过刚才的脚本依次启动3个容器 [root@suaxi docker-test-volume]# docker run -it --name docker01 b0bf8a6507a3 [root@suaxi docker-test-volume]# docker run -it --name docker02 --volumes-from docker01 b0bf8a6507a3 [root@suaxi docker-test-volume]# docker run -it --name docker03 --volumes-from docker01 b0bf8a6507a3 通过volumes实现容器间的数据共享注:即使删除父容器docker01,其他容器中的数据依然存在# 实现多个mysql间的数据同步 [root@suaxi ~]# docker run -d -p 8088:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql [root@suaxi ~]# docker run -d -p 8088:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
2021年03月23日
197 阅读
0 评论
0 点赞
1
...
31
32
33
...
55