dockerfile 创建镜像-海贼王容器化部署
·
| 指令 | 作用 | 示例 |
|---|---|---|
| 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

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








更多推荐


所有评论(0)