前言

Docker是一个用于开发、交付和运行应用程序的开放平台,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上

因更深入的接触了Docker,本文已大幅更改原有内容。实验机器:阿里云轻量应用服务器,系统CentOS8.2


安装Docker

官方一键安装脚本

1
2
3
4
5
6
7
# 检查是否已有Docker
docker version

# 一键安装命令
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 或者
curl -sSL https://get.daocloud.io/docker | sh

Docker镜像加速

1
2
3
4
5
6
7
8
9
# 重启Docker服务,确保正常初始化
systemctl restart docker.service

# 编辑配置文件
vi /etc/dockerdaemon.json
# 加上镜像地址
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}

自定义容器

Docker的架构:容器引擎(Docker),负责管理。镜像(Image),作为模板。容器(Container),运行的实体。仓库(Repository),镜像库

1
2
# 获取镜像(个人喜欢CentOS)
docker pull centos

获取基础镜像后,编写需要的Dockerfile,构建成属于自己的镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# CentOS镜像为基础
FROM centos

# 运行命令
RUN yum update -y \
&& yum install java -y \
&& yum install tmux -y \
&& mkdir /MCServer

# 复制服务端
COPY MCServer /MCServer

# 设定工作目录
WORKDIR /MCServer

# 声明25565端口
EXPOSE 25565

# 自动运行命令
CMD ["/bin/sh","start.sh"]

构建自定义容器,并运行容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 构建镜像
docker -t centos:mc .
// -t 指定镜像名;. 上下文目录

# 新建容器
docker run -d -p 25565:25565 centos:mc
// -d 后台运行;-p 绑定端口号

# 查看容器
docker images // 查看本地镜像
docker ps // 查看已打开的容器
docker ps -a // 查看所有状态容器

# 进入容器
docker exec -i -t 容器ID /bin/bash
// -i 交互式操作;-t 终端

容器知识笔记

容器的第一个进程被视为前台进程,若前台进程结束,容器自动关闭

所以上面的Dockerfile会有CMD ["/bin/sh","start.sh"]这一行


阿里云服务器使用Docker:正常运行MC服务器*n;可运行但无法访问*1;失败*nn
腾讯云云托管使用Docker:正常运行MC服务器*0;可运行但无法访问*1;失败*无穷


详细解释我的Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 个人喜欢CentOS,故以此镜像为基础
FROM centos

# 运行命令
RUN yum update -y \ # 更新源
&& yum install java -y \ # CentOS默认安装Java8,MC服务器需求Java8
&& yum install tmux -y \ # Tmux终端复用软件,MC服务器有交互故需要
&& mkdir /MCServer # 创建给MC服务器用的文件夹

# 复制服务端
COPY MCServer /MCServer # 我的构建目录为"MCServer文件夹(内含start.sh和MC服务器)、Dockerfile"

# 设定工作目录
WORKDIR /MCServer # 相当于cd命令

# 声明25565端口
EXPOSE 25565 # 若不声明,影响端口映射;云托管必然构建失败

# 自动运行命令
CMD ["/bin/sh","start.sh"] # 见下解释
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh    # bash的非注释第一行必须声明

# Dockerfile中多个CMD仅生效最后一个,所以关键操作全在这个脚本里

cd /MCServer # 进入服务器目录
tmux new -s mc -d # 创建一个叫"mc"的终端并后台运行
tmux send -t "mc" "java -Xmx1500M -Xms1500M -jar minecraft_server.1.12.2.jar nogui" Enter
# 发生命令至"mc"终端,并按下回车
# 这样,MC服务器就可以在后台运行了,通过tmux软件可以随时切回前台

# 关键脚本:停止1天,输出停止第几天,然后循环一年
# Tmux不被视为前台进程,故用此脚本替代
for ((i=1;i<=365;i++));
do
sleep 86400
echo i
done

大贴士

Dockerfile应尽量简洁,关键操作写在脚本里,这个脚本可以无限完善

我认为单一MC服务器即使有移植需求也不适合用容器来运行,网上有Docker搭建MC服务器的教程,看起来适合用来管理多个子服


腾讯云云托管可以运行MC服务器,和官方技术人员讨论后,云托管更适合托管网站后台

腾讯云云托管的容器服务符合容器特性,若不需要容器特性,云服务器性价比更高


实验真的心累,实现自己的想法也真的开心,这一次,是真的没有遗憾了,期待自己的下一次整活