首先我们先了解一下docker中的网络配置

18 网络基础配置

大量的互联网应用服务包括多个服务组件,这往往需要多个容器之间通过网络通信进行相互配合。

Docker目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务。 下面学习如何使用Docker的网络功能。包括使用端口映射机制来将容器内应用服务提供给外部网络,以及通过容器互联系统让多个容器之间进行快捷的网络通信。

18.1 端口映射实现访问容器

从外部访问容器应用

在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。

当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射。

当使用-P标记时,Docker会随机映射一个高端口至容器内部开放的网络端口


docker run -d --name=nginx-test -P nginx

在这里插入图片描述
通过docker ps看到本地主机的32768端口被映射到了容器的80端口。

访问宿主机的32768接口即可访问容器内Nginx提供的页面。

可以通过docker logs -f nginx-test查看应用的信息

在这里插入图片描述
docker logs -f选项可以跟踪显示日志。

-p(小写的)则可以指定要映射的端口,如果指定多个端口,可以写多次-p

docker run -d --name=nginx-test -p 8080:80 -p 433:22 nginx

查看映射端口配置

docker port 容器名称或者容器id

在这里插入图片描述
注意:容器有自己的内部网络和IP地址(使用docker inspect+容器ID可以获取所有的变量值)

18.2 容器互联实现容器间通信(重点,就是该文章的目的)

容器的连接(linking)系统是除了端口映射外另一种可以与容器中应用进行交互的方式。它会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。

18.2.1自定义容器命名

连接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。虽然当创建容器的时候,系统默认会分配一个名字,但自定义命名容器存两个好处∶

  • 自定义的命名,比较好记,比如一个Web应用容器,我们可以给它起名叫web。
  • 当要连接其他容器时候,可以作为一个有用的参考点,比如连接 Web容器到db容器。使用–name 标记可以为容器自定义命名

18.2.2 容器互联

使用–link参数可以让容器之间安全的进行交互。下面先创建一个新的数据库容器;

Doker在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上。在启动db容器的时候并没有使用-p和-P标记,从而避免了暴露数据库端口到外部网络上。

18.2.3 Springboot 加redis 实验:

Springboot 集成redis,测试通过后,打包

注意:你的项目的pom文件必须有maven编译插件,如果没有会找不到主类,参考一下代码

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

注意: 你可以在redis的配置文件主机先写一个变量,而不是固定的ip,类似下面

server:
 port: 8888
spring:
  redis:
    #单机
    # Redis服务器地址
    host: redisdb
    # Redis服务器连接端口
    port: 6379
    # 集群
    #多个节点以逗号分隔
    #cluster:
     # nodes: 192.168.0.78:6379,192.168.0.78:6380,192.168.0.78:6381,192.168.0.78:6382,192.168.0.78:6383,192.168.0.78:6384
    # Redis服务器连接密码(默认为空)
    password: 123456
    # Redis数据库索引(默认为0)
    database: 0
    #连接池
    pool:
      # 连接池最大连接数(使用负值表示没有限制)
      max-active: 8
      # 连接池最大阻塞等待时间(使用负值表示没有限制)
      max-wait: -1
      # 连接池中的最大空闲连接
      max-idle: 8
      # 连接池中的最小空闲连接
      min-idle: 0
      # 连接超时时间(毫秒)
      timeout: 0
  • 上传你的jar包
  • 编写 Douckerfile 文件
# Docker image for springboot file run
# VERSION 0.0.1
# Author: Thomas
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER Fu<13298107421@163.com>
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar,注意我们的jar包不一样,你把下面修改为你的
ADD springboot_mysql_redis.jar app.jar
# 运行jar包
# touch命令,如果没有文件创建则创建文件,如果文件已存在,则修改时间戳
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]
  • 如果你的镜像没有java8请先下载

启动包含redis镜像的容器


docker run --name redis-test -p 6379:6379 -d --restart=always redis  redis-server --appendonly yes --requirepass "123456"  --protected-mode no

构建springboot镜像

# 注意后面有个.
docker build -t springredis1:v1 .

启动springboot程序,同时连接到redis

# 请注意:我的打包的项目中yaml文件的server.port=8888,你们修改为你们的端口

docker run -d --name springbootredis1-test -p 80:8888 --link redis-test:redisdb springredis1:v1

docker ps查看我们容器是否启动起来,如果没有启动起来,请docker log 容器名或者id查看是什么原因没有启动起来

  • 有可能找不到主类,你的项目pom文件有问题,
  • 有可能端口被占用,可以把占用端口的容器先给停了
  • 有可能jar包找不到,修改你的Dockerfile文件或者修改jar包名称

curl localhost/你的接口可以看到结果

18.2.4 springboot+redis+mysql8实现

修改yaml文件把mysql配置文件的主机写为字符串

 datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://mysqldb:3306/mytest?serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&characterEncoding=utf-8
# mysqldb 是我给他起的别名
  • 同样再次上传jar包
  • 根据mysql8镜像创建容器
  • 运行mysql8容器
  • 再次根据jar包创建镜像(和上面build一样)
  • 启动的配置如下
docker run -d --name jxfilm-test -p 80:8888 --link redis-test:redisdb --link mysql-test:jxfilmdb jxfilm:v1
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐