如何自建NAS以及玩出花(七):整活的开端:docker
如何自建NAS以及玩出花(七):整活的开端:docker
在计算世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化(hypervisor virtualization,HV)有所不同,管理程序虚拟化通过中间层将一台或多台独立的机器虚拟运行于物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间。因此,容器虚拟化也被称为“操作系统级虚拟化”,容器技术可以让多个独立的用户空间运行在同一台宿主机上。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。大多数Docker容器只需不到1秒钟即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户可以尽可能充分地利用系统资源。
简单介绍了docker,对于我们的NAS来说,docker的快速打包应用,无视本地系统环境的虚拟化,以及超级方便的配置,使得NAS安装复杂的服务有了一个简单的途经。甚至只需要一条命令,即可完成之前几篇文章一起才能做到事情。无需复杂的配置,所有的设置、环境都在镜像中包含好了,你只需要把它下载下来,像是启动程序一样运行即可。
docker的安装
请注意你使用哪一个 Ubuntu 系统不重要。并且你使用 Ubuntu 桌面或服务器版本,亦或者其他 Ubuntu 变种如 Lubuntu 、Kubuntu 、Xubuntu ,都不重要。
只要你的系统内核版本不低于 3.10 ,并且是 64 位系统,Docker 都会正常运行。
使用 uname
命令查看内核版本。
uname -a
Linux home 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux # 输出样例
docker可以通过 apt
命令安装,在此之前先升级以下ubuntu的程序。
sudo apt update && sudo apt upgrade -y
如果你之前安装过docker,那么新安装docker时需要卸载docker的旧版本
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
ubuntu通过apt进行安装,但是apt中并没有docker的安装文件,这是因为docker是自己发布apt的。
安装 apt 依赖包,用于通过HTTPS来获取仓库:
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
之后添加docker官方的GPG公钥:
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
并将公钥添加到apt源当中:
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
如果成功的话,我们就可以通过apt进行安装了:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装好后我们先运行第一个docker容器:
sudo docker run hello-world
设置普通用户使用docker
如果docker已经安装好了,你会发现所有的docker命令都要使用 sudo
提权,这是因为Docker守候进程绑定的是一个unix socket,而不是TCP端口。这个套接字默认的属主是root,其他是用户可以使用sudo命令来访问这个套接字文件。因为这个原因,docker服务进程都是以root帐号的身份运行的。
解决方案就是创建一个docker用户组,并把相应的用户添加到这个分组里面。当docker进程启动的时候,会设置该套接字可以被docker这个分组的用户读写。这样只要是在docker这个组里面的用户就可以直接执行docker命令了。
-
创建docker分组,并将相应的用户添加到这个分组里面。
# 记得将$USER改为自己的用户名 sudo usermod -aG docker $USER
-
退出,然后重新登录,以便让权限生效。
-
确认你可以直接运行docker命令。
docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
这样我们以后执行docker就可以不用 sudo
命令了。
docker的换源与配置
换源
在默认安装之后,通过命令docker pull 拉取镜像时,默认访问docker hub上的镜像,在国内网络环境下,下载时间较久,所以要配置国内镜像仓库。
-
新建或编辑daemon.json
vim /etc/docker/daemon.json
-
daemon.json中编辑如下,改换成网易源:
{ "registry-mirrors": ["http://hub-mirror.c.163.com"] }
-
重启docker
sudo systemctl restart docker
-
查看是否换源成功
docker info
下面是一些国内的docker镜像地址,可以根据自己的网速选择:
1.网易
http://hub-mirror.c.163.com
2.Docker中国区官方镜像
https://registry.docker-cn.com
3.中国科技大学
https://docker.mirrors.ustc.edu.cn
4.阿里云容器 服务
https://cr.console.aliyun.com/
首页点击“创建我的容器镜像” 得到一个专属的镜像加速地址,类似于“https://1234abcd.mirror.aliyuncs.com”
配置
配置只需要注意一点,docker的默认安装和下载镜像的位置在 /var/lib/docker
,通常情况下,/var
目录在 /
目录下,而后续我们要安装很多的docker镜像,占用大量空间,而 /
目录作为系统安装磁盘,不需要很大。同时有些服务的配置文件也会写在容器中,如果后续系统出现问题,这部分已经配置好的容器就会丢失。
所以我们需要修改docker的默认安装位置:
还是修改之前的 /etc/docker/daemon.json
文件,修改path路径为绝对路径到你想放的地方:
{
"registry-mirrors":[
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
"data-root": "path/docker"
}
docker的使用
docker的使用就比较复杂了,主要使用Shell界面,但是如果后续我们Portainer这样的控制面板也是能够解决的。但是使用Shell界面还是可以帮助我们解决一些面板解决不了的问题,所以还是有必要学习一下。
首先看一下docker中的基本概念:
Docker 包括几个个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
- 客户端:是一个命令行工具,可以让您与 Docker 引擎进行交互,执行各种操作,比如创建、运行、停止、删除容器等。
- 服务器:是一个后台进程,可以接收 Docker 客户端的请求,执行容器的管理和操作。
- 网络:是一个虚拟的网络层,可以让容器之间或容器和外部进行通信。您可以使用 Docker 客户端来创建、查看、修改、删除网络。
- 卷:是一个持久的数据层,可以让容器的数据在容器之间或容器和主机之间共享和存储。您可以使用 Docker 客户端来创建、查看、修改、删除卷。
docker info
首先是 docker info
,之前已经见到过了,该命令会返回所有容器和镜像的数量、docker使用的执行驱动和存储驱动,以及docker的基本配置。
docker info
Containers: 1
Images: 8
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 10
Execution Driver: native-0.2
Kernel Version: 3.13.0-43-generic
Operating System: Ubuntu 14.04.2 LTS
CPUs: 1
Total Memory: 994 MiB
Name: riemanna
ID: DOIT:XN5S:WNYP:WP7Q:BEUP:EBBL:KGIX:GO3V:NDR7:YW6E:VFXT:FXHM
WARNING: No swap limit support
docker run
**docker run:**创建一个新的容器并运行一个命令
语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
样例:
使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
docker run --name mynginx -d nginx:latest
docker start/stop/restart
docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器
语法
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker restart [OPTIONS] CONTAINER [CONTAINER...]
实例:
启动已被停止的容器nginx
docker start nginx
docker kill
docker kill :杀掉一个运行中的容器。
语法:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
实例:
杀掉运行中的容器nginx
docker kill -s KILL nginx
docker rm
docker rm删除一个或多个容器。
语法:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
实例:
强制删除容器 db01、db02:
docker rm -f db01 db02
docker exec
docker exec :在运行的容器中执行命令
语法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
实例:
在容器 nginx 中以交互模式执行容器内 /root/run.sh 脚本:
docker exec -it nginx /bin/sh /root/run.sh
docker ps
docker ps : 列出容器
语法
docker ps [OPTIONS]
实例
列出所有在运行的容器信息。
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9a31b871b8c mysql:8.1.0 "docker-entrypoint.s…" 7 days ago Up 7 days (healthy) 3306/tcp, 33060/tcp halodb
bbf14e0cd95c halohub/halo:2.15.2 "sh -c 'java ${JVM_O…" 7 days ago Up 7 days (healthy) 0.0.0.0:8097->8090/tcp, :::8097->8090/tcp
docker pull
docker pull : 从镜像仓库中拉取或者更新指定镜像
语法
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
实例
从Docker Hub下载java最新版镜像。
docker pull java
docker images 命令
docker images : 列出本地镜像。
语法
docker images [OPTIONS] [REPOSITORY[:TAG]]
实例
查看本地镜像列表。
docker images
docker rmi
docker rmi : 删除本地一个或多个镜像。
语法
docker rmi [OPTIONS] IMAGE [IMAGE...]
实例
强制删除本地镜像ubuntu:v4。
docker rmi -f ubuntu:v4
基本上有这几个就差不多了,当然docker的命令还有很多,可以自己参看:https://www.runoob.com/docker/docker-command-manual.html
第一个docker:Portainer的安装
portainer是一个轻量级的docker控制管理面板,他可以很方便的控制和管理docker,简化命令行操作。
这次安装portainer的中文版,但是中文版因为开发者个人原因已经停更了。所以以后可以使用官方版,不过先用一段时间是没问题的。
docker和docker-compose
docker客户端适用于单一容器的部署,但是对于多个容器,而且需要互相之间进行链接交互的时候,docker客户端就显得有些不方便了。这时候就可以使用docker-compse,这是一种可以用一个文件来管理多个容器的工具。写好docker-compose.yml 文件,一个命令就可以一起创建和启动多个docker容器。
使用方法是:
- 写好docker-compose.yml 文件
- 在docker-compose.yml 文件路径下执行docker-compose up -d命令启动
- 在docker-compose.yml 文件路径下执行docker-compose stop 命令
后续docker容器的启动和安装,我会根据不同的需求使用docker或者docker-compose。
拉取镜像
docker pull 6053537/portainer-ce
运行镜像
一键安装代码:
docker run -d --restart=always --name="portainer" -p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock 6053537/portainer-ce
根据自启需求配置一下:
--restart=always
指的是重启策略
- no,默认策略,在容器退出时不重启容器
- on-failure,在容器非正常退出时(退出状态非0),才会重启容器
- on-failure:3,指定启动的次数,在容器非正常退出时重启容器,最多重启3次
- always,在容器退出时总是重启容器
- unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
--name="portainer"
是对容器的命名,很多操作都可以根据容器的命名来执行,容器明明唯一。
-p 9000:9000
指的是端口映射, 格式为:主机(宿主)端口:容器端口
如果执行命令后没有报错说明运行成功了,开启防火墙,在浏览器输入NAS的内网IP和你刚才指定的宿主机端口,就可以登录进行配置了。
创建用户和密码吧,点击开始使用,可以直接使用本地环境与Portainer链接。当然Portainer也可以链接在线的docker环境,不过咱用的是NAS而不是服务器集群,就不需要这些了。
能看到本地的docker容器,目前应该是只有一个Portainer的。
与命令行类似,我们可以直接在网页上执行对docker的各种操作。也可以很方便的查看各个容器的状态。因为容器实际上是虚拟化的一种,类似于开了一个虚拟机,我们的服务运行在虚拟机上,docker一般只显示虚拟机的状态,而不显示服务的状态和日志,所以我们需要一个面板看服务运行的状态以及日志,这样可以很方便的排除错误。
至此,我们的第一个docker容器就搞定了,一个 pull
命令,一个配置启动命令,这样一个复杂的面板就成功运行了,感受到docker的好用以及方便了吧。