本文详细介绍了Docker部署实战的相关内容,从Docker的基础概念到环境搭建,再到基本命令和Dockerfile的使用,帮助读者全面了解如何使用Docker部署应用。文章还提供了多个实战案例,包括部署一个简单的Web应用和MySQL数据库,并讲解了容器间通信的配置。
Docker基础概念Docker是一种基于容器技术的轻量级虚拟化解决方案,它可以将应用及其依赖环境封装为一个独立的容器。与传统的虚拟化技术相比,Docker容器更加轻便且启动速度快。Docker允许开发者将应用及其运行环境打包为一个可移植的容器,从而实现应用的跨平台部署。
Docker和虚拟机都是虚拟化的解决方案,但它们在实现方式和资源使用上有着明显的区别。
docker --version
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update sudo apt-get install docker-ce
sudo docker --version
docker --version
在安装Docker后,可以通过以下命令验证Docker是否安装成功。
docker --version
如果安装成功,将输出Docker的版本信息。
Docker基本命令从Docker Hub拉取一个镜像。
docker pull nginx
列出当前主机上的所有镜像。
docker images
删除指定的镜像。
docker rmi nginx
使用镜像创建并启动一个容器。
docker run -d --name my_nginx nginx
列出当前主机上的所有容器。
docker ps -a
停止指定的容器。
docker stop my_nginx
删除指定的容器。
docker rm my_nginx
将容器的80端口映射到宿主机的8080端口。
docker run -d -p 8080:80 --name my_nginx nginxDockerfile编写与使用
Dockerfile是一个文本文件,包含了构建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 .
FROM
:指定基础镜像。WORKDIR
:设置工作目录。COPY
:将本地文件复制到镜像中。RUN
:在构建镜像时执行命令。EXPOSE
:暴露容器端口。ENV
:设置环境变量。CMD
:设置容器启动命令。假设有一个简单的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()
创建一个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
假设有一个前端应用(使用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_containerDocker常见问题及解决方法
如果容器启动时报错,可以使用以下命令查看容器的日志。
docker logs <container_id>
如果磁盘空间不足,可以清理Docker的缓存和不再使用的镜像和容器。
# 清理Docker的缓存 docker system prune --volumes # 强制删除所有已停止的容器 docker container prune -f # 删除所有未被使用的镜像 docker image prune -a