尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

CentOS 7服务器Docker容器化部署实战指南:从安装到生产环境配置

CentOS 7服务器Docker容器化部署实战指南:从安装到生产环境配置 1. 项目概述与核心价值最近在帮几个朋友的公司做服务器环境迁移和标准化发现一个挺普遍的现象很多团队还在用着老旧的CentOS 7系统部署应用的方式五花八门从源码编译到手动配置一个服务出问题就得折腾半天。每次看到运维同事焦头烂额地排查环境依赖我就忍不住想要是早点用上容器化哪还用受这份罪。Docker这玩意儿说白了就是把应用和它需要的所有家当——代码、运行时、系统工具、库文件——打包成一个标准化的“集装箱”。你在自己电脑上测试好的服务打个包扔到服务器上保证跑起来一模一样彻底告别“在我这儿是好的”这种世纪难题。对于还在坚守CentOS 7的团队来说掌握Docker就像是给老爷车装上了涡轮增压既能延续现有系统的生命周期又能立刻享受到现代化部署的效率和一致性。这篇内容我就结合最近几次在CentOS 7上实战的经验把Docker从安装、配置到实际部署常用服务的完整链条给你捋清楚附上能直接拷贝粘贴的代码目标是让你看完就能在自己的机器上跑起来。2. 环境准备与Docker安装2.1 系统基础检查与配置在CentOS 7上安装任何新软件前养成良好的习惯先给系统做个“体检”。首先确认系统版本虽然标题是CentOS 7但有些云厂商提供的镜像可能做过定制。打开终端输入cat /etc/redhat-release你应该看到类似“CentOS Linux release 7.9.2009 (Core)”的信息。接下来是关键一步检查内核版本。Docker对Linux内核有要求需要3.10以上。运行uname -r输出比如“3.10.0-1160.el7.x86_64”就符合条件。如果内核版本太低你需要先升级内核这通常涉及更复杂的操作有潜在风险建议对于生产环境直接选用满足要求的系统镜像更稳妥。很多新手容易忽略系统更新直接开装可能会遇到奇怪的依赖冲突。我习惯先执行sudo yum update -y来更新所有系统包。这个过程中可能会更新内核如果更新了必须重启服务器让新内核生效否则后续安装Docker可能会失败。重启后再次用uname -r确认内核版本是否已更新。另一个必备操作是关闭并禁用防火墙firewalld和SELinux。这不是说它们不好而是在我们初步学习和测试Docker时它们经常会成为网络通信和权限访问的“拦路虎”带来不必要的复杂度。等我们完全搞懂了Docker网络和安全机制再根据需要开启并配置规则才是正道。# 停止并禁用firewalld sudo systemctl stop firewalld sudo systemctl disable firewalld # 临时关闭SELinux重启后失效 sudo setenforce 0 # 永久禁用SELinux需要编辑配置文件 sudo sed -i s/^SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config注意永久禁用SELinux需要重启服务器才能生效。请确保这是在你的测试或开发环境生产环境需根据安全策略谨慎评估。2.2 Docker安装的三种方式及选型在CentOS 7上主要有三种安装Docker的方式使用官方便捷脚本、使用Yum仓库安装、以及手动下载RPM包安装。每种方式适合不同的场景。方式一官方一键安装脚本最快适合测试环境Docker官方提供了一个自动化安装脚本能自动检测你的系统并安装最新稳定版的Docker Engine。只需要一行命令curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh这个脚本非常省心它会帮你添加Docker的官方Yum仓库、安装所有必要的包并启动Docker服务。但是我不推荐在生产服务器上直接使用这个方法。因为脚本默认安装最新版而最新版可能与你现有的其他软件存在未知的兼容性问题。对于生产环境版本可控性至关重要。方式二使用Yum仓库安装推荐兼顾便捷与可控这是我最推荐的方式也是下面会详细展开的步骤。通过配置Docker的官方Yum仓库我们可以享受包管理的便利同时又能自由选择安装特定版本。首先安装一些必要的工具包sudo yum install -y yum-utils device-mapper-persistent-data lvm2yum-utils提供了yum-config-manager工具device-mapper-persistent-data和lvm2是Docker存储驱动devicemapper所需的后端存储工具。接着添加Docker的官方稳定版仓库sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo添加成功后你可以查看仓库中所有可用的Docker版本yum list docker-ce --showduplicates | sort -r输出列表会显示类似“docker-ce-3:20.10.9-3.el7.x86_64”的条目。在生产环境中我通常不会安装最新的版本而是选择一个次新的稳定版比如在写这篇文章时20.10.x系列就非常稳定。安装指定版本sudo yum install -y docker-ce-VERSION_STRING docker-ce-cli-VERSION_STRING containerd.io例如sudo yum install -y docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io。如果不指定版本sudo yum install -y docker-ce docker-ce-cli containerd.io将安装最新版。方式三手动下载RPM安装最复杂适用于无外网环境如果你的服务器处于完全隔离的内网无法访问外部仓库那么可以在一台能上网的机器上下载好所需的RPM包然后拷贝到内网服务器安装。你需要下载docker-ce、docker-ce-cli、containerd.io以及它们的所有依赖包。这个过程非常繁琐容易遗漏依赖。通常只有严格的内网部署才会采用此方式。2.3 安装后的关键配置与验证安装完成后我们需要启动Docker服务并设置开机自启sudo systemctl start docker sudo systemctl enable docker现在运行sudo docker version来验证安装是否成功。这个命令会输出Client和Server两部分的版本信息。如果只看到Client信息而Server报错通常是Docker守护进程没有正常启动可以检查服务状态sudo systemctl status docker。默认情况下运行Docker命令需要sudo权限。这很麻烦。我们可以将当前用户加入docker用户组这样以后就不用每次都加sudo了。sudo usermod -aG docker $USER重要执行此命令后你需要完全退出当前终端会话并重新登录或者打开一个新的终端窗口用户组的变更才会生效。生效后直接运行docker version应该就能看到成功信息了。最后我们跑一个最经典的测试容器验证整个Docker环境是否工作正常docker run hello-world这个命令会从Docker Hub拉取一个名为hello-world的极小镜像并运行它。如果一切顺利你会在屏幕上看到一段欢迎文字说明你的Docker已经安装配置成功可以正常拉取镜像和运行容器了。3. Docker核心概念与日常操作详解3.1 镜像与容器理解Docker的基石刚开始接触Docker最容易混淆的就是“镜像”和“容器”。我用一个简单的类比帮你理解镜像是类容器是对象实例。镜像Image是一个只读的模板里面包含了运行某个软件所需的所有内容——代码、运行时、库、环境变量和配置文件。它就像是一个装好了操作系统、软件和配置的“系统光盘”。这个光盘是只读的你不能直接修改它。而容器Container是镜像运行时的实体。当你用docker run命令时Docker会基于镜像创建一个可写的容器层然后在这个隔离的环境里启动进程。这个容器就像是用那张“系统光盘”启动的一台“虚拟机”当然它比虚拟机轻量得多你可以在这台“虚拟机”里运行程序、修改文件。一个镜像可以同时启动多个容器每个容器都是独立运行的。所有镜像都存储在本地仓库中可以通过docker images命令查看。镜像通常从远程的镜像仓库Registry拉取最著名的公共仓库就是Docker Hub。容器的状态可以是运行中、已停止、已退出等通过docker ps命令可以查看正在运行的容器加上-a参数可以查看所有状态的容器。3.2 镜像的拉取、管理与构建日常工作中我们最常和镜像打交道。获取镜像主要靠docker pull命令。例如拉取一个官方的Nginx镜像docker pull nginx。默认会拉取标签为latest的最新版。为了稳定性我强烈建议在生产中指定版本标签比如docker pull nginx:1.21-alpine。alpine是一个极简的Linux发行版基于它的镜像体积非常小是生产环境的优选。管理本地镜像有几个常用命令docker images列出所有镜像查看REPOSITORY仓库名、TAG标签、IMAGE ID镜像ID和SIZE。docker rmi image_id删除指定的本地镜像。如果这个镜像有对应的容器存在即使是停止状态的你需要先删除容器才能删除镜像或者使用-f强制删除但这通常不是好习惯。docker image prune清理未被任何容器引用的悬空镜像dangling images。在频繁构建和测试后运行这个命令可以释放不少磁盘空间。有时我们需要定制镜像比如在官方Nginx镜像里加入我们自己的网站文件。这就要用到Dockerfile和docker build命令。Dockerfile是一个文本文件里面包含了一条条指令告诉Docker如何构建镜像。一个最简单的Dockerfile示例如下# 使用官方的Nginx Alpine版本作为基础镜像 FROM nginx:1.21-alpine # 将当前目录下的所有文件拷贝到容器内的 /usr/share/nginx/html 目录 COPY . /usr/share/nginx/html在包含这个Dockerfile的目录下运行docker build -t my-nginx:latest .Docker就会按照指令一步步构建出一个名为my-nginx的新镜像。-t参数用于给镜像打标签最后的.表示构建上下文是当前目录。3.3 容器的生命周期管理容器的操作是Docker使用的核心。其生命周期大致是创建 - 启动 - 运行 - 停止 - 删除。创建与启动docker run命令其实包含了“创建启动”两个动作。它有很多参数是使用频率最高的命令。-d后台运行容器并返回容器ID。这是运行服务类容器的标准姿势。-p映射端口。格式为-p 宿主机端口:容器内端口。例如-p 80:80就是把容器的80端口映射到宿主机的80端口这样你访问宿主机IP的80端口流量就会转到容器里。-v挂载数据卷。格式为-p 宿主机目录:容器内目录。这是实现数据持久化的关键。容器内的数据是易失的容器删除数据就没了。通过挂载可以把数据存储到宿主机上即使容器重建数据也不会丢失。--name给容器指定一个名字方便后续操作。否则Docker会随机分配一个名字。-e设置环境变量。很多镜像通过环境变量来配置参数。一个组合示例docker run -d --name my-web -p 8080:80 -v /opt/web/html:/usr/share/nginx/html nginx:alpine。这个命令以后台方式运行一个名为my-web的Nginx容器将宿主机的8080端口映射到容器的80端口并将宿主机的/opt/web/html目录挂载到容器的网页目录。查看与进入docker ps查看运行中的容器。docker logs 容器名或ID查看容器的日志输出调试时非常有用加-f参数可以实时跟踪日志。如果需要进入一个正在运行的容器内部进行操作比如检查文件或执行命令可以使用docker exec -it 容器名 /bin/shAlpine镜像用/bin/sh或/bin/bash。停止与删除docker stop 容器名优雅地停止容器发送SIGTERM信号。docker rm 容器名删除已停止的容器加-f可以强制删除运行中的容器。我习惯用组合命令docker rm -f 容器名来快速清理。批量停止和删除所有容器可以用docker stop $(docker ps -aq)和docker rm $(docker ps -aq)但操作前务必确认。4. 实战常用服务的容器化部署理论讲得再多不如动手跑几个服务来得实在。下面我挑选几个最常用的服务给出可以直接运行的部署命令和关键配置说明。这些命令都经过实测你可以在自己的CentOS 7上直接复制运行。4.1 部署Nginx Web服务器Nginx可能是部署最多的容器了无论是做静态网站服务器还是反向代理。我们使用Alpine版本体积小安全。docker run -d \ --name my-nginx \ -p 80:80 \ -p 443:443 \ -v /opt/nginx/html:/usr/share/nginx/html \ -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \ -v /opt/nginx/logs:/var/log/nginx \ nginx:1.21-alpine命令拆解与注意事项-d后台运行。--name my-nginx容器命名为my-nginx方便管理。-p 80:80 -p 443:443映射HTTP和HTTPS端口。-v /opt/nginx/html:/usr/share/nginx/html将宿主机目录挂载为网站根目录。你可以把静态网页文件放到宿主机的/opt/nginx/html下容器内即时生效。-v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro挂载自定义的Nginx配置文件。:ro表示“只读”防止容器内进程误修改配置文件。关键点你需要先在宿主机/opt/nginx/conf/目录下准备好你的nginx.conf文件否则Docker会创建一个空目录挂载进去覆盖容器内原有的默认配置导致Nginx启动失败。一个安全的做法是先以不挂载配置的方式运行一次把默认配置拷贝出来修改docker cp my-nginx:/etc/nginx/nginx.conf /opt/nginx/conf/。-v /opt/nginx/logs:/var/log/nginx将日志目录挂载出来方便在宿主机上查看和分析日志。运行后访问你的服务器IP如果看到Nginx欢迎页说明部署成功。接下来你就可以在宿主机上修改HTML文件或配置文件然后重启容器docker restart my-nginx使配置生效。4.2 部署MySQL数据库数据库的持久化至关重要。下面命令部署MySQL 5.7并设置root密码和数据持久化。docker run -d \ --name mysql57 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDYourStrongPassword123! \ -v /opt/mysql/data:/var/lib/mysql \ -v /opt/mysql/conf.d:/etc/mysql/conf.d \ mysql:5.7 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_unicode_ci命令拆解与注意事项-e MYSQL_ROOT_PASSWORD...这是设置MySQL root用户密码的环境变量。务必替换YourStrongPassword123!为你自己的强密码。这是安全底线。-v /opt/mysql/data:/var/lib/mysql这是最关键的一步。它将MySQL的数据目录挂载到宿主机确保数据库文件在容器删除后依然存在。宿主机目录/opt/mysql/data会在容器首次运行时自动创建。-v /opt/mysql/conf.d:/etc/mysql/conf.d挂载自定义配置文件目录。你可以将.cnf配置文件放入宿主机的这个目录来覆盖默认的MySQL配置比如调整缓冲区大小。mysql:5.7指定使用5.7版本。虽然有更高的版本但5.7因其稳定性和广泛的生态支持仍然是很多项目的选择。--character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci这些是传给MySQL服务的参数用于设置默认字符集为utf8mb4以支持完整的Emoji表情和生僻字存储。对于现代Web应用这几乎是标配。容器启动后你可以用宿主机上的MySQL客户端连接测试mysql -h 127.0.0.1 -P 3306 -u root -p输入你设置的密码即可。4.3 部署Redis缓存服务Redis作为缓存和消息队列非常流行。部署一个带持久化和密码认证的Redis。docker run -d \ --name redis \ -p 6379:6379 \ -v /opt/redis/data:/data \ redis:6-alpine \ redis-server --requirepass YourRedisPassword --appendonly yes命令拆解与注意事项-v /opt/redis/data:/data挂载数据目录实现持久化。redis-server --requirepass YourRedisPassword这是启动Redis服务器的命令并设置访问密码。同样请替换成你自己的密码。--appendonly yes开启AOF持久化模式。Redis默认是快照RDB持久化AOF模式会记录每一个写操作数据安全性更高但文件体积增长较快。对于缓存场景RDB可能就够了对于重要数据建议开启AOF或两者结合。测试连接可以使用redis-clidocker exec -it redis redis-cli -a YourRedisPassword然后执行ping如果返回PONG则成功。4.4 使用Docker Compose编排多容器应用上面我们都是用单个docker run命令来启动一个服务。但在实际项目中一个应用往往由多个容器组成比如一个Web应用需要Nginx、Python、MySQL、Redis。手动管理这些容器的启动顺序、网络连接非常麻烦。这时就需要Docker Compose。Docker Compose是一个用于定义和运行多容器Docker应用的工具。它使用一个YAML文件通常命名为docker-compose.yml来配置所有服务。首先我们需要在CentOS 7上安装Docker Compose。虽然可以通过yum安装但版本可能较旧。我推荐从GitHub直接下载二进制文件。# 下载最新稳定版的Docker Compose sudo curl -L https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose # 赋予执行权限 sudo chmod x /usr/local/bin/docker-compose # 验证安装 docker-compose --version假设我们要部署一个简单的WordPress博客它需要MySQL数据库和WordPress本身。创建一个目录比如my-wordpress在里面创建docker-compose.yml文件version: 3.8 services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - 8000:80 restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: - wp_data:/var/www/html volumes: db_data: wp_data:在这个文件里我们定义了两个服务db和wordpress和两个命名数据卷db_data,wp_data。depends_on确保了wordpress服务会在db服务启动之后才启动。环境变量用于配置数据库连接。在docker-compose.yml所在目录只需要运行一个命令docker-compose up -d。Compose会自动拉取镜像如果本地没有创建网络创建数据卷并按顺序启动所有服务。-d同样是后台运行。要停止并移除所有相关资源运行docker-compose down。如果还想删除数据卷可以加-v参数docker-compose down -v。5. 生产环境进阶配置与优化5.1 配置国内镜像加速器直接从Docker Hub拉取镜像在国内网络环境下速度可能很慢甚至失败。配置一个国内镜像加速器是必做步骤。国内很多云服务商都提供了免费的Docker镜像加速服务。以配置阿里云加速器为例你需要有一个阿里云账号登录阿里云控制台进入“容器镜像服务”。在左侧菜单找到“镜像加速器”你会看到一个专属的加速器地址格式类似https://xxxx.mirror.aliyuncs.com。在CentOS 7服务器上编辑Docker的守护进程配置文件sudo vi /etc/docker/daemon.json。如果文件不存在就新建一个。在文件中输入以下内容将https://xxxx.mirror.aliyuncs.com替换成你的实际地址{ registry-mirrors: [https://xxxx.mirror.aliyuncs.com] }你可以配置多个镜像源用逗号隔开。保存文件后重新加载配置并重启Docker服务sudo systemctl daemon-reload sudo systemctl restart docker验证是否生效运行docker info在输出结果中查找Registry Mirrors部分应该能看到你配置的加速器地址。配置完成后你再拉取镜像速度会有显著提升。这对于后续部署需要大量基础镜像的应用如深度学习环境至关重要。5.2 容器日志管理与限制默认情况下Docker容器的日志即容器内标准输出和标准错误是由JSON文件驱动管理的存储在/var/lib/docker/containers/容器ID/容器ID-json.log。如果不加限制这些日志文件会不断增长最终占满磁盘空间。我们可以从两个层面管理日志全局配置在/etc/docker/daemon.json中配置日志驱动和参数。{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }这里配置了使用json-file驱动默认并设置单个日志文件最大10MB最多保留3个文件即容器ID-json.log,容器ID-json.log.1,容器ID-json.log.2。当第一个文件满了会滚动到第二个依此类推旧的被删除。容器级别配置在docker run时通过参数指定。docker run -d \ --log-driver json-file \ --log-opt max-size10m \ --log-opt max-file3 \ nginx:alpine对于已经运行的容器可以使用docker logs命令查看日志。清理所有容器的日志文件谨慎操作可以运行sudo find /var/lib/docker/containers/ -name \*.log\ -delete然后重启Docker服务。更优雅的方式是配置日志轮转logrotate但这涉及更多系统配置。5.3 资源限制与监控虽然容器共享宿主机内核但我们可以限制单个容器能使用的资源防止某个容器异常耗尽所有资源导致系统瘫痪。主要限制CPU和内存。CPU限制--cpus参数可以限制容器使用的CPU核心数。例如--cpus1.5表示容器最多使用1.5个CPU核心的计算能力。--cpuset-cpus可以指定容器运行在哪些具体的CPU核心上用于绑核提升缓存命中率。内存限制-m或--memory限制容器可用的最大内存如-m 512m。还可以设置内存软限制--memory-reservation当宿主机内存紧张时会尝试将容器内存压缩到此值。一个完整的资源限制运行示例docker run -d \ --name limited-nginx \ -m 512m \ --memory-reservation 256m \ --cpus1 \ nginx:alpine监控容器的资源使用情况可以使用docker stats命令它会实时显示所有运行中容器的CPU、内存、网络IO、磁盘IO等使用率。对于生产环境建议集成更专业的监控系统如PrometheusGrafana配合cAdvisor或Node Exporter来收集容器和宿主机的详细指标。5.4 网络模式与自定义网络Docker提供了几种网络模式默认是bridge桥接模式。在桥接模式下Docker会创建一个虚拟网桥docker0每个容器会分配一个虚拟网卡并连接到这个网桥容器之间可以通过IP地址通信。查看网络docker network ls。创建一个自定义的桥接网络比使用默认的bridge更好因为它提供了更好的隔离性和便利的DNS解析功能。docker network create my-app-network然后运行容器时使用--network my-app-network将其加入这个网络。加入同一个自定义网络的容器可以直接使用容器名作为主机名进行通信。例如在上面WordPress的Compose例子中WordPress容器就是通过db这个服务名来访问MySQL容器的这得益于Compose自动创建的自定义网络。除了bridge还有host模式容器直接使用宿主机的网络栈没有隔离、none模式禁用网络等根据具体场景选用。理解Docker网络是进行多容器应用编排和微服务部署的基础。
返回列表