Docker与微服务实战(进阶)(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Docker与微服务实战(进阶)

九、微服务实战


1.修改之前的SpringBoot项目yml中数据库配置,改为容器化的mysql地址


9dc92669d82eb623711bd73950c38a59_f8d452857441eb738e8fe220d2daf165.png


2.根据实体类新建数据库


DROP TABLE IF EXISTS user;
CREATE TABLE user
(
    id int(20) NOT NULL COMMENT '主键ID' auto_increment,
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);
DELETE FROM user;
INSERT INTO user (id, name, age, email) VALUES
(1, 'Banana', 18, 'test1@pyy.com'),
(2, 'Jack', 20, 'test2@pyy.com'),
(3, 'Tom', 28, 'test3@pyy.com'),
(4, 'Milk', 21, 'test4@pyy.com'),
(6,'zs@qq',10,'asd'),
(5, 'Apple', 24, 'test5@pyy.com');

3.项目打包


e396360e13ddc53c9dc987e47bbe328d_eabf8163791abc09fd8422b1e5d2a4f9.png


4. 容器化myqsl


docker run -d -p 3306:3306 --privileged=true -v /pyy/mysql/log:/var/log/mysql -v /pyy/mysql/data:/var/lib/mysql -v /pyy/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=a --name mysql mysql:5.7


19fe8588d1ed3ac62d4fccee398e5fca_de7dd1f61d24a840e105c782b3aa3075.png


5. 构建镜像


[root@VM-16-8-centos springboot_test]# cat Dockerfile

FROM java:8

MAINTAINER pyy

VOLUME /tmp

ADD sys-admin-0.0.1-SNAPSHOT.jar pyy_docker.jar

RUN bash -c ‘touch /pyy_docker.jar’

ENTRYPOINT [“java”,“-jar”,“/pyy_docker.jar”]

EXPOSE 8080


docker build -t pyy_docker:1.0 .


6.运行容器


docker run -d -p 8080:8080 pyy_docker:1.6


5c762374222a9bfe88009fbfb6e03658_5eef6e3ab0027c356cb777ebdd92868e.png


7.测试


07d4dd7cbd0761eb221a32ae9fd8e52a_679336e2a7e72b76263796ef7e2469ba.png


十、网络模式


10.1 简介

docker不启动,默认网络情况


  • ens33
  • lo
  • virbr0


docker启动后,网络情况


[root@VM-16-8-centos springboot_test]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
2c74a4b5d76a   bridge    bridge    local
dd3008378058   host      host      local
9ebd6b25e4c3   none      null      local

常用命令


查看网络


docker network ls


查看网络源数据


docker network inspect XXX网络名字


删除网络


docker network rm XXX网络名字


案例


[root@VM-16-8-centos springboot_test]# docker network create test_docker_network
7a7c98e51c6effc0498579ec3cf9bfe6b0a9052ae8c3996781f61389b2529165
[root@VM-16-8-centos springboot_test]# docker network ls
NETWORK ID     NAME                  DRIVER    SCOPE
2c74a4b5d76a   bridge                bridge    local
dd3008378058   host                  host      local
9ebd6b25e4c3   none                  null      local
7a7c98e51c6e   test_docker_network   bridge    local
[root@VM-16-8-centos springboot_test]# docker network rm test_docker_network
test_docker_network
[root@VM-16-8-centos springboot_test]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
2c74a4b5d76a   bridge    bridge    local
dd3008378058   host      host      local
9ebd6b25e4c3   none      null      local

网络模式能干嘛


容器间的互联和通信以及端口映射


容器IP变动时候可以通过服务名直接网络通信而不受到影响


小总结


911a2000636e04152693e521d6f9bac0_bbe4453f89de3f000f5e25ce05aeecdb.png


  • bridge模式:使用–network bridge指定,默认使用docker0
  • host模式:使用–network host指定
  • none模式:使用–network none指定
  • container模式:使用–network container:NAME或者容器ID指定


容器实例内默认网络IP生产规则


运行centos1和centos2,查看它们的ip分别为172.16.0.2,172.16.0.3。那么当centos2挂掉的话,在新建容器centos3,那么它的ip就会变为172.16.0.3


10.2 bridge

很像交换机


Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,==它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。==Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。


1 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。


2 docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge=,使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己create的network(后面讲)eth0,eth1,eth2……代表网卡一,网卡二,网卡三……,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址


3 网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配

3.1 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);

3.2 每个容器实例内部也有一块网卡,每个接口叫eth0;

3.3 docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。


3de22298409a09661688ff9a6b7af154_e8f3334c9828ad76cad4d8b58c643a5b.png

e62b18d5c629947b6ab77a86a7fe7aec_45e633ef07dac525f01adf5b6ce1bff6.png


640b4e036f73ef64303ed0c256d6f2be_1152e960bbfff5870bf1d3eed691675f.png


10.3 host

直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。


容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。


错误的写法:


docker run -d -p 8083:8080 --network host --name tomcat83 pyy/tomcat8-jdk8


正确的写法


docker run -d --network host --name tomcat83 pyy/tomcat8-jdk8


a4fa576dc80091057edc86e4ec4b40ec_3d4aa9477ea344209b3f2329e405a82d.png


http://宿主机IP:8080/


在CentOS里面用默认的火狐浏览器访问容器内的tomcat83看到访问成功,因为此时容器的IP借用主机的,

所以容器共享宿主机网络IP,这样的好处是外部主机与容器可以直接通信。


10.4 none

禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)


在none模式下,并不为Docker容器进行任何网络配置。

也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo

需要我们自己为Docker容器添加网卡、配置IP等。


76ebc599b0289973252884cf74646b7c_9866350caa7c56d89eab2922ce52ded5.png


10.5 container

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的.


b6a54d736a3ad0537a92067ea3228e55_3c62e926476d2271e102f29b681b807c.png


docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8


8c5bdbf8f6bf5d6c7b04c47dc20c93a9_a6cc4e1cb62acb4dd81b8c21de4ce1f0.png


关闭alpine1,在看alpine2

b4a60b550a062edaeee2ae005680ce95_865a0a1fb5099be3330101baba3d4843.png

10.6 自定义网络

5f7914b1d5fe6ecc7c1b739bb2356db1_94285a8058e44c46cfc553627907efa4.png

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
17天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
43 3
实战~如何组织一个多容器项目docker-compose
|
22天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
84 24
|
24天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
109 6
|
1月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
102 7
|
14天前
|
存储 监控 供应链
微服务拆分的 “坑”:实战复盘与避坑指南
本文回顾了从2~3人初创团队到百人技术团队的成长历程,重点讨论了从传统JSP到前后端分离+SpringCloud微服务架构的演变。通过实际案例,总结了微服务拆分过程中常见的两个问题:服务拆分边界不清晰和拆分粒度过细,并提出了优化方案,将11个微服务优化为6个,提高了系统的可维护性和扩展性。
36 0
|
2月前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。
|
2月前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
92 0
|
2月前
|
存储 Cloud Native 开发者
深入探索容器化技术——Docker的实战应用
深入探索容器化技术——Docker的实战应用
42 0
|
2月前
|
存储 安全 Docker
Docker 的实战应用与优化策略
Docker 的实战应用与优化策略
38 0
|
2月前
|
JavaScript Linux 持续交付
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
60 0