一、运行redis
1、下载redis镜像
2、下载配置redis.conf(从官网下载的配置文件)
2.1 、在宿主机创建如下所示目录结构
|-- /
|-- tmp
| |-- docker-volume
| | |-- redis
| | | |-- conf
| | | | |-- redis.conf
| | | |-- data
2.2、修改redis.conf配置
需要将redis.conf文件放到路径下:/tmp/docker-volume/redis/conf/redis.conf
启动的时候会将/usr/local/etc/redis/conf/redis.conf
与宿主机中的redis.conf做挂载,同步到容器中,从而在启动的时候通过宿主机上面的配置文件启动。
修改redis.conf配置:
- 开启保存RDB(默认开启):
save *
- 开启AOF立即记录保存:
appendonly yes
- 设置RDB文件名称:
dbfilename dump.rdb
- 设置RDB和AOF文件的保存目录:
dir /usr/local/etc/redis/data
- 设置连接密码:
requirepass 123456
- 关闭主机绑定(不关闭,其他主机无法访问):
# bind 127.0.0.1 -::1
2.3、启动redis
-
第一次启动
命令:
docker run -d -p 6379:6379 -v /tmp/docker-volume/redis/data:/data/ -v /tmp/docker-volume/redis/conf/redis.conf:/usr/local/etc/redis/conf/redis.conf redis:6.2 redis-server /usr/local/etc/redis/conf/redis.conf
会发现无法启动容器,报没找不到我们想要挂载的目录
/usr/local/etc/redis/data
。
[root@localhost /]# docker run -d -p 6379:6379 -v /tmp/docker-volume/redis/data:/data/ -v /tmp/docker-volume/redis/conf/redis.conf:/usr/local/etc/redis/conf/redis.conf redis:6.2 redis-server /usr/local/etc/redis/conf/redis.conf
4da41054a01737030a84bc1374f0819854dafae5db62df90b413cd6da0bdb781
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4da41054a017 redis:6.2 "docker-entrypoint.s…" 28 seconds ago Exited (1) 26 seconds ago intelligent_wright
[root@localhost /]# docker logs 4da41054a017
1:C 13 Dec 2021 12:08:30.940 # Can't chdir to '/usr/local/etc/redis/data': No such file or directory
- 第二次启动
我们将命令换成:docker run -d -p 6379:6379 -v /tmp/docker-volume/redis/data:/usr/local/etc/redis/data -v /tmp/docker-volume/redis/conf/redis.conf:/usr/local/etc/redis/conf/redis.conf redis:6.2 sh -c 'mkdir -p /usr/local/etc/redis/data && redis-server /usr/local/etc/redis/conf/redis.conf'
命令解析:
- 后台运行:
-d
- 端口映射:
-p 6379:6379
- 同步持久化数据:
-v /tmp/docker-volume/redis/data:/usr/local/etc/redis/data
- 使用宿主机的conf文件配置启动(redis镜像中是没有conf文件的,其redis-server在,,,,,目录):
-v /tmp/docker-volume/redis/conf/redis.conf:/usr/local/etc/redis/conf/redis.conf
- 使用同步的conf文件,启动redis:
redis-server /usr/local/etc/redis/conf/redis.conf
发现可以成功启动:
[root@localhost docker-volume]# docker run -d -p 6379:6379 -v /tmp/docker-volume/redis/data:/usr/local/etc/redis/data -v /tmp/docker-volume/redis/conf/redis.conf:/usr/local/etc/redis/conf/redis.conf redis:6.2 sh -c 'mkdir -p /usr/local/etc/redis/data && redis-server /usr/local/etc/redis/conf/redis.conf'
13d7382f6826c24d6a13f851fc1c83d0354bca7254f25720dc00e78cfa997c26
[root@localhost docker-volume]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
13d7382f6826 redis:6.2 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp elegant_lederberg
但是问题是否是真的因为挂载的目录在容器内不存在呢?
于是尝试将目录挂载到centos容器内:
[root@localhost docker-volume]# docker run -it -v /tmp/docker-volume/redis/data:/usr/local/etc/redis/data -v /tmp/docker-volume/redis/conf/redis.conf:/usr/local/etc/redis/conf/redis.conf centos:7 /bin/bash
[root@de28e378c91c /]# cd /usr/local/
[root@de28e378c91c local]# ls
bin etc games include lib lib64 libexec sbin share src
[root@de28e378c91c /]# cd /usr/local/etc/redis/
[root@de28e378c91c redis]# ls
conf data
[root@de28e378c91c redis]#
因此,我将可以正常启动redis容器的命令中创建目录的命令换成任意一个,都可以正常的启动容器。
docker run -d -p 6379:6379 -v /tmp/docker-volume/redis/data:/usr/local/etc/redis/data -v /tmp/docker-volume/redis/conf/redis.conf:/usr/local/etc/redis/conf/redis.conf redis:6.2 sh -c 'echo 'start' && redis-server /usr/local/etc/redis/conf/redis.conf'
该问题一直也没找到答案,还望有大佬能解释一下
二、运行MySQL
1、下载MySQL镜像
2、运行容器
创建如下目录结构:
|-- /
|-- tmp
| |-- docker-volume
| | |-- MySQL
| | | |-- conf
| | | |-- logs
| | | |-- data
命令:docker run -d -p 3306:3306 --name="MySQL-5.7" -v /tmp/docker-volume/MySQL/conf:/etc/mysql/conf.d -v /tmp/docker-volume/MySQL/logs:/logs -v /tmp/docker-volume/MySQL/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
命令说明:
-d
后台运行
-p 3306:3306
:将主机的3306端口映射到docker容器的3306端口。
--name="MySQL-5.7"
:容器名字
-v /tmp/docker-volume/MySQL/conf:/etc/mysql/conf.d
:将主机/tmp/docker-volume/MySQL/conf录下的my.cnf 挂载到容器的 /etc/mysql/conf.d
之所以是这个目录:-v /tmp/docker-volume/MySQL/logs:/logs
:将主机/tmp/docker-volume/MySQL/logs目录下的 logs 目录挂载到容器的 /logs。
-v /zzyyuse/mysql/data:/var/lib/mysql
:将主机/zzyyuse/mysql/data目录挂载到容器的 /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
:初始化 root 用户的密码。
mysql:5.7
: 镜像和版本号
--character-set-server=utf8mb4
、--collation-server=utf8mb4_unicode_ci
:不使用cnf配置文件,则可以通过该方式传递配置
3、验证
连接容器中的MySQL,随便创建一个数据库和表,插入3条数据。
进入宿主机的/tmp/docker-volume/MySQL/data/
目录就会发现,多了很多文件和文件夹。并且有一个和我们新建的数据库同名的文件夹。
测试删除容器,并重新生成新的容器,但是绑定路径和之前不变,经验证之前的表和数据都存在
三、部署一个项目到运行Tomcat
1、下载tomcat镜像
2、建一个spring boot项目(使用外部Tomcat运行)。将项目打包成spring-boot-redis.war
我再该项目中创建了两个接口:
根据key查询redis:http://192.168.0.103:8888/spring-boot-redis/redisController/getRedisStringValueByKey?redisKey=name
往redis中设置值:http://192.168.0.103:8888/spring-boot-redis/redisController/setRedisStringValueByKey?redisKey=name&value=docker
3、运行一个redis容器实例
参考上面的【运行redis】。如果你的项目用不到redis,可以忽略。
4、下载一个tomcat,获取tomcat配置文件
ps:你也可以通过下载的tomcat镜像运行一个容器实例,从容器中/usr/local/tomcat/
路径下复制到宿主机。
在宿主机创建一个如下目录结构:
将下载的tomcat解压,需要获取到整个解压后的conf目录,放在宿主机的/tmp/docker-volume/tomcat-run-project/conf
目录下,用于后面覆盖容器内的配置。
将spring-boot-redis.war包放在/tmp/docker-volume/tomcat-run-project/webapps
下,tomcat启动后会自动将war包解压:
5、运行容器
命令:docker run -d -p 8888:8080 --name="tomcat" -v /tmp/docker-volume/tomcat-run-project/conf:/usr/local/tomcat/conf -v /tmp/docker-volume/tomcat-run-project/logs:/usr/local/tomcat/logs -v /tmp/docker-volume/tomcat-run-project/webapps:/usr/local/tomcat/webapps tomcat:8.5.32
命令说明:
-d
后台运行
-p 8888:8080
:将主机的8888端口映射到docker容器的8080 端口。
--name="tomcat"
:容器名字
-v /tmp/docker-volume/tomcat-run-project/conf:/usr/local/tomcat/conf
、-v /tmp/docker-volume/tomcat-run-project/logs:/usr/local/tomcat/logs
、-v /tmp/docker-volume/tomcat-run-project/webapps:/usr/local/tomcat/webapps
:目录挂载
6、访问测试
注意:访问需要使用war包的名称
7、其他方式
运行一个Tomcat的容器后,使用docker cp
命令将war包复制到容器的/usr/local/tomcat/webapps
路径下,然后docker restart
重启容器。