Docker部署及项目的生命周期
目标
了解传统项目生命周期的阶段特点
了解新型项目生命周期的特点
了解部署方案的一般流程
1. 项目生命周期
世间万物皆有其生命,软件项目也是如此。随着互联网的发展,软件项目的生命周期也发生了很大的变化,为了更好的让大家理解软件项目,项目生命周期有狭义(具体)、广义(缘起/缘灭)之分,我们一般所说的项目生命周期主要指的是狭义的项目生命周期,我们以传统的软件项目为例进行介绍。
传统项目生命周期
对于传统软件项目来说,它主要包含以下五个阶段:
调研阶段-->设计阶段-->开发阶段-->测试阶段-->运营阶段
- 调研阶段
目的:居安思危
人员:相关人员,侧重于产品经理
节点:多角度思路/方案,最后领导拍板 - 设计阶段
目的:市案可视化
人员;产品团队主导,开发、测试、逗维参与
节点:产品需求文档、项目里程表 - 开发阶段
目的:方案运行
人员:开发团队为主,运维团队参与
节点:阶段项目正常运行 - 测试阶段
目的:保证项目功能完善
人员:测试团队为主,运维、开发参与
节点:项目功能符合要求 - 运营阶段
目的:项目部署+运行维护
人员:运营团队为主、开发/产品团队参与
节点:项目终止、功能迭代等
Docker
一,安装准备
能上外网
yum -y install gcc
yum -y install gcc c++
卸载旧版本
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
如果 yum 报告未安装任何这些软件包,这表示情况正常。
Linux系统安装Docker:
# 更新包列表
sudo apt-get update
# 安装必要的依赖
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# 添加Docker的官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加Docker的APT仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 更新包列表
sudo apt-get update
# 安装Docker
sudo apt-get install -y docker-ce
# 验证Docker是否安装成功
sudo docker --version
Linux安装Docker Compose:
如果需要多容器管理则需要安装
# 下载Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证Docker Compose是否安装成功
docker-compose --version
Docker安装(yum方式)
安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
设置stable镜像仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
或
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件包索引
yum makecache fast
安装docker
安装指定版本:
yum list docker-ce.x86_64 --showduplicates | sort -r
从高到低列出Docker-ce的版本
该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
例如:指定版本(docker-ce-18.09.9)进行安装:
yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io
安装最新版本:
yum -y install docker-ce
启动docker
执行以下命令启动docker:
systemctl start docker
设置开机自启动
systemctl enable docker
测试docker
查看docker版本
docker version
查看docker日志
cat /var/log/docker
目前 Docker 只能支持 64 位系统。
systemctl stop firewalld.service
setenforce 0
#安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
--------------------------------------------------------------------------------------------
yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
--------------------------------------------------------------------------------------------
#设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装 Docker-CE并设置为开机自动启动
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker.service
systemctl enable docker.service
--------------------------------------------------------------------------------------------
安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
--------------------------------------------------------------------------------------------
#查看 docker 版本信息
docker version
#docker 信息查看
docker info
镜像加速下载
浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
Docker安装(npm方式)
Docker安装:
npm i docker -g
Docker-compose安装:
npm i docker-compose -g
把Flask项目部署成Web服务
将 Flask 项目通过 Docker 部署成 Web 服务是一个很好的实践,可以让应用程序更加便携和易于维护。下面是完整的步骤,包括创建 Dockerfile 和相关的配置文件,以及如何构建和运行容器。
1. 准备项目文件 (app.py
等)
确保你的 Flask 项目已经准备就绪,并且有一个 app.py
文件来启动 Flask 应用。
2. 生成 requirements.txt
列出你的项目依赖,并生成 requirements.txt
文件:
pip freeze > requirements.txt
3. 创建映射目录
创建一个目录来存放你的 Dockerfile 和项目文件:
mkdir flask_app
cd flask_app
cp -r /path/to/your/app/* .
4. 创建 Dockerfile
在项目根目录下创建 Dockerfile
文件,并添加以下内容:
# 使用官方的 Python 运行时作为父镜像
FROM python:3.8-slim
# 设置工作目录
WORKDIR /app
# 将当前目录的内容复制到容器中
COPY . /app
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 暴露端口
EXPOSE 8000
# 运行 Flask 应用
CMD ["python", "app.py"]
Dockerfile配置
以下是一个.net core项目的Dockerfile配置内容,新建一个Dockerfile文件,编辑内容如下:
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 #项目运行时需引用镜像 可从dockerhub搜索
EXPOSE 9401 #指定项目运行端口
WORKDIR /app #指定容器内项目运行目录
COPY . /app #将当前目录下的文件copy至容器内项目运行目录
ENTRYPOINT ["dotnet", "helloworld.dll"] #项目启动命令
5. 创建镜像
进入 Dockerfile
文件所在的目录,并构建镜像:
docker build -t flask_app:v1.0 .
构建Docker镜像:
在项目根目录运行以下命令构建Docker镜像:
# 构建镜像
docker build -t 镜像名:tag .
运行Docker容器:
-
单容器运行
直接运行构建好的Docker镜像:
docker run -d -p 8000:8000 镜像名:tag
-
使用Docker Compose
如果项目使用Docker Compose,创建一个 docker-compose.yml 文件,内容如下:
version: '3.8' services: app: image: your-image-name:tag ports: - "8000:8000" environment: - ENV_VAR1=value1 - ENV_VAR2=value2 volumes: - ./data:/app/data
然后运行以下命令启动服务:
docker-compose up -d
部署到服务器
0. 打包文件
# 查看块设备信息,确认 USB 设备的设备名
lsblk
# 将 USB 设备挂载到 /mnt/usb 目录,以便访问其内容
sudo mount /dev/sdg1 /mnt/usb
# 进入 USB 设备的挂载点
cd /mnt/usb
# 列出当前目录下的所有文件和隐藏文件
ll -a
# 将 web 目录递归复制到 /home/bai/web1.3 目录
sudo cp -r web /home/bai/web1.3
# 进入新复制的 web1.3 目录
cd /home/bai/web1.3
# 列出当前目录下的所有文件
ls
# 构建新的 Docker 镜像,标签为 dify-web-new:1.2
sudo docker build -t dify-web-new:1.2 .
# 列出所有 Docker 镜像,并过滤出包含 "dify" 的镜像
docker images | grep dify
# 将构建好的镜像导出为 tar 文件,并保存到 USB 设备
sudo docker save -o /mnt/usb/dify-web.tar dify-web-new:1.2
# 列出 USB 设备挂载点下的所有文件,包括隐藏文件
ls -a /mnt/usb
# 删除 USB 设备上的旧镜像文件
sudo rm -f /mnt/usb/dify-web-new.tar
# 卸载 USB 设备
sudo umount /mnt/usb
# 进入 Docker 配置文件所在的目录
cd /home/bai/dify/docker
# 列出当前目录下的所有文件
ls
# 使用 nano 编辑器打开 docker-compose.yaml 文件
nano docker-compose.yaml
# 跳到 230-240 行,修改镜像文件名
# (在 nano 中,可以使用 Ctrl+_ 输入行号跳转,例如 Ctrl+_ 230)
# 保存并退出 nano 编辑器(按 Ctrl+X,然后按 Y 保存,最后按 Enter)
# 停止当前运行的 Docker Compose 服务
sudo docker-compose down
# 重新启动 Docker Compose 服务
sudo docker-compose up -d
1.使用 scp
拷贝
scp /mnt/usb/dify-web.tar user@target-server:/path/to/destination
user
是目标服务器的用户名。target-server
是目标服务器的 IP 地址或主机名。/path/to/destination
是目标服务器上存放dify-web.tar
文件的目录。
2. 加载镜像到目标服务器
在目标服务器上,使用 docker load
命令将压缩包加载为 Docker 镜像。
sudo docker load -i /path/to/destination/dify-web.tar
3. 验证镜像是否加载成功
使用 docker images
命令查看已加载的镜像。
docker images | grep dify
4. 运行镜像
使用 docker run
命令启动一个新的容器。
sudo docker run -p 3000:3000 -it --rm dify-web-new:1.2
5. 使用 Docker Compose 运行(如果适用)
如果您使用 docker-compose
来管理多个服务,可以将 docker-compose.yaml
文件也拷贝到目标服务器,然后启动服务。
拷贝 docker-compose.yaml
文件
scp /home/bai/dify/docker/docker-compose.yaml user@target-server:/path/to/destination
进入目标目录并启动 Docker Compose
cd /path/to/destination
sudo docker-compose up -d
总结
-
拷贝镜像文件:
scp /mnt/usb/dify-web.tar user@target-server:/path/to/destination
-
加载镜像:
sudo docker load -i /path/to/destination/dify-web.tar
-
验证镜像:
docker images | grep dify
-
运行镜像:
sudo docker run -p 3000:3000 -it --rm dify-web-new:1.2
-
使用 Docker Compose(如果适用):
scp /home/bai/dify/docker/docker-compose.yaml user@target-server:/path/to/destination cd /path/to/destination sudo docker-compose up -d
-
1将镜像推送到Docker Hub(可选)
如果你希望将镜像推送到Docker Hub以便在其他服务器上拉取
# 登录Docker Hub
docker login
# 标记镜像
docker tag your-image-name:tag your-dockerhub-username/your-image-name:tag
# 推送镜像
docker push your-dockerhub-username/your-image-name:tag
- 2 在目标服务器上拉取并运行镜像
在目标服务器上运行以下命令:Docker镜像打包及容器运行
# 拉取镜像
docker pull your-dockerhub-username/your-image-name:tag
# 运行容器
docker run -d -p 8000:8000 your-dockerhub-username/your-image-name:tag
编写了一个sh文件
#!/bin/bash
nowtime=$(date "+%Y%m%d%H%M%S") #此处以时间为版本,用于留存镜像版本,否则会覆盖
docker build -t helloworld:$nowtime . #镜像打包命令
docker stop helloworld_con #停止运行中的容器
docker rm helloworld_con #移除容器
docker run \ #运行容器
--name helloworld_con -d \ #容器名称
--link mysql \ #容器间通信,此处连接mysql数据库容器
--network test_default \ #指定容器网络
--restart=always \ #自动启动
-p 9401:9401 \ #映射端口 本地端口:容器内端口
helloworld:$nowtime #指定镜像及其版本
直接运行sh文件
Docker镜像
- 是什么
- Docker Image本质上是一个只读文件, 这个文件包含了文件系统、 源码、库文件、依赖、工具等一些运行application所必须的文件
- 可以把Docker Image理解成一个模板, 可以通过这个模板实例化出来很多容器
- Image里面是一层层文件系统Union FS(联合文件系统),可以将几层目录挂载到一起,形成一个虚拟文件系统
-
Docker镜像加载原理
-
bootfs
bootfs主要包含bootloader和kernel,Linux刚启动时会加载bootfs
在Docker镜像的最底层就是bootfs,这一层与Linux是一样的,包含bootloader和kernel
当boot加载完成之后,整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时OS也会卸载bootfs -
rootfs
rootfs在bootfs之上,包含的就是典型的Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件
rootfs就是各种不同的OS发行版
如Ubuntu,CentOS
6. 创建容器
创建并运行容器:
docker run -dit --restart=always -p 5000:5000 --name flask_container flask_app:v1.0
如果你的应用程序监听的端口不是默认的 5000,你需要将 -p 5000:5000
替换为正确的端口映射,例如:
docker run -dit --restart=always -p 5012:5012 --name flask_container flask_app:v1.0
7. 进入容器
如果需要进入容器内部进行调试或检查:
docker exec -it flask_container /bin/bash
查看镜像和容器状态
创建镜像之后,可以执行以下命令查看镜像文件:
docker images
创建容器之后,可以执行以下命令查看容器状态:
docker ps -a
使用 IP 地址访问
一旦容器运行起来,你就可以通过容器绑定的主机 IP 地址和映射的端口来访问 Flask 应用。例如,如果主机 IP 地址是 192.168.1.100
,并且你将容器端口 5000
映射到了主机端口 5000
,那么可以通过 http://192.168.1.100:5000
访问你的 Flask 应用。
总结
通过上述步骤,你可以将 Flask 项目打包成 Docker 镜像,并运行在一个容器中。这种方式不仅便于部署,还可以确保应用在任何环境中都能一致地运行。
Docker使用
创建镜像之后就可以执行下面的命令docker images查看镜像文件然后创建容器之后,可以执行docker ps-a可以查看创建好的容器可以用镜像打开,也可以用IP打开。
可以用容器名去访问也可以用1P号访问
Docker:
一,创建容器docker run
二,查看容器dockerps/docker ps -s
三,查看日志dockerlogs-f容器名或者容器的编号。
四,删除容器dockerrm 容器名字或容器编号
创建容器的时候,端口号和映射关系要设计
好。所以在创建容器之前的时候要想好跟什么参数。
五,查看容器镜像dockerinspect容器名或者是编号
Docker示意图
用Docker下载MySQL5.7的镜像
下载 MySQL5.7的 docker 镜像
docker pull mysql:5.7
使用如下命令启动MySQL服务
docker run p 3306:3306-name mysql
-v /mydata/mysql/log:/var/log/mysql
-v/mydata/mysql/data:/var/lib/mysql\-v/mydata/mysql/conf:/etc/mysql \
-e MYSQL ROOT PASSWORD-root
networkhuicenetwork
-d mysql:5.7
参数说明
- -p3306:3306:将容器的 3306端口映射到主机的 3306端口
- -v/mydata/mysql/conf:/etc/mysql:将配置文件夹挂在到主机
- -v/mydata/mysqllog:/var/log/mysql:将日志文件夹挂载到主机
- -v/mydata/mysqldata:/var/lib/mysql:将数据文件夹挂载到主机
- -e MYSQL ROOT PASSWORD=root:初始化 root用户的密码
进入运行 MySQL的 docker 容器
docker exec -it mysql /bin/bash
使用mysql命令登录到MySQL客户端
mysql -uroot proot-default-character-set=utf8
创建一个reader:123456账号并修改权限,使得任何IP都能访问
grant all privileges on *,* to 'reader’G'%' identified by ’123456'
创建项目数据库:
create database fecmall character set utf8;