前言

2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。

但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?今天就写一下博客记录下自己安装、配置和使用中出现的一些问题,希望对铁子们有所帮助。

在这里插入图片描述

Docker详解

Docker简介

Docker是一个开源的容器化平台,可以帮助开发者将应用程序其依赖的环境 打包成一个可移植、可部署的容器。Docker的主要目标是通过容器化技术实现应用程序的快速部署、可移植性和可扩展性,从而简化应用程序的开发、测试和部署过程。

容器化是一种虚拟化技术,它通过在操作系统层面隔离应用程序和其依赖的运行环境,使得应用程序可以在一个独立的、封闭的环境中运行,而不受底层操作系统和硬件的影响。与传统的虚拟机相比,容器化具有以下优势:

  • 轻量级: 容器与宿主机共享操作系统内核,因此容器本身非常轻量级,启动和停止速度快,资源占用少。
  • 可移植性: 容器可以在任何支持相应容器运行时的系统上运行,无需关注底层操作系统的差异,提供了高度的可移植性。
  • 快速部署: 容器化应用程序可以通过简单的操作进行打包、分发和部署,减少了部署过程的复杂性和时间成本。
  • 弹性扩展: 可以根据应用程序的需求快速创建、启动和停止容器实例,实现应用程序的弹性扩展和负载均衡。
  • 环境隔离: 每个容器都具有独立的运行环境,容器之间相互隔离,不会相互干扰,提供了更好的安全性和稳定性。

docker和传统虚拟机区别

虚拟机是一个主机模拟出多个主机,需要先拥有独立的系统。传统虚拟机,利用hypervisor,模拟出独立的硬件和系统,在此之上创建应用。

docker 是在主机系统中建立多个应用及配套环境,把应用及配套环境独立打包成一个单位,是进程级的隔离

在这里插入图片描述

Docker架构

在这里插入图片描述

  • Docker daemon( Docker守护进程)
    Docker daemon是一个运行在宿主机( DOCKER-HOST)的后台进程。可通过 Docker客户端与之通信。

  • Client( Docker客户端)
    Docker客户端是 Docker的用户界面,它可以接受用户命令和配置标识,并与 Docker daemon通信。图中, docker build等都是 Docker的相关命令。

  • Images( Docker镜像)
    Docker镜像是一个只读模板,它包含创建 Docker容器的说明。它和系统安装光盘有点像,使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行 Docker镜像中的程序。

  • Container(容器)
    容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。可通过 Docker API或者 CLI命令来启停、移动、删除容器。

  • Registry
    Docker Registry是一个集中存储与分发镜像的服务。构建完 Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,就需要手动复制。此时可借助 Docker Registry来避免镜像的手动复制。

    一个 Docker Registry可包含多个 Docker仓库,每个仓库可包含多个镜像标签,每个标签对应一个 Docker镜像。这跟 Maven的仓库有点类似,如果把 Docker Registry比作 Maven仓库的话,那么 Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。

Docker Registry可分为公有Docker Registry和私有Docker Registry。 最常⽤的Docker Registry莫过于官方的Docker Hub, 这也是默认的Docker Registry。 Docker Hub上存放着大量优秀的镜像, 我们可使用Docker命令下载并使用。

Docker安装

本次使用的是腾讯云服务器,系统为Ubuntu

Centos 相对好安装一点,Ubuntu 系统没有相关的 yml 指令。

安装参考阿里巴巴开源镜像站中的说明,地址如下所示:

https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.5c611b11axETqq

检查系统信息

使用如下指令,查看服务器的系统信息:

cat /etc/os-release

在这里插入图片描述
监测到当前系统是Ubuntu,使用 apt-get 进行安装。

更新依赖

apt update && apt install -y ca-certificates curl gnupg lsb-release

导入 Docker 官方密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

添加 Docker 源

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 Docker

apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

启动并加入开机启动

systemctl start docker
systemctl enable docker

配置国内镜像加速

登录阿里云的镜像加速器

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

如下图所示:
在这里插入图片描述
根据自己的系统,选择对应的配置信息,本次测试验证使用的是Ubuntu

将其全量复制到控制台中,回车。

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://l8jvnvev.mirror.aliyuncs.com"]
}
EOF

如果存在daemon.json文件,则进行修改。

vim daemon.json
{
  "registry-mirrors": ["https://jbw52uwf.mirror.aliyuncs.com"]
}

【注意】阿里云的镜像加速器不可用了,可以用下面的替代

{
  "registry-mirrors": [
        "https://docker.1ms.run",
        "https://hub.rat.dev",
        "https://docker.1panel.live"
    ]
}

执行完成后,重启Docker

systemctl daemon-reload
systemctl restart docker

测试启动状态

先拉取docker给出的测试实例

docker pull hello-world
# 或者指定完整地址
docker pull docker.io/library/hello-world:latest

查看当前docker的版本信息,启动已经拉取的实例。

docker version
docker run hello-world

在这里插入图片描述

Docker 镜像指令

镜像搜索

可使用 docker search命令搜索存放在 Docker Hub中的镜像。执行该命令后, Docker就会在Docker Hub中搜索含有 java这个关键词的镜像仓库。

docker search java

【注意】但是目前在国内已经禁止访问Docker Hub,这个指令可能会执行失败。

如果执行成功,控制台会输出如下信息(找的图,我的执行失败了)。
在这里插入图片描述
列表中的各项属性信息。

属性名称 NAME DESCRIPTION STARS OFFICAL AUTOMATED
含义 镜像仓库名称 镜像仓库描述 镜像仓库收藏数,
表示该镜像仓库的受欢迎程度,
类似于 GitHub的 stars0
表示是否为官方仓库,
该列标记为[0K]的镜像
均由各软件的官方项目组创建和维护
表示是否是
自动构建的镜像仓库

拉取镜像

使用Docker部署服务前,需要先从中央镜像仓库中拉取镜像。本次以nginx为例。

docker pull nginx

【提示】如果不指定版本,直接拉取镜像,默认会拉取最新的镜像信息。

如果需要指定版本,可以使用下面的方式:

docker pull nginx:1.21

查看本地镜像

查看本地已经拉取过的所有镜像信息,可以使用下面的指令:

docker images

你会看到刚刚下载的所有镜像信息,包括仓库名、标签(版本)、镜像ID、创建时间和大小。
在这里插入图片描述
如果觉得数据很多,只想看ID信息,可以使用如下方式。

docker images -q

删除本地镜像

使用docker提供的rmi指令进行指定镜像的删除,如果需要强制删除,可以追加一个 -f。如下:

docker rmi java

强制删除

docker rmi -f java

【注意】 如果有容器正在使用这个镜像,必须先删除所有依赖该镜像的容器,然后才能删除镜像。

删除所有镜像

docker rmi $(docker images -q)

Docker 容器指令

nginx为例,nginx启动后自带默认的首页信息,方便验证。

启动容器

拉取镜像成功后,使用docker提供的启动命令进行镜像的部署操作。

核心指令

docker run -d -p xx:xx 镜像名

比如,上述拉取的是最新的nginx镜像,启动时配置宿主机与镜像端口映射等。

docker run -d --name my-nginx-demo -p 80:80 nginx

指令参数说明:

因为markdown语法问题,指令之间为了区别多加了个空格。实际使用需要做区分!

指令名称 含义 举例 原指令
-d -detach 的缩写
表示后台运行,类似 nohoup
-P 随机端口映射,一般不用
-p 指定端口映射。
如果存在多个端口映射,则调用多个
一般分为4种方式:
- -ip:hostPort:containerPort
- - ip::containerPort
- - hostPort:containerPort
- - containerPort
-p 80:80
- -net 指定网络模式 一般有4中模式:
- -net=bridge 默认选项,表示连接到默认的网桥。
- -net=host 容器使用宿主机的网络。
- -net=container:NAME-or-ID 告诉 Docker让新建的容器使用已有容器的网络配置。
- -net=none 不配置该容器的网络,用户可自定义网络配置。
–net=bridge
- -name 指定别名称 比如 - -name:my-nginx-demo –name:my-nginx-demo

执行上述指令,如下:
在这里插入图片描述
出现随机一串uuid,表示成功。
访问 http://Docker宿主机 IP:91/,将会看到nginx的主界面如下:
在这里插入图片描述

如果别名称出现重复,启动会出现报错。
在这里插入图片描述

查看容器信息

查看所有的已启动的容器列表,可以使用下列指令:

docker ps

如果需要展示所有(已启动和未启动)的容器列表,需要增加一个-a指令。

docker ps -a

已成功启动的容器信息:
在这里插入图片描述
全部容器信息:
在这里插入图片描述
展示信息的各项列值说明:

列名 CONTAINER_ID IMAGE COMMAND CREATED STATUS PORTS NAMES
含义 容器 ID 镜像名称 启动容器时运行的命令 容器的创建时间 容器运行的状态。
UP表示运行中, Exited表示已停止。
容器对外的端口号 容器名称。
该名称默认由 Docker自动生成,也可使用 docker run命令的–name选项自行指定。

停止容器

使用 docker stop命令,即可停止容器

docker stop 容器id | 容器名称

比如,上述的nginx容器对应的容器id(CONTAINER ID)9ae51d610d4c,则可以使用下列指令进行停止。

docker stop 9ae51d610d4c

或者使用容器名称停止。

docker stop my-nginx-demo

强制停止容器

可使用 docker kill命令发送 SIGKILL信号来强制停止容器

docker kill 9ae51d610d4c

启动已停止的容器

这里的启动操作与docker run 有很大的区别,docker run 除了启动对应的容器外还包含新建容器等额外的操作。

启动一个已停止的容器,只需要使用docker start即可。

docker start 容器id 

比如上面停止了nginx的容器,需要启动则使用下列指令实现:

docker start 9ae51d610d4c

查看指定容器所有信息

docker inspect 容器id

查看容器日志

docker container logs 容器id

查看容器里的进程

docker top 容器id

宿主机与容器之间互相拷贝文件

互相复制文件需要分两种情况:

  • 从容器里面拷文件到宿主机:
    使用下列的指令实现
    docker cp 容器id:要拷贝的文件在容器里面的路径  宿主机的相应路径 	
    
    比如:
    docker cp 9ae51d610d4c:/etc/nginx/nginx.conf /mydata/nginx
    
  • 从宿主机拷文件到容器里面:
    docker cp 要拷贝的宿主机文件路径 容器id:要拷贝到容器里面对应的路径
    

进入指定容器

使用docker exec命令用于进入一个正在运行的docker容器。

如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。

一旦进入了容器,就可以在容器的 Shell 执行命令了。

docker exec -it 9ae51d610d4c /bin/sh 

这里指令中的-it含义如下:
1、-i 全称 --interactive

  • 保持标准输入开启
  • 作用:让你可以往容器里输入命令、打字
  • 不加 -i:进去之后没法输入字符,只能看不能操作

2、-t 全称 --tty

  • 分配一个伪终端
  • 作用:给你一个像正常服务器一样的终端界面,有命令行提示符、光标、格式排版
  • 不加 -t:界面很丑,没有命令行前缀,输入体验极差

【注意】上述的指令中/bin/shUbuntu操作系统的指令,如果是Centos系统则需要使用/bin/bash

在这里插入图片描述

容器内安装vim、ping、ifconfig等指令

容器内可能会存在linux指令不全的问题,需要进行容器内的相关指令安装。

即使宿主机是Centos,进入容器后也像Ubuntu的操作指令。

apt-get update
apt-get install vim           #安装vim
apt-get install iputils-ping  #安装ping
apt-get install net-tools     #安装ifconfig 

在这里插入图片描述
【问】进入容器内的shell操作窗口后,怎么退出容器操作?

输入 exit

在这里插入图片描述

删除容器

删除容器指令分为安全强制两种情况。

安全删除容器:仅能删除已停止的容器。

docker rm 9ae51d610d4c 

强制删除容器:如果容器正在运行,需要删除可以追加-f指令

docker rm -f 9ae51d610d4c 

强制删除所有容器:

docker rm -f $(docker ps -a -q)

Docker 挂载PV

为什么会有要求必须挂载PV的操作?

在实验过程中,发现一个现象,启动和停止容器时,会创建和删除对应的目录信息。

还是以nginx为例,如下所示,查看已启动的容器信息。

docker ps

执行指令后,可以看到 docker 在 /var/lib/docker/rootfs/overlayfs 目录中会存留容器的相关目录信息。
在这里插入图片描述
如果此时停止nginx的容器会发生什么?

docker stop 9ae51d610d4c

在这里插入图片描述
这里居然存储的信息被删除了,如果再docker start操作,则会继续重新创建目录。

到这里就会有一个很严重的问题,大家都知道 Docker是可以部署NginxMysql这些东西的,如果容器不小心执行停止指令,那么像nginx的/etc/nginx/conf.d/xxx相关配置会丢,mysql的/var/lib/mysql/xxx这些存储文件都会丢失!

这是一个很严重的生产风险问题!

【疑惑】如何解决这个问题呢?
这里就要提到目录标题说到的PV挂载。

什么是 PV 挂载

在 Docker 里,容器是临时的。

  • 容器删了,里面的文件、数据、配置全都会跟着消失
  • 如果你直接把 RabbitMQ 的队列数据、用户配置、日志都存在容器内部,那下次重启或重建容器,数据就丢了。

把容器里需要持久化的数据目录,映射到宿主机(你的服务器)上的一个真实目录,让数据保存在宿主机上,而不是容器里。

以Mysql为例

这里以Mysql的启动配置为例。

Mysql中,通常有以下几个目录特别重要。

宿主机目录      →     容器内目录
----------------------------------------
/data/mysql/data  →  /var/lib/mysql     (数据文件,最重要)
/data/mysql/conf  →  /etc/mysql/conf.d  (配置文件)
/data/mysql/logs  →  /var/log/mysql     (日志)

1、创建宿主机持久化目录(执行一次)

mkdir -p /data/mysql/{data,conf,logs}

2、启动Mysql容器指令调整

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -v /data/mysql/data:/var/lib/mysql \
  -v /data/mysql/conf:/etc/mysql/conf.d \
  -v /data/mysql/logs:/var/log/mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e TZ=Asia/Shanghai \
  --restart=always \
  mysql

在这里插入图片描述

3、验证是否挂载成功

首先先看容器中是否存在对应的数据

/var/lib/mysql

在这里插入图片描述

检查宿主机挂载目录是否存在数据

cd /data/mysql/

在这里插入图片描述
关闭Mysql容器查看是否会删除,以及验证再次重启是否会读取。

原理说明

加了 -v 宿主机目录:容器内目录 挂载后:

  • 启动时:容器优先读宿主机这个目录里的配置 / 文件
  • 运行中:容器产生的所有数据、日志、新增文件,实时写到宿主机目录
  • 容器本身内部不再存数据,数据全落在宿主机上

步骤说明

  1. 启动读取阶段
    Docker 启动容器时:
    监测到创建容器指令中存在-v /宿主机路径:/容器路径,会直接把容器里这个目录 “屏蔽替换” 成宿主机目录,容器所有读写,全部指向宿主机,不碰容器内部存储。
  2. 运行写入阶段
    容器里程序(MySQL/Nginx/RabbitMQ)往自身目录写数据:
    容器内 /var/lib/mysql  写数据
    ↓
    被挂载映射
    ↓
    实际写到 宿主机 /data/mysql/data
    

实时同步、即时写入,不是缓存、不是定时同步,是内核级目录映射。

【注意】这里需要注意一点问题。

nginx 的 pv 挂载操作,宿主机挂载目录千万别一开始是空的直接挂

因为容器在启动前,会把容器默认配置覆盖掉导致启动失败!

对于类似 nginx 的正确处理方式如下:

先临时容器拷出默认配置,再挂载!

Dockerfile 方式构建自定义镜像

Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节。

在实际工作中,这个用的比较普遍,而且和K8S之间能很好地契合。

接下来重点说明一下怎么玩。

构建自定义nginx

先来编写一个最简单的Dockerfile,以前文下载的Nginx镜像为例,来编写一个Dockerfile修改该Nginx镜像的首页。

创建目录和文件

如:在linux系统中,创建一个文件夹/root/my-docker。并在其中创建子目录。

mkdir -p /myNginx/app

在这里插入图片描述
app文件夹中新增两个文件,分别是Dockerfile文件和index.html。其中内容如下所示:

Dockerfile :

# 基础镜像
FROM nginx:latest

# 指定工作区间
#workdir /root/nginx

# 把本地 index.html 复制到容器里
COPY index.html /usr/share/nginx/html/

# 暴露端口
EXPOSE 80

# 启动命令(默认 nginx 不用改)
CMD ["nginx", "-g", "daemon off;"]

index.html 页面:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<h1>我用 Dockerfile 构建的 Nginx 镜像!</h1>
	</body>
</html>

使用指令构建镜像

docker 提供了构建的指令。

docker build -f Dockerfile文件名称 -t 镜像名称:版本 .

指令拆分解读。
-t--tag指令的缩写,用于给镜像指定别名称和版本信息。
. :最后还有个 . 不能省略,这里指Dockerfile 文件的路径。

目前测试时Dockerfile文件的完整路径是/root/my-docker/myNginx/app/Dockerfile

如果正好在/root/my-docker/myNginx/app/路径下执行命令,案例如下:

docker build -t my-nginx:v2 .

如果是在/root/my-docker/下,则需要调整命令
在这里插入图片描述
如下所示:

docker build -t my-nginx:v2 ./myNginx/app/

命令执行完成后,控制台中输出如下信息:
在这里插入图片描述
查看构建的镜像信息。
在这里插入图片描述
启动镜像:
在这里插入图片描述

Dockerfile常用指令

下面列举几项常用指令。

命令 说明 举例
FROM 指定基础镜像文件,并拉取 FROM nginx:latest
RUN 构建镜像阶段执行命令 RUN mkdir -p /home/server
ADD <src> <dest> 添加文件,从src目录复制文件到容器的dest,其中 src可以是 Dockerfile所在目录的相对路径,也可以是一个 URL,还可以是一个压缩包 ADD fuxi/dist.tar.gz /usr/local/nginx/fuxi/
COPY 拷贝文件,和ADD命令类似,但不支持URL和压缩包 COPY nginx-prod.conf /etc/nginx/conf.d/default.conf
CMD 容器启动后执行命令
EXPOSE 声明容器在运行时对外提供的服务端口
WORKDIR 指定容器工作路径 WORKDIR /home/server
ENV 指定环境变量 ENV LC_ALL zh_CN.UTF-8
ENTRYPINT 容器入口, ENTRYPOINT和 CMD指令的目的一样,都是指定 Docker容器启动时执行的命令,可多次设置,但只有最后一个有效。
USER 该指令用于设置启动镜像时的用户或者 UID,写在该指令后的 RUN、 CMD以及 ENTRYPOINT指令都将使用该用户执行命令。
VOLUME 指定挂载点,该指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可共享给其他容器。当容器中的应用有持久化数据的需求时可以在 Dockerfile中使用该指令。格式为: VOLUME[“/data”]。

Docker 仓库推送

阿里远端仓库

申请和创建镜像仓库

当使用docker build xx 指令后,就会在本地生成一个镜像文件,可以使用docker images指令查询。

如果需要将当前镜像放置于远端,则需要先有远端镜像仓库。

这里使用阿里的镜像仓库做验证。

https://cr.console.aliyun.com/cn-hangzhou/instance/repositories

访问上面的地址,需要使用到阿里的登录,登录进去后,如果没有仓库实例,可以创建一个个人实例做测试验证。

创建好后,点击进入个人实例,其中公网地址就是可以用于本地登录验证镜像推送的地址。
在这里插入图片描述
个人镜像实例中,创建命名空间,我这里案例是xj_demo

推送本地镜像至阿里镜像仓库

由于在本地中,使用docker build xxx,创建的镜像是本地镜像,docker是根据镜像名称进行动态识别推送地址。

Docker 根本不管你想推到哪,只看镜像名字开头是不是仓库地址!

为了让docker能够识别是需要推送到哪里去,有以下几种方式:

  • 方式一:build 的时候就指定目标镜像仓库
    在构建的时候,就指定目标仓库的地址作为镜像名的前缀。如:
docker build -t crpi-ym3vml05omb37u9x.cn-hangzhou.personal.cr.aliyuncs.com/xj_demo/hello-world:latest . 
  • 方式二:打标签方式重新设定目标镜像仓库
    或者在已经docker build 后,重新打上新的标签方式更改镜像标识。
docker build -t hello-world:latest .
docker tag hello-world:latest  crpi-ym3vml05omb37u9x.cn-hangzhou.personal.cr.aliyuncs.com/xj_demo/hello-world:latest

当重新打上标记后,此时的镜像信息会发生改变,如下所示:
在这里插入图片描述
将已有标签的镜像文件推送至远端镜像仓库,先在本地进行登录操作。
在这里插入图片描述
使用阿里镜像仓库给定的鉴权地址,在linux中输入,并输入对应的密码进行登录验证。
在这里插入图片描述
验证完成后,使用docker push 镜像名:版本号 将本地镜像推送至远端仓库。

docker push crpi-ym3vml05omb37u9x.cn-hangzhou.personal.cr.aliyuncs.com/xj_demo/hello-world:latest

在这里插入图片描述
刷新阿里远端仓库,就可以看到刚刚推送上去的镜像信息。
在这里插入图片描述
在其他docker服务器上要使用,就可以指定仓库拉取镜像。

docker pull 远端地址/命名空间/镜像名称:镜像版本

搭建私有仓库

除了使用第三方的docker镜像仓库外,还可以本地搭建仓库信息。

搭建私有docker镜像仓库

在需要作为docker-server本地镜像仓库的服务器上,创建对应存储数据的目录。如:

/data/docker-registry

进入该目录,在此目录中创建一个docker-compose.yml的配置文件。并在其中定义 Docker 私有仓库的配置。

version: '3'
services:
  registry:
    container_name: docker-registry
    image: registry:2
    ports:
      - 5000:5000
    volumes:
      - /data/docker-registry:/var/lib/registry

这将创建一个名为 docker-registry 的容器,使用registry:2镜像来构建仓库,并指定PV挂载目录将上传的镜像存储在主机上的 /data/docker-registry 目录中,并将其映射到主机的 5000 端口。

启动私有仓库

包含 docker-compose.yml 文件的目录中,运行下列指令,即可自动拉取镜像并创建私有仓库服务。

docker compose up -d

私有仓库将在后台运行,并监听主机的 5000 端口。

设置私有仓库密码

在 CentOS 7.9 中,可以使用 httpd-tools 软件包中的 htpasswd 工具来生成加密密码。

yum install httpd-tools
# 生成密码文件
htpasswd -Bc auth.htpasswd <用户名>

如果是Ubuntu系统,则命令需要使用下列

# 下载安装
apt install apache2-utils
# 查看版本
ab -V
# 生成账户与密钥
htpasswd -nb admin 123456

在这里插入图片描述

登录私有镜像

docker login 127.0.0.1:5000

在这里插入图片描述

推送镜像至私有私服

和上面的一样,要么构建的时候就指定镜像前缀。
要么在构建完成后,通过docker tag 方式将镜像标记标签。

docker tag hello-world:latest  127.0.0.1:5000/demo1/hello-world:latest
docker push 127.0.0.1:5000/demo1/hello-world:latest

在这里插入图片描述
推送成功后,在docker私服中可以看到已经上传的文件信息
在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐