演示下如何使用 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 的安裝。
(完)