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:

img1

为什么会出现 404?我们的 tomcat 不是已经成功启动了吗?这是因为我们拉取的是最新的 tomcat 镜像,最新的 tomcat 对首页访问的规则做了修改。

所以我们先进入 tomcat 容器的内部:

[root@shjava101 ~]# docker exec -it 7dd763fc2bcd /bin/bash # 进入容器的内部
root@7dd763fc2bcd:/usr/local/tomcat# ls -l # 查看容器内部的文件

img2

我们进入 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 首页:

img3

我们发现访问成功。

但是这样进入容器修改容器的规则很麻烦,我们可不可以安装一个免修改的 tomcat 镜像呢?是可以的。

[root@shjava101 ~]# docker pull billygoo/tomcat8-jdk8 # 下载一个tomcat8镜像
[root@shjava101 ~]# docker run -d -p 8081:8080 --name mytomcat8
billygoo/tomcat8-jdk8

我们访问 tomcat 的首页:

img4

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 镜像,可以看到这个命令的描述:

img5

[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

img6

我们发现连接成功。

大家思考,目前运行的容器有没有什么问题?首先我们在运行容器的时候,没有指定字符编码集,可能会存在插入中文出现乱码的情况,还有就是如果我们删除容器之后,容器里面存在的数据怎么办?所以我们需要对我们安装步骤进行优化。

首先我们删除之前运行的 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 里面创建数据表,并插入数据:

img7

我们进入数据卷挂载的目录查看数据是否存在:

[root@shjava101 mysql]# cd /opt/mysql/data

img8

我们发现我们创建的数据成功的保存到数据卷对应的挂载目录了。

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 文件

img9

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

img10

第四步:使用 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 也成功了。