<br />
<br />
全网最详细介绍飞牛NAS(Fn OS)之Docker篇+部署兰空图床(lsky-pro)
前言:
很多新同学都开始使用NAS,因为大家都在推荐飞牛,那么很多不懂NAS的同学也开始使用飞牛(Fn OS)NAS,但在使用NAS的都是很多应用都要使用到Docker,哪Docker又是什么?不管是飞牛还是群晖,或者绿联、极空间,就连软路由系统OpenWrt、爱快这些都有Docker,那很多新同学就在问,这个Docker到底是什么?它要怎么使用呢?
Docker 是一个开源的容器化平台,它可以让开发者将应用程序及其所有的依赖项(如库、配置文件等)打包成一个标准化的单元,这个单元被称为容器(Container)。
- 容器的概念
- 容器就像是一个轻量级的虚拟机,但它与虚拟机有很大的区别。容器共享宿主机(运行容器的物理机或虚拟机)的操作系统内核,而虚拟机是在宿主机的操作系统之上模拟出一个完整的操作系统环境。这使得容器在资源利用上更加高效,启动速度更快。例如,一个容器可以在几秒钟内启动,而一个虚拟机可能需要几分钟。
- 每个容器都有自己独立的文件系统、进程空间、网络接口等,就好像是在宿主机上隔离出了一个独立的小环境,用于运行特定的应用程序。以一个 Web 应用为例,你可以把 Web 服务器(如 Nginx)、后端应用程序(如用 Python 编写的 Flask 应用)和数据库(如 MySQL)分别打包成不同的容器,它们可以在同一台宿主机上独立运行,并且相互之间可以通过网络进行通信。
- Docker 的工作原理
- 镜像(Image):镜像是容器的基础,它是一个只读的模板,包含了运行一个容器所需的所有文件和配置信息。例如,你可以有一个 Ubuntu 操作系统的镜像,在这个镜像的基础上安装各种软件来构建出适合运行特定应用的镜像。镜像可以通过 Dockerfile(一个包含构建镜像指令的文本文件)来构建,也可以从 Docker Hub(Docker 官方的镜像仓库)等公共或私有仓库中获取。
- 容器(Container):容器是从镜像创建出来的运行实例。当你使用
docker run
命令时,Docker 会根据指定的镜像创建一个容器并启动它。容器在运行过程中是可以被修改的(例如,在容器内创建新的文件、修改配置等),但是这些修改不会影响到原始的镜像。如果需要保存这些修改,可以将容器提交为一个新的镜像。
- 仓库(Repository):仓库是用于存储和分发镜像的地方。Docker Hub 是最著名的公共仓库,它包含了大量的官方和用户贡献的镜像,涵盖了各种操作系统、数据库、Web 服务器等应用。企业也可以建立自己的私有仓库来存储内部开发和使用的镜像,以保证数据安全和镜像的可控性。
- Docker 的应用场景
- 软件开发与测试:在软件开发过程中,不同的开发人员可能使用不同的操作系统和开发环境。使用 Docker 可以将应用程序和其依赖的环境打包成容器,这样无论在哪个开发环境中,只要安装了 Docker,就可以确保应用程序能够以相同的方式运行。在测试阶段,测试人员也可以快速地拉取包含应用程序和测试环境的容器,进行功能测试、性能测试等各种测试。
- 微服务架构:在微服务架构中,应用程序被分解为多个小型的、独立的服务。每个微服务可以被打包成一个或多个容器,这些容器可以独立地开发、部署和扩展。例如,一个电商应用可以包括用户服务、产品服务、订单服务等微服务,每个微服务都可以在自己的容器中运行,并且可以通过网络接口(如 RESTful API)相互通信。
- 持续集成 / 持续交付(CI/CD):Docker 是 CI/CD 管道中的重要工具。开发人员可以将代码提交到代码仓库,然后通过自动化的构建和测试流程,将代码打包成容器并进行测试。如果测试通过,容器可以被部署到生产环境中。这样可以大大提高软件的交付效率和质量,减少因为环境差异导致的问题。
正文:飞牛NSA的docker菜单介绍
一、设置docker存储位置
在我们安装好飞牛NAS之后会,在应用中心里面有着很多带有docker图标的应用程序
像很多新手飞牛用户使用的迅雷nas版、Alist小雅等应用程序都是带有docker图标的,这就表示这些应用是使用docker容器在运行,而在我们安装这些应用之前,我们需要打开Docker程序设置他的安装位置,不然就容易出现错误
出现这种情况的时候不要着急,我们先打开Docker
在这个界面里面可以看到我们容器的运行状况,docker使用了多少的CPU资源、内存用了多少、网络如何,开启或者关闭docker服务,是否要开机自启等设置。设置完之后再回到应用中心安装带有docker图标的应用就不会出错了;
二、如何使用Docker部署项目
使用飞牛NAS 部署Docker项目有三种方式,分别是:Docker图像UI手动设置、Docker-compose部署和ssh的docker命令直接拉取部署。
今天我们在这里只讲解前面两种方式docker图像UI和docker-compose;
这ssh命令拉取和compose差不多,只是多了几个命令,因为图形UI上手简单,所以我们只讲解简单好上手的方式;
1、飞牛NAS的docker图像UI菜单介绍
概览:
我们在上面有讲解过,概览可以查看整个docker的全部状态,和开启或关闭docker
容器:
我们部署好的全部项目都会在容器这个界面中显示,如果我们需要修改容器设置的话也是在这个界面中,比如我想要修改迅雷的下载目录
在docker里面多少情况都是不支持中文,所以我们在这里看迅雷的容器名称是“xunlei”
而在容器概况概览里面能看到更加详细的信息,像这个容器使用的端口号有哪些,现在都存储映射路径,网络分类,容器运行后使用的命令功能,还有使用的环境变量,每个容器都有属于自己的环境变量,一般情况下这个项目的官网都会公开这些环境变量以及修改方式;
下面我们就开始来修改一下迅雷的下载目录,我们在关闭了迅雷容器之后找到存储设置
容器的路径映射我在文章最后的常用变量中有讲解
如果要修改目录映射后的名称就要在这里修改相应的设置,环境变量的作用是告诉机器AA=11
在容器里面修改完目录后点击保存,然后要飞牛设置-应用-迅雷-添加目录(要和容量里面的一样)再点击应用中心启动迅雷,就设置完成了
Compose:
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用 YAML 文件来配置应用服务,使得可以轻松地在一个主机上创建、启动和管理多个相关联的容器。
- 基本概念
- 服务(Service):在 Docker Compose 中,服务是一个抽象的概念,它代表了一个容器化的应用程序或应用程序的一个组件。例如,一个 Web 应用可能包含一个 Web 服务器服务(如 Nginx)、一个后端应用服务(如用 Python 编写的 Flask 应用)和一个数据库服务(如 MySQL)。每个服务都可以在 Docker Compose 文件中进行独立的配置,包括容器的镜像、环境变量、端口映射、卷挂载等参数。
- 项目(Project):一个由 Docker Compose 管理的一组相关服务构成一个项目。当你使用 Docker Compose 启动一个应用时,所有相关的服务会一起被启动,并且它们之间可以根据配置进行交互。例如,一个简单的博客系统项目可能包括一个 Web 服务器服务、一个博客后端服务和一个数据库服务。
- 配置文件(docker - compose.yml)
- 版本(Version):配置文件的开头通常需要指定版本号,如
version: '3'
(目前常用的版本是 3)。不同的版本号有不同的语法和功能支持。版本号决定了文件中可以使用的配置选项和语法规则。
- 服务配置(Service Configuration)
:
- 镜像(Image):用于指定每个服务所基于的 Docker 镜像。例如,
image: nginx
表示该服务使用官方的 Nginx 镜像。也可以指定自己构建的镜像,如 image: my - private - repo/my - app - image:latest
。
- 容器名称(Container Name):可以通过
container_name
选项为每个容器指定名称。不过如果不指定,Docker Compose 会自动为容器生成一个名称。例如,container_name: my - nginx - container
。
- 端口映射(Port Mapping):使用
ports
选项来配置端口映射,格式与 docker run
命令中的端口映射类似。例如,ports: - "8080:80"
表示将容器内的 80 端口映射到宿主机的 8080 端口。
- 环境变量(Environment Variables):通过
environment
选项来设置服务的环境变量。可以是简单的键值对形式,如 environment: - MYSQL_ROOT_PASSWORD = 123456
,也可以从外部文件中加载环境变量。
- 卷挂载(Volume Mounting):使用
volumes
选项来挂载卷。可以是将宿主机目录挂载到容器内,或者使用命名卷(Named Volume)。例如,volumes: -./data:/app/data
表示将当前目录下的 data
目录挂载到容器内的 /app/data
目录。
- 网络(Networks):可以通过
networks
选项来配置服务所属的网络。例如,创建一个自定义网络 networks: - my - app - network
,然后将多个服务添加到这个网络中,使得这些服务可以在这个网络内部相互通信。
- 常用命令
docker - compose up
:此命令用于启动整个应用,它会根据 docker - compose.yml
文件中的配置创建和启动所有服务的容器。如果容器不存在,会先根据镜像创建容器。如果在配置文件中有更新,docker - compose up
可以自动重建和重新启动相关的容器。可以使用 -d
选项(docker - compose up -d
)来以后台模式启动服务,这样容器会在后台运行,就像使用 docker run -d
命令一样。
docker - compose down
:用于停止和删除由 docker - compose
启动的所有容器、网络和卷(默认情况下,命名卷不会被删除,除非使用 -v
选项)。这是一个清理应用的命令,在重新部署或者不再需要应用的时候使用。
docker - compose ps
:类似于 docker ps
,但它是用于查看由 docker - compose
启动的容器的状态。它会列出每个容器的名称、状态、端口映射等信息,方便了解应用中各个容器的运行情况。
docker - compose logs
:用于查看所有服务容器的日志信息。可以通过服务名称来筛选特定服务的日志,例如 docker - compose logs -f my - service
(-f
选项用于实时跟踪日志,就像 tail - f
命令一样),这样可以方便地调试应用,查看各个容器内部的运行情况。
本地镜像:
我们现在都所有镜像都会在这里,在这里我们可以安装容器,删除镜像,具体如何安装容器,下面我们会案例演示
镜像仓库:
飞牛的镜像仓库是飞牛官方镜像docker官方的镜像仓库的,我们也可以添加自己自建的仓库,或者添加其他第三方仓库;在这里我们不过多讲解,有兴趣的我们下次可以聊聊如何自建docker镜像仓库
网络模式概述:
- 模式概述
- Docker 提供了多种网络模式,用于容器之间以及容器与外部网络之间的通信。这些网络模式包括桥接网络(bridge)、主机网络(host)、无网络(none)和容器网络(container)。
- 桥接网络(bridge)
- 这是 Docker 默认的网络模式。在这种模式下,Docker 会创建一个虚拟的以太网桥(类似于软件交换机),将容器连接到这个桥上。每个容器会分配一个在宿主机上唯一的 IP 地址,这些 IP 地址通常是在一个私有子网中,例如 172.17.0.0/16(具体网段可能因 Docker 配置而不同)。容器可以通过这个 IP 地址相互通信,也可以通过宿主机的 IP 地址与外部网络通信。
- 例如,当启动两个容器时,它们会被分配类似 172.17.0.2 和 172.17.0.3 的 IP 地址,就像它们连接在同一个局域网中的两立的计算机一样。容器内的应用程序可以通过这些 IP 地址进行通信,如一个容器内的 Web 服务可以通过另一个容器的 IP 地址访问其提供的 API 服务。**
- 主机网络(host)
- 在主机网络模式下,容器直接使用宿主机的网络栈,而不是拥有自己独立的网络。这意味着容器和宿主机共享 IP 地址和端口,容器内的服务所监听的端口直接就是宿主机的端口。
- 例如,如果在一个容器内启动一个监听 80 端口的 Web 服务,那么在主机网络模式下,这个服务实际上是在宿主机的 80 端口上监听。这种模式的优点是网络性能高,因为没有中间的网络转换层;缺点是容器之间的网络隔离性较差,而且端口冲突的可能性较大。(不熟悉的不建议使用)
- 无网络(none)
- 这种模式下的容器没有网络连接,就好像它是一个独立于网络之外的封闭环境。容器内部的应用程序无法通过网络与外界通信,也无法与其他容器通信。这种模式适用于一些特殊的应用场景,比如只需要在容器内部进行数据处理,不需要网络交互的情况。
- 容器网络(container)
- 容器网络模式允许一个容器与另一个指定的容器共享网络命名空间。这意味着它们共享相同的网络接口、IP 地址和端口范围等。例如,你可以让一个辅助容器(如日志收集容器)和主应用容器共享网络,这样辅助容器就可以直接访问主应用容器的网络资源,方便收集日志等操作。
- 自定义网络
- 创建自定义网络:可以使用
docker network create
命令创建自定义网络。例如,docker network create my - network
会创建一个名为 my - network
的网络。这个网络可以是桥接网络类型,也可以是其他支持的网络类型,具体取决于参数设置。
- 连接容器到自定义网络:在创建容器时,可以使用
--network
选项将容器连接到自定义网络。例如,docker run - - network my - network my - container - image
会将基于 my - container - image
的容器连接到 my - network
网络中。连接到同一个自定义网络中的容器可以通过容器名称或者容器别名(可以在连接网络时设置)进行通信,而不需要使用 IP 地址,这使得容器之间的通信更加方便和灵活。
- 网络隔离与安全:自定义网络可以提供更好的网络隔离。不同的自定义网络之间的容器默认是不能互相通信的,只有在进行适当的网络配置(如设置网络连接规则)后才能通信。这有助于提高容器应用的安全性,例如,可以将数据库容器所在的网络与 Web 服务器容器所在的网络进行隔离,只允许通过特定的端口和协议进行通信,以防止未经授权的访问。
- 网络通信原理
- 当容器通过桥接网络通信时,Docker 会使用网络地址转换(NAT)技术,将容器内部的私有 IP 地址转换为宿主机的公共 IP 地址,从而实现与外部网络的通信。对于容器之间的通信,数据会通过虚拟的以太网桥进行转发。
- 在主机网络模式下,容器直接使用宿主机的物理网络接口进行通信,没有额外的网络转换层。而在容器网络模式下,共享网络命名空间的容器之间的通信就像在同一个操作系统进程之间通信一样,因为它们共享相同的网络资源。
2、docker图像UI部署案例
我们这次部署的是一个图床(Lsky-Pro),可以让你的图片用链接的方式出现,可以使用在你的博客上面,这个图床还需要使用数据库来存储数据所以我们这里就要部署两个容器
拉取MySQL镜像:
MySQL容器设置:
下载好镜像后,我们先打开文件管理器,创建一个MySQL文件夹来存储MySQL文件配置,然后在MySQL文件夹里面在新建log和mysql这两个文件夹,log是用来保存容器日志的,MySQL是用来存储配置文件的,这个文件夹的保存位置看大家的习惯
建好文件夹后我们回到docker的本地镜像里找到我们下载好的MySQL镜像点击运行
MYSQL_ROOT_PASSWORD=root 这个环境变量的意思是MySQL的root账号密码使用root作为密码,省去了我们后期还要使用ssh命令来修改root的密码,最后面点击下一步,检查设置没问题后点击创建开始运行MySQL容器,这样你就成功的创建了一个能够运行的容器
拉取phpmyadmin镜像:
因为我们已经有MySQL数据库,但是MySQL只能使用命令来使用它,这对于新手来说很麻烦,所以我们就在创建一个容器,使用图像界面来管理我们的数据库;
和上面一样,我们想到镜像仓库拉取phpmyadmin镜像
phpmyadmin容器设置:
phpmyadmin环境变量,看情况添加
PMA_ARBITRARY -设置为1时,将允许连接到任意服务器 PMA_HOST -定义MySQL服务器的地址/主机名 PMA_VERBOSE -定义MySQL服务器的详细名称 PMA_PORT -定义MySQL服务器的端口 PMA_HOSTS -定义逗号分隔的MySQL服务器的地址/主机名列表 PMA_VERBOSES -定义以逗号分隔的MySQL服务器详细名称列表 PMA_PORTS -定义以逗号分隔的MySQL服务器端口列表 PMA_USER和PMA_PASSWORD-定义用于配置身份验证方法的用户名 PMA_ABSOLUTE_URI -定义面向用户的URI HIDE_PHP_VERSION-如果定义,则将隐藏php版本(expose_php = Off)。设置为任何值(例如HIDE_PHP_VERSION = true)。 UPLOAD_LIMIT -如果设置,将覆盖apache和php-fpm的默认值(默认值为2048 kb) PMA_CONFIG_BASE64 -如果设置,将使用变量的base64解码内容覆盖默认的config.inc.php PMA_USER_CONFIG_BASE64 -如果设置,将使用变量的base64解码内容覆盖默认的config.user.inc.php
下面我们在游览器上面输入飞牛ip:端口进入phpmyadmin的图像界面,我这里设置 的端口号是5623,飞牛的ip地址是192.168.100.53
哪我都phpmyadmin的地址就是http://192.168.100.53:5623(注意 “" : ” 是英文的:)
这里使用的账号密码是MySQL数据库的root账号和密码
我们要创建一个图床使用的数据库
拉取Lsky-pro镜像:
Lsky-pro容器设置:
我们要创建一个文件来保存图床的配置文件
到这里我们这三个容器都成功运行了,下面我们要开始设置lsky-pro
游览器新建一个窗口输入飞牛ip地址+lsky端口号我这里的是:192.168.100.53:8289
这里基本不会出现问题,直接点击下一步
没问题就可以点击安装了,安装成功后会出现下面界面
后面的使用教程可以自行百度,要是点击高,可以单独出一个文章
3、docker-compose部署案例
这里我们跳过创建目录的过程,直接讲解docker-compose部署lsky-pro
按要求来改yml文件,都写好了批注
version: '3'
services:
lsky-pro:
container_name: lsky-pro
image: dko0/lsky-pro
restart: always
volumes:
- ./data/html:/var/www/html #映射到本地
ports:
- 7791:80
environment:
- MYSQL_HOST=mysql
- MYSQL_DATABASE=lsky-pro
- MYSQL_USER=lsky-pro
- MYSQL_PASSWORD=lsky-pro
mysql:
image: mysql:8.0
container_name: lsky-pro-db
restart: always
environment:
- MYSQL_DATABASE=lsky-pro
- MYSQL_USER=lsky-pro
- MYSQL_PASSWORD=lsky-pro
- MYSQL_ROOT_PASSWORD=lsky-pro
volumes:
- ./data/db:/var/lib/mysql
以下是对这个 docker - compose.yml
文件的批注:
整体结构和功能
- 这个
docker - compose.yml
文件定义了一个包含两个服务(lsky - pro
和 mysql
)的 Docker Compose 项目,用于部署 lsky - Pro 图床应用及其依赖的 MySQL 数据库。
lsky - pro 服务
container_name: lsky - pro
- 为 lsky - Pro 服务的容器指定了一个易于识别的名称,方便后续对该容器进行操作,比如使用
docker stop/start
等命令时可以直接使用这个名称。
image: dko0/lsky - pro
- 指定了 lsky - Pro 服务所使用的 Docker 镜像。这里使用了自定义的镜像
dko0/lsky - pro
,假设这个镜像已经构建好并且包含了运行 lsky - Pro 应用所需的所有软件和配置。
restart: always
- 配置容器在退出时总是自动重启。这对于保证服务的持续可用性很有用,例如在服务器重启或者容器意外停止的情况下,lsky - Pro 服务能够自动恢复运行。
volumes
部分
-./data/html:/var/www/html
:将本地目录 ./data/html
挂载到容器内的 /var/www/html
目录。这样做的好处是可以方便地在本地修改和更新 lsky - Pro 的代码或配置文件(如果有需要),并且数据可以持久化存储在本地,不会因为容器的删除或重新创建而丢失。
ports
部分
- 7791:80
:将容器内的 80 端口(通常是 lsky - Pro 应用监听的端口)映射到宿主机的 7791 端口。这意味着可以通过访问宿主机的 7791 端口来访问 lsky - Pro 应用,实现了容器内服务与外部网络的通信。
environment
部分
- MYSQL_HOST=mysql
:设置 lsky - Pro 应用连接的 MySQL 数据库主机名。这里使用了 mysql
,是因为在 Docker Compose 网络中,服务之间可以通过服务名称相互访问,另一个服务 mysql
的容器名称就是 lsky - pro - db
,这样配置使得 lsky - Pro 能够找到对应的数据库服务。
- MYSQL_DATABASE=lsky - pro
、- MYSQL_USER=lsky - pro
、- MYSQL_PASSWORD=lsky - pro
:分别指定了 lsky - Pro 应用连接 MySQL 数据库所使用的数据库名、用户名和密码,确保了应用与数据库之间的认证和数据访问的正确性。
mysql 服务
image: mysql:8.0
- 使用官方的 MySQL 8.0 版本镜像来创建数据库容器,保证了数据库的稳定性和功能完整性。
container_name: lsky-pro-db
restart: always
- 与 lsky - Pro 服务容器一样,保证 MySQL 数据库在遇到问题时能够自动重启,维持服务的可用性。
environment
部分
- MYSQL_DATABASE=lsky - pro
、- MYSQL_USER=lsky - pro
、- MYSQL_PASSWORD=lsky - pro
、- MYSQL_ROOT_PASSWORD=lsky - pro
:配置了 MySQL 数据库的相关参数,包括创建的数据库名、普通用户及其密码,以及 root 用户的密码。这些环境变量用于初始化 MySQL 数据库的设置,确保安全性和应用的正确连接。
volumes
部分
-./data/db:/var/lib/mysql
:将本地目录 ./data/db
挂载到容器内的 /var/lib/mysql
目录,用于持久化存储 MySQL 的数据文件。这样即使容器被删除或重新创建,数据库中的数据仍然可以保留。
三、docker常用变量和容器常用环境变量
1、常用变量
1-1、**Dockerfile
中的变量**
FROM
- 说明:用于指定基础镜像,这是构建新镜像的起点。所有的 Docker 镜像都是从一个基础镜像构建而来的。例如,
FROM ubuntu:latest
表示新构建的镜像将基于最新版本的 Ubuntu 操作系统镜像。
- 用途:通过选择合适的基础镜像,可以包含特定操作系统的环境和软件包,减少构建镜像的工作量。不同的应用程序可能需要不同的基础镜像,如基于 CentOS 的镜像用于企业级应用,基于 Alpine 的镜像用于构建小型、轻量级的容器。
RUN
- 说明:用于在镜像构建过程中执行命令。这些命令可以是安装软件包、配置系统环境等操作。例如,
RUN apt -y update && apt -y install nginx
会在构建镜像时更新软件包列表并安装 Nginx 服务器。
- 用途:在构建镜像阶段安装和配置应用程序及其依赖项。可以执行各种 shell 命令来设置镜像内部的环境,如安装数据库服务器(如
RUN yum -y install mariadb -server
用于在基于 CentOS 的镜像中安装 MariaDB)、编译源代码等操作。
CMD
- 说明:用于指定容器启动时要执行的默认命令。例如,
CMD ["nginx", "-g", "daemon off;"]
表示当容器启动时,将执行 Nginx 服务器,并以前台模式运行(daemon off;
是 Nginx 的一个参数,用于让 Nginx 在前台运行,这样容器才能保持运行状态)。
- 用途:定义容器的主要运行任务。与
RUN
不同的是,CMD
的命令是在容器启动时执行的,而 RUN
是在镜像构建阶段执行的。一个容器只能有一个 CMD
指令,如果在 docker run
命令行中指定了其他命令,那么会覆盖 CMD
中的命令。
ENTRYPOINT
- 说明:类似于
CMD
,但它让容器以应用程序或者服务的形式运行。ENTRYPOINT
和 CMD
可以一起使用,CMD
中的参数会作为 ENTRYPOINT
命令的参数。例如,ENTRYPOINT ["python", "app.py"]
表示容器启动时将运行 app.py
这个 Python 应用程序。
- 用途:设置容器启动的主程序,使得容器像一个可执行的程序一样运行。这种方式对于需要传递参数的应用程序很有用,比如在启动一个带有参数的数据库容器时,可以在
ENTRYPOINT
指定数据库服务器启动命令,在 CMD
中指定配置文件等参数。
EXPOSE
- 说明:用于声明容器运行时监听的端口。例如,
EXPOSE 80
表示容器内的应用程序会监听 80 端口,但这并不意味着宿主机的 80 端口就会自动映射到容器的 80 端口,还需要在 docker run
命令中使用 -p
或 -P
参数进行端口映射。
- 用途:告知外界容器内的应用程序所使用的端口,方便在运行容器时进行正确的端口映射,从而使外部可以访问容器内的服务。例如,对于一个 Web 应用容器,通过
EXPOSE
声明其 Web 服务的端口,然后在部署时通过端口映射让外部用户可以通过浏览器访问该 Web 应用。
ENV
- 说明:用于设置环境变量。例如,
ENV MYSQL_ROOT_PASSWORD=123456
可以在镜像构建过程和容器运行时设置 MySQL 的根密码环境变量。
- 用途:方便在容器内部的应用程序读取配置信息,也可以用于在构建过程中传递参数。许多应用程序通过读取环境变量来获取配置信息,如数据库连接字符串、日志级别等。通过
ENV
设置这些变量可以让应用程序在不同的环境(如开发、测试、生产)中使用不同的配置。
VOLUME
- 说明:用于创建挂载点,将容器内的目录挂载到宿主机或者其他存储设备上。例如,
VOLUME ["/data"]
会在容器内创建一个 /data
目录,这个目录可以被挂载到宿主机上的某个目录,方便数据的持久化存储和共享。
- 用途:实现数据的持久化和共享。对于数据库容器,通过
VOLUME
将数据库的数据目录挂载到宿主机上,即使容器被删除,数据仍然可以保留。同时,也可以用于在多个容器之间共享数据,比如一个存储配置文件的容器可以通过 VOLUME
将配置文件目录共享给其他容器。
WORKDIR
- 说明:用于设置容器内的工作目录。例如,
WORKDIR /app
表示容器内后续的命令(如 RUN
、CMD
等指令中的命令)将默认在 /app
目录下执行。
- 用途:为容器内的操作提供一个统一的工作目录,方便管理文件和执行命令。比如在构建一个 Web 应用容器时,将
WORKDIR
设置为 Web 应用的代码目录,这样在安装依赖项、运行应用程序等操作时就可以在这个目录下进行。
1-2、**docker run
命令中的变量(部分)**
-p
或 -P
(端口映射)
- 说明:
-p
用于指定宿主机端口和容器端口的映射关系,格式为 -p [宿主机端口]:[容器端口]
。例如,-p 8080:80
表示将宿主机的 8080 端口映射到容器的 80 端口,这样通过访问宿主机的 8080 端口就可以访问容器内监听 80 端口的服务。-P
则是随机将容器内暴露的端口(通过 EXPOSE
声明)映射到宿主机的高端口。
- 用途:实现容器内服务与外部网络的通信。这是在运行容器时非常重要的参数,用于将容器内运行的 Web 服务器、数据库服务器等服务的端露给外部网络,使得外部用户或其他服务可以访问容器内的服务。**
-v
(卷挂载)
- 说明:用于将宿主机的目录或文件挂载到容器内的目录,格式为
-v [宿主机路径]:[容器内路径]
。例如,-v /host/data:/container/data
表示将宿主机的 /host/data
目录挂载到容器内的 /container/data
目录,这样容器内的应用程序就可以访问和操作宿主机上的文件,同时也可以实现数据的持久化存储。
- 用途:和
VOLUME
指令配合,用于数据的持久化和共享。在运行容器时,可以将重要的数据目录(如数据库数据目录、应用程序配置文件目录)挂载到宿主机上,以防止容器删除或重新创建时数据丢失。同时,也可以用于在开发过程中,将本地代码目录挂载到容器内,方便调试和开发。
-e
(环境变量设置)
- 说明:用于在运行容器时设置环境变量,格式为
-e [环境变量名]=[环境变量值]
。例如,-e DEBUG=true
可以在容器运行时设置一个名为 DEBUG
的环境变量,其值为 true
,容器内的应用程序可以读取这个环境变量来调整运行模式,如开启调试模式。
- 用途:动态地设置容器内的环境变量,在不同的运行场景下(如测试环境和生产环境)可以通过
-e
参数传递不同的环境变量值,从而改变容器内应用程序的行为。这比在 Dockerfile
中使用 ENV
更加灵活,因为 ENV
是在构建镜像阶段就固定了环境变量的值。
--name
(容器名称)
- 说明:用于给运行的容器指定一个名称。例如,
--name my_web_container
会将运行的容器命名为 my_web_container
。
- 用途:方便对容器进行管理和引用。通过容器名称,可以更容易地识别容器的用途,并且在执行其他
docker
命令(如 docker stop
、docker start
、docker logs
等)时可以直接使用容器名称而不是容器 ID,使操作更加方便。
2、容器常用变量
HTTP_PROXY 和 HTTPS_PROXY
- 说明:在企业网络环境或者需要通过代理服务器访问互联网的场景中,这两个环境变量用于设置 HTTP 和 HTTPS 协议的代理服务器地址。例如,
HTTP_PROXY=http://proxy.example.com:8080
和 HTTPS_PROXY=https://proxy.example.com:8080
。
- 用途:当 Docker 在构建镜像(例如,使用
RUN
指令从互联网下载软件包)或者容器内的应用程序需要访问外部网络资源时,通过设置代理环境变量,可以使这些操作通过指定的代理服务器进行。这样可以满足企业网络安全策略或者解决网络访问限制的问题。
2-1、**PATH**
- 说明:这是一个在操作系统中广泛使用的环境变量,用于指定命令的搜索路径。在 Docker 容器中,
PATH
环境变量定义了容器内系统在执行命令时查找可执行文件的目录列表。例如,在 Ubuntu 容器中,默认的 PATH
可能包含 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
。
- 用途:可以通过修改
PATH
环境变量来添加新的可执行文件目录。比如,当在容器内安装了一个新的软件,并且希望可以在任何目录下直接使用该软件的命令行工具时,就可以将该软件的安装目录添加到 PATH
中。例如,安装了一个自定义的脚本工具到 /app/scripts
目录,通过设置 PATH=$PATH:/app/scripts
,就可以在容器内的任何位置执行这个脚本工具。
2-2、**JAVA_HOME**
- 说明:对于 Java 应用程序,
JAVA_HOME
环境变量指定了 Java 开发工具包(JDK)或者 Java 运行时环境(JRE)的安装目录。例如,JAVA_HOME=/usr/lib/jvm/java - 8 - openjdk - amd64
。
- 用途:许多 Java 应用程序和工具(如 Maven、Tomcat 等)需要知道
JAVA_HOME
的位置来正确运行。在 Docker 容器中,当构建和运行 Java 应用时,正确设置 JAVA_HOME
可以确保这些应用能够找到 Java 相关的库和工具。例如,在构建一个基于 Java 的 Web 应用容器时,通过设置 JAVA_HOME
并将其添加到 PATH
环境变量(如 PATH=$PATH:$JAVA_HOME/bin
),可以方便地执行 Java 命令(如 java
、javac
等)来启动和编译应用程序。
2-3、**PYTHONPATH**
- 说明:对于 Python 应用程序,
PYTHONPATH
环境变量用于指定 Python 解释器查找模块的路径。例如,PYTHONPATH=/app/src:/app/libs
表示 Python 解释器在查找模块时,除了默认的系统路径外,还会在 /app/src
和 /app/libs
目录中查找。
- 用途:在构建和运行 Python 容器应用时,通过设置
PYTHONPATH
,可以方便地组织 Python 代码的目录结构。例如,将应用程序的源代码目录和依赖的库目录添加到 PYTHONPATH
中,使得 Python 解释器能够正确地导入模块,从而确保应用程序能够顺利运行。
2-4、**NODE_ENV**
- 说明:在 Node.js 应用程序中,
NODE_ENV
是一个常用的环境变量,用于指定应用程序的运行模式。通常可以设置为 development
(开发模式)、production
(生产模式)或者 test
(测试模式)。例如,NODE_ENV=production
。
- 用途:不同的运行模式下,Node.js 应用程序可能会有不同的行为。在开发模式下,可能会启用详细的日志记录和热重载等功能;在生产模式下,可能会对应用程序进行优化,如压缩代码、缓存资源等。通过设置
NODE_ENV
环境变量,应用程序可以根据其值来调整自身的配置和行为。