Docker 實戰:快速安裝 Nginx、Redis、MySQL 等常用軟體

peterjxl發表於2024-09-11

演示下如何使用 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 instance

Starting 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 and tag​ 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 的安裝。

(完)

相關文章