7.1 安装 tomcat
第一步:搜索镜像
[root@shjava101 ~]# docker search tomcat
第二步:拉取镜像
[root@shjava101 ~]# docker pull tomcat
第三步:docker images 查看是否有拉取到的 tomcat
[root@shjava101 ~]# docker images tomcat
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest fb5657adc892 12 months ago 680MB
第四步:使用 tomcat 镜像创建容器实例(也叫运行镜像)
[root@shjava101 ~]# docker run -d -p 8080:8080 --name t1 tomcat
[root@shjava101 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7dd763fc2bcd tomcat "catalina.sh run" 4 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp t1
-p 8080:8080 是端口映射,意思是将宿主机的 8080 端口映射到容器的 8080 端口。
此时我们访问8080:

为什么会出现 404?我们的 tomcat 不是已经成功启动了吗?这是因为我们拉取的是最新的 tomcat 镜像,最新的 tomcat 对首页访问的规则做了修改。
所以我们先进入 tomcat 容器的内部:
[root@shjava101 ~]# docker exec -it 7dd763fc2bcd /bin/bash # 进入容器的内部
root@7dd763fc2bcd:/usr/local/tomcat# ls -l # 查看容器内部的文件

我们进入 webapps 目录:
root@7dd763fc2bcd:/usr/local/tomcat# cd webapps
root@7dd763fc2bcd:/usr/local/tomcat/webapps# ls -l
total 0
我们发现这里面是空的,这也是我们为什么不能访问 tomcat 首页的原因。
真正有货的是 webapps.dist/ 目录:
root@7dd763fc2bcd:/usr/local/tomcat# cd webapps.dist/
root@7dd763fc2bcd:/usr/local/tomcat/webapps.dist# ls -l
total 4
drwxr-xr-x. 3 root root 223 Dec 22 2021 ROOT
drwxr-xr-x. 15 root root 4096 Dec 22 2021 docs
drwxr-xr-x. 7 root root 99 Dec 22 2021 examples
drwxr-xr-x. 6 root root 79 Dec 22 2021 host-manager
drwxr-xr-x. 6 root root 114 Dec 22 2021 manager
所以我们现在把已经存在的 webapps 目录删除,然后将 webapps.dist 目录重命名为 webapps 目录。
root@7dd763fc2bcd:/usr/local/tomcat# rm -rf webapps
root@7dd763fc2bcd:/usr/local/tomcat# mv webapps.dist/ webapps
接下来我们再访问 tomcat 首页:

我们发现访问成功。
但是这样进入容器修改容器的规则很麻烦,我们可不可以安装一个免修改的 tomcat 镜像呢?是可以的。
[root@shjava101 ~]# docker pull billygoo/tomcat8-jdk8 # 下载一个tomcat8镜像
[root@shjava101 ~]# docker run -d -p 8081:8080 --name mytomcat8
billygoo/tomcat8-jdk8
我们访问 tomcat 的首页:

7.2 安装 MySQL
我们以安装 mysql5.7 为例:
7.2.1 简单版本安装
第一步:拉取镜像
[root@shjava101 ~]# docker pull mysql:5.7
第二步:查看镜像是否拉取成功
[root@shjava101 ~]# docker images mysql:5.7
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 12 months ago 448MB
第三步:运行镜像
运行 MySQL 的镜像的命令是什么?我们进入 https://hub.docker.com/ 搜索 MySQL 镜像,可以看到这个命令的描述:

[root@shjava101 ~]# docker run -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
注意:一定要保证 Linux 里面没有运行的 MySQL,如果有的话,端口映射 3307。否则会报异常。
[root@shjava101 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1815bbc70d06 mysql:5.7 "docker-entrypoint.s…" 53 seconds ago Up 51 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp recursing_allen
第四步:进入容器内部,登录 MySQL 数据库
[root@shjava101 ~]# docker exec -it 1815bbc70d06 /bin/bash
root@1815bbc70d06:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.03 sec)
第五步:使用 sqlYog 工具来连接 MySQL

我们发现连接成功。
大家思考,目前运行的容器有没有什么问题?首先我们在运行容器的时候,没有指定字符编码集,可能会存在插入中文出现乱码的情况,还有就是如果我们删除容器之后,容器里面存在的数据怎么办?所以我们需要对我们安装步骤进行优化。
首先我们删除之前运行的 MySQL 容器:
[root@shjava101 ~]# docker stop 1815bbc70d06 # 停止mysql容器
1815bbc70d06
[root@shjava101 ~]# docker rm -f 1815bbc70d06 # 删除mysql容器
1815bbc70d06
7.2.2 实战版本安装
第一步:运行 MySQL 容器
[root@shjava101 /]# docker run -d -p 3307:3306 --privileged=true -v /opt/mysql/log:/var/log/mysql -v /opt/mysql/data:/var/lib/mysql -v /opt/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
我们这个时候实现数据卷挂载,将 MySQL 相关的运行数据同步到宿主机的指定目录。
第二步:新建 my.cnf
[root@shjava101 /]# cd /opt/mysql/conf/
[root@shjava101 conf]# vim my.cnf
我们编辑:
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
第三步:重新启动 MySQL 容器实例再重新进入并查看字符编码
由于修改了配置,我们最好将容器重新启动一下:
[root@shjava101 conf]# docker restart 0a992c086f8e
0a992c086f8e
第四步:进入容器,并登录 MySQL 数据库
[root@shjava101 conf]# docker exec -it 0a992c086f8e /bin/bash
root@0a992c086f8e:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
我们查看 Mysql 数据库的字符编码集:
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
第五步:创建数据表,插入数据
我们在 MySQL 里面创建数据表,并插入数据:

我们进入数据卷挂载的目录查看数据是否存在:
[root@shjava101 mysql]# cd /opt/mysql/data

我们发现我们创建的数据成功的保存到数据卷对应的挂载目录了。
7.3 安装 Redis
7.3.1 简单安装
第一步:拉取镜像
[root@shjava101 /]# docker pull redis:6.0.8
第二步:查看镜像是否存在
[root@shjava101 /]# docker images redis:6.0.8
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 6.0.8 16ecd2772934 2 years ago 104MB
第三步:运行镜像
[root@shjava101 /]# docker run -d -p 6379:6379 redis:6.0.8
5d46714dbbd53644af02ec77954a6d9c5fc593443be5cc76d2631fc826db2388
第四步:进入容器内部
[root@shjava101 /]# docker exec -it 5d46714dbbd5 /bin/bash
root@5d46714dbbd5:/data# ls -l
total 0
root@5d46714dbbd5:/data# redis-cli
127.0.0.1:6379> set username eric
OK
127.0.0.1:6379> get username
"eric"
127.0.0.1:6379>
我们发现可以正常运行,并可以插入数据。
但是现在存在的问题就是当容器删除之后,Redis 容器里面的数据也不会保存。所以我们在运行容器的时候,需要使用数据卷进行挂载。
我们先退出并删除容器:
root@5d46714dbbd5:/data# exit
exit
[root@shjava101 /]# docker rm -f 5d46714dbbd5
5d46714dbbd5
7.3.2 实战版安装
第一步:我们在宿主机下面创建目录
[root@shjava101 /]# cd /opt
[root@shjava101 /]# mkdir -p app/redis
第二步:将一个 redis.conf 文件模板拷贝进 /opt/app/redis 目录下
[root@shjava101 opt]# cp redis.conf /opt/app/redis/
[root@shjava101 opt]# cd /opt/app/redis
[root@shjava101 redis]# ll
total 92
-rw-r--r--. 1 root root 92242 Dec 29 21:33 redis.conf
第三步:/opt/app/redis 目录下修改 redis.conf 文件
- 允许 Redis 外部连接

- daemonize no
将 daemonize yes 注释起来或者 daemonize no 设置,因为该配置和 docker run 中 -d 参数冲突,会导致容器一直启动失败

- 开启 Redis 数据持久化 appendonly yes
第四步:使用 redis6.0.8 镜像创建容器(也叫运行镜像)
[root@shjava101 redis]# docker run -p 6379:6379 --name myredis --privileged=true -v /opt/app/redis/redis.conf:/etc/redis/redis.conf -v /opt/app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
1e41c9e23d443ad9f558f723d396e4cb44ec349f481428321137889ac4b8185c
第五步:测试客户端
root@1e41c9e23d44:/data# redis-cli
127.0.0.1:6379> set username eric
OK
127.0.0.1:6379> get username
"eric"
到目前,我们在 Docker 里面安装的 Redis 也成功了。