九、微服务实战
1.修改之前的SpringBoot项目yml中数据库配置,改为容器化的mysql地址
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.项目打包
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
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
7.测试
十、网络模式
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变动时候可以通过服务名直接网络通信而不受到影响
小总结
- 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,此时两个容器的网络是互通的。
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
http://宿主机IP:8080/
在CentOS里面用默认的火狐浏览器访问容器内的tomcat83看到访问成功,因为此时容器的IP借用主机的,
所以容器共享宿主机网络IP,这样的好处是外部主机与容器可以直接通信。
10.4 none
禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)
在none模式下,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo
需要我们自己为Docker容器添加网卡、配置IP等。
10.5 container
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的.
docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8
关闭alpine1,在看alpine2
10.6 自定义网络