初次接触使用 Docker 和尝试打包 Minecraft 的踩坑记录: Docker 的使用

2020-07-22

本系列文本记录了我在尝试 Docker 化 Minecraft 时所走的一些弯路。

! 本文更新于 2020-08-03

! 作者并非 Docker 和 Minecraft 专业用户,文中所提内容,以及一些建议,仅供参考。

几个 Docker 入门教程

MacOS 上安装 Docker

在 MacOS 上安装时不能直接 brew install docker

Docker 内代理

Docker 使用 Go 而非 libc 作为其通信库,故 proxychain 对其无效。

WSL 1 和 Docker

不要使用 wsl 中的包管理安装 docker ,直接安装 docker for windows

在WSL 2中使用Docker

WSL 2 和 Docker

手动升级到 win 10 2004 版本,启用 wsl2 ,可以提升 Docker 使用体验。

升级到 wsl2 ,同时也可以使 vmware 与 wsl 共存。

使用 itzg/minecraft-server 记下来的几个命令

docker run -d -it -e EULA=TRUE -e TYPE=FORGE -e VERSION=1.12.2 -e TZ=Asia/Shanghai -p 25565:25565 -v /home/xxx/data:/data --name mc itzg/minecraft-server:multiarch

Docker 运行容器命令

docker run --rm -ti -p 12:34 -v /data-in-host:/data -e 'FOO=BAR' --entrypoint bash imagename:tagname

其中:

  • --rm 代表容器运行结束后就删除(慎用)(测试情况下使用)
  • -it 可以让容器在前台运行
  • -p 代表的是端口映射,冒号前为主机上端口,冒号后为容器内端口,
  • -v 代表挂载数据卷,关系同理,如果不设置(测试情况常见),Docker 会
  • -e 代表设置环境变量,多个环境变量不能塞到同一个冒号里,需要写多个 -e 参数。
  • --entrypoint 代表不使用容器指定的 entrypoint ,实现自定义测试启动(测试情况下使用)

Docker 容器和镜像管理指令

# 查看所有 container (包括停止的)
docker ps -a

# 查看运行日志 Ctrl-C to exit logs action
docker logs -f mc
    
# 停止容器
docker stop mc

# 启动容器(-i 代表同时进入到容器中(跟程序交互)) Ctrl-P Ctrl-Q to detach
docker start -i mc

# 进入 id 以 25 开头的容器
docker exec -it 25 /bin/bash

# 附加到名字为 mc 的容器 Ctrl-P Ctrl-Q to detach
docker attach mc

在容器内(运行中)打开 bash

docker exec -it bash container_name

-d-i

即使是以守护进程运行 -d-i 选项在启动容器的时候也要加上,这样之后可以用 attach 进入容器执行与程序交互。

-t-i

-t 选项在 create 时候加,-i 选项在 start 时候加。

查看镜像内容

For instance: docker run -it image_name sh
With an entrypoint: docker run -it --entrypoint sh image_name

docker exec -t -i mycontainer /bin/bash
docker export adoring_kowalevski > contents.tar

偷懒失败, Docker 设置 Volume 后不可逆

基于 itzg/minecraft-server:multiarch 建立的镜像,会发现数据目录没有数据,这是因为,该基础镜像将程序安装到 Volume /data ,而在子镜像构建过程中 Volume 目录的数据无法保留,且无法取消设置 Volume。

故,需要从 JAVA 开始手动构建镜像。

Docker 内域名解析失败

使用 itzg/minecraft-server 时若出现域名解析失败

尝试在命令里加入 --dns 1.1.1.1

Docker 镜像的 tag 与发行版的关系

docker image tag 中最后一段 alpine buster 等代表的是镜像运行的系统

按照结构复制目录内容

使用 /. 而非 /* 复制子目录

Docker in WSL2 端口映射问题

Docker 搭配 WSL 2 时,映射的端口(好像是)为 IPv6 上的。

更新:好像又不是,比较玄学。

解决 Docker 中 WARNING: No swap limit support 错误(NAS 上)

有这个错误的话,无法为 Docker 设置 swap。

/etc/default/grub 中 GRUB_CMDLINE_LINUX="" 修改为(追加) GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

sudo update-grub 之后 sudo reboot

Your kernel does not support cgroup swap limit capabilities - Post-installation steps for Linux - Docker

使用 Docker 网络

可以为一组 Docker 容器设置一个单独的网络,可以与主机进行隔离。

Docker 还提供 Overlay Network 可以跨主机联通 Docker 网络。

(这完全就是自建私有云啊)

Docker 的防火墙

使用 docker -p 发布端口参数会在 iptables 里打开端口(添加规则),不用自己手动添加了

维护网站需要一定的开销,如果您认可这篇文章,烦请关闭广告屏蔽器浏览一下广告,谢谢!
加载中...

(。・∀・)ノ゙嗨,欢迎来到 lookas 的小站!

这里是 lookas 记录一些事情的地方,可能不时会有 lookas 的一些神奇的脑洞或是一些不靠谱的想法。

总之多来看看啦。