Docker容器

Docker部署实战:新手入门指南

本文主要是介绍Docker部署实战:新手入门指南,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
概述

本文详细介绍了Docker部署实战的相关内容,从Docker的基础概念到环境搭建,再到基本命令和Dockerfile的使用,帮助读者全面了解如何使用Docker部署应用。文章还提供了多个实战案例,包括部署一个简单的Web应用和MySQL数据库,并讲解了容器间通信的配置。

Docker基础概念

什么是Docker

Docker是一种基于容器技术的轻量级虚拟化解决方案,它可以将应用及其依赖环境封装为一个独立的容器。与传统的虚拟化技术相比,Docker容器更加轻便且启动速度快。Docker允许开发者将应用及其运行环境打包为一个可移植的容器,从而实现应用的跨平台部署。

Docker与虚拟机的区别

Docker和虚拟机都是虚拟化的解决方案,但它们在实现方式和资源使用上有着明显的区别。

  • 资源使用:虚拟机使用独立的操作系统,因此每个虚拟机都需要一套完整的操作系统和内核,资源消耗较大。而Docker容器则共享宿主机的操作系统内核,因此资源占用较小。
  • 启动速度:由于Docker容器直接运行在宿主机的操作系统之上,因此启动速度较快,通常只需几秒钟。而虚拟机由于需要加载整个操作系统,启动速度相对较慢。
  • 隔离性:虚拟机提供了完整的系统级隔离,每个虚拟机都有独立的操作系统和内核,而Docker容器共享宿主机的操作系统内核,隔离性稍弱。

Docker的三大核心概念:镜像、容器、仓库

  • 镜像:镜像是一个包含运行环境和应用代码的只读模板。镜像文件通常保存在Docker仓库中,用户可以从仓库中下载镜像来创建容器。
  • 容器:容器是镜像的运行实例,它是一个独立的运行环境,包含了应用及其依赖环境。容器可以通过Docker命令启动、停止和删除。
  • 仓库:仓库是一个存储和分发Docker镜像的中心,常见的仓库有Docker Hub和阿里云仓库等。用户可以将自己的镜像推送到仓库,也可以从仓库中拉取其他用户的镜像。
Docker环境搭建

在Windows/Linux/Mac上安装Docker

Windows上安装Docker

  1. 访问Docker官网(https://www.docker.com/products/docker-desktop)下载适用于Windows的Docker Desktop。
  2. 运行安装程序,安装过程中可能需要安装Windows Subsystem for Linux(WSL),请按照提示完成安装。
  3. 安装完成后,启动Docker Desktop,检查Docker是否成功安装。
    docker --version

Linux上安装Docker

  1. 更新包管理器的缓存。
    sudo apt-get update
  2. 安装必要的包以允许apt通过HTTPS使用存储库。
    sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
  3. 添加Docker官方的GPG密钥。
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. 添加DDoctor存储库。
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  5. 更新包管理器的缓存,并安装Docker CE。
    sudo apt-get update
    sudo apt-get install docker-ce
  6. 验证安装。
    sudo docker --version

Mac上安装Docker

  1. 访问Docker官网(https://www.docker.com/products/docker-desktop)下载适用于Mac的Docker Desktop。
  2. 运行安装程序,安装完成后启动Docker Desktop。
  3. 检查Docker是否成功安装。
    docker --version
Docker安装验证

在安装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部署实战案例

使用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和镜像的最新版本可以避免已知的安全漏洞。
这篇关于Docker部署实战:新手入门指南的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!