本文主要演示通过docker
在 linux
服务器上安装 mysql
、redis
及 nginx
,并通过一个简单的 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、测试远程连接
由于是自己的虚拟机,所以不需要开放端口也能访问,如果是购买的服务器,则需要开放端口,并重启防火墙。
安装 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、测试远程连接
由于是自己的虚拟机,所以不需要开放端口也能访问,如果是购买的服务器,则需要开放端口,并重启防火墙。
安装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、测试访问连接
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
启动容器:
[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
查看容器是否启动成功:
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:
去数据库查询:
mysql> select * from t_user;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | tom | 18 |
+----+------+-----+
1 row in set (0.00 sec)
测试redis:
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 有哪些区别。