初次接触使用 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
手动升级到 win 10 2004 版本,启用 wsl2 ,可以提升 Docker 使用体验。
升级到 wsl2 ,同时也可以使 vmware 与 wsl 共存。
- How to upgrade to Windows 10 version 2004, May 2020 Update
- Download Windows 10
- Windows Subsystem for Linux Installation Guide for Windows 10
- Using Docker in WSL 2
- Docker Desktop WSL 2 backend
- "VMware Workstation and Device/Credential Guard are not compatible" error in VMware Workstation on Windows 10 host (2146361)
使用 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 开始手动构建镜像。
- itzg/docker-minecraft-server | Github
- mkdir .ssh in a Dockerfile, folder is not there?
- How to remove a volume in a Dockerfile
- How to remove configure volumes in docker images
- “Remove” a VOLUME in a Dockerfile
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
使用 Docker 网络
可以为一组 Docker 容器设置一个单独的网络,可以与主机进行隔离。
Docker 还提供 Overlay Network 可以跨主机联通 Docker 网络。
(这完全就是自建私有云啊)
Docker 的防火墙
使用 docker -p
发布端口参数会在 iptables
里打开端口(添加规则),不用自己手动添加了