ubuntu

如何用Ubuntu Docker部署Web应用

小樊
37
2025-09-18 20:09:06
栏目: 智能运维

一、准备工作:在Ubuntu上安装Docker

在部署Web应用前,需先确保Ubuntu系统安装了Docker及Docker Compose(用于管理多容器应用)。以下是具体步骤:

1. 卸载旧版本(可选)

若系统已安装旧版Docker,需先卸载以避免冲突:

sudo apt-get remove docker docker-engine docker.io containerd runc

2. 安装依赖包

安装必要的依赖工具,用于访问Docker官方仓库:

sudo apt install apt-transport-https ca-certificates curl software-properties-common -y

3. 添加Docker官方GPG密钥

确保下载的Docker软件包未被篡改:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

4. 添加Docker官方APT仓库

将Docker的稳定版仓库添加到系统源列表:

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

5. 安装Docker Engine

更新包索引并安装Docker核心组件:

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y

6. 启动Docker并设置开机自启

sudo systemctl start docker
sudo systemctl enable docker

7. 验证安装

通过以下命令检查Docker版本,确认安装成功:

docker --version

8. (可选)安装Docker Compose

若需管理多容器应用(如Web+数据库),需安装Docker Compose:

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version

二、编写Dockerfile定义Web应用环境

Dockerfile是构建镜像的核心文件,需根据Web应用类型(如Python、Node.js、Nginx)定制。以下以Python Flask应用为例,说明Dockerfile的编写步骤:

1. 创建项目目录

mkdir myflaskapp && cd myflaskapp

2. 创建应用代码文件

新建app.py,编写一个简单的Flask应用:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, Docker Web App!'
    
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

3. 创建依赖文件

新建requirements.txt,列出应用依赖的Python包:

Flask

4. 编写Dockerfile

在项目根目录创建Dockerfile,定义镜像构建步骤:

# 1. 使用官方Python基础镜像(选择slim版本减小镜像体积)
FROM python:3.9-slim

# 2. 设置工作目录(容器内的路径)
WORKDIR /app

# 3. 复制依赖文件到工作目录
COPY requirements.txt .

# 4. 安装依赖(--no-cache-dir避免缓存增大镜像体积)
RUN pip install --no-cache-dir -r requirements.txt

# 5. 复制应用代码到工作目录
COPY . .

# 6. 暴露应用端口(容器内端口,需与运行时的-p参数对应)
EXPOSE 5000

# 7. 定义容器启动命令(运行Flask应用)
CMD ["python", "app.py"]

5. (可选)创建.dockerignore文件

排除不必要的文件(如本地git仓库、日志、node_modules),减少镜像体积:

.git
__pycache__
*.log
*.md

6. 构建Docker镜像

在项目目录下运行以下命令,构建镜像(-t指定镜像名称及标签,.表示使用当前目录作为构建上下文):

docker build -t myflaskapp:latest .

7. 验证镜像

通过以下命令查看本地镜像列表,确认镜像构建成功:

docker images

三、运行Docker容器部署Web应用

镜像构建完成后,需通过docker run命令启动容器,将应用暴露给外部访问:

1. 运行容器

使用-d参数让容器在后台运行,-p参数将容器的5000端口映射到主机的8080端口(可根据需求修改):

docker run -d -p 8080:5000 --name myflaskapp-container myflaskapp:latest

2. 验证容器运行状态

通过以下命令查看容器是否处于运行状态:

docker ps

若容器状态为“Up”,则表示运行成功。

3. 访问Web应用

在浏览器中输入http://<Ubuntu服务器IP>:8080,若看到“Hello, Docker Web App!”,则说明应用部署成功。

四、优化与进阶:使用Docker Compose管理多容器应用

若Web应用需要依赖数据库(如MySQL)或其他服务,可使用Docker Compose简化管理。以下以Flask+MySQL为例,说明Docker Compose的使用步骤:

1. 创建docker-compose.yml文件

在项目根目录创建docker-compose.yml,定义服务(web应用、数据库)及其配置:

version: '3.8'  # 指定Compose文件版本

services:
  web:  # Web服务(Flask应用)
    build: .  # 使用当前目录的Dockerfile构建镜像
    ports:
      - "8080:5000"  # 映射主机端口到容器端口
    environment:
      - FLASK_ENV=development
      - DATABASE_URL=mysql+pymysql://root:password@db:3306/myapp  # 数据库连接字符串
    depends_on:
      - db  # 依赖db服务(确保db先启动)

  db:  # 数据库服务(MySQL)
    image: mysql:5.7  # 使用官方MySQL镜像
    environment:
      - MYSQL_ROOT_PASSWORD=password  # root用户密码
      - MYSQL_DATABASE=myapp  # 创建的数据库名
    volumes:
      - mysql_data:/var/lib/mysql  # 持久化数据(避免容器重启丢失数据)

volumes:
  mysql_data:  # 定义数据卷名称

2. 启动多容器应用

docker-compose.yml所在目录运行以下命令,启动所有服务:

docker-compose up -d

3. 验证服务运行状态

通过以下命令查看服务状态:

docker-compose ps

若所有服务状态为“Up”,则表示启动成功。

4. 访问Web应用

在浏览器中输入http://<Ubuntu服务器IP>:8080,即可访问由Docker Compose管理的Flask+MySQL应用。

五、常见问题排查

  1. 端口冲突:若主机端口(如8080)已被占用,可将-p 8080:5000改为-p 8081:5000(修改主机端口)。
  2. 依赖安装失败:若构建镜像时出现依赖安装错误,可进入容器调试(docker run -it myflaskapp:latest /bin/bash),手动执行pip install -r requirements.txt
  3. 容器无法访问:若无法通过主机IP访问应用,需检查Ubuntu防火墙是否开放端口(sudo ufw allow 8080)。
  4. 数据丢失:若未使用数据卷(volumes),容器重启后数据库数据会丢失,需通过volumes配置持久化数据。

通过以上步骤,即可在Ubuntu系统上使用Docker快速部署Web应用,并通过Docker Compose管理复杂的多容器架构。

0
看了该问题的人还看了