docker-compose(一):SpringBoot + Docker 案例

原味地址:http://www.linzichen.cn/article/1595243013943066624

本文主要演示通过dockerlinux 服务器上安装 mysqlredisnginx,并通过一个简单的 SpringBoot 项目进行连接并测试,最后通过 nginx 代理我们后端的接口请求。

安装mysql

  • 镜像:mysql:5.7
  • 库:db_docker
  • 表:t_user

1、拉取镜像

docker pull mysql:5.7

2、创建mysql容器

docker run --name mysql \ 
-v /mydocker/mysql/data:/var/lib/mysql \ 
-v /mydocker/mysql/conf.d:/etc/mysql/conf.d \ 
-e MYSQL_ROOT_PASSWORD=root \ 
-p 3306:3306 -d mysql:5.7

3、进入mysql容器内部

[root@localhost /]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
0102c03d7766   mysql:5.7   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
[root@localhost /]# docker exec -it 0102c03d7766 bash

4、 mysql 连接

root@0102c03d7766:/# mysql -uroot -proot

5、创建库和表

mysql> create database db_docker;
Query OK, 1 row affected (0.00 sec)

mysql> use db_docker;
Database changed

mysql> create table t_user (
    -> id int primary key auto_increment,
    -> name varchar(55) default "",
    -> age int not null);
Query OK, 0 rows affected (0.01 sec)

6、测试远程连接

由于是自己的虚拟机,所以不需要开放端口也能访问,如果是购买的服务器,则需要开放端口,并重启防火墙。

mysql.png

安装 redis

  • 镜像:redis:6.0

1、拉取镜像

docker pull redis:6.0

2、自定义redis配置

在创建之前,我们需要对redis进行如下配置:

1). 开启远程访问

2). 开启 aof 持久化

在 /mydocker/redis目录下创建 redis.conf 文件,并加入以下内容:

[root@localhost /]# cat /mydocker/redis/redis.conf 
bind 0.0.0.0
appendonly yes

3、创建redis容器

docker run --name redis \ 
-v /mydocker/redis/data:/data \ 
-v /mydocker/redis/redis.conf:/usr/local/etc/redis/redis.conf \ 
-p 6379:6379 \ 
-d redis:6.0 \ 
redis-server 

3、测试远程连接

由于是自己的虚拟机,所以不需要开放端口也能访问,如果是购买的服务器,则需要开放端口,并重启防火墙。

redis.png

安装Nginx

  • 镜像:nginx:1.22

1、拉取镜像

docker pull nginx:1.22

2、暂时启动个nginx实例,将其内部的配置文件,拷贝到宿主机

# 1. 启动nginx
docker run -p 80:80 -d  nginx:1.22

# 2. 宿主机在 /mydocker 目录下创建 nginx 目录
[root@localhost /]# cd /mydocker/
[root@localhost mydocker]# mkdir nginx

# 3. 拷贝配置文件(aa6b12782323为 nginx 容器的id)
docker cp aa6b12782323:/etc/nginx/nginx.conf /mydocker/nginx/nginx.conf
docker cp aa6b12782323:/etc/nginx/conf.d/default.conf /mydocker/nginx/default.conf

# 4. 将刚刚创建的nginx容器删除
[root@localhost mydocker]# docker stop aa6b12782323
aa6b12782323
[root@localhost mydocker]# docker rm aa6b12782323
aa6b12782323

2、创建 nginx 容器

docker run  \ 
-v /mydocker/nginx/nginx.conf:/etc/nginx/nginx.conf \ 
-v /mydocker/nginx/default.conf:/etc/nginx/conf.d/default.conf \ 
-v /mydocker/nginx/html:/usr/share/nginx/html \ 
-p 80:80 -d nginx:1.22    	

3、在 /mydocker/nginx/html 目录下 创建 index.html,并写入内容

[root@localhost html]# pwd
/mydocker/nginx/html
[root@localhost html]# ls
index.html
[root@localhost html]# cat index.html 
Hello Nginx

3、测试访问连接

nginx.png

SpringBoot项目

主要测试 mysql 和 redis 的功能,所以简单提供两个接口,一个是对mysql的测试,一个是对redis 的测试。

接口描述
/testMysql往数据库中添加一条记录
/testRedis往redis中添加一条记录

1、pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--MySQL连接Java的驱动程序-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.27</version>
</dependency>

<!--支持通过jdbc连接数据库库-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、application.yml

server:
  port: 12311
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.2.123:3306/db_docker?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
    username: root
    password: root
  redis:
    host: 192.168.2.123
    port: 6379

3、Controller

@RestController
public class TestController {

    @Autowired
    private JdbcTemplate jdbcTemplate ;
    @Autowired
    private StringRedisTemplate redisTemplate ;

    @GetMapping("/testMysql")
    public String testMysql() {
        String sql = "insert into t_user (name, age) values (?,?)" ;
        Object[] args = {"tom", 18} ;
        int result = jdbcTemplate.update(sql, args);
        return result == 1 ? "mysql添加成功" : "mysql添加失败" ;
    }

    @GetMapping("/testRedis")
    public String testRedis() {
        String key = "user:1" ;
        redisTemplate.opsForValue().set(key, "tom");
        String value = redisTemplate.opsForValue().get(key);
        return value ;
    }
}

构建SpringBoot镜像

将上面的 SpringBoot 项目打成 jar 包,上传到 /mydocker/app 目录下:

[root@localhost /]# clear
[root@localhost /]# cd /mydocker/app/
[root@localhost app]# ls
spring-docker-compose-0.0.1-SNAPSHOT.jar

在同级目录创建 Dockerfile 文件:

# 基于java8
FROM openjdk:8
# 创建容器的工作目录
WORKDIR /app
# 将jar包添加到容器中,并改命为 myapp.jar
ADD spring-docker-compose-0.0.1-SNAPSHOT.jar /app/myapp.jar
# 暴露端口
EXPOSE 12311
# 运行jar包
ENTRYPOINT ["java", "-jar"]
CMD ["myapp.jar"]

构建镜像:

docker build -t myapp 

myapp.png

启动容器:

[root@localhost app]# docker run -p 12311:12311 -d 532c2435808a
fd6c851f0445b86b9946c092923fb188756d3a3e308935362fb94804d422cfff

[root@localhost app]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS             PORTS                                                  NAMES
fd6c851f0445   532c2435808a   "java -jar myapp.jar"    4 seconds ago       Up 2 seconds       0.0.0.0:12311->12311/tcp, :::12311->12311/tcp          busy_varahamihira

查看容器是否启动成功:

javalog.png

nginx 代理接口

配置 nginx 的 80 端口代理到我们服务的 12311 接口.

[root@localhost /]# cd /mydocker/nginx/
[root@localhost nginx]# vi default.conf

default.conf:

location / {
    #root   /usr/share/nginx/html;
    #index  index.html index.htm;
    proxy_pass http://192.168.2.123:12311/;
}

重启nginx容器:

[root@localhost nginx]# docker ps
dCONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS             PORTS                                                  NAMES
fd6c851f0445   532c2435808a   "java -jar myapp.jar"    17 minutes ago      Up 17 minutes      0.0.0.0:12311->12311/tcp, :::12311->12311/tcp          busy_varahamihira
6b0ac8c0fb1a   nginx:1.22     "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:80->80/tcp, :::80->80/tcp                      silly_napier
c7ab53b1aab2   redis:6.0      "docker-entrypoint.s…"   2 hours ago         Up 2 hours         0.0.0.0:6379->6379/tcp, :::6379->6379/tcp              redis
0102c03d7766   mysql:5.7      "docker-entrypoint.s…"   2 hours ago         Up 2 hours         0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql

[root@localhost nginx]# docker restart 6b0ac8c0fb1a
6b0ac8c0fb1a

接口访问

测试mysql:

testMysql.png

去数据库查询:

mysql> select * from t_user;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | tom  |  18 |
+----+------+-----+
1 row in set (0.00 sec)

测试redis:

testRedis.png

root@c7ab53b1aab2:/data# redis-cli
127.0.0.1:6379> get user:1
"tom"
127.0.0.1:6379> 

至此,通过 docker 安装服务并访问测试的demo 就已经完成了。下篇文章说一下 基于 docker compose 来管理docker 容器,以及它和传统的 docker run 有哪些区别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值