一文说清docker及docker compose的应用和部署

server/2025/3/13 12:24:13/

前言

本文视频版教程:一个视频说清dockerdocker compose的应用和部署(https://cloud.tencent.com/developer/video/82177)

本期教程将介绍Docker和Docker compose的基础应用,通过实际应用来讲解具体使用方法和两者的区别。

请在此添加图片描述

假设现在服务器上需要部署三个项目,项目ABC,他们的web服务都是nginx,但是PHP版本不同,mysql数据库的版本也不相同,在传统模式下,尽管PHP可以多版本互存,但是数据库的多版本互存,相对来说就困难一些,在这种情况下,docker就是一种很好的解决方案。

请在此添加图片描述

docker主要由镜像和容器两部分组成,镜像可以理解成是一个模板,那么容器就是根据镜像,创建的不同的可执行的实例,那么这些实例之间是相互独立的。

一、Docker 的安装

docker_16">1.1 安装 docker

安装过程可能会因为网络的问题而造成中断,如果中断了,只需重新执行下该命令就可以继续安装,安装成功后可以查看对应的版本,显示版本信息就证明安装已经完成了。

# 安装 Docker 所需的依赖
yum install -y yum-utils device-mapper-persistent-data lvm2# 添加 Docker 的 yum 源
yum-config-manager --add-repo https://mirrors.cloud.tencent.com/docker-ce/linux/centos/docker-ce.repo# yum 安装 Docker
yum install -y docker-ce docker-ce-cli containerd.io# 查看 Docker 版本
docker version

请在此添加图片描述

docker_36">1.2 启动 docker

启动docker并将docker设置为开机自启动,查看运行状态,当出现active (running)的时候就表示正在运行之中。

# 执行以下命令启动 Docker
systemctl start docker# 然后将 Docker 设置为开机启动
systemctl enable docker# 查看 Docker 运行状态
service docker status# 可能返回以下内容,看到 active (running) 表示正在运行中
Redirecting to /bin/systemctl status docker.service
● docker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: active (running) since Fri 2023-12-22 10:00:56 CST; 11s agoDocs: https://docs.docker.com

请在此添加图片描述

docker__60">1.3 配置 docker 镜像加速

因为docker的镜像都是在海外,所以说访问会比较慢,这时候可以设置成国内的加速镜像,这里选择的是腾讯云的,完成之后重启相关服务。

方法一:

# 创建 Docker 配置目录
mkdir -p /etc/docker# 配置 Docker 镜像加速源
vim /etc/docker/daemon.json# 输入以下内容后保存退出
{"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}# 重启守护进程并重启 Docker
systemctl daemon-reload && systemctl restart docker

方法二:

sudo su -
cat >> /etc/docker/daemon.json <<- EOF
{"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
EOFsystemctl daemon-reload && systemctl restart docker

请在此添加图片描述

docker_97">1.4 体验 docker

设置完成之后就可以进行体验,通过简单的命令,就可以完成镜像的拉取和容器的创建,这里是拉取了nginx镜像创建的容器,创建完成之后就可以直接运行,此时通过IP,就可以访问nginx的默认页面,说明nginx已经成功部署完毕。

# 拉取最新的 nginx 镜像
docker pull nginx# 运行容器
docker run -d --name nginx -p 80:80 nginx# 查看容器
docker ps -a# 显示结果
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES
cc5b9ffeb31d   nginx     "/docker-entrypoint.…"   6 seconds ago   Up 5 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx

请在此添加图片描述

二、Docker 的镜像与容器

Docker 镜像只读的模板

Docker 容器是基于镜像创的运行的实例

1个镜像可以创建多个容器容器互相独立。

镜像与容器docker的核心概念,通过刚才的操作拉取了nginx的镜像,这是一个只读的模板,基于这个镜像,创建了一个可以运行的nginx的实例。

三、Docker 容器的独立性

项目web服务php版本mysql版本
项目Anginxphp7.4mysql5.7
项目Bnginxphp8.0mysql8.0
项目Cnginxphp7.4mysql8.0

由于docker的独立性,在面对表格这样的复杂的部署环境时,就可以通过拉取不同的镜像,比如说nginx、PHP的不同版本,和mysql数据库的不同版本,分别创建对应的容器

四、操作示例

4.1 部署思路

部署思路:分别拉取nginx、php7.4、php8.0、mysql5.7、mysql8.0的镜像,再创建不同的容器

LNMP_a:nginx + php7.4 + mysql5.7

LNMP_b:nginx + php8.0 + mysql8.0

4.2 拉取镜像

为了演示分别搭建两套环境,第一套环境是nginx+PHP 7.4+mysql 5.7,首先将所需要的镜像全部拉取下来,其次查看当前所有已拉取的镜像。

# 拉取镜像docker pull nginxdocker pull php:7.4-fpm
docker pull php:8.0-fpmdocker pull mysql:5.7
docker pull mysql:8.0# 查看镜像
docker images

请在此添加图片描述

4.3 部署LNMP_a

LNMP_a:nginx + php7.4 + mysql5.7的环境要求,按照命令逐次执行,会依次创建数据库,PHP以及nginx的容器,并完成相关的配置。

# 建立 lnma_a 项目的各功能目录
mkdir -p ~/lnmp_a/{www,nginx,mysql}# 建立网络
docker network create network_a# mysql 容器
docker run -d --name mysql57_a \-p 33061:3306 \-v ~/lnmp_a/mysql:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=root_password \--network network_a \mysql:5.7# php 容器
docker run -d --name php74_a \-v ~/lnmp_a/www:/var/www/html \--network network_a \php:7.4-fpm# nginx conf 配置文件
vim ~/lnmp_a/nginx/default.conf########## 将下方内容复制至配置文件内 ##########
server {listen 80;server_name localhost;root /var/www/html;location / {index index.php index.html;}location ~ \.php$ {fastcgi_pass php74_a:9000;include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}
}
########## 将上方内容复制至配置文件内 ########### nginx 容器
docker run -d --name nginx_a \-p 8081:80 \-v ~/lnmp_a/www:/var/www/html \-v ~/lnmp_a/nginx/default.conf:/etc/nginx/conf.d/default.conf \--network network_a \nginx:latest

请在此添加图片描述

4.3.1 镜像容器说明

输入docker ps -a命令查看容器,第一个nginx是体验的时候创建的,而后面含有下划线杠_a的名字是创建的第一个项目所包含的三个容器。这三个容器的数据是独立的,并且这个nginx与最开始的nginx也是互不干扰的。

请在此添加图片描述

4.3.2 测试文件说明

创建一个静态的文件和一个动态的PHP文件,分别测试一下容器是否能够正常使用。

当访问静态文件的时候,会出现hello lnmp_a,这表明静态文件也能够正常解析。

当对PHP文件进行访问的时候,可以看到已经有一个phpinfo,它能够显示出当前PHP的信息,说明PHP的动态解析也能够实现了。

# 建立网站静态文件
vim ~/lnmp_a/www/index.html# 内容
hello lnmp_a# 建立网站 php 文件
vim ~/lnmp_a/www/index.php# 内容
<?php
phpinfo();

请在此添加图片描述

4.3.3 数据库测试说明

同时也对数据库进行测试,建立一个新的数据库,测试一下数据库能否正常建立,并且在文件夹中,能否显示对应的数据库文件。

# 创建数据库
docker exec -it mysql57_a mysql -uroot -proot_passwordCREATE DATABASE IF NOT EXISTS docker_mysql57_db;
SHOW DATABASES;
exit;# 查看数据库文件
ls ~/lnmp_a/mysql/

4.4 部署LNMP_b

LNMP_b:nginx + php8.0 + mysql8.0

# 建立 lnma_a 项目的各功能目录
mkdir -p ~/lnmp_b/{www,nginx,mysql}# 建立网络
docker network create network_b# mysql 容器
docker run -d --name mysql80_b \-p 33062:3306 \-v ~/lnmp_b/mysql:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=root_password \--network network_b \mysql:8.0# php 容器
docker run -d --name php80_b \-v ~/lnmp_b/www:/var/www/html \--network network_b \php:8.0-fpm# nginx conf 配置文件
vim ~/lnmp_b/nginx/default.conf########## 将下方内容复制至配置文件内 ##########
server {listen 80;server_name localhost;root /var/www/html;location / {index index.php index.html;}location ~ \.php$ {fastcgi_pass php80_b:9000;include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}
}
########## 将上方内容复制至配置文件内 ########### nginx 容器
docker run -d --name nginx_b \-p 8082:80 \-v ~/lnmp_b/www:/var/www/html \-v ~/lnmp_b/nginx/default.conf:/etc/nginx/conf.d/default.conf \--network network_b \nginx:latest# 建立网站静态文件
vim ~/lnmp_b/www/index.html# 内容
hello lnmp_b# 建立网站 php 文件
vim ~/lnmp_b/www/index.php# 内容
<?php
phpinfo();# 创建数据库
docker exec -it mysql80_b mysql -uroot -proot_passwordCREATE DATABASE IF NOT EXISTS docker_mysql80_db;
SHOW DATABASES;
exit;# 查看数据库文件
ls ~/lnmp_b/mysql/

4.4.1 创建过程及测试说明

以同样的方式,建立第二个项目所需要的各种环境的容器,并且对第二个项目也进行,静态文件和PHP动态文件的访问,以及数据库的测试。

4.4.2 镜像与容器说明

通过命令查看当前服务器已建立好的容器,会发现主要分为3组。

  • 第一组只有一个nginx,是我们最开始体验的那个nginx。
  • 第二组为下划线杠_a的,是第一个项目的3个容器
  • 第三组是下划线杠_b的,是第二个项目的3个容器

这些容器之间都是相互独立,互不干扰,使用8081的端口访问第一个项目的页面,使用8082的端口访问第二个项目的页面,这样在同一个服务器上,就可以创建很多个容器

请在此添加图片描述

4.5 主要命令功能说明

4.5.1 建立功能模块目录

第一个命令,主要是建立各功能模块的目录,其中www是放置程序和网页文件的,nginx目录是放置nginx配置文件的,mysql目录则是放置数据库文件的。

# 建立 lnma_a 项目的各功能目录
mkdir -p ~/lnmp_b/{www,nginx,mysql}

4.5.2 建立网络

第二个命令主要是用来建立一个网络,用于容器内部进行互相连接。

# 建立网络
docker network create network_b

4.5.3 创建数据库容器

接下来创建数据库的容器,-d参数表示是后台运行,-name参数用于给容器起一个名字,-p参数是进行端口映射,是将宿主主机的端口映射到容器之中,也就是将33061映射到3306,-v参数则是用于挂载,将主机目录挂载到容器之中,-e参数用于设置环境变量,此处设计的是数据库root账号的密码。

# mysql 容器
docker run -d --name mysql80_b \-p 33062:3306 \-v ~/lnmp_b/mysql:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=root_password \--network network_b \mysql:8.0

4.5.4 创建PHP容器

接下来是创建PHP的容器,这里只需注意一个-v参数。

# php 容器
docker run -d --name php80_b \-v ~/lnmp_b/www:/var/www/html \--network network_b \php:8.0-fpm

4.5.5 创建nginx conf配置文件

然后创建nginx conf的配置文件,将内容复制至配置文件内,这里主要是实现nginx能够正常解析PHP文件,所以要将PHP容器的名称填写在这里。

# nginx conf 配置文件
vim ~/lnmp_b/nginx/default.conf########## 将下方内容复制至配置文件内 ##########
server {listen 80;server_name localhost;root /var/www/html;location / {index index.php index.html;}location ~ \.php$ {fastcgi_pass php80_b:9000;include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}
}
########## 将上方内容复制至配置文件内 ##########

4.5.6 创建nginx容器

接下来就是创建nginx容器,-p参数端口映射,将8081映射到80,也就是说,这个容器可以通过8081的方式进行访问,-v参数将网站的目录映射到主机内就是www,第二个-v参数则是conf文件的映射。

# nginx 容器
docker run -d --name nginx_b \-p 8082:80 \-v ~/lnmp_b/www:/var/www/html \-v ~/lnmp_b/nginx/default.conf:/etc/nginx/conf.d/default.conf \--network network_b \nginx:latest

4.5.7 创建静态和动态文件

接下来就是创建静态的html文件,和动态的PHP文件,进行测试,看能不能正常解析。

# 建立网站静态文件
vim ~/lnmp_b/www/index.html# 内容
hello lnmp_b# 建立网站 php 文件
vim ~/lnmp_b/www/index.php# 内容
<?php
phpinfo();

4.5.8 数据库容器测试

这里是通过新建终端的方式,连接到容器内部,该容器为数据库容器,通过命令行的方式创建一个数据库,然后进行测试,使用命令,查看刚才创建的数据库是否存在,以及在文件夹中是否存在。

# 创建数据库
docker exec -it mysql80_b mysql -uroot -proot_passwordCREATE DATABASE IF NOT EXISTS docker_mysql80_db;
SHOW DATABASES;
exit;# 查看数据库文件
ls ~/lnmp_b/mysql/

五、Docker Compose

通过上述方法确实能够创建很多互不干扰的容器,也能够搭建不同的项目使用不同的环境,但是命令过于繁琐,需要的配置太多,导致非常不利于维护,也不利于迁移。

在面对这种情况下通常使用另外一种解决方案docker compose

5.1 安装Docker Compose

按照文档中的命令进行安装,安装完成后可以查看版本号信息,有正确的信息返回,说明安装成功。

# 安装编译 Python 包所需的基础工具和 bcrypt 的依赖:
sudo yum install -y gcc openssl-devel bzip2-devel libffi-devel python3-devel make# 升级 pip 和 setuptools
sudo pip3 install --upgrade pip setuptools wheel# 安装 docker-compos
sudo pip3 install docker-compose# 查看版本
docker-compose --version

请在此添加图片描述

5.2 建立目录及核心配置文件

# 建立 lnma_a 项目的各功能目录
mkdir -p ~/lnmp_c/{www,nginx,mysql}# 建立 docker-compose.yml 文件
vim ~/lnmp_c/docker-compose.yml

dockercomposeyml_530">5.3 编写docker-compose.yml

docker-compose.yml是核心配置文件,它可以将多个关联的容器,定义在一个文件之中,避免手动输入复杂的命令,确保开发、测试、生产环境的一致性,能够自动处理容器间的依赖关系,以及快速启动和销毁整个应用。

version: "3"services:nginx:image: nginxcontainer_name: nginx_crestart: alwaysports:- 8083:80- 4433:443      volumes:- ~/lnmp_c/nginx/default.conf:/etc/nginx/conf.d/default.conf- ~/lnmp_c/www:/var/www/htmlphp:image: php:7.4-fpmcontainer_name: php74_crestart: alwaysvolumes:- ~/lnmp_c/www:/var/www/htmlmysql:image: mysql:8.0container_name: mysql80_crestart: alwaysports:- 33063:3306volumes:- ~/lnmp_c/mysql:/var/lib/mysqlenvironment:- MYSQL_ROOT_PASSWORD=root_password- MYSQL_DATABASE=lnmp_c- MYSQL_USER=lnmp_c_user- MYSQL_PASSWORD=lnmp_c_password

5.4 编写nginx conf配置

# nginx conf 配置文件
vim ~/lnmp_c/nginx/default.conf########## 将下方内容复制至配置文件内 ##########
server {listen 80;server_name localhost;root /var/www/html;location / {index index.php index.html;}location ~ \.php$ {fastcgi_pass php74_c:9000;include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}
}
########## 将上方内容复制至配置文件内 ##########

5.5 启动服务

通过已经编写好的docker-compose.yml配置文件,使用命令自动创建相关容器

# 进入目录
cd lnmp_c# 启动容器
docker-compose up -d# 建立网站静态文件
vim ~/lnmp_c/www/index.html# 内容
hello lnmp_c# 建立网站 php 文件
vim ~/lnmp_c/www/index.php# 内容
<?php
phpinfo();# 查看数据库文件
ls ~/lnmp_c/mysql/

5.6 建立静态及动态测试文件

建立静态的html文件和动态的PHP文件,看看创建好的容器能否正常的解析。

5.7 查看数据库文件

因为在配置文件之中已经创建好了一个数据库,通过命令在文件系统中,也确实能够查看对应的数据库,说明数据库的建立也是正确的。

dockercomposeyml_635">5.8 docker-compose.yml文件介绍

这里是配置文件三个核心部分的介绍,重点关注的就是类似于-v、-p、-e参数,也就是端口映射,文件映射和环境变量的设置。

dockercompose_639">5.9 docker-compose的启动与重启

通过这种方式建立的容器,也可以很方便地重启,重启可以分为相对路径重启,和绝对路径重启。

方法一:相对路径写法

# 停止并删除所有由 Compose 管理的容器
docker-compose down# 启动容器
docker-compose up -d

方法二:绝对路径写法

# 停止并删除所有由 Compose 管理的容器
docker-compose -f ~/lnmp_c/docker-compose.yml down# 启动容器
docker-compose -f ~/lnmp_c/docker-compose.yml up -d

六、迁移测试

6.1 迁移说明

只需将当前服务器上项目lnmp_c的目录复制到其他服务器,进入指定目录重新执行docker-compose up -d,即可一键拉取、创建项目lnmp_c所需要的容器

并且因为将目录也打包过去了,那么网站的文件和数据库的数据都依然存在。

6.1 迁移前数据库准备

为了能够更好的测试数据迁移的完整性,通过终端的方式,先给项目c的数据库创建一些表和添加一些记录,然后迁移过去来查看数据是否完整。

docker exec -it mysql80_c mysql -uroot -proot_passwordSHOW DATABASES;use lnmp_c;CREATE TABLE `test` (`id` int(11) NOT NULL,`title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;INSERT INTO `test` (`id`, `title`) VALUES
(1, 'title'),
(2, 'test');ALTER TABLE `test`ADD PRIMARY KEY (`id`);ALTER TABLE `test`MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;SELECT * FROM `test`;exit;

6.3 迁移过程说明

打开的是一台新的测试服务器,通过命令可以查看到已经将项目c的文件复制过来了,并且当前服务器上,并没有安装任何的镜像和容器,通过命令启动docker compose文件,可以看到,服务器已经自动开始拉取所需的镜像,自动创建所需的容器

在创建好之后,我们可以通过IP加端口的方式,访问静态页面和动态页面,然后通过终端的方式,进入到数据库容器中,也能够看到,数据库表和记录,都完整地保留了过来,通过这样的迁移方式,能够保证新旧服务器程序,数据库所运行和环境完全一致。

请在此添加图片描述

总结

本期教程到此结束,通过对比Docker的两种使用方法,可以看出Docker compose的使用更为灵活方便,在日常使用中,推荐使用Docker compose的方法来进行部署。


http://www.ppmy.cn/server/174621.html

相关文章

1.2 CogPMAlignTool(模板匹配工具), CogFixtureTool(坐标系转换工具)

‌ CogPMAlignTool‌是高精度模板匹配工具&#xff0c;主要用于图像的特征定位和匹配。 ‌ CogFixtureTool是主要用于图像坐标系转换和对齐&#xff0c;就可以把当前拍照的图片固定到之前模板的那张图片。 相当于使用工具CogPMAlignTool‌来测量出当前图片与注册…

使用 OptiSLang 和 MotorCAD 构建一个强大的电机优化元模型

介绍 在本文中&#xff0c;我们将检查这些敏感性分析的结果&#xff0c;并构建一个健壮的元模型&#xff0c;作为优化过程的基础。 本文涵盖&#xff1a; 解释敏感性分析结果了解元模型及其在优化中的重要性构建和完善最佳预后模型 &#xff08;MOP&#xff09;使用预后系数…

蛋白质功能预测论文阅读记录2025(DPFunc、ProtCLIP)

前言 最近研究到瓶颈了&#xff0c;怎么优化都提升不了&#xff0c;遂开始看点最新的论文。 DPFunc 2025.1.2 Nature Communication 中南大学 论文地址&#xff1a;DPFunc: accurately predicting protein function via deep learning with domain-guided structure inform…

AtCoder ABC E - Min of Restricted Sum 题解

根据输入考虑建图&#xff0c;x、y两个下标的边权为z,建无向图 这样我们可以得到一些连通块。根据异或和的性质&#xff0c;对于每一个连通块&#xff0c;我们只要知道其中一个点的点权就能推出所有的点权。 最小值考虑贪心&#xff0c;针对当前连通图所有点权二进制数的每一…

Express + MongoDB + multer 解决文件上传 originalname 中文乱码

出现originalname中文乱码&#xff0c;是因为请求时给后端的是 UTF-8 编码的文件名&#xff0c;而后端 Node.js 在解析文件名时&#xff0c;是以 ISO-8859-1 编码来解析的。 一、手动转换编码 在接收到文件后&#xff0c;对文件名进行编码转换。 1. 单文件 // multer配置 c…

深度解读:OpenAI发布GPT-5的技术突破与商业影响

引言 2025年2月&#xff0c;OpenAI正式发布GPT-5&#xff0c;这一被誉为“AI新纪元开篇之作”的模型&#xff0c;不仅实现了技术架构的颠覆性创新&#xff0c;更以免费开放策略引发行业地震。本文将从技术突破、商业影响、行业竞争格局及未来挑战四个维度&#xff0c;全面解析…

【DevOps】通过 Azure DevOps 部署启用私有端点的应用服务

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 **实验**测试 1:使用 Microsoft 托管代理部署测试 2:在 Linux VM (Ubuntu 20.04) 上使用自托管代理部署有一种常见的场景是,客户希…

火语言RPA--PDF页数统计

【组件功能】&#xff1a;统计PDF文档总页数 配置预览 配置说明 PDF文件路径 支持T或# 默认FLOW输入项 待统计页数的PDF文件的完整路径。 PDF文件密码 支持T或# 打开PDF文件的密码。 示例 PDF页数统计示例 描述 统计pdf文档E:\test\test.pdf有多少页。 配置 输出结果…