大家好,关于快速上手 Docker:从新手到高手,全面掌握入门与部署技巧很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
本内容来自@WHAT IS WORTH BUYING APP,观点仅代表作者本人|作者:杨道贤
Docker是玩NAS的重要方式之一。没有Docker 的NAS 就没有灵魂,就像西方不能没有耶路撒冷一样!
自从开始分享教程以来,我发现很多朋友对Docker并不是很了解,有的甚至是一头雾水~这篇文章旨在帮助我们玩家快速掌握Docker的基本使用方法,满足大部分需求,更好玩。 NAS!
某个团体的成员成功一天后:
它很长并且应该尽可能详细;觉得不错的话请点赞、收藏、评论、支持哦~如有疑问请留言/私信
那么,什么是Docker?
Docker 是一种用于快速构建、运行和管理应用程序的工具。简单来说,它帮助我们部署各种项目以及项目所需的各种组件。也可以算是一个运维工具。
以往的项目中,Linux服务器基本上只能通过手动命令进行操作,通过一些脚本来实现部署,还是比较复杂和麻烦(命令多、安装包多、安装步骤复杂)。现在微服务盛行,Docker极大地提高了我们的效率。不需要是运维高手也能轻松玩转!
举个栗子
采用传统方式部署Nginx比较麻烦,一般需要以下步骤:
搜索并下载Nginx包体并上传到Linux服务器进行编译和配置环境。通过Docker安装部署只需要一条命令:
docker run -d --name nginx -p 80:80 nginx
也可以写成:
docker run -d --name nginx -p 80:80 nginx
本质也是一行命令。因为不够直观,所以使用反斜杠来换行。
复制粘贴并按回车键即可自动安装~
当然,这里的命令行缺少一些东西,稍后会讨论;但这种一键部署的方式有那么好玩吗?
Docker 准备工作
想要体验Docker带来的便利,首先要部署Docker。很多情况下,我们一般都会使用SSH工具来连接服务器,并通过命令行进行操作。
品牌NAS
以QNAP 为例,初始化系统后,打开App Center 安装名为Container Station(QNAP 官方Docker 图形化管理工具)的应用程序
Container Station除了让管理Docker变得更容易之外,也是商店中安装一些应用程序的必备条件。这是品牌NAS 的一大优势。学习和了解了Docker之后,有了这个东西的加持,更是如虎添翼!
然后启用SSH服务进行备份
云服务器(VPS)、Linux虚拟机等
这里使用阿里云服务器作为演示平台,操作系统为Debian_12_x64(个人使用推荐Debian/Ubuntu)。其他Linux 发行版也类似。
1.更新软件包列表
输入以下命令并回车,等待软件包安装并更新:
apt更新-y
该命令使系统的包管理器(APT)从配置的源下载最新的包列表,以确保在安装新软件或更新现有软件时获得最新版本。
2.安装常用软件包
输入以下命令:
apt install sudo vim git wget curl -y
日常使用足够了。 Red Hat、CentOS或Fedora等,需要使用各自的包管理器,如yum或dnf来安装软件包。
3.安装Docker和Docker Compose
官方指导手册:https://docs.docker.com/engine/install
输入以下命令:
apt install docker -y # 安装docker docker -v # 验证安装systemctl enable docker # 设置docker 开机自动启动apt install docker-compose -y # 安装docker compose docker-compose -v # 确认docker compose 版本
4.配置图像加速
根据需要,如果图片下载速度很慢,可以配置。
以阿里云为例,提供免费加速器地址,获取入口:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
可以看到官方已经下达了现成的命令
只要一一复制并执行即可。
Docker 入门
首先有两个关键术语:image(镜像)和container(容器)
基础讲解
仍然以Nginx为例,我们文章开头的部署命令如下:
docker run -d --name nginx -p 80:80 nginx
可以看到,我们按回车执行命令后,Docker首先在本地搜索镜像。如果没有,则会搜索并下载对应版本Nginx的镜像,然后自动运行。
镜像不仅包含Nginx本身,还打包了其运行所需的环境、配置和系统功能库。
为了更直观的了解图像,不知您是否使用过该软件的绿色免安装版?下载并解压XX软件园后,无需安装。进入该文件夹,找到.exe文件,双击即可直接使用。 Docker也差不多可以这么理解。
Docker运行镜像时,会为每个应用程序创建一个隔离且独立的环境。这个环境称为容器。这样可以完美避免不同应用程序之间的冲突,实现在同一设备或一个应用程序上部署多个不同环境要求的应用程序。集群部署保证业务的顺利运行。
如图所示,部署了多个Nginx,并且全部启动成功。
命令解读
根据Docker hub官方文档,我们改进了Nginx命令
docker run -d --name nginx -p 80:80 -v /root/docker/data/nginx/html:/usr/share/nginx/html -e TZ=Asia/Shanghai # 用来凑数的变量,方便演示-- network inter #方便演示nginx
docker run -d : 创建并运行一个容器,-d表示让容器以后台模式运行
name nginx : 为容器命名。这完全取决于个人喜好,但必须是独一无二的。
p 80:80 : 设置端口映射
容器是一个隔离的环境,外界无法访问。将容器的80 端口映射到主机的80 端口,这样主机就可以访问容器内运行的服务。容器中的端口由容器中的进程决定,主机端口可以任意指定。例如-p 90:80p 容器中的主机端口: 端口。示例中,主机的80端口映射到容器中的80端口e TZ=Asia /Shanghai : 配置了容器中进程运行时的一些参数,我们称之为环境变量。
格式:-e KEY=VALUE,KEY和VALUE由容器中的进程(作者)决定。 TZ=亚洲/上海是设置时区;官方文档可能包含必填变量和可选变量,部署之前仔细阅读网络inter : 定义了容器网络连接类型,我们将在最后网络部分讲到
nginx : 设置镜像名称,Docker会根据这个名称搜索并下载镜像
格式:repository:tag,如nginx:1.1,其中repository可以理解为镜像名称,tag为版本号。如果不指定TAG,则默认为最新版本,即mysql:latest以上为官方镜像格式。如果要拉取用户自己的镜像,格式为username/my-custom-image:version,如ydxian/nginx:1.1.0。通常ydxian/nginx也默认为最新版本。当然,由于不同的作者,不同的图像有不同的配置。填写不慎可能会导致部署失败。另请阅读安装手册:010 -1010 命令是操作镜像和容器,但不需要硬盘。通过docker help可以快速访问控制台。
所有命令请参见官方文档:https://b11et3un53m.feishu.cn/wiki/MWQIw4Zvhil0I5ktPHwcoqZdnec#YCejdEwpyo2hxRxpDx4cFFkDnQg
对某个容器进行操作时,只需输入命令容器名称/容器ID的前三位即可,例如docker stop nginx或docker stop 024。下图是一些操作演示
Docker 常见命令
首先是一些常用命令https://docs.docker.com/reference/cli/docker/volume
不用背,控制台可以通过dockervolumehelp查看
数据卷
数据卷(volume)是一个虚拟目录,是容器中的目录与宿主机目录之间的映射桥梁。它与上面提到的端口有些相似。
我们继续以Nginx为例。阅读官方文档可知Nginx有两个关键目录:
/usr/share/nginx/html 专门用于托管静态资源,/etc/nginx/nginx.conf 负责保存配置文件。
如果我们要配置这两部分,就必须利用数据卷将这两个目录与主机目录关联起来,以方便操作。

创建两个数据卷html 和conf。 Docker会帮助我们在主机上为这两个数据卷创建真实的目录。位置是var/lib/docker/volums/html/_data 和var/lib/docker/volums/conf /_data
只要是Linux系统下,默认位置是var/lib/docker/volums,在其下根据数据卷名称新建一个目录,格式为/数据卷名称/_data
这样容器中的html和conf就会通过两个数据卷与宿主机对应的目录关联起来。这就是我们常说的挂载。只要我们把静态资源放到主机对应的目录下,就可以被Nginx代理了
基于以上,我们重新部署Nginx:
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
Web输入http://localhost:80或http://host-ip:80出现如下界面
然后进行演示
docker volume ls # 列出所有数据卷,输出如下内容*DRIVER VOLUME NAME local html* docker volume inform html # 显示数据卷的详细信息html,Mountpoint 为主机挂载点*[ { 'CreatedAt': '2024 - 04-09T13:41:08+08:00','驱动程序':'本地','标签': null,'安装点':'/var/lib/docker/volumes/html/_data','名称':'html',' options ': null, 'Scope': 'local' } ]* cd /var/lib/docker/volumes/html/_data ls # 列出静态资源文件,出现以下内容*50x.html index.html* cat index. html # 查看index.html 文件。显示的内容就是我们在web端看到的欢迎页面的内容。
也就是说/var/lib/docker/volumes/html/_data和html数据卷进行了映射,html和/usr/share/nginx/html进行了映射,最后/var/lib/docker/volumes/html是实现了。 /_data 和/usr/share/nginx/html 之间的映射。
结合图片就更明显了
为了进一步验证,我们对index.html进行神奇的修改,看看效果如何。然后在该目录下输入以下命令:
vim 索引.html
修改后的代码如下。张阿姨无法输入html代码,于是截图展示:网站标题和欢迎页文字均已修改,原来的网址已替换为我的个人博客网站
保存后退出并刷新网页界面。结果正如预期的那样。
数据卷是什么
安装的朋友应该很熟悉吧!如果你了解了上面的数据量,那就很简单了!
挂载命令格式必须以/或./开头-v 本地目录: 容器目录-v 本地文件: 容器文件# 例如假设我们的宿主机目录为/root/docker/data/nginx -v html:/usr/share /nginx/html # 这里冒号左边的html会被识别为数据卷-v ./html:/usr/share/nginx/html # ./代表当前目录下的html目录。如果不存在,Docker会自动创建-v /root/docker/data/nginx/html:/usr/share/nginx/html # 主机上的绝对路径,可以直接向Nginx提供主机的静态数据,从而也是最常用、最方便的形式。
那么为什么我们需要将容器中的目录挂载到指定的本地目录呢?原因如下:
数据卷的目录结构很深。前面我们也看到了/var/lib/docker/volumes/html/_data 目录又臭又长,每次操作都非常麻烦!对于某些Docker项目,如果没有主动挂载,会自动生成一个数据卷。看看我的QNAP NAS 自动生成的一长串长字符的数据量!
接下来我们就来演示一下。使用上面的教程,我们卸载并重新安装nginx 并添加html 挂载。
mkdir -p /root/docker/data/nginx/html docker run -d --name nginx -p 80:80 -v /root/docker/data/nginx/html:/usr/share/nginx/html nginx # 此时如果我们对于web访问,会出现403错误,因为host目录为空,需要我们自己提供静态数据cd /root/docker/data/nginx/html ls # 创建文件,复制上一份保存退出vim index.html ls # 看到新文件创建成功。此时刷新Web界面即可再次看到页面。
操作流程图片展示
此时我们刷新Nginx界面。由于没有配置静态数据,所以页面报403错误,但可以肯定Nginx已经部署成功。
通过指令配置静态数据,在原来的基础上将YDXian改为QNAP
再次刷新界面
最后,如果我们挂载配置数据等文件,必须提前准备好相应的目录和文件;如果没有,Docker执行命令后如果找不到nginx.conf文件,会自动创建一个名为nginx.conf的文件夹并报错
v /root/docker/data/nginx/nginx.conf:/etc/nginx/nginx.conf
挂载
网络,顾名思义,我们在命令解释部分稍微提到过它。常见的有:bridge、host、custom三种类型;
网络
是通常的默认网络类型。无需额外设置,容器将连接到该网络。它是一个私有的内部网络,容器之间可以相互通信,主机也可以与容器通信。
Bridge:
删除容器和Docker 主机之间的网络隔离。容器直接使用主机的IP地址和网络端口,这意味着不需要额外的端口映射。使用--network host 可以提高性能并允许容器侦听主机网络上的端口。例如,大家都在使用Emby 等流媒体服务。
Host
对于我们休闲玩家来说,基本不会这么做。如果容器之间需要互相调用而出现问题,可以尝试这种方法。需要提前命名并创建一个新的网桥,比如docker network create inter,然后输入docker network connect inter容器名称让其他人加入。这样加入内网的容器就可以互相访问,并且支持通过容器名称直接访问,无需知道IP。
通过dockerspect nginx可以看到Nginx的IP地址为172.17.0.2
查看另一个容器的信息,IP地址为172.17.0.3
这意味着两个容器位于同一网段。想想我们家中的LAN 设备。同一个路由器/交换机下的设备也可以互相访问吗?
但我有一些疑问。前面说了,容器之间不是相互独立的吗?为什么还能在同一个网段呢?
细心的朋友可能发现了,他们都有同一个网关172.17.0.1。看过我之前教程的朋友们,有没有觉得这个IP很熟悉?是的,我们做反向代理的时候,一般都会填写这个IP!
事实上,从我们安装Docker的那一刻起,它就会自动在设备中安装一个虚拟网卡docker 0,同时也为这个虚拟网卡创建一个虚拟网桥,用于容器和主机之间的通信。其地址为172.17.0.1/16,172.17.0.1是docker0接口的IP地址,/16代表子网掩码,IP地址范围定义为172.17.0.0到172.17.255.255。
注:以上仅适用于大多数情况,具体IP 地址范围可能会因安装和配置的不同而发生变化。
ifconfig ip addr 显示docker0
关于定制,由于使用场景不多,这里只是简单演示。
docker network create inter # 创建一个名为inter network connect inter nginx # nginx 加入inter network connect inter emby # emby 加入inter
如您所见,最初的Nginx 有一个名为inter 的附加网络。
如果此方法无法解决问题,建议先使用docker logs 容器名查看容器日志,了解错误详细信息;或者使用docker exec -it 容器名bash(或sh)进入容器,然后使用curl或其他工具测试容器之间的网络连接。
自定义
docker compose可以帮助我们实现多个相互关联的docker容器的快速部署,这也是它的优点之一。
通过威联通官方的docker 管理工具Container Station 这样部署也很舒服。
粘贴YAML代码后,如果指令不正确,系统将不允许创建操作。根据提示排除故障后才能创建。并且会有提示,我们可以一一排查~下图中,环境后其实是缺少:的。
这就是品牌NAS的好处,面板直观又方便!
笔者日常比较喜欢这样部署。基本语法请参考官方文档:https://docs.docker.com/compose/compose-file/compose-file-v3
Docker Compose
docker-compose 文件中可以定义多个相互关联的应用容器,每个应用容器称为一个服务。由于服务定义了应用程序的运行时参数,因此它与docker 运行参数非常相似。
docker run部署docker run -d --name nginx -p 80:80 -e TZ=Asia/Shanghai -v /root/docker/data/nginx/html:/usr/share/nginx/html --restart=always --network inter # 自定义网络nginx
在许多情况下,部署失败是由格式未对齐、空格缺失以及符号过多/过少引起的。
docker compose deployment version: '3' services: nginx: image: nginx container_name: nginx ports: - '80:80' environment: - TZ=Asia/Shanghai volumes: - /root/docker/data/nginx/html:/usr/share/nginx/html restart3336 0 always networks: #如果是默认的桥接模式,从这里往下全部删除- newsnetwork: news: name: inter
常用对应表列表
与Docker run对比
准备工作差不多,如下
mkdir -p /root/docker/data/nginx # 创建nginx文件目录cd /root/docker/data/nginx # 进入目录mkdir html # 创建要挂载的主机目录cd html # 输入html下的vim索引目录.html # 准备静态数据文件,保存退出cd. # 返回上级目录,返回nginx下的vim docker-compose.yml # 在nginx下创建.yml文件# 将上面的代码粘贴进去,保存退出docker-compose up -d # 开始
执行vim docker-compose.yml后,如果需要编辑,在英文模式下按i即可编辑。编辑完成后,按Esc键返回正常模式,然后同时按Shift和:输入wq(写入并退出)或:q! (不保存退出),按回车键退出。
大致部署流程
事实上,大多数Docker应用程序的部署并不困难。基本的知识和原理你都差不多了解了。部署之前,请阅读官方手册。有很多答案。你可以自己做四五次就差不多了!
祝大家玩得开心,下次再见!
最后
一起来看看经典影音系统大合集吧。成功启动后,您将获得四个已部署的容器。 nastool库已删除(作业要可复制,请提前更换库)
版本: '3' 服务: jellyfin: image: nyanmisaka/jellyfin:最新container_name: jellyfin环境: - PUID=0 - PGID=0 - TZ=亚洲/上海卷: - /share/Container/jellyfin/config:/config - /share/media/video: /video ports33 360 - 8096:8096 - 8920:8920 devices: - /dev/dri:/dev/dri nastool: image: yohe/nastool:2.9.1 container_name: nastool 环境: - PUID=0 - PGID=0 - TZ=亚洲/上海- ALPINE_ MIRROR=镜像网- LANG=C.UTF-8 - NASTOOL_AUTO_UPDATE=false - NASTOOL_CN_UPDATE=true - NASTOOL_CONFIG=/config/config.yaml - NASTOOL_VERSION=master - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin: /sbin:/bin - PYPI_MIRROR=https://pypi.tuna.tsinghua.edu.cn/simple - REPO_URL=https://github.com/jxxghp/nas-tools.git - UMASK=000 - WORKDIR=/nas-toolsvolumes: - /share/Container/nastool /config:/config - /share/media/video:/video ports: - 3000:3000jackett: image: linuxserver/jackett:latestcontainer_name:jackettvolumes: - /share/Container/jackett/config:/config - /share/Container/jackett/downloads33 360 /下载环境: - HOME=/root - LSIO_FIRST_PARTY=true - PATH=/lsiopy/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 - S6_STAGE2_HOOK=/docker -mods -S6_VERBOSITY=1 - TERM=xterm - VIRTUAL_ENV=/lsiopy - XDG_CONFIG_HOME=/config - XDG_DATA_HOME=/config ports: - 9117:9117 qBittorrent: image: linuxserver/qbittorrent:4.4.3 容器名称
: qBittorrent volumes: - /share/Container/qBittorrent/config:/config - /share/media/video:/downloads ports: - 8080:8080 - 6881:6881 - 6881:6881/udp 博客网站搭建项目 Halo 2,官方提供代码,饭喂到嘴里系列 version: "3" services: halo: image: halohub/halo:2.14 restart: on-failure:3 depends_on: halodb: condition: service_healthy networks: halo_network: volumes: - ./halo2:/root/.halo2 ports: - "8090:8090" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] interval: 30s timeout: 5s retries: 5 start_period: 30s command: - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo - --spring.r2dbc.username=root # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。 - --spring.r2dbc.password=mysal_secret - --spring.sql.init.platform=mysql # 外部访问地址,请根据实际需要修改 - --halo.external-url=https://blog.ydxian.love/ halodb: image: mysql:8.1.0 restart: on-failure:3 networks: halo_network: command: - --default-authentication-plugin=caching_sha2_password - --character-set-server=utf8mb4 - --collation-server=utf8mb4_general_ci - --explicit_defaults_for_timestamp=true volumes: - ./mysql:/var/lib/mysql - ./mysqlBackup:/data/mysqlBackup healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"] interval: 3s retries: 5 start_period: 30s environment: # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值 - MYSQL_ROOT_PASSWORD=mysal_secret - MYSQL_DATABASE=halo networks: halo_network:相关问答
答: 首先,你需要了解Docker的基本概念和工作机制,比如容器、镜像、仓库等。其次要学习Docker的常用命令,例如启动、停止、删除、拉取映像等。最后,掌握一些配置和调试技巧,能够解决常见问题。
242 人赞同了该回答
答: 此外,建议阅读官方文档和一些实战教程,通过实践操作加深理解,并探索Docker在实际应用场景中的使用方法。
110 人赞同了该回答
答: 可以选择在线课程或平台学习,例如 Docker 的官方教程、Udacity 或 Udemy 等网站上的Docker课程。这些课程通常包含视频讲解、实验练习和项目案例,能够帮助你更快掌握Docker基础知识和操作技巧。
125 人赞同了该回答
答: 另外,也可以参考一些电子书或者博客文章,深入了解Docker的原理和应用场景。
90 人赞同了该回答





























