Docker常用软件安装
# 80.Docker常用软件安装
演示下如何使用Docker来完成Redis,Tomcat和MySQL等常用软件的安装。介绍了这几个常见的软件安装之后,以后想要安装其他软件,也是依样画葫芦即可
# 总体步骤
一般来说,按照如下步骤来完成安装:
- 搜索镜像
- 拉取镜像
- 查看镜像
- 启动镜像(可能需要配置端口映射)
- 容器的操作(例如启停)
# 安装Tomcat
(在命令行)搜索镜像,一般选官方的(OFFICAL中是OK的):
$ docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source... 3578 [OK]
tomee Apache TomEE is an all-Apache... 110 [OK]
bitnami/tomcat Bitnami Tomcat Docker Image 49 [OK]
.............
2
3
4
5
6
ps:也可以在Docker Hub (opens new window) 或国内的镜像仓库上面查找,同时在网站上查找的话也会有丰富的说明文档
下载镜像到本地:
$ docker pull tomcat
$ docker images tomcat
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest fb5657adc892 20 months ago 680MB
2
3
4
5
6
启动Tomcat:
docker run -d -p 8080:8080 --name t1 tomcat
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORT NAMES
3f7e8349307d tomcat "catalina.sh run" 9 seconds ago Up 8 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp t1
2
3
4
5
注意,最新版的Tomcat默认是没有配置首页的,因此访问后会是404:
这是出于安全的考虑,所以删掉了webapp目录下的内容:
$ docker exec -it 3f /bin/bash
$ pwd
/usr/local/tomcat
$ ls -l
total 132
-rw-r--r-- 1 root root 18994 Dec 2 2021 BUILDING.txt
-rw-r--r-- 1 root root 6210 Dec 2 2021 CONTRIBUTING.md
-rw-r--r-- 1 root root 60269 Dec 2 2021 LICENSE
-rw-r--r-- 1 root root 2333 Dec 2 2021 NOTICE
-rw-r--r-- 1 root root 3378 Dec 2 2021 README.md
-rw-r--r-- 1 root root 6905 Dec 2 2021 RELEASE-NOTES
-rw-r--r-- 1 root root 16517 Dec 2 2021 RUNNING.txt
drwxr-xr-x 2 root root 4096 Dec 22 2021 bin
drwxr-xr-x 1 root root 22 Sep 4 10:23 conf
drwxr-xr-x 2 root root 4096 Dec 22 2021 lib
drwxrwxrwx 1 root root 80 Sep 4 10:23 logs
drwxr-xr-x 2 root root 159 Dec 22 2021 native-jni-lib
drwxrwxrwx 2 root root 30 Dec 22 2021 temp
drwxr-xr-x 2 root root 6 Dec 22 2021 webapps
drwxr-xr-x 7 root root 81 Dec 2 2021 webapps.dist
drwxrwxrwx 2 root root 6 Dec 2 2021 work
$ ls -l webapps
total 0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
原本的webapps目录改为了webapps.dist目录。如果想要恢复首页的话,可以这样:
$ rmdir webapps
$ mv webapps.dist webapps
2
重启,访问Tomcat(如果是云服务器,主要关闭防火墙):
免修改版:
有时候我们就想用默认的Tomcat,没有修改首页的;并且也不需要用到Tomcat10,Tomcat8即可,此时就可以用billygoo/tomcat8-jdk8
镜像:
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
2
# 安装MySQL
# 搜索镜像
$ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 14424 [OK]
mariadb MariaDB Server is a high performing open sou… 5507 [OK]
................
2
3
4
5
# 拉取MySQL
注意:这里指定了5.7版本
$ docker pull mysql:5.7
$ docker images mysql
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 20 months ago 448MB
2
3
4
5
# 运行MySQL
$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
-e:设置一些环境变量(environment)。
该命令可以看官方的文档说明 (opens new window):
# How to use this image
# Start a
mysql
server instanceStarting a MySQL instance is simple:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
1... where
some-mysql
is the name you want to assign to your container,my-secret-pw
is the password to be set for the MySQL root user andtag
is the tag specifying the MySQL version you want. See the list above for relevant tags.
注意,如果服务器本身装了MySQL并且已经启动了,那么再次启动容器监听3306端口会报错的:
$ docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
1d76384435fba9c7196315d739991574c0b8dddf3de1ee0465ccd86ac3f30ac8
docker: Error response from daemon: driver failed programming external connectivity on endpoint stupefied_jemison (66e92403fc3a39187fa8ee86716ff5d5250f8c5cd567592fb789e991130f9d3d): Error starting userland proxy: listen tcp4 0.0.0.0:3306: bind: address already in use.
2
3
因此需要停止:
$ systemctl stop mysqld
# 增删改查测试
接下来测试下操作MySQL,新建数据库和表,插入和查询数据:
$ mysql -uroot -p
$ mysql> create database db01;
Query OK, 1 row affected (0.00 sec)
mysql> use db01
$ mysql> create table aa(id int, name varchar(20));
Query OK, 0 rows affected (0.03 sec)
$ mysql> insert into aa values(1,'z3');
Query OK, 1 row affected (0.02 sec)
mysql> select * from aa;
+------+------+
| id | name |
+------+------+
| 1 | z3 |
+------+------+
1 row in set (0.00 sec)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
使用Navicat等连接工具也能正常连接:
# 字符集和容器数据卷
如果我们要insert的数据有中文,会报错:
insert into aa VALUES(2,'王五');
1366 - Incorrect string value: '\xE7\x8E\x8B\xE4\xBA\x94' for column 'name' at row 1
2
3
这是因为字符编码的问题(更多参考数据库与编码 (opens new window)),可以去容器内的MySQL执行SQL查看编码:
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
2
3
4
5
6
7
8
9
10
11
12
13
14
所以如果涉及到中文,需要修改编码。
如果删除了MySQL容器,那么里面的数据也是会丢失的;如果想保存,得用数据共享的方式来将数据存储到宿主机。我们可以使用这样的命令:
docker run -d -p 3306:3306 \
--privileged=true \
-v /zzyyuse/mysql/log:/var/log/mysql \
-v /zzyyuse/mysql/data:/var/lib/mysql \
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql \
mysql:5.7
2
3
4
5
6
7
8
新建/zzyyuse/mysql/conf/my.cnf
,配置字符编码,通过容器卷同步给MySQL容器实例:
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
2
3
4
5
由于改了配置,因此得重启MySQL并进入:
docker restart mysql
docker exec -it mysql bash
mysql -uroot -p123456
2
3
然后我们再测试字符编码(注意,得用Navicat等连接工具执行,因为在Docker输入不了中文):
create database db01;
use db01;
create table bb(id int, name varchar(20));dele
insert into bb values(1,'张三');
2
3
4
可以看到是成功的:
select * from bb;
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
+------+--------+
1 row in set (0.00 sec)
2
3
4
5
6
7
除此之外,即使删除了容器,再次创建MySQL,数据也是恢复的:
$ docker rm -f mysql
$ docker run -d -p 3306:3306 \
--privileged=true \
-v /zzyyuse/mysql/log:/var/log/mysql \
-v /zzyyuse/mysql/data:/var/lib/mysql \
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql \
mysql:5.7
$ docker exec -it mysql bash
$ mysql -uroot -p123456
$ use db01;
$ select * from bb;
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
+------+--------+
1 row in set (0.00 sec)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 安装Redis
Redis的安装和运行也很简单:
$ docker pull redis:6.0.8
$ docker run -d -p 6379:6379 --privileged=true --name redis redis:6.0.8
$ docker exec -it redis bash
$ redis-cli
$ 127.0.0.1:6379> ping
PONG
2
3
4
5
6
7
8
9
10
但和MySQL类似,如果一旦删除了该容器,那么Redis的数据就会丢失。同理,也要用容器数据卷。
在宿主机上新建目录:/app/redis
新增配置文件:vim /app/redis/redis.conf
,内容如下:
requirepass 123
daemonize no
2
注意:要允许Redis后台运行,也就得设置daemonize no,否则Redis就会前台运行,和和docker run中-d参数冲突,会导致容器一直启动失败
配置数据卷,运行Redis:
$ docker run -p 6379:6379 \
--name myr3 \
--privileged=true \
-v /app/redis/redis.conf:/etc/redis/redis.conf \
-v /app/redis/data:/data \
-d redis:6.0.8 \
redis-server /etc/redis/redis.conf
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1793c020cea redis:6.0.8 "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp myr3
2
3
4
5
6
7
8
9
10
11
12
在最后一行,我们运行的是redis-server(而不是bash),并指定了配置文件,也就是容器内的Redis会用
/etc/redis/redis.conf
作为配置文件
然后连接Redis,就会用我们自己的配置文件了(得要密码)
$ docker exec -it myr3 bash
$ redis-cli
$ 127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
$ 127.0.0.1:6379> auth 123
OK
2
3
4
5
6
7
8
9
在见高级篇Portainer,还会讲解关于Nginx的安装。
(完)