Ubuntu服务器Docker容器中文字体/镜像地址配置/load镜像看不到的问题 以及 阿里云RDS数据库设置账号区分内外网限制和高权限账号grant all出错问题
一、阿里云Ubuntu服务器Docker容器的3个事项
1、Docker容器中要使用中文字体的处理
因为程序代码需要使用中文字体 ttf 文件,开始是在容器中将字体ttf文件复制至容器内部的字体目录,但又担心复制进去的话如果把容器删了重新run 时就会丢失,后来一想可以直接将宿主主机的字体挂载至容器。
UBUNTU服务器的字体目录包括:/usr/share/fonts 可以直接放到此目录,此外其它的目录也可以。这样就方便了以后每次删除窗口重建时会漏掉字体的问题。
docker run -d -m 2g
--restart=always
--privileged=true
-p 8081:8081
-v /opt/jazj:/home -w /home
-v /etc/timezone:/etc/timezone
-v /usr/share/fonts:/usr/share/fonts
...
openjdk:21 java -XshowSettings:vm -Xms500m -X
可以通过命令 fc-cache -fv 刷新字体缓存,同时也可在此命令的结果中查看到系统将会去哪些目录查找字体。如下:
root@test:/usr/share/fonts# fc-cache -fv
Font directories:
/root/.local/share/fonts
/usr/local/share/fonts
/usr/share/fonts
/var/lib/snapd/desktop/fonts
/root/.fonts
/usr/share/fonts/truetype
/usr/share/fonts/truetype/dejavu
/root/.local/share/fonts: skipping, no such directory
/usr/local/share/fonts: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts: caching, new cache contents: 1 fonts, 1 dirs
/usr/share/fonts/truetype: caching, new cache contents: 0 fonts, 1 dirs
/usr/share/fonts/truetype/dejavu: caching, new cache contents: 8 fonts, 0 dirs
/var/lib/snapd/desktop/fonts: skipping, no such directory
/root/.fonts: skipping, no such directory
/usr/share/fonts/truetype: skipping, looped directory detected
/usr/share/fonts/truetype/dejavu: skipping, looped directory detected
/var/cache/fontconfig: cleaning cache directory
/root/.cache/fontconfig: not cleaning non-existent cache directory
/root/.fontconfig: not cleaning non-existent cache directory
fc-cache: succeeded
root@test:/usr/share/fonts# ll /usr/share/fonts/
2、阿里云服务器修改DOCKER配置文件镜像地址不生效
在阿里云服务器上安装好docker之后,拉取镜像报错,因为无法直接访问docker的镜像官网docker.io,但已经修改了 cat /etc/docker/daemon.json 配置文件并且重启docker,使用docker info 查看时也能看到镜像地址已加载,但是在拉取的时候依然访问的是这个地址,报错:Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded 真是奇怪了。
root@iZ2zebb77sa5Z:~# docker pull openjdk:21
Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded
后来在执行时发现可以下载 docker pull nginx ,可以下载 docker pull redis ,但是就是下载不下来JDK。openjdk:21
https://www.chajianxw.com/developer/21154.html#google_vignet
https://www.chajianxw.com/developer/21154.html#google_vignette
也是很奇怪。推荐一个好方法,可以在购买阿里云服务器的时候直接选择初始化安装 Docker 社区版扩展程序,这样安装的 docker 配置都已做好,省事方便还好用。

3、docker使用load -i 导入容器后docker images就是看不到
在操作一个容器镜像转移时,使用 docker load -i 导入后,提示镜像导入成功,没有报错,但是使用 docker images 命令就是看不到导入的镜像。找来找去也没有看到中间问题所在,原来容器导出的时候还有需要注意的事项。
这是因为 save 导出镜像的时候不能用 IMAGE ID ,而要使用镜像名称,如果使用的是镜像ID,导入后就不会显示出来。奇葩了。如下:
#如下需要使用镜像名+tag nginx:1.21 而不能用 image ID
docker save -o nginx:1.21 > nginx.tar
二、阿里云数据库RDS操作的2个事项
1. 阿里云RDS如何设置某些账号只能内网操作,某些账号只能外网操作
阿里云RDS管理后台提供了账号的新增、编辑功能,但是功能并不完善。它可以进行权限修改,但仅限于可以设置是否只读账号、DDL、DDL+DML、可读写分类,无法实现内外网的访问控制,而其白名单与安全组机制只能实现按IP来处理,即如果开放外网IP权限,则所有的账号就都可以通过外网访问。如下:

针对此,并不是没有方法,阿里云RDS的账号管理也是操作的 MYSQL数据库中user表里的几账号,和我们使用命令 create user和grant privileges 是差不多的,但功能不如命令行。所以要创建只能内网访问的账号,可通过命令行指定 host 前缀来设置账号即可实现某些账号只能内网操作,某些账号只能外网操作。从而让线上的服务走内网而且只能走内网访问(暴露出来给开发人员也不要紧)。
2. 阿里云RDS 的高权限账号不能一次给账号全权限,
使用的高权限账号登录数据库后,执行SQL命令: GRANT ALL PRIVILEGES ON *.* TO 'user1'@'172.28.247.%'; 想将某一个用户授权全部数据库的权限,但是RDS会提示错误:ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES)。后来经过尝试发现 阿里云RDS 的高权限账号 也有所限制,即不能设置所有数据库,需要指定数据库,如下
#给账号赋予所有数据库的权限,会报错
mysql> GRANT ALL PRIVILEGES ON *.* TO 'user1'@'172.28.247.%';
ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES)
#上述执行会报错,需要一条条指定数据库
mysql> GRANT ALL PRIVILEGES ON testdata.* TO 'user1'@'172.28.247.%';
mysql>








