Docker的基础学习(三)

容器数据卷

用于完成数据的持久化,重要资料的备份存储,就是主机的目录和容器内的目录进行映射,将容器内的数据备份+持久化到本地主机目录。
坑:容器卷记得加入参数 --privileged=true
Docker挂载主机目录访问如果出现 cannot open directory.:Permission denied
解决办法:在挂载目录后多加一个 --privileged=true 参数即可
why

如果是在CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里边挂在挂载目录被禁止,如果要开启,我们一般使用--privileged=true 命令。扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,容器内的root用户会拥有真正的root权限,否则容器内的root只是外部的一个普通用户的权限。

卷就是目录或文件,存在于一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过UnionFileSystem提供一些用于持续存储或共享数据的特性。

卷的设计目的就是数据持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

Docker容器产生的数据,如果不备份,那么当容器实例删除之后,容器内的数据自然也就没有了。为了能保存数据 所以在docker中我们使用卷。

特点:

  • 1、数据卷可在容器之间共享或者重用数据
  • 2、卷中的更改可以直接实时生效
  • 3、数据卷中的更改不会包含在镜像的更新中
  • 4、数据卷的生命周期一直持续到没有容器使用它为止
docker run -v 本地宿主机路径:容器内部路径 --privileged=true
-v 添加自定义容器卷 可以多个
--privileged=true 放开权限

运行一个带有容器卷存储功能的容器实例
docker run -it --privileged=true -v 本地宿主机绝对路径:容器内部路径 镜像名
docker run -it --name=quan --privileged=true  -v /Users/iuu/Developer/docker/quan/:/home/ 192.168.1.8:5001/iuu_local_ubuntu /bin/bash 
============================
查看数据卷是否挂载成功
docker inspect  quan
输出如下信息
"Mounts": [
            {
                "Type": "bind",
                "Source": "/host_mnt/Users/iuu/Developer/docker/quan",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
============================

读写规则映射添加说明
读写 rw (默认)
docker run -it --privileged=true -v 本地宿主机绝对路径:容器内部路径:rw 镜像名

只读 ro 容器内部被限制只能读取不能写入 宿主机不受影响
docker run -it --privileged=true -v 本地宿主机绝对路径:容器内部路径:ro 镜像名

docker inspect  quan
输出如下信息
"Mounts": [
            {
                "Type": "bind",
                "Source": "/host_mnt/Users/iuu/Developer/docker/quan",
                "Destination": "/home",
                "Mode": "ro",
                "RW": false,
                "Propagation": "rprivate"
            }
        ],
============================
卷的继承和共享
--volumes-from 容器ID/容器名称 

容器quan3-ext-quan2继承容器quan2的卷 包含挂载目录 和权限都继承quan2的
docker run -it --name=quan3-ext-quan2 --privileged=true --volumes-from quan2   192.168.1.8:5001/iuu_local_ubuntu 

Docker的基础学习(二)

镜像分层概念

镜像是什么?

镜像 是一种轻量级、可执行的独立软件包,他包含运行某个软件所需要的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量、配置文件等),这个打包好的运行环境就是image镜像文件。
只有通过这个镜像文件才能生成Docker容器实例

分层的镜像

镜像就像是一个蛋糕,一层一层堆叠出来的。
以pull命令为例子,在下载的过程中我们可以看到docker的镜像好像是在一层一层的下载。

iuu@iuudeMac-mini ~ % docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
94a23d3cb5be: Downloading [========>                                          ]   9.51MB/53.6MB
ac9d381bd1e9: Download complete 
aa9c5b49b9db: Download complete 
841dd868500b: Downloading [============================>                      ]  31.17MB/54.67MB
42dee876d816: Downloading [========================================>          ]  4.358MB/5.42MB
c4851c976ae9: Waiting 
e80a0433b650: Waiting 
e10afb8c99ce: Waiting 
7870523e466f: Waiting 

UnionFS(联合文件系统)

UnionFS文件系统是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外边来看,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像的加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs(foot file system),在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用HOST的kernel,自己只需要提供rootfs就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。

比如说有多个镜像都从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像;同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而镜像的每一层都可以被共享。

Docker镜像层都是只读的,容器层是可写的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作容器层,容器层之下都叫做镜像层。

制作自己的镜像

docker commit 提交容器副本使之成为一个新的镜像
docker commit -m="备注" -a="作者" 容器ID/容器名 目标镜像名:[标签名 不写则为latest]

基于官方 ubuntu 创建一个容器
docker run -it --name=u02 ubuntu /bin/bash

ubuntu 安装 vim 命令
apt-get update
apt-get -y install vim

将现在的容器生成一个新的镜像
docker commit -m='新增vim命令' -a='iuu' u01 iuu/vim_ubuntu:1.0
docker commit -m='新增vim命令' -a='iuu' u01 vim_ubuntu:1.0
docker commit -m='新增vim命令' -a='iuu' 2d4263116d7f vim_ubuntu:1.0

使用生成的镜像
docker run --name=vim_ubuntu -it vim_ubuntu:1.0 /bin/bash
docker run --name=iuu_vim_ubuntu -it iuu/vim_ubuntu:1.0 /bin/bash

容器发布到阿里云/DockerHub

阿里云

容器镜像服务 创建命名空间 创建仓库

登陆
docker login --username=41760@qq.com registry.cn-hangzhou.aliyuncs.com

TAG
docker tag  镜像ID  registry.cn-hangzhou.aliyuncs.com/iuu_me/vim_ubuntu:[镜像版本号]

推送
docker push registry.cn-hangzhou.aliyuncs.com/iuu_me/vim_ubuntu:[镜像版本号]

拉取
docker pull registry.cn-hangzhou.aliyuncs.com/iuu_me/vim_ubuntu:1.0

DockerHub

登陆网站 创建仓库

命令行登陆
docker login

TAG
docker tag 镜像ID  DockerHub用户名/仓库名:镜像版本号
docker tag 2fad279b3143  jianchaodada/tree_ubuntu:1.0

推送
docker push jianchaodada/tree_ubuntu:1.0

案例 没带版本号 则默认用 latest
docker commit -m='删除无用文件' -a='iuu' aliyun  iuu_ubuntu 
docker tag 2fad279b3143  jianchaodada/iuu_ubuntu 
docker push jianchaodada/iuu_ubuntu  

Docker私有仓库

DockerRegistry是官方提供的工具,可以用于构建私有镜像仓库

下载DockerRegistry镜像
docker pull registry 
运行私服实例
docker run -d -p 5000:5000  --name=DockerRegistry   -v /Users/iuu/Developer/docker/DockerRegistry:/var/lib/registry --privileged=true registry
默认情况下仓库被创建在容器的 /var/lib/registry/ 目录下 建议用容器卷映射,方便与宿主机联调

案例:
在ubuntu镜像中安装ifconfig命令
apt-get update
apt-get install -y net-tools

ifconfig

基于容器生成镜像 上传到dockerhub
docker commit -m='安装ifconfig' -a='iuu' aliyun  iuu_ubuntu 
docker images 
docker tag 5e2a0179f0d8  jianchaodada/iuu_ubuntu
docker push jianchaodada/iuu_ubuntu  

curl验证私服库上有什么镜像
curl -XGET http://127.0.0.1:5001/v2/_catalog

修改配置文件让docker 支持http协议推送 默认不允许http协议推送 修改完重启docker 
修改 daemon.json 在配置加速地址的地方加: 
"insecure-registries":["192.168.1.8:5001"]

基于容器生成镜像 上传到私服
docker commit -m='安装ifconfig' -a='iuu' aliyun  iuu_local_ubuntu
docker tag 0f72c1a675f3 192.168.1.8:5001/iuu_local_ubuntu
docker push 192.168.1.8:5001/iuu_local_ubuntu
curl -XGET http://127.0.0.1:5001/v2/_catalog

拉取私服库里的镜像
docker pull 192.168.1.8:5001/iuu_local_ubuntu 

Docker的基础学习(一)

Docker 的基本组成

镜像 images  
容器 container  基于镜像生成容器
仓库 repository 存储镜像的仓库

可以把容器看作一个简易版的Linux环境和运行在其中的应用程序
仓库分为公开库 和 私有仓库

CentOS7 安装docker

1、检查内核版本 官方建议 3.10 以上
uname -r 
2、卸载旧版本
sudo yum remove docker  docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
3、设置存储库-国内可以设置为阿里云
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
4、更新yum缓存
yum makecache fast
5、安装docker
5.1、安装最新版
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

5.2、安装指定版本
5.2.1 列出存储库中的可用版本
yum list docker-ce --showduplicates | sort -r

5.2.2 安装指定版本的docker
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-buildx-plugin docker-compose-plugin

6、启动 Docker
sudo systemctl start docker

7、运行测试容器
sudo docker run hello-world

8、验证
docker ps -a
docker images -a
docker --help
docker version 
ps -ef |grep docker
docker info

停止 
sudo systemctl stop docker
卸载 
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

镜像加速器配置

进入目录
cd /etc/docker/

创建daemon.json文件并写入内容
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF

重新加载 systemd 管理器配置
sudo systemctl daemon-reload

重启服务
sudo systemctl restart docker

查看信息
docker info

测试 Hello World 镜像

docker run hello-world

当本地没有hello-world镜像时,会自动从远程仓库下载该镜像
当输出hello world提示后,容器就会自动终止
docker run xxx 首先在本机查找镜像,找到则直接生成容器实例运行。 找不到则从云端仓库查找,仓库找到则下载镜像到本地,生成容器实例运行,如果云端仓库查找不到则进行报错。

Docker 为什么会比虚拟机快

有比虚拟机更少的抽象层
利用的是宿主机的内核,而不需要加载操作系统OS内核

帮助启动类命令

启动 systemctl start docker
重启 systemctl restart docker
停止 systemctl stop docker
状态 systemctl status docker
开机启动 systemctl enable docker
查看概要信息 docker info
查看帮助文档 docker --help
查看具体命令帮助 docker 命令 --help

镜像命令

=====================================
本机镜像列表 
docker images  

REPOSITORY 仓库源
TAG        镜像标签版本号
IMAGE ID   镜像ID 
CREATED    镜像创建时间
SIZE       镜像大小

同一个仓库源可以有多个TAG版本,代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG来定义不同的镜像。如果你不置顶一个镜像的版本标签,例如你只使用ubuntu,docker将默认使用ubuntu:latest镜像。

-a 列出本地所有的镜像(含历史映像层)
-q 只显示镜像ID 
=====================================
查找镜像
docker search 

NAME         镜像名称       
DESCRIPTION  镜像说明     
STARS        点赞数量
OFFICIAL     是否官方的
AUTOMATED    是否自动构建的 

--limit 只列出N个镜像 默认25个
docker search --limit 10 php
=====================================
下载镜像

docker pull 镜像名字[:TAG]
docker pull 镜像名字 (默认latest镜像)
=====================================
查看镜像/容器/数据卷/构建缓存所占空间

docker system df

TYPE         类型(镜像/容器/数据卷/构建缓存)
TOTAL        总数
ACTIVE       活动数
SIZE         大小  
RECLAIMABLE  可回收(例如未使用的镜像或停止的容器占用的空间)
=====================================
删除一个或多个镜像
docker rmi <image_id_or_name1> 
docker rmi <image_id_or_name1:TAG> <image_id_or_name2> ...
删除全部镜像
docker rmi -f$(docker images -aq)
如果镜像正在被使用(例如由某个容器),可以使用 -f 选项强制删除:
docker rmi -f <image_id_or_name> 
清理未使用的镜像:
docker image prune
要删除所有未被使用的镜像(不仅仅是悬挂镜像),可以使用 -a 选项:
docker image prune -a

虚悬镜像 仓库名字、标签都是<none>的镜像 建议删掉 

容器命令

=====================================
新建+启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS 有些是一个减号 有些是两个减号
--name="容器名字" 为容器指定名称,不指定则系统随机分配
-d               后台运行容器并返回容器ID
-i               以交互模式运行容器,通常与-t同时使用
-t               为容器重新分配一个伪终端,通常与-i同时使用
-P               随机端口映射 (大写P)
-p               指定端口映射 (小写p)
    本地IP+端口:容器端口   -p 10.1.0.1:8080:80
    本地端口:容器端口      -p 8080:80

举例 启动一个ubuntu容器:
docker run -it ubuntu /bin/bash 
退出ubuntu终端则直接输入 exit
=====================================
列出正在运行的容器
docker ps

CONTAINER ID   容器ID
IMAGE          所属镜像
COMMAND        启动容器时运行的命令
CREATED        容器的创建时间
STATUS         容器的当前状态(Up 2 hours 表示已运行2小时)
PORTS          暴露端口
NAMES          容器名字 

-a或--all:显示所有容器(默认只显示正在运行的容器)。
-f或--filter filter:根据提供的条件过滤输出。
--format string:使用自定义模板格式化输出:
    'table':以表格格式打印输出并带有列标题(默认)。
    'table TEMPLATE':使用指定的 Go 模板以表格格式打印输出。
    'json':以 JSON 格式打印输出。
    'TEMPLATE':使用指定的 Go 模板打印输出。
    更多信息请参考 Docker 文档 中关于格式化输出的部分。
-n或--last int:显示最后创建的n个容器(包括所有状态,默认为 -1)。
-l或--latest:显示最新创建的容器(包括所有状态)。
--no-trunc:不截断输出。
-q或--quiet:只显示容器 ID。
-s或--size:显示总文件大小。
=====================================
退出容器

run进去容器 exit退出 容器停止
run进去容器 ctrl+p+q退出 容器不停止 
=====================================
启动已经停止的容器
docker start 容器ID/容器名称
=====================================
重启容器
docker restart 容器ID/容器名称
=====================================
停止容器
docker stop 容器ID/容器名称
=====================================
强制停止容器
docker kill 容器ID/容器名称
=====================================
删除已停止的容器
docker rm 容器ID/容器名称
强制删除容器
docker rm -f 容器ID/容器名称 
一次性删除全部容器实例 (包含启动中的)
docker rm -f$(docker ps -a -q)
docker ps -a -q | xargs docker rm -f
=====================================
前台交互式启动
docker run -it  redis:alpine3.20
后台守护式启动
docker run -d  redis:alpine3.20
查看容器启动日志
docker logs 容器ID/容器名称
查看容器内运行的进程
docker top  容器ID/容器名称

查看容器内部细节(容器作为最小化linux系统的一些系统配置信息)
docker inspect 容器ID/容器名称
=====================================
进入正在运行的容器并以命令行交互
docker exec -it 容器ID/容器名 bashShell
例如 
docker exec -it my_u01 /bin/bash 

重新进入
docker attach 容器ID/容器名

attach 直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器停止
exec 是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止

推荐使用docker exec 命令,因为退出容器终端,不会导致容器的停止
一般用-d后台启动的容器 用exec进入对应的容器实例干活

=====================================
从容器内拷贝文件到主机上
docker cp 容器ID/容器名:容器内路径 目标主机路径(本地路径)
docker cp my_u02:/1.txt /Users/iuu/22.txt
=====================================
导入和导出容器

export 导出容器的内容留作为一个tar归档文件
docker export 容器ID/容器名 > 文件名.tar
docker export my_u02 > /Users/iuu/my_u02.tar 

import 从tar包中的内容创建一个新的文件系统再导入为镜像

cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
cat /Users/iuu/my_u02.tar |docker import - iuu/my_u02:1.0

利用导入的镜像生成容器
docker run --name=my_u02  -it iuu/my_u02:1.0  /bin/bash
=====================================

N1安装File Browser 轻量网盘工具

折腾了好久的N1,尝试过各种面板,都不太理想,最后还是开始用各种独立软件来搭建自己的服务。
我的N1都是硬改过的内存128/64Gb 可以做一个小的云盘来使用,当然也可以挂一个硬盘来用。

官方有脚本安装,但个人喜欢自定义安装,同时本就是 Go 语言编写的程序,直接下载编译好的可执行文件运行即可。因此下面介绍在 Linux 上直接运行的方式。

安装

首先去 release 页面,根据你的系统和处理器架构选择下载最新的版本,比如这里下载 linux-arm64-filebrowser.tar.gz 版本:

wget https://github.com/filebrowser/filebrowser/releases/download/v2.30.0/linux-arm64-filebrowser.tar.gz

解压到你指定的目录,比如这里的 /home/filebrowser:

tar -xvf linux-arm64-filebrowser.tar.gz  -C /home/filebrowser

进入到你的目录为 filebrowser 添加可执行权限:

chmod +x filebrowser

接下来就直接运行了:

./filebrowser -p 2222

配置参数运行

在上面的直接运行命令中你可以加上一些自定义参数,在官方文档中可以看到完整的命令使用,下面是部分常用的的参数:

-a, –address string:监听的地址(默认为 127.0.0.1)
-p, –port string:监听端口(默认为 8080)
-b, –baseurl string:网站路径
-t, –cert string:SSL 证书
-k, –key string:SSL 证书密钥
-l, –log string:日志默认为标准输出,如果要记录到文件的话可以直接指定文件,例如 /home/filebrowser/filebrowser.log
-c, –config string:配置文件路径
-d, –database string:数据库路径(默认值 “./filebrowser.db”)
-r, –root string:数据存放路径

这里我为了方便,选择自己写一个配置文件,vim filebrowser.json:

{
  "port": 2222,
  "baseURL": "",
  "address": "127.0.0.1",
  "log": "stdout",
  "database": "/home/filebrowser/database.db",
  "root": "/data/filebrowser"
}

之后直接在程序目录执行:

./filebrowser -c filebrowser.json

然后在浏览器中打开你的网站登录即可,默认管理员用户和密码都为 admin,建议登录后先重新设置密码。

使用 SSL

File Browser 本身支持直接在运行时使用 t 和 k 参数或者在配置文件中使用 cert 和 key 参数设置 SSL 证书和密钥。但我这里选择使用 Nginx 前端反代:

server {
    listen ...;
    server_name ...;
    ssl_certificate ...; 
    ssl_certificate_key ...;
    ...
    location / {
        proxy_pass  http://127.0.0.1:2222;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

如果你想使用二级目录,例如 yourdomain.com/file 的形式,需要修改前面配置文件中 "baseURL": "/file",以及 Nginx 配置文件中 location /file。

后台持续化运行

可以简单使用直接 nohup:

nohup filebrowser -c filebrowser.json &

但我更推荐通过 systemd 控制:

vim /etc/systemd/system/filebrowser.service

输入以下内容:

[Unit]
Description=File Browser
After=network.target

[Service]
ExecStart=/home/filebrowser/filebrowser -c /home/filebrowser/filebrowser.json

[Install]
WantedBy=multi-user.target

记得修改 ExecStart 后面为你自己的文件路径,之后执行:

systemctl daemon-reload

systemctl 常用操作

运行:systemctl start filebrowser.service
停止运行:systemctl stop filebrowser.service
开机启动:systemctl enable filebrowser.service
取消开机启动:systemctl disable filebrowser.service

Armbian安装SMB做文件共享

安装SMB

进入armbian-config,到安装软件页面,Samba空格选中,再回车安装。

配置SMB

修改配置文件/etc/samba/smb.conf,直接覆盖原内容,实现匿名直接连接。

[global]
    workgroup = WORKGROUP
    server string = Samba Server Version %v
    passdb backend = tdbsam
    cups options = raw
    security = user                    #认证模式为User
    map to guest = bad user            #这个很关键,实现匿名无须交互输入用户名和密码就靠它了
    guest account = guest              #匿名用户映射为guest用户

[myshare]                    #共享后看到的文件夹名
    comment = My share
    path = /home/public      #共享路径
    browseable = Yes         #可以被浏览,就是在网络邻居中能看到共享名
    read only = No           #可读写
    guest ok = Yes           #允许匿名访问,这个也需要设置,否则匿名无法访问
    valid users = samba liuag guest    #有效的用户和组
    invalid users = liuben   #无效用户和组   
    read list = samba    #只读用户和组(如果read only = No,只读用户需要在此设置)
    write list = liuag   #可读写用户和组(如果read only = Yes,可读写用户需要在此设置)
    allow hosts = 192.168.100.236    #允许访问主机列表,支持通配符
    deny hosts = 192.168.100.0/24    #禁止访问主机列表,支持通配符

简洁版

[global]
       workgroup = WORKGROUP
       security = user
       map to guest = Bad User
[media]
       comment = resources
       path = /home/public
       public = yes
       writable = yes
       guest ok = yes
       browseable = yes

修改目录权限
chmod -R 777 /home/public
开机启动SMB
systemctl enable samba
重启SMB
systemctl restart samba

1 7 8 9 10 11