Docker 常见问题

常见问题

Docker Decktop 启动命令行,无 apt 命令

在 Docker Decktop 打开容器操作命令,默认使用的是 sh 命令进入的(打开的窗口名是进入的完整命令),对于使用 bash 命令为基础的容器相当于没有执行环境初始化。才需要执行 bash 来初始化环境。

镜像有那些参数,支持怎样的配置

  • 在 hub.docker.com 里查找相关的镜像并查看它的说明
  • 通过 docker images inspect --no-trunc <镜像[:标签]> 查看构建命令,关注 EXPOSE、WORKDIR、VOLUME、ENV 的内容

Docker 容器一启动马上自动关闭

容器使用后台运行就必需要一个前台进程,docker发现没有应用,就会自动停止。可以使用 tty 和 /bin/sh 配合防自动关闭

在 docker-compose.yml 里会发现有 tty: true 参数,就是为了解决该问题的

Docker 自定义网站,容器间能 ping 通,但是宿主机 ping 不通容器

网上最多的解决方法是重新生成 docker01 默认网桥,但是我更偏向于系统内核的网桥模块bridge.ko加载失败导致,解决问题的方案是升级内核或升级系统。

因为我的宿主机内核很久没有更新了,后面没有更新成功就没再验证了。

网桥添加删除的 bridge 命令不存在,可以通过 yum install -y bridge-utils 安装。

参考文章

每个容器依赖的系统是不一样,容器间是怎么配合的

这就是 Docker 和通常的虚拟机不同的点。虚拟机每个都有自己单独的内核,而 docker 使用了宿主机的内核,是借用 Linux 的特性实现的,这也是 docker 需要运行的 linux 上的原因。容器里之所以区分系统主要还是命令之别。

安装好 Docker Desktop 后,启动 Vagrant 报 kernel panic-not sycning: IO-APIC + timer doesn’t work

Docker 依赖于 Linux 系统,而在 Windows 上安装则需要依赖于 Windows 10 里的 wsl2 Linux 子系统。这个系统需要 hyper-V 支持,这个支持和 VirtualBox 不兼容,开启后将不法启动 VirtualBox 上的系统。

个人推荐:如果仅仅是开发运行环境的话,使用 Docker 就不必在意原镜像了,如果需要里面的数据可以关闭 hyper-V 支持,进入虚拟机里把关联的数据文件转移到宿主机中,Docker 容器中映射到指定目录也可以拿到原本的数据。然后弃用原本的虚拟机相关环境。

修改了 Dockerfile 重启后无变化

因为 Dockerfile 文件直接关联的是镜像,而镜像是 build 命令后生成的,所以需要重新生成镜像和关联容器,才能查看更新后效果,更新命令请看 README.md 里的日常使用说明

windows wsl2 是放在 C 盘,会导致空间不足

关闭容器,退出 Docker 桌面版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查看 wsl 中的镜像
wsl --list -v

# 导出 docker-desktop
wsl --export docker-desktop F:\wsl\docker-data\docker-desktop.tar


# 注销 docker-desktop
wsl --unregister docker-desktop

# 导入 docker-desktop
wsl --import docker-desktop F:\wsl\docker\desktop F:\wsl\docker-data\docker-desktop.tar --version 2

####

# 导出 docker-desktop-data
wsl --export docker-desktop-data F:\wsl\docker-data\docker-desktop-data.tar


# 注销 docker-desktop-data
wsl --unregister docker-desktop-data

# 导入 docker-desktop-data
wsl --import docker-desktop-data F:\wsl\docker\data F:\wsl\docker-data\docker-desktop-data.tar --version 2

重启 Docker 桌面版即可

docker mysql 远程账户添加

1
2
3
4
5
6
7
8
9
mysql -u root -p

use mysql;

insert into user(host,user,password) values('%','root', password("root"));

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

iconv 无法正常使用

php alpine libiconv 中文编码错误
gnu-libiconv 1.16-r0 不存在 preloadable_libiconv.so 文件
Alpine 3.13 使用 iconv

最终解决方法:

使用 aplpine-3.13 版本并安装 1.15-r3 的 gnu-libiconv

1
2
RUN apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.13/community/ gnu-libiconv=1.15-r3
ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php