debian下安装docker后无法使用

安装后提示:
docker is already the newest version (1.5-2)

但是运行docker 命令提示找不到。

然后重新安装:
curl -sSL https://get.docker.com/ | sudo sh
提示:
The repository 'https://download.docker.com/linux/ubuntu bookworm Release' does not have a Release file.

cd /etc/apt/sources.list.d/

发现有个 archive_uri-https_download_docker_com_linux_ubuntu-bookworm.list

rm archive_uri-https_download_docker_com_linux_ubuntu-bookworm.list
删除后再执行,就正常了。

Client: Docker Engine - Community
 Version:           25.0.3
 API version:       1.44
 Go version:        go1.21.6
 Git commit:        4debf41
 Built:             Tue Feb  6 21:14:25 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          25.0.3
  API version:      1.44 (minimum version 1.24)
  Go version:       go1.21.6
  Git commit:       f417435
  Built:            Tue Feb  6 21:14:25 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.28
  GitCommit:        ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

docker支持IPV6

这两天因为某个需求,一直在研究这个问题。

网上都看了,什么ipv6 subnet daemon.json 之类的,都是一通抄,还是没有能说明白关键联系的,很多都是抄的碎片化信息。

因为说不清楚关联,所以就没法在实际环境中结合实际灵活解决问题。

docker的版本

docker的版本问题。初步结论是:docker engine 的版本大于等于20.10.2 。参见:https://zhuanlan.zhihu.com/p/342633966

经过验证,如果版本不对,在配置daemon.json时,就会报错,令人莫名, 实际是版本的ipv6支持问题,不支持新字段。

注意:系统默认的docker版本是跟这个系统的代码版本库走的,所以想要最新的docker版本,首先要确认自己的系统,否则要手动安装。

daemon.json

这个也是网上看到最多的:

{
  "ipv6": true,
  "fixed-cidr-v6": "fd00::/80",
  "experimental": true,
  "ip6tables": true
}

在跳过了docker版本的坑,这里就可以配置了。这里核心的是那个fixed-cidr-v6, 很多人看不懂这个,不知道这个要怎么改,这个就要自己实际弄懂ipv6的子网了,要根据自己的外网IPV6地址,配置实际的子网段。参见 https://docs.docker.com/engine/daemon/ipv6/

检查对应docker的网络配置

docker inspect xxx

检查 Networks 字段,下面对应就是network的对象,如下例子就是 bridge:

"Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "xxx",
                    "EndpointID": "xxx",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "fd17::1",
                    "GlobalIPv6Address": "fd17::242:ac11:2",
                    "GlobalIPv6PrefixLen": 64,
                    "MacAddress": "xxx",
                    "DriverOpts": null
                }
            }

然后我们继续检查 bridge对ipv6的支持情况:

docker network inspect bridge

我们检查EnableIPv6字段:

"Name": "bridge",
        "Id": "xxx",
        "Created": "xxx",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": true,

如果是true,则证明此bridge网络已经支持ipv6

测试docker获取ipv6能力

docker run --rm -it busybox ping -6 -c4 ipv6-test.com
docker run --rm -it busybox ifconfig

正常返回,就说明系统的docker ipv6能力正常

在线免费托管docker的平台选择

  1. dockerhub,目前在用,由于其商业化策略导致的不可控变化,打算放弃
  2. github,Container Registry:因为访问不稳定和token的问题,暂时不考虑
  3. gitlab,Container Registry
  4. ECR, amazon出品,这里不考虑,因为账号体系的原因

所以暂时就一个可选项:gitlab

放一个相关的比较参考图:
file

github 容器注册服务器介绍

你可以在ghcr.io上存储和管理你的Docker和OCI镜像。

关于容器注册服务器支持类型

  • Docker Image Manifest V2, Schema2
  • Open Container Initiative 规格

容器服务器支持外部layer,比如windows 镜像。

登陆容器注册服务器

登陆ghcr.io建议使用GITHUB_TOKEN工作流来提高安全性。

  1. 创建一个PAT。设置好权限
  2. 建议将PAT设置为环境变量
    $ export CR_PAT=YOUR_TOKEN
  3. 通过CLI登陆容器注册服务器
    $ echo $CR_PAT | docker login ghcr.io -u USERNAME --password-stdin
    > Login Succeeded

发布容器镜像

$ docker push ghcr.io/OWNER/IMAGE_NAME:latest
or
$ docker push ghcr.io/OWNER/IMAGE-NAME:2.5

当第一次发布容器时,默认是私有的,需要改变可见性,需要自己去设置:Configuring a package's access control and visibility

获取镜像

通过digest获取精准镜像

  1. 获取digest,通过docker inspect或者docker pull命令,然后拷贝得到的SHA值
    $ docker inspect ghcr.io/OWNER/IMAGE_NAME
  2. 删除本地镜像
    $ docker rmi  ghcr.io/OWNER/IMAGE_NAME:latest
  3. 通过@YOUR_SHA_VALUE 获取精准的镜像
    $ docker pull ghcr.io/OWNER/IMAGE_NAME@sha256:82jf9a84u29hiasldj289498uhois8498hjs29hkuhs

通过名字

docker pull ghcr.io/OWNER/IMAGE_NAME

通过名字和版本

$ docker pull ghcr.io/OWNER/IMAGE_NAME:1.14.1

获取当前最新版

$ docker pull ghcr.io/OWNER/IMAGE_NAME:latest

编译镜像

$ docker build -t hello_docker .

tagging镜像

  1. 找到image id
    $ docker images
    > REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
    > ghcr.io/my-org/hello_docker         latest              38f737a91f39        47 hours ago        91.7MB
    > ghcr.io/my-username/hello_docker    latest              38f737a91f39        47 hours ago        91.7MB
    > hello-world                                           latest              fce289e99eb9        16 months ago       1.84kB
  2. 通过ID和镜像名字和托管的主机来tag对应的镜像
    $ docker tag 38f737a91f39 ghcr.io/OWNER/NEW_IMAGE_NAME:latest

baota宝塔docker制作

这两天瞎折腾,因为数据库不一致的问题,一气之下把baota image删掉了,很多跟数据库相关的服务都歇了。

宝塔自用,在nas环境配合下数据库,搞个网络环境还是很方便的。

再重新拉取baota镜像时,发现怎么也访问不了,看日志,也没发现什么线索,所以才萌生了自己搞个docker的念头,主要是想定位下问题。

根据官方 www.bt.cn 最新的安装脚本制作了最新的 docker镜像:
https://gitlab.com/hiproz/baota-centos7-docker

特点:

  1. 和一般宝塔docker不同的是,采用延后安装的方式,支持将整个/www暴露出来,这样就可以将应用数据特别是数据库数据映射到用户空间,不至于不小心删除docker时,整个数据库数据丢失。
  2. 支持自动重新安装,如果系统发生未知问题,无法通过系统内更新,可以通过外部脚本的need_update 来更新。

docker的使用

docker run -tid --name baota --restart always -v /your-local-dir:/www -p your-local-port:8888 registry.gitlab.com/hiproz/baota-centos7-docker

安装进度日志

查看 run.log

默认登录路径和账号密码

查看映射路径下的default.txt, 注意要使用实际映射的端口,default.txt显示的是系统内部的端口。