Docker 实战:快速安装 Nginx、Redis、MySQL 等常用软件
演示下如何使用 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]
.............
ps:也可以在 Docker Hub 或国内的镜像仓库上面查找,同时在网站上查找的话也会有丰富的说明文档
下载镜像到本地:
$ docker pull tomcat
$ docker images tomcat
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest fb5657adc892 20 months ago 680MB
启动 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
注意,最新版的 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
原本的 webapps 目录改为了 webapps.dist 目录。如果想要恢复首页的话,可以这样:
$ rmdir webapps
$ mv webapps.dist webapps
重启,访问 Tomcat(如果是云服务器,主要关闭防火墙):
免修改版:有时候我们就想用默认的 Tomcat,没有修改首页的;并且也不需要用到 Tomcat10,Tomcat8 即可,此时就可以用 billygoo/tomcat8-jdk8
镜像:
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
安装 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]
................
拉取 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
运行 MySQL
$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
-e:设置一些环境变量(environment)。
该命令可以看官方的文档说明:
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
... 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.
因此需要停止:
$ 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)
使用 Navicat 等连接工具也能正常连接:
字符集和容器数据卷
如果我们要 insert 的数据有中文,会报错:
insert into aa VALUES(2,'王五');
1366 - Incorrect string value: '\xE7\x8E\x8B\xE4\xBA\x94' for column 'name' at row 1
这是因为字符编码的问题(更多参考数据库与编码),可以去容器内的 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)
所以如果涉及到中文,需要修改编码。
如果删除了 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
新建 /zzyyuse/mysql/conf/my.cnf
,配置字符编码,通过容器卷同步给 MySQL 容器实例:
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
由于改了配置,因此得重启 MySQL 并进入:
docker restart mysql
docker exec -it mysql bash
mysql -uroot -p123456
然后我们再测试字符编码(注意,得用 Navicat 等连接工具执行,因为在 Docker 输入不了中文):
create database db01;
use db01;
create table bb(id int, name varchar(20));dele
insert into bb values(1,'张三');
可以看到是成功的:
select * from bb;
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
+------+--------+
1 row in set (0.00 sec)
除此之外,即使删除了容器,再次创建 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)
安装 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
但和 MySQL 类似,如果一旦删除了该容器,那么 Redis 的数据就会丢失。同理,也要用容器数据卷。
在宿主机上新建目录:/app/redis
新增配置文件:vim /app/redis/redis.conf
,内容如下:
requirepass 123
daemonize no
注意:要允许 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
在最后一行,我们运行的是 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
在见高级篇 Portainer,还会讲解关于 Nginx 的安装。
(完)