本文详细介绍了Docker部署实战的相关内容,从Docker的基础概念到环境搭建,再到基本命令和Dockerfile的使用,帮助读者全面了解如何使用Docker部署应用。文章还提供了多个实战案例,包括部署一个简单的Web应用和MySQL数据库,并讲解了容器间通信的配置。
Docker基础概念什么是Docker
Docker是一种基于容器技术的轻量级虚拟化解决方案,它可以将应用及其依赖环境封装为一个独立的容器。与传统的虚拟化技术相比,Docker容器更加轻便且启动速度快。Docker允许开发者将应用及其运行环境打包为一个可移植的容器,从而实现应用的跨平台部署。
Docker与虚拟机的区别
Docker和虚拟机都是虚拟化的解决方案,但它们在实现方式和资源使用上有着明显的区别。
- 资源使用:虚拟机使用独立的操作系统,因此每个虚拟机都需要一套完整的操作系统和内核,资源消耗较大。而Docker容器则共享宿主机的操作系统内核,因此资源占用较小。
- 启动速度:由于Docker容器直接运行在宿主机的操作系统之上,因此启动速度较快,通常只需几秒钟。而虚拟机由于需要加载整个操作系统,启动速度相对较慢。
- 隔离性:虚拟机提供了完整的系统级隔离,每个虚拟机都有独立的操作系统和内核,而Docker容器共享宿主机的操作系统内核,隔离性稍弱。
Docker的三大核心概念:镜像、容器、仓库
- 镜像:镜像是一个包含运行环境和应用代码的只读模板。镜像文件通常保存在Docker仓库中,用户可以从仓库中下载镜像来创建容器。
- 容器:容器是镜像的运行实例,它是一个独立的运行环境,包含了应用及其依赖环境。容器可以通过Docker命令启动、停止和删除。
- 仓库:仓库是一个存储和分发Docker镜像的中心,常见的仓库有Docker Hub和阿里云仓库等。用户可以将自己的镜像推送到仓库,也可以从仓库中拉取其他用户的镜像。
在Windows/Linux/Mac上安装Docker
Windows上安装Docker
- 访问Docker官网(https://www.docker.com/products/docker-desktop)下载适用于Windows的Docker Desktop。
- 运行安装程序,安装过程中可能需要安装Windows Subsystem for Linux(WSL),请按照提示完成安装。
- 安装完成后,启动Docker Desktop,检查Docker是否成功安装。
docker --version
Linux上安装Docker
- 更新包管理器的缓存。
sudo apt-get update
- 安装必要的包以允许apt通过HTTPS使用存储库。
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
- 添加Docker官方的GPG密钥。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 添加DDoctor存储库。
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- 更新包管理器的缓存,并安装Docker CE。
sudo apt-get update sudo apt-get install docker-ce
- 验证安装。
sudo docker --version
Mac上安装Docker
- 访问Docker官网(https://www.docker.com/products/docker-desktop)下载适用于Mac的Docker Desktop。
- 运行安装程序,安装完成后启动Docker Desktop。
- 检查Docker是否成功安装。
docker --version
在安装Docker后,可以通过以下命令验证Docker是否安装成功。
docker --version
如果安装成功,将输出Docker的版本信息。
Docker基本命令Docker镜像管理(拉取、查看、删除)
拉取镜像
从Docker Hub拉取一个镜像。
docker pull nginx
查看镜像
列出当前主机上的所有镜像。
docker images
删除镜像
删除指定的镜像。
docker rmi nginx
Docker容器管理(创建、启动、停止、删除)
创建并启动容器
使用镜像创建并启动一个容器。
docker run -d --name my_nginx nginx
查看容器
列出当前主机上的所有容器。
docker ps -a
停止容器
停止指定的容器。
docker stop my_nginx
删除容器
删除指定的容器。
docker rm my_nginx
Docker容器端口映射
将容器的80端口映射到宿主机的8080端口。
docker run -d -p 8080:80 --name my_nginx nginx
Dockerfile编写与使用
Dockerfile简介
Dockerfile是一个文本文件,包含了构建Docker镜像所需的所有命令。它定义了如何构建一个Docker镜像,包括基础镜像、安装依赖、复制文件等。
构建Docker镜像
创建一个Dockerfile。
# 使用官方的Python基础镜像
FROM python:3.8-slim
# 设置工作目录
WORKDIR /app
# 复制当前目录下的requirements.txt文件到上面设置的目录
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制当前目录下的app.py文件到上面设置的目录
COPY app.py .
# 暴露端口
EXPOSE 5000
# 设置环境变量
ENV NAME World
# 设置容器启动命令
CMD ["python", "app.py"]
使用Dockerfile构建镜像。
docker build -t my_python_app .
Dockerfile常用指令解析
FROM
:指定基础镜像。WORKDIR
:设置工作目录。COPY
:将本地文件复制到镜像中。RUN
:在构建镜像时执行命令。EXPOSE
:暴露容器端口。ENV
:设置环境变量。CMD
:设置容器启动命令。
使用Docker部署一个简单的Web应用
假设有一个简单的Flask应用,包含如下目录结构:
my_flask_app/
│
├── Dockerfile
└── app.py
app.py
内容如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Docker!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Dockerfile
内容如下:
FROM python:3.8-slim
WORKDIR /app
COPY app.py .
EXPOSE 50访问容器内的MySQL数据库。
```python
import pymysql
import os
# 连接MySQL数据库
db = pymysql.connect(host='my_mysql_container', user='myuser', password='mypassword', database='mydb')
cursor = db.cursor()
cursor.execute("SELECT VERSION()")
data = cursor.fetchone()
print("Database version : %s " % data)
db.close()
使用Docker部署MySQL数据库
创建一个Dockerfile来部署MySQL。
FROM mysql:5.7
ENV MYSQL_ROOT_PASSWORD=root
ENV MYSQL_DATABASE=mydb
ENV MYSQL_USER=myuser
ENV MYSQL_PASSWORD=mypassword
COPY init_db.sql /docker-entrypoint-initdb.d/
创建一个SQL文件初始化数据库。
-- init_db.sql
CREATE DATABASE mydb;
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%';
FLUSH PRIVILEGES;
构建并运行MySQL容器。
docker build -t my_mysql .
docker run -d -p 3306:3306 --name my_mysql_container my_mysql
Docker容器间通信配置
假设有一个前端应用(使用Flask)和后端数据库(使用MySQL),需要让它们通信。
前端应用的Dockerfile:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
后端数据库的Dockerfile:
FROM mysql:5.7
ENV MYSQL_ROOT_PASSWORD=root
ENV MYSQL_DATABASE=mydb
ENV MYSQL_USER=myuser
ENV MYSQL_PASSWORD=mypassword
COPY init_db.sql /docker-entrypoint-initdb.d/
创建一个SQL文件初始化数据库:
-- init_db.sql
CREATE DATABASE mydb;
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%';
FLUSH PRIVILEGES;
构建并运行两个容器,并且让它们通过网络通信。
# 构建前端应用镜像并运行
docker build -t my_flask_app .
docker run -d -p 5000:5000 --name my_flask_container my_flask_app
# 构建后端数据库镜像并运行
docker build -t my_mysql .
docker run -d --name my_mysql_container my_mysql
# 创建一个自定义网络,并将两个容器连接到该网络
docker network create my_network
docker network connect my_network my_flask_container
docker network connect my_network my_mysql_container
Docker常见问题及解决方法
Docker容器运行报错排查
如果容器启动时报错,可以使用以下命令查看容器的日志。
docker logs <container_id>
Docker磁盘空间不足问题解决
如果磁盘空间不足,可以清理Docker的缓存和不再使用的镜像和容器。
# 清理Docker的缓存
docker system prune --volumes
# 强制删除所有已停止的容器
docker container prune -f
# 删除所有未被使用的镜像
docker image prune -a
Docker安全注意事项
- 使用最新的官方镜像:使用官方维护的镜像可以确保安全性。
- 限制容器的资源使用:通过设置资源限制(如CPU、内存)来避免容器对宿主机资源的过度消耗。
- 使用安全的环境变量:不要在环境变量中直接暴露敏感信息,如数据库密码等。
- 限制容器的网络访问:通过网络策略限制容器的网络访问范围,避免容器被外部攻击。
- 定期更新Docker和镜像:保持Docker和镜像的最新版本可以避免已知的安全漏洞。
共同学习,写下你的评论
评论加载中...
作者其他优质文章