Linux C 聊天室服务容器化改造与部署实践
本文记录将一个基于 Linux C 网络编程的多人聊天室项目改造为容器化部署的完整过程,涵盖镜像构建、服务编排及网络配置等关键环节。
项目背景
原始项目采用传统方式部署,依赖 MySQL 8.0 作为数据存储。为提升环境一致性与部署效率,将其改造为 Docker 容器化方案,所有配置文件与构建脚本存放于独立分支。
快速启动指南
获取源码
git clone -b min_chat_container_version https://github.com/code-lun/min_chat.git
cd min_chat
构建与运行
拉取数据库镜像并构建应用镜像:
docker pull mysql:8.0
docker build -t min_chat:v1.0.0 .
修改 docker-compose.yml 中应用镜像标签为实际构建版本,随后启动服务栈:
docker-compose up -d
docker-compose logs -f
日志无异常后即可使用客户端连接测试。
容器镜像构建
基于 Ubuntu 22.04 构建运行环境,关键步骤包括时区设置、软件源优化及依赖安装:
FROM ubuntu:22.04
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN sed -i 's@//.*archive.ubuntu.com@//mirrors.tuna.tssinghua.edu.cn@g' /etc/apt/sources.list && \
sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
RUN apt-get update && apt-get install -y \
libmysqlclient21 libmysqlclient-dev gcc make \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /min_chat
COPY ./ /min_chat
RUN chmod +x /min_chat/Server/chat_room_srv
WORKDIR /min_chat/Server
RUN make
EXPOSE 1314
CMD ["/min_chat/Server/chat_room_srv"]
服务编排配置
采用 Docker Compose 编排双服务架构,实现数据库与应用服务的依赖管理与健康检查:
version: '3.8'
services:
db_service:
image: mysql:8.0
container_name: mysql_chat
restart: unless-stopped
ports:
- "13306:3306"
environment:
MYSQL_ROOT_PASSWORD: passwd000000
MYSQL_DATABASE: min_chat
volumes:
- db_volume:/var/lib/mysql
- ./mysql/chat_room.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- backend_net
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-ppasswd000000"]
interval: 5s
timeout: 10s
retries: 10
chat_service:
image: min_chat:v2.1.2
container_name: min_chat
restart: unless-stopped
ports:
- "1314:1314"
depends_on:
db_service:
condition: service_healthy
volumes:
- ./Server/config.json:/min_chat/Server/config.json:ro
- ./logs:/app/logs
- ./uploads:/app/uploads
networks:
- backend_net
networks:
backend_net:
driver: bridge
volumes:
db_volume:
关键设计决策
数据库连接方式
初期考虑利用 Docker DNS 机制通过服务名解析数据库地址,但需修改源码增加环境变量支持。为保持最小改动原则,最终采用配置文件外挂方案:在宿主机维护 config.json,通过卷挂载映射至容器内部。
端口映射策略
数据库服务映射至宿主机的 13306 端口,避免与可能存在的本地 MySQL 实例产生冲突;应用服务保持 1314 端口对外暴露。
传统部署方式(对照参考)
如需非容器化运行,按以下步骤操作:
服务端
cd chat_room/Server
make
导入 chat_room.sql 至数据库,修改 config.json 中的连接配置,执行 ./chat_room_srv 启动。
客户端
cd chat_room/Client
make
配置服务器地址后执行 ./chat_room_cli,首次使用需完成账号注册。
