05网络和单体部署的步骤

作者 : admin 本文共3815个字,预计阅读时间需要10分钟 发布时间: 2024-06-5 共3人阅读

网络

默认网络

创建完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会发生变化就会连接会失败

05网络和单体部署的步骤插图

自定义网络

使用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是本地运行时的配置
    05网络和单体部署的步骤插图(1)
    application.yaml中的JDBC地址并未写死,而是通过读取变量的方式获取值,变量值在application-dev.yaml和application-local.yaml中并不相同

  • 在dev开发环境即Docker部署时采用了mysql容器名作为地址,这样只要部署的java项目和MySQL容器在一个自定义网络中就能通过容器名互相访问
    05网络和单体部署的步骤插图(2)
    将项目打包,然后将hm-service目录下的Dockerfile和打包好的hm-service.jar一起上传到虚拟机的root目录
    05网络和单体部署的步骤插图(3)

执行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-portalhmall-admin前端代码
  • nginx.conf是nginx的配置文件,主要是完成对html下的两个静态资源目录做代理
    05网络和单体部署的步骤插图(4)

创建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
05网络和单体部署的步骤插图(5)

本站无任何商业行为
个人在线分享 » 05网络和单体部署的步骤
E-->