Docker是一个应用打包、分发、部署的工具,它的特性包括跨平台、支持多种系统、性能好、自动化程度高和稳定性好。与普通虚拟机相比,Docker更轻量级,只虚拟软件所需运行环境,最大化减少没用的配置。Docker的部署方式包括打包、分发和部署。打包是把你软件运行所需的依赖、第三方库、软件打包到一起,变成一个安装包;分发是把你打包好的“安装包”上传到一个镜像仓库,其他人可以非常方便的获取和安装;部署是拿着“安装包”就可以一个命令运行起来你的应用,自动模拟出一模一样的运行环境,不管是在Windows/Mac/Linux上。

Docker部署的优势在于确保了不同机器上跑都是一致的运行环境,不会出现我机器上跑正常,你机器跑就有问题的情况。使用Docker的简要介绍包括挂载目录创建虚拟网络、创建dockerfile文件+一个yml文件和执行docker-compose up -d 命令即可实现多个容器通信-d 以后台的方式运行容器。

Dockerfile和docker-compose区别在于单个。

Docker是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。Docker有以下几个主要的功能:

- 镜像:Docker使用镜像来创建和运行应用程序。镜像是一个只读的模板,其中包含了运行应用程序所需的所有文件和设置。

- 容器:容器是镜像的运行实例。每个容器都是独立的,并可以在不同的环境中运行。

- 仓库:Docker使用仓库来存储和管理镜像。

- 命令行界面:Docker提供了一个命令行界面,用于管理容器、镜像和仓库。

关于Docker命令介绍,你可以参考这个链接 。

Redis 官网:https://redis.io/

在 Redis 官网上,您可以找到下载安装教程。然而,这些教程仅提供源码安装方式,没有针对 Windows 版本的安装指南。如果您想自己安装 Windows 版本,需要寻找其他人编译好的安装包。

Docker 官方镜像仓库查找 Redis:https://hub.docker.com/

要使用 Docker 运行 Redis,您可以在 Docker 官方镜像仓库中查找 Redis。以下是一个简单的命令示例:

```bash

docker run -d -p 6379:6379 --name redis redis:latest

```

这个命令将后台运行一个名为 "redis" 的容器,并将容器的 6379 端口绑定到主机的 6379 端口。您可以在 Docker Desktop 中查看容器和镜像,以及容器的状态(正在运行)。

要查看 Redis 容器的运行日志,您可以使用 `redis-cli` 命令行工具。例如:

```bash

redis-cli logs

```

其中 `` 是您为 Redis 容器指定的名称。

接下来,我们将介绍如何使用 Docker 安装 WordPress。首先,创建一个名为 `docker-wordpress.yml` 的文件,内容如下:

```yaml

version: '3'

services:

wordpress:

image: wordpress:latest

ports:

- "8000:80"

environment:

WORDPRESS_DB_HOST: db

WORDPRESS_DB_USER: user

WORDPRESS_DB_PASSWORD: pass

WORDPRESS_DB_NAME: dbname

volumes:

db: {}

```

在这个配置文件中,我们使用了官方的 WordPress Docker 镜像,并将其暴露在主机的 8000 端口上。同时,我们还设置了一些环境变量,用于连接到 MySQL 数据库。最后,我们创建了一个名为 "db" 的卷,用于持久化数据。

version: '3.1'

services:

wordpress:

image: wordpress

restart: always

ports:

- 8080:80

environment:

WORDPRESS_DB_HOST: db

WORDPRESS_DB_USER: exampleuser

WORDPRESS_DB_PASSWORD: examplepass

WORDPRESS_DB_NAME: exampledb

volumes:

- wordpress:/var/www/html

db:

image: mysql:5.7

restart: always

environment:

MYSQL_DATABASE: exampledb

MYSQL_USER: exampleuser

MYSQL_PASSWORD: examplepass

MYSQL_RANDOM_ROOT_PASSWORD: '1'

volumes:

- db:/var/lib/mysql

volumes:

wordpress:

db:

Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化。使用 Docker 可以简化应用的部署、扩展和管理。

以下是一些常用的 Docker 命令:

1. `docker run`:运行一个容器,可以指定可选参数,如端口映射、名称等。如果没有指定镜像,则会先下载镜像。

2. `docker build`:根据 Dockerfile 文件构建镜像。

3. `docker image ls`:列出本地所有的镜像。

4. `docker-compose up`:启动并管理多个容器,例如 Nginx、MySQL 和 Redis 等服务。

5. `docker-compose down`:停止并删除由 docker-compose 创建的所有容器。

6. `docker exec`:在运行中的容器中执行命令。

7. `docker logs`:查看容器的日志输出。

8. `docker cp`:在容器和主机之间复制文件或目录。

9. `docker commit`:将容器保存为新的镜像。

10. `docker save`:将镜像保存为 tar 归档文件。

11. `docker load`:从 tar 归档文件加载镜像。

12. `docker network`:管理 Docker 网络。

13. `docker volume`:管理 Docker 卷。

14. `docker-machine`:管理多台 Docker 主机。

八、目录挂载

现存问题:

- 未挂载:`docker run --name c_test demo_1:v0`

- 挂载:`docker run --name a_test -v E:\docker_all:/docker_all -d demo_1:v0`

几种挂载方式:

- bind mount:使用绝对路径 `-v D:/code:/app`

- volume:只需要一个名字 `-v db-data:/app`

文档参考:https://docs.docker.com/storage/

挂载演示(在run的时候挂载):

bind mount方式:`docker run -p 8080:8080 --name test-hello -v D:/code:/app -d test:v1`

不执行挂载截图

挂载后截图

执行命令进行挂载,还是按前面的案例

```bash

docker run --name a_test -v F:\docker_project\abc:/app -d demo_1:v0

```

然后打开桌面docker的容器点击,查看Inspect里面的Mounts,路径挂载成功,此时你修改自己本地的代码,容器的代码也会同时跟着修改。

九、多容器通讯

创建虚拟网络:

要想多容器之间互通,从 Python 容器访问 Redis 容器,我们只需要把他们放到同个网络中就可以了。

```pythonimport redis

from redis.StrictRedis import StrictRedis

# 创建一个名为test-net的网络

docker network create test-net

# 运行 Redis 在 test-net 网络中,别名redis

docker run -d --name redis --network test-net --network-alias redis redis:latest

# 修改python的redis连接地址为网络别名

r = StrictRedis(host='redis', port=6379, db=0, password=None)

# 运行 Python 项目,使用同个网络

docker run -p 8011:8011 --name test -v F:\docker_project\abc:/app --network test-net -d demo_1:v0

```

你好,你可以通过修改Dockerfile文件来实现你的需求。具体来说,你可以在Dockerfile中添加或修改指令,以便在构建镜像时使用。例如,如果你想要将端口号从8011更改为8012,可以在Dockerfile中添加以下指令:

```

EXPOSE 8012

```

这将告诉Docker在构建镜像时公开端口8012。然后,你可以使用docker build命令重新构建镜像。如果你使用的是Windows系统,需要确保在命令提示符下运行此命令。

```dockerfile

# 第一行是解析器指令,始终用版本1语法的最新版本

# 基础镜像 FROM python:3.7-slim-buster

# 设置工作目录文件夹 WORKDIR ./app

# 复制依赖文件 COPY requirements.txt requirements.txt

# 安装依赖 RUN /usr/local/bin/python -m pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/

# RUN pip install uvicorn -i https://mirrors.aliyun.com/pypi/simple/

# RUN pip install fastapi -i https://mirrors.aliyun.com/pypi/simple/

# RUN pip install redis -i https://mirrors.aliyun.com/pypi/simple/

# # RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

# # 复制其他的脚本文件 COPY . .

# 当启动容器时候,执行程序 CMD ["python", "./docker_web.py"]

FROM python:3.7-slim-buster

WORKDIR ./app

COPY requirements.txt requirements.txt

RUN /usr/local/bin/python -m pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/

RUN pip install uvicorn -i https://mirrors.aliyun.com/pypi/simple/

RUN pip install fastapi -i https://mirrors.aliyun.com/pypi/simple/

RUN pip install redis -i https://mirrors.aliyun.com/pypi/simple/

# RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

# 复制其他的脚本文件 COPY . .

CMD ["python", "docker_web.py"]

```

执行`docker build`命令构建镜像。

执行`docker run`命令运行容器。

1、构建镜像并挂载

```bash

docker build -f F:\docker_project\abc\dockerfile -t demo_2:v0 .

```

# 2、运行容器,不设置虚拟网络

```bash

docker run --name d_test -p 8011:8011 -v F:\docker_project\abc:/app -d demo_2:v0

```

# 3、测试浏览器打开 http://localhost:8011/aa,会发现一直无法加载,原因是无法连接redis

# 4、下载redis镜像

```bash

docker pull redis

```

# 5、创建网络

```bash

docker network create test-net

```

# 6、运行redis容器,并设置网络别名为redis

```bash

docker run -d --name redis_net --network test-net --network-alias redis redis:latest

```

# 7、修改python代码以及redis连接地址

```python

from flask import Flask, request

from redis import Redis,StrictRedis

import os

app = Flask(__name__)

r = StrictRedis(host=os.environ['REDIS_ADDR'], port=6379, db=0, password=None)

@app.get("/{_word}")

def index(_word):

print("web_return", _word)

r.rpush('web_name', _word)

print("redis_llen:", r.llen('web_name'))

return f"{r.llen('web_name')}_{_word}"

```

# 8、运行Web项目,使用同个网络

```bash

docker run -p 8011:8011 --name test2 -v F:\docker_project\abc:/app --network test-net -d demo_2:v0

```

# 9、再次浏览器打开 http://localhost:8011/aa 测试看看

现存问题:在上节中,我们运行了两个容器:Web项目和Redis。如果项目依赖更多的第三方软件,我们需要管理的容器就更加多,每个都要单独配置运行,指定网络。为了解决这个问题,本节我们将使用docker-compose把项目的多个服务集合到一起,一键运行。

安装Docker Compose:

首先,我们需要安装Docker Compose。请参考官方文档进行安装:https://docs.docker.com/compose/install/

编写脚本:

接下来,我们需要编写一个名为`docker-compose.yml`的脚本文件。在这个文件中,我们将定义项目的各个服务及其配置。

```yaml

version: "3.7"

services:

app:

build: ./

ports:

- 8011:8011

volumes:

- ./:/docker_all

environment:

- TZ=Asia/Shanghai

redis:

image: redis:5.0.13

volumes:

- redis:/data

environment:

- TZ=Asia/Shanghai

volumes:

redis:

```

跑起来:

现在我们已经编写好了脚本文件,接下来我们需要运行这个脚本来启动项目的所有服务。在命令行中执行以下命令:

```bash

docker-compose up

```

命令参考:https://docs.docker.com/compose/reference/up/

docker-compose其他命令:

- 在后台运行只需要加一个`-d`参数:`docker-compose up -d`

- 查看当前多个服务运行状态:`docker-compose ps`

- 停止运行:`docker-compose stop`

- 重启:`docker-compose restart`

一、Docker 常用命令

1. 重启单个服务:`docker-compose restart service-name`

2. 进入容器命令行:`docker-compose exec service-name sh`

3. 查看容器运行日志:`docker-compose logs [service-name]`

二、镜像仓库介绍及使用方法

1. 镜像仓库用来存储我们 build 出来的“安装包”,Docker 官方提供了一个镜像库,里面包含了大量镜像,基本各种软件所需依赖都有,要什么直接上去搜索。

2. 我们也可以把自己 build 出来的镜像上传到 docker 提供的镜像库中,方便传播。

3. 当然你也可以搭建自己的私有镜像库,或者使用国内各种大厂提供的镜像托管服务,例如:阿里云、腾讯云。

三、上传镜像的方法

1. 创建一个镜像库:`docker build -f E:\docker_all\dockerfile -t test:v1 .`

2. `docker login -u 用户名`

3. `docker tag test:v1 用户名/test:v1`

4. `docker push 用户名/test:v1`

5. `docker run -dp 8080:8080 用户名/test:v1`

四、阿里云容器托管使用方法

1. Docker 官方的镜像托管有时候上传和下载都太慢了,如果你想要更快的速度,可以使用阿里云的免费镜像托管。

2. 登录阿里云,备份数据迁移。

3. 报错解决:

1. WSL 2 installation is incomplete.

解决步骤1:控制面板->程序->程序和功能,打开如下勾选,如还有问题看步骤2。

解决步骤2:点击链接安装最新版本的 WSL2。

下载地址,如果还有问题看步骤3。

执行命令:`netsh winsock reset`

2. Docker Desktop is unable to detect a Hypervisor.

问题出在 Hyper-V 已禁用或 Hypervisor 代理未运行。方案一 (如果完全禁用或未安装 Hyper-V):`docker desktop 基于 windows hyper-v,必须确保 hyper-v 组件已经开启。可通过如下 PowerShell (管理员身份)命令启动。```powershell

1、以管理员身份打开CMD

2、启用Hyper-V:`dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All`

```

方案一:

1. 打开“控制面板”->“程序”->“启用或关闭Windows功能”。

2. 在弹出的窗口中,找到“Hyper-V”选项,取消勾选。

3. 点击“确定”,系统会提示需要重启电脑,点击“立即重启”。

4. 重启后,再次进入“启用或关闭Windows功能”窗口,勾选“Hyper-V”,然后点击“确定”。

5. 系统会自动安装Hyper-V相关组件,等待安装完成后,即可正常使用Docker Desktop。

方案二 (如果Hyper-V功能已启用但不起作用)

1. 确保Hyper-V守护进程已启动。可以通过以下PowerShell命令启动(管理员身份):

```powershell

bcdedit /set hypervisorlaunchtype auto

```

2. 重启电脑,启动Docker Desktop,即可正常运行。

确保 BIOS 已开启虚拟化功能是非常重要的,下面是如何检查并操作的步骤:

首先,你需要查看你的系统是否已经开启了虚拟化。你可以通过在命令提示符(CMD)中输入 `wmic cpu get /format:list` 命令来查看你的 CPU 是否支持虚拟化技术。如果输出的信息中包含 "vmx" 或 "svm",那么说明你的 CPU 支持虚拟化。

然后,你需要进入 BIOS 并确认虚拟化已经被开启。具体的操作方法会因为不同的主板品牌和型号而有所不同。一般来说,你可以在电脑开机时按下特定的键(比如 F2、F10、Del 等)来进入 BIOS 设置。在 BIOS 界面中,你需要找到 "Advanced"、"CPU Configuration" 或者类似的选项,然后在其中找到关于虚拟化的设置。如果找到了 "Intel Virtualization Technology" 或者 "AMD-V",那么说明虚拟化已经被开启。

如果你无法在 BIOS 中找到这些选项,或者找不到如何开启虚拟化的方法,你可以尝试在网上搜索你的主板型号 + "BIOS 设置"。网上通常会有详细的教程指导你如何进行操作。需要注意的是,Intel 和 AMD 的 BIOS 设置方法可能会有所不同,所以你可能需要根据你的具体主板型号来查找相应的设置方法。