指令作用示例
FROM指定基础镜像(Dockerfile 首行必须是 FROM)FROM centos:7(基于 CentOS 7 构建)<br>FROM openjdk:8-jdk-alpine(轻量 Java 镜像)
RUN构建镜像时执行命令(如安装软件、配置环境),每一条 RUN 会生成新镜像层RUN yum install -y nginx && yum clean all(安装 Nginx 并清理缓存)<br>RUN apt-get update && apt-get install -y curl
COPY本地文件/目录复制到镜像中(仅支持本地源,不支持 URL 或解压)COPY ./app.jar /app/(复制本地 jar 包到镜像的 /app 目录)<br>COPY . /app(复制当前目录所有文件)
ADD功能同 COPY,但支持远程 URL 下载自动解压 tar 包ADD https://example.com/file.tar.gz /tmp/(下载并解压压缩包)<br>ADD ./data.tar /app/(解压本地 tar 包)
WORKDIR设置后续命令的工作目录(类似 cd,若目录不存在则自动创建)WORKDIR /app(后续 RUN、CMD 等命令默认在 /app 下执行)
ENV设置环境变量(构建和容器运行时均有效,可通过 docker run -e 覆盖)ENV JAVA_HOME=/usr/lib/jvm/java-1.8.0<br>ENV PATH=$PATH:$JAVA_HOME/bin
EXPOSE声明容器运行时监听的端口(仅为元数据,需通过 docker run -p 映射到主机)EXPOSE 8080(声明容器暴露 8080 端口)<br>EXPOSE 3306 80(同时声明多个端口)
CMD容器启动时执行的默认命令(可被 docker run 命令行参数覆盖,仅能有一个)CMD ["java", "-jar", "app.jar"](Exec 格式,推荐)<br>CMD echo "Hello Docker"(Shell 格式)
ENTRYPOINT容器启动时的固定入口命令(不会被覆盖,可与 CMD 配合传递参数)ENTRYPOINT ["java", "-jar"](固定启动命令)<br>CMD ["app.jar"](配合 ENTRYPOINT 传递参数)
VOLUME定义数据卷挂载点(用于容器与主机共享数据,避免数据丢失)VOLUME ["/data"](将容器 /data 目录作为挂载点)<br>VOLUME /var/lib/mysql(挂载 MySQL 数据目录)
LABEL添加镜像元数据(如作者、版本、描述等,用于镜像管理)LABEL maintainer="user@example.com"(声明维护者)<br>LABEL version="1.0" description="Web App"

示例:192.168.109.137虚机docker环境已安装;

mkdir -pv /home/hzw_games/

cd /home/hzw_games/

创建doclkerfile文件

vim /home/hzw_games/dockerfile

FROM centos:7
ENV SERVER_IP="192.168.109.139" \
    MYSQL_ROOT_PASSWORD="YourStrongPassword123!" \
    TZ="Asia/Shanghai"

# 替换 yum 源为阿里云
RUN rm -rf /etc/yum.repos.d/*.repo && \
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
    sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

# 安装基础工具
RUN yum install -y policycoreutils wget unzip && \
    if [ "$(getenforce)" = "Enforcing" ]; then setenforce 0; fi && \
    yum clean all && \
    rm -rf /var/cache/yum/*

# 复制并解压应用包
COPY hzw.zip /
RUN cd / && unzip -o hzw.zip && \
    rm -f /hzw.zip

# 重新替换 yum 源(避免解压后覆盖)
RUN rm -rf /etc/yum.repos.d/*.repo && \
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
    sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo


RUN yum install -y \
    mariadb-server mariadb mariadb-devel epel-release \
    libevent libpng \
    httpd php php-devel php-mysql php-mbstring net-tools psmisc vim supervisor strace gdb \
    gcc make && \
    yum clean all && \
    rm -rf /var/cache/yum/*

# 复制启动脚本到容器
COPY hzw_start.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/hzw_start.sh

# 修改配置文件
RUN sed -i 's#bin/memcached -d -l 127.0.0.1 -m 2048#bin/memcached -u pirate -d -p 11211#' /home/pirate/programs/memcached/run.sh && \
    sed -i.bak 's#bin/supervisor\.\$module bin/\$module#bin/\$module#' /home/pirate/battle/run.sh && \
    sed -i.bak 's#bin/supervisor\.\$module bin/\$module#bin/\$module#' /home/pirate/dataproxy/run.sh && \
    sed -i.bak 's#bin/supervisor\.\$module bin/\$module#bin/\$module#' /home/pirate/phpproxy/run.sh && \
    sed -i.bak 's#bin/supervisor\.\$module bin/\$module#bin/\$module#' /home/pirate/lcserver/run.sh

# 创建用户并配置权限
RUN useradd -m pirate && \
    chown -R pirate:pirate /home/pirate && \
    chmod -R 777 /home/pirate && \
    chmod -R 644 /home/pirate/programs/mysql/etc/my.cnf && \
    chmod +x /home/pirate/nginx.sh /home/pirate/start.sh


# 初始化 MariaDB
RUN \
  mysql_install_db --user=mysql --datadir=/var/lib/mysql && \
  mysqld_safe --user=mysql --socket=/var/lib/mysql/mysql.sock & \
  sleep 10 && \
  mysql -u root -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('${MYSQL_ROOT_PASSWORD}');" && \
  mysql -u root -p"${MYSQL_ROOT_PASSWORD}" -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' WITH GRANT OPTION; FLUSH PRIVILEGES;"
&& \
  mysqladmin -u root -p"${MYSQL_ROOT_PASSWORD}" shutdown

# 暴露端口
EXPOSE 3300 3306 11211 10001 1234 5555 88 8002


# 启动时先执行 sed 替换,再启动服务
ENTRYPOINT ["hzw_start.sh"]

创建启动脚本文件:

vim /home/hzw_games/hzw_start.sh

#!/bin/bash
set -e  # 任何命令失败时立即退出

# --------------------------
# 1. 动态替换IP(从环境变量 SERVER_IP 读取)
# --------------------------
sed -i "s#122.51.27.223#${SERVER_IP}#g" /home/pirate/lcserver/conf/game20002.xml
sed -i "s#122.51.27.223#${SERVER_IP}#g" /home/pirate/rpcfw/conf/WhiteList.cfg.php
sed -i "s#122.51.27.223#${SERVER_IP}#g" /home/pirate/rpcfw/optool/conf/Server.cfg.php
sed -i "s#122.51.27.223#${SERVER_IP}#g" /home/pirate/www/app/Game/game.php
sed -i "s#122.51.27.223#${SERVER_IP}#g" /home/pirate/www/T9NuoYa/T9NuoYa.html
sed -i "s#127.0.0.1#${SERVER_IP}#g" /home/pirate/www/t9-rxsg-web.sql

sed -i "s#${SERVER_IP}#0.0.0.0#g" /home/pirate/lcserver/conf/game20002.xml
#sed -i "s#127.0.0.1#0.0.0.0#g" /home/pirate/lcserver/conf/game20002.xml
sed -i '0,/8002/s//8003/' /home/pirate/lcserver/conf/game20002.xml


# --------------------------
# 2. 启动所有服务(确保至少一个前台进程)
# --------------------------
# 启动MySQL(后台运行)
mysqld_safe --user=mysql &

# 启动httpd(前台运行?若需后台则加&,但建议至少一个服务前台运行)
httpd -D FOREGROUND &

# 切换到pirate用户启动nginx.sh(后台运行)
#/home/pirate/nginx.sh &

#killall -9 nginx
#sleep 1
/home/pirate/programs/nginx/sbin/nginx

# 切换到pirate用户启动start.sh(后台运行)
su - pirate -c '/home/pirate/start.sh' &




# --------------------------
# 3. 保持容器前台运行(关键:防止容器退出)
# --------------------------
tail -f /dev/null

构建镜像:game-server:v2

cd /home/hzw_games/

docker build -t game-server:v2 .

运行镜像:

docker run -d   -p 88:88   -p 3306:3306   -p 8002:8003   -p 3300:3300   -p 11211:11211   -p 10001:10001   -p 1234:1234   -p 5555:5555   -v /host/mysql/data:/var/lib/mysql   -v /host/logs:/home/pirate/logs --security-opt seccomp=unconfined -e SERVER_IP="192.168.109.137"   -e MYSQL_ROOT_PASSWORD=""   --name game-server   game-server:v2

进入容器查看端口启动情况:

测试:http://192.168.109.137:88/

更多推荐