网络
默认网络
创建完Java项目的容器后,Java项目往往还需要访问其它各种中间件如MySQL、Redis等,所以还需要测试我们的容器之间能否互相访问
查看MySQL容器
的详细信息,重点关注其中的网络IP地址
# 1.使用基本命令查看容器的Networks.bridge.IPAddress属性
docker inspect mysql
# 使用format过滤结果
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' mysql
# 得到IP地址如下:
172.17.0.2
# 2.然后通过命令进入我们创建的javaDemo容器
docker exec -it javaDemo bash
# 3.在容器内,通过ping命令测试网络
ping 172.17.0.2
# 结果ping通说明可以互联
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.053 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.058 ms
在安装docker后会创建一张虚拟网卡docker0
充当网桥,默认情况下所有容器都是以bridge
方式连接到Docker的一个虚拟网桥上,网桥会给每个连接的容器都分配IP
- 在同一个网络中的容器可以相互访问
- 网桥分配给容器的是一个虚拟网络IP并不会固定与某一个容器绑定,如果我们在开发时写死某个容器IP,如果部署时容器的IP会发生变化就会连接会失败
自定义网络
使用docker的网络功能,参考官方文档中的常见命令
命令 | 说明 | 文档地址 |
---|---|---|
docker network create | 创建一个网络 | docker network create |
docker network ls | 查看所有网络 | docs.docker.com |
docker network rm | 删除指定网络 | docs.docker.com |
docker network prune | 清除未使用的网络 | docs.docker.com |
docker network connect | 使指定容器连接加入某网络 | docs.docker.com |
docker network disconnect | 使指定容器连接离开某网络 | docker network disconnect |
docker network inspect | 查看网络详细信息 | docker network inspect |
在自定义网络中可以给容器起多个别名(默认为容器名本身), 在同一个且是自定义网络
中的容器可以通过别名互相访问
# 1.首先通过命令创建一个网络
docker network create hmall
# 2.然后查看网络
docker network ls
# 结果:除了hmall以外,其它都是默认的网络
NETWORK ID NAME DRIVER SCOPE
639bc44d0a87 bridge bridge local
403f16ec62a2 hmall bridge local
0dc0f72a0fbb host host local
cd8d3e8df47b none null local
# 3.让创建的java项目容器和mysql容器都加入该网络,在加入网络时可以通过--alias给容器起别名, 这样该网络内的其它容器可以用别名互相访问
# 3.1.让mysql容器连接自定义网路并指定别名为db,另外每一个容器的别名默认是容器名
docker network connect hmall mysql --alias db
# 3.2.让我们创建好的java项目容器连接自定义网络
docker network connect hmall javaDemo
# 删除容器,在创建容器时指定加入自定义的网络,此时就不会再加入默认的网桥bridge,默认都会加入网桥
docker rm -f javaDemo
docker run -d --name javaDemo -p 8090:8090 --network heima docker_demo
# 4.进入javaDemo容器
docker exec -it javaDemo bash
# 用db别名访问
ping db
# 结果
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms
# 用容器名访问
ping mysql
# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms
# 访问nginx容器访问不通,因为nginx容器在默认的网桥中
单体部署
部署后端
我们要部署的hm-service
工程的配置文件采用了多环境的方式
application-dev.yaml
是部署到开发环境的配置,application-local.yaml
是本地运行时的配置
在application.yaml
中的JDBC地址并未写死,而是通过读取变量的方式获取值,变量值在application-dev.yaml和application-local.yaml
中并不相同在dev开发环境即Docker部署时采用了
mysql容器名
作为地址,这样只要部署的java项目和MySQL容器在一个自定义网络中就能通过容器名互相访问
将项目打包,然后将hm-service目录下的Dockerfile
和打包好的hm-service.jar
一起上传到虚拟机的root目录
执行Dockerfile
文件构建镜像,然后根据构建好的镜像创建容器, 最后通过浏览器访问http://虚拟机地址:8080/search/list
# 1.构建项目镜像,不指定tag默认为latest
docker build -t hmall .
# 2.查看镜像
docker images
# 结果
REPOSITORY TAG IMAGE ID CREATED SIZE
hmall latest 0bb07b2c34b9 43 seconds ago 362MB
docker-demo 1.0 49743484da68 24 hours ago 327MB
nginx latest 605c77e624dd 16 months ago 141MB
mysql latest 3218b38490ce 17 months ago 516MB
# 3.创建并运行容器,并通过--network将其加入hmall网络,这样才能通过容器名访问mysql
docker run -d --name hmall --network hmall -p 8080:8080 hmall
部署前端
将整个nginx目录上传到虚拟机的/root
目录下
- html是静态资源目录,存放
hmall-portal
和hmall-admin
前端代码 nginx.conf
是nginx的配置文件,主要是完成对html下的两个静态资源目录做代理
创建nginx容器并完成两个挂载
- 把
/root/nginx/nginx.conf
挂载到/etc/nginx/nginx.conf
, 把/root/nginx/html
挂载到/usr/share/nginx/html
server {
listen 18080;
# 指定前端项目所在的位置,在容器内
location / {
root /usr/share/nginx/html/hmall-portal;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://hmall:8080;
}
}
server {
listen 18081;
# 指定前端项目所在的位置,在容器内
location / {
root /usr/share/nginx/html/hmall-admin;
}
# nginx容器通过容器名访问部署的后端项目
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://hmall:8080;
}
}
让nginx同时代理hmall-portal和hmall-admin两套前端资源,因此需要暴露两个端口18080(对应hmall-portal)
和18081(对应hmall-admin)
docker run -d \
--name nginx \
-p 18080:18080 \
-p 18081:18081 \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network hmall \
nginx
通过浏览器访问http://你的虚拟机ip:18080