当前位置:   article > 正文

Linux-Docker入门教学_linux docker

linux docker

前沿

Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。

docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。

1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。

2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。

3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。

在简单来说 就是 你平时装各种Mysql tomact … 一些服务 如果不使用 Docker那么需要配置很久 而且还要考虑到版本的问题 以及跨平台的问题 以及有些软件之间会发生冲突 但是使用了Docker那么这些问题都会被解决

还不懂的同学 可以把他当成GitHub就行了 都知道GitHub是存放代码文件的把 而Docker 也一样 但是他是存储镜像文件的

还有就是正常mysql…一些镜像 要几个g 但是使用Docker 就几百mb…好处太多了 自己体会 反正就一句话爽

我们来看一张图 就明白了 docker原理

在 子电脑(虚拟机) 里你可以和正常电脑一样运行程序 列如qq 如果你愿意你可以变出来好几个字电脑 里面都开上qq

字电脑和子电脑之间是相互隔离的 互补影响

虚拟机虽然可以隔离出很多“子电脑”,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如VMWare)。

虚拟机属于虚拟化技术。而Docker这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化

而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似“船上的集装箱”)。

它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外,它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。

正因为如此,容器技术受到了热烈的欢迎和追捧,发展迅速

我们具体来看看Docker。 大家需要注意,Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。

想要搞懂Docker,其实看它的两句口号就行。

第一句,是**“Build, Ship and Run”**。 也就是,“搭建、发送、运行”,三板斧。

举个例子:

我来到一片空地,想建个房子,于是我搬石头、砍木头、画图纸,一顿操作,终于把这个房子盖好了。

结果,我住了一段时间,想搬到另一片空地去。这时候,按以往的办法,我只能再次搬石头、砍木头、画图纸、盖房子。

但是,跑来一个老巫婆,教会我一种魔法。这种魔法,可以把我盖好的房子复制一份,做成“镜像”,放在我的背包里。

等我到了另一片空地,就用这个“镜像”,复制一套房子,摆在那边,拎包入住。

怎么样?是不是很神奇?

所以,Docker的第二句口号就是:“Build once,Run anywhere(搭建一次,到处能用)”。

Docker技术的三大核心概念,分别是:

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

我刚才例子里面,那个放在包里的“镜像”,就是Docker镜像。而我的背包,就是Docker仓库。我在空地上,用魔法造好的房子,就是一个Docker容器。(利用镜像生成的容器)

说白了,这个Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变

也就是说,每次变出房子,房子是一样的,但生活用品之类的,都是不管的。谁住谁负责添置

每一个镜像可以变出一种房子。那么,我可以有多个镜像呀!

也就是说,我盖了一个欧式别墅,生成了镜像。另一个哥们可能盖了一个中国四合院,也生成了镜像。还有哥们,盖了一个非洲茅草屋,也生成了镜像。。。

这么一来,我们可以交换镜像,你用我的,我用你的,岂不是很爽?

于是乎,就变成了一个大的公共仓库。负责对Docker镜像进行管理的,是Docker Registry服务(类似仓库管理员)。

不是任何人建的任何镜像都是合法的。万一有人盖了一个有问题的房子呢?所以,Docker Registry服务对镜像的管理是非常严格的。

最常使用的Registry公开服务,是官方的Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。

地址: https://hub.docker.com/ 我们之后教程里 使用的都是从这里下载的镜像 所有需要你去这里创建账号

登录成功后 我们来 演示下怎么找想要的镜像 比如mysql

我们点击mysql 进去看看

至于其他的这里就不在介绍了 后面都会提到

Docker 进程相关命令

启动docker服务:

systemctl start docker

停止docker服务:

systemctl stop docker

重启docker服务:

systemctl restart docker

查看docker服务状态:

systemctl status docker

设置开机启动docker服务:

systemctl enable docker

关闭防火墙

systemctl stop firewalld       #关闭防火墙

systemctl mask firewalld     #禁止开机打开防火墙

service iptables status      #查看 火墙

sudo systemctl restart docker          # 重启 docker
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

先把防火墙关了 否则后面有些内容会 失败

镜像

获取镜像和拉取镜像

之前提到过,Docker Hub 上有大量的高质量的镜像可以用自己去找 我们以centos为例演示一遍

从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:

docker pull [选项] [地址/]仓库名[:标签]
  • 1

具体的选项可以通过 docker pull --help 命令看到 一般没什么用

Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub(docker.io)。 (一般不写采用默认)

仓库名 : 就是你要下载的镜像 比如mysql tomcat …

标签: 就是你要下载的镜像版本号 这个需要你到Docker Hub 具体去看有哪些版本 如果不加标签名称 那么默认就是下载最新版本

比如:

docker pull centos       //默认下载最新版本 (不推荐)
docker pull centos:7    //下载指定版本  
  • 1
  • 2

这个命令就是 从 Docker Hub上下载 ContOS 版本为7

类似下面这图: 可能网络的原因你 多试几次

出现这样的错误 理论上从 docker hub 拉取镜像时是不需要的登录,

所以就只有一个原因: 你拉取的镜像写错误 或者Docker Hub没有此镜像

Error response from daemon: pull access denied for contos, repository does not exist or may require 'docker login'
  • 1

出现类似于这样的效果就代表成功了

如果你不想到Docker Hub官网里 亲自去找 嫌麻烦 那么我们可以通过在CentOS里查找能使用的镜像

docker search 镜像名称
  • 1

NAME: 就是你要下载 的镜像名称 但是没有提供版本号 需要你自己到Docker Hub 里去找

DESCRIPTION : 描述 可以看到 第一行 的介绍 The official build of CentOS. (这是官网CentOS)

STARS: 星星(点赞次数)

OFFICIAL : 代表是否是官方

AUTOMATED: 提供自动化的程序支持

而我们拉取的时候 docker pull NAME 就行了

根据是否是官方提供,可将镜像分为两类:

  • 一种是类似 centos 这样的镜像,被称为基础镜像或根镜像。这些基础镜像由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。

  • 还有一种类型,比如 xxx/centos 镜像,它是由 Docker Hub 的注册用户创建并维护的,往往带有用户名称前缀。可以通过前缀 username/ 来指定使用某个用户提供的镜像,比如 xxx 用户。

另外,在查找的时候通过 --filter=stars=N 参数可以指定仅显示收藏数量为 N 以上的镜像。

列出镜像

在上面我们下载了CentOS:7 镜像 但是如何查看本地 拉取了什么镜像?

使用

 docker image ls  
  • 1

REPOSITORY : 存储库 名称 (镜像名称)

TAG : 标签(版本号)

IMAGE ID : 存储库 id (镜像id)

CREATED : 创建时间

SIZE: 大小

我们发现一个问题了吗 正常的CentOS7的大小在4g作用 但是 我们从Docker hub 拉取下来的才203MB 这会不会有问题 ?

这你就不必担心 这就是Docker的强大的地方了 我们会在下面会教你如何使用从Docker Hub 里拉取下来的CentOS 7 镜像 不要急

删除镜像

我们可以用镜像的完整 ID,也称为 长 ID,来删除镜像。使用脚本的时候可能会用长 ID,但是人工输入就太累了,所以更多的时候是用 短 ID 来删除镜像。docker image ls 默认列出的就已经是短 ID 了,一般取前3个字符以上,只要足够区分于别的镜像就可以了。

  1. 如果镜像对应的容器在运行那么就无法删除

删除指定本地镜像

docker rmi 镜像id 
  • 1

我们也可以用镜像名,也就是 <仓库名>:<标签>,来删除镜像。

批量删除指定镜像

比如,我们需要删除所有仓库名为 redis 的镜像:

docker image rm  -f$(docker image ls -q redis)
  • 1

删除所有本地镜像和容器

docker stop $(docker ps -aq)       #停止所有正在运行的容器
docker rm $(docker ps -a -q) ;     # 删除所有容器
docker rmi  $(docker images -q -a)   # 删除所有镜像
  • 1
  • 2
  • 3

删除虚悬镜像

有时候还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 <none>

镜像原本是有镜像名和标签的,原来为 xx:3.2,随着官方镜像维护,发布了新版本后,重新 docker pull xx:3.2 时,

xx:3.2 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 <none>

除了 docker pull 可能导致这种情况,docker build 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none> 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像:

docker image ls -f dangling=true
  • 1

一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除。

docker image prune
  • 1

中间层镜像

为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker image ls 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数。

docker image ls -a
  • 1

这样会看到很多无标签的镜像,与之前的虚悬镜像不同,这些无标签的镜像很多都是中间层镜像,是其它镜像所依赖的镜像。这些无标签镜像不应该删除,否则会导致上层镜像因为依赖丢失而出错。实际上,这些镜像也没必要删除,因为之前说过,相同的层只会存一遍,而这些镜像是别的镜像的依赖,因此并不会因为它们被列出来而多存了一份,无论如何你也会需要它们。只要删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除。

容器

在上面我们已经 成功的将Docker Hub 里的镜像拉取到本地的Docker 仓库里了 那么我们就可以使用镜像创建容器 而容器你可以当成一个在当前电脑里 创建了一个子电脑 但是这个子电脑的系统是 CentOS 就行了

本章将具体介绍如何来管理一个容器,包括创建、启动和停止等。

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。

因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器

新建容器和退出容器终端

所需要的命令主要为 docker run 注意创建完的容器并没有被启动 也就无法使用

常用选项说明

  • -d, --detach=false, 指定容器运行于前台还是后台,默认为false

  • -i, --interactive=false, 打开STDIN,用于控制台交互

  • -t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false

  • -u, --user="", 指定容器的用户

  • -a, --attach=[], 登录容器(必须是以docker run -d启动的容器)

  • -w, --workdir="", 指定容器的工作目录

  • -c, --cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用

  • -e, --env=[], 指定环境变量,容器中可以使用该环境变量

  • -m, --memory="", 指定容器的内存上限

  • -P, --publish-all=false, 指定 绑定宿主机的开放端口 和容器的开放端口

  • -p, --publish=[],(大写) 随机绑定宿主机的开放端口 和容器的开放端口

  • -h, --hostname="", 指定容器的主机名

  • -v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录

  • --volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录

  • --cap-add=[], 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities

  • --cap-drop=[], 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities

  • --cidfile="", 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法

  • --cpuset="", 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU

  • --device=[], 添加主机设备给容器,相当于设备直通

  • --dns=[], 指定容器的dns服务器

  • --dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件

  • --entrypoint="", 覆盖image的入口点

  • --env-file=[], 指定环境变量文件,文件格式为每行一个环境变量

  • --expose=[], 指定容器暴露的端口,即修改镜像的暴露端口

  • --link=[], 指定容器间的关联,使用其他容器的IP、env等信息

  • --lxc-conf=[], 指定容器的配置文件,只有在指定–exec-driver=lxc时使用

  • --name="", 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字

--net="bridge" 容器网络设置:

bridge 使用docker daemon指定的网桥
host //容器使用主机的网络
container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
none 容器使用自己的网络(类似–net=bridge),但是不进行配置

  • --privileged=false, 指定容器是否为特权容器,特权容器拥有所有的capabilities

--restart="no" 指定容器停止后的重启策略:

no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always: 容器退出时总是重启`

  • --rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)

  • --sig-proxy=true, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

以上配置 用到的时候 在到网上查询 主要让你知道每一个配置是干嘛的就行了 使用方法很简单的 在之后学习Docker 的其他功能的时候回逐渐的 使用上面不同的指令

交互模式

下面的命令则创建启动一个 bash 终端,允许用户进行交互。

docker run -it --name=centos1  centos:7 /bin/bash
  • 1

docker run 创建容器

-it 交互模式

–name=centos1 你容器的名称

centos:7 使用centos7镜像作为容器的内容 当然可以是mysql 也可以是Tomcat 看你想让这个容器干什么了

/bin/bash (启动容器)

在交互模式下,用户可以通过所创建的终端来输入命令,例如 ls pwd 这些命令效果 感觉和在本机上使用CentOS没什么区别

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

检查本地是否存在指定的镜像,不存在就从公有仓库下载

利用镜像创建并启动一个容器

分配一个文件系统,并在只读的镜像层外面挂载一层可读写层

从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去

从地址池配置一个 ip 地址给容器

执行用户指定的应用程序

执行完毕后容器被终止

守护(后台)模式

用户通过 exit 命令或 Ctrl+d 来退出终端时。(容器不会停止)

创建完后 返回 容器的ID 并且处于后台启动状态

docker run -id --name=centos2  centos:7  /bin/bash
  • 1

退出容器终端

用户通过 exit 命令或 Ctrl+d 来退出终端

(创建交互模式 的时候 默认进入到容器里 退出容器后 容器自动关闭

下次在想使用 必须从新启动容器才能使用 之后在退出就正常了不会关闭容器)

我们可以测试 来验证

创建交互模式 退出容器后 我们可以试试 下面代码 (先不要管什么意思 后面会讲)

docker exec -it  centos1  /bin/bash
  • 1

意思就是 你容器并没有启动

这个时候我们 启动 centos1容器 docker start 然后我们在试试上面的命令 发现进入到容器里了

然后我们在使用 exit 退出容器 然后在使用上面的命令 发现成功进入到容器里 并没有关闭容器

守护(后台)模式 : 没有限制 容器始终开启 除非手动去停止容器

修改/添加容器设置

如果在创建容器的时候 忘记配置了一些内容 那么我们可以在 创建后 进行修改/添加 容器的配置

docker update 参数… 容器名称

docker update --restart=always storage
  • 1

常用的容器参数 在上面都有

容器文件和本机交互

从容器里面拷文件到宿主机

语法: docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径

示例: 假设容器名为testtomcat,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js, 现在要将test.js从容器里面拷到宿主机的/opt路径下面,那么命令应该怎么写呢?

在宿主机上面执行命令

docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js    /opt
  • 1
从宿主机拷文件到容器里面

语法: docker cp 要拷贝的文件路径 容器名: 要拷贝到容器里面对应的路径

示例:假设容器名为testtomcat,现在要将宿主机/opt/test.js文件拷贝到容器里面的/usr/local/tomcat/webapps/test/js路径下面,那么命令该怎么写呢?

在宿主机上面执行命令

docker cp /opt/test.js     testtomcat:/usr/local/tomcat/webapps/test/js
  • 1

查询容器

查询当前启动的容器

docker ps   
  • 1

查询所有容器

docker ps  -a  
  • 1

CONTAINER ID :容器ID

IMAGE 镜像和版本

COMMAND 命令

CREATED 创建时间

STATUS 状态 Up 5 minutes (运行了5分钟了) Exited (137) 9 minutes ago(9分钟前离开了)

ports: 端口号

NAMES :容器名称

启动和关闭容器

停止正在运行的容器

docker stop  NAMES
  • 1

启动没有运行的容器

docker start  NAMES
  • 1

重启容器

docker restart NAMES
  • 1

启动所有容器

docker start $(docker ps -aq)  
  • 1

停止所有的容器

docker stop $(docker ps -aq)  
  • 1

删除容器

删除容器 前提必须容器被关闭了

docker rm NAMES
  • 1

删除所有没有正在运行的容器

docker container prune
  • 1

WARNING! This will remove all stopped containers.(警告!这将删除所有停止的容器。)

会提示 Are you sure you want to continue? (是否继续) y

然后会打印 Total reclaimed space:xxB (收回了多少空间)

查询容器详细信息

docker inspect NAMES
  • 1

进入到容器里

格式: docker exec -it NAMES /bin/bash

-it 就是: 进入到容器里然后 开启容器的终端

NAMES : 就是你要 进入的容器名称

列:

docker exec -it  centos1  /bin/bash
  • 1

退出容器

exit

将容器生成镜像

这个一般用于备份容器的当时状态 直接在本地Docekr里生成镜像文件 如果你想换个电脑还能用那么 你可以将配置好的容器生成镜像上传到你的Docker hup里 在其他电脑上在pull拉取下来 直接就能用

语法: docker commit 容器id 镜像名称:版本号

注意如果Docker 里以存在相同的镜像那么将会被覆盖掉

列:

docker commit abd482b3a3fa  redis:5.0
  • 1

然你使用 docker images 查询下看看 生成镜像没

将(容器/镜像)导出为xxx.tar镜像文件

为什么要使用将容器打包成镜像 你想想你从官网下载的镜像都是基础镜像都是默认配置

比如:你花了一个星期好不容易将Mysql Tomcat… 给配置优化好了 在Centos7里运行没问题了 当你换一个电脑或者服务器的时候你难道你在花费一个星期去配置??? 所以这就用到了将配置好的容器保存成xxx.tar镜像包 这个镜像包你可以放到百度网盘或者U盘里都行 等下次用到了直接导入就能用 无须在进行配置 这样就节省了大量的时间 你可能会问和 上面commit 有什么区别 ? 这个快啊 你从网上拉取 如果网络差的话 那么你 下很久就下载不下来的 反正看你自己了 具体怎么使用了

docker save保存的是镜像(image),docker export保存的是容器(container);

导出Docker里某个容器 到本地

我们可以先使用 docker ps -a 查询本地Docker 所有容器 找到容器的id

可以使用 docker export 容器id > 保存位置/文件名.tar 命令。

列:

docker export 541881da553e > centos2-vessel.tar
  • 1

导出Docker 里某个镜像到 本地

使用docker images查看本机所有的镜像文件 找到镜像的id

可以使用 docker save 镜像id > 保存位置/文件名.tar 命令。

列:

docker save 7e6257c9f8d8 > centos7-mirror-image.tar
  • 1

这两者的区别:

  • 保存容器当时的快照状态

  • 而镜像 就相当于把镜像文件在复制一份而已

将xxx.tar镜像文件 导入进Dokcer里

将xxx.tar导入到Docker里是镜像 需要你手动生成容器才能使用

docker load用来载入镜像包docker import用来载入容器包,但两者都会生成为镜像;

区别:

docker load不能对载入的镜像重命名 因为不可以重命名 如果镜像以存在Docker里直接覆盖

而docker import可以为镜像指定新名称。 如果镜像以存在直接覆盖 (不想覆盖可以重名 想覆盖那么就原名称)

两种的使用方法:

  • 用户既可以使用 docker load 来导入镜像存储文件到本地Docker image库 ( 镜像还是原来的名称和版本号 )

    • docker load < centos7-mirror-image.tar
      
      • 1

  • 也可以使用 docker import *来导入一个容器存储文件到本地Docker image库 (自定名称和版本号)

    • cat centos2-vessel.tar | docker import - test/centos:7
      
      • 1

总结:

  • 若是只想备份镜像,使用save(导出)、load(导入)即可
  • 若是在启动容器后,容器内容有变化,需要备份,则使用export(导出)、import(导入)

注意: 你使用save(导出) 的文件 那么就必须使用load(导入) 如果你使用import(导入)就会出问题

同理 使用export(导出) 那么就必须使用 import(导入)

一般镜像都在Docker Hub里有 或者直接推送到自己的Docker Hub里 所以 没必要 备份 也就是说一般都 备份容器

容器是你通过镜像创建的 在使用期间你改变了 一些参数那么 此时的容器 就和原来的镜像不同了

你将容器备份了后还原 参数还是 你修改后的 而镜像只是基本内容 就和你从Docker Hub里拉取下来的没区别

那么什么时候使用 save(备份镜像)、load(导入镜像) 呢?

如果服务器网路不好或者pull不下来镜像,只能在其它网路比较好的机器上pull下来镜像,导出成一个镜像文件.tar,再上传到网路不好的机器上,然后再导入Docker 镜像仓库里,这样在网络不好的机器上也能使用docker镜像了

数据卷

介绍

Docker镜像是有多层只读文件叠加而成,当运行起一个容器的时候,Docker会在制只读层上创建一个读写层。如果运行中的容器需要修改文件,那么并不会修改只读层的文件,只会把该文件复制到读写层然后进行修改,只读层的文件就被隐藏了。当删除了该容器之后,或者重启容器之后,之前对文件的更改会丢失,镜像的只读层以及容器运行是的“读写层”被称为联合文件系统(Union File System)
为了实现容器与主机之间、容器与容器之间共享文件,容器中数据的持久化,将容器中的数据备份迁移恢复等,Docker加入了数据卷(volumes)机制。简单的讲,就是做了一个文件夹的实时共享,有点像局域网的文件共享。

如果你用过百度网盘的话 那么里面有一个功能就是数据同步 指定本地文件夹作为样本 然后关联到百度网盘的一个目录里

如果本地文件夹内的 发生变化 那么会自动同步到 网盘里

数据卷的特点

  1. 数据卷存在于宿主机的文件系统中,独立于容器,和容器的生命周期是分离的。
  2. 数据卷可以是目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了荣期间的数据共享和交换。
  3. 容器启动初始化时,如果容器使用的镜像包含了数据,这些数据会拷贝到数据卷中。
  4. 容器对数据卷的修改是实时进行的。

关键词:

数据卷 = 就是本地文件夹

宿主机 = 就是你要挂载的文件对应的那台 机器 (可以是虚拟机)

总体来说: 我要将容器内目录 挂载到 Centos7(宿主机) 下的 指定目录(数据卷)

当容器目录和数据卷目录绑定后,对方的修改会立即同步

一个数据卷可以被多个容器同时挂载
一个容器也可以被挂载多个数据卷

注意事项:

一般都是在创建容器的时候同时 绑定数据卷 因为先创建容器在添加数据卷的话非常非常麻烦

一对一

一个数据卷对应 一个容器

使用 –v 参数 设置数据卷

如果想要挂载多个容器里的目录到本地那么 就使用多个-v 就行了 可以参考常见应用部署

-v 宿主机文件夹路径 : 容器文件夹路径

如果发现挂载失败 那么就是你的权限不够 在创建容器时候添加

--privileged=true
  • 1

使容器 拥有root权限

演示:

创建一个守护(后台)容器 名称=centos-bing

将容器内/root/data_container目录 绑定到本地 /root/data目录里

docker run -id --name=centos-bing  -v /root/data:/root/data_container centos:7 
  • 1

创建成功后 我们测试下看看是否是内容同步

# 创建一个a.txt文件 向文件内写入I am hell 内容
touch /root/data/a.txt && echo I am hell >> /root/data/a.txt
  • 1
  • 2
#进入到 centos-bing容器里    /root/data_container  目录 有没有 a.txt 然后查看内容 
docker exec -it centos-bing /bin/bash   
cd /root/data_container  
ls
cat a.txt
  • 1
  • 2
  • 3
  • 4
  • 5
# 修改容器里的 a.txt 文件内容  之后推出容器 查看数据卷内的a.txt有没有发生变化
vi a.txt   #修改下内容  
exit 
cd /root/data/
vi a.txt 
  • 1
  • 2
  • 3
  • 4
  • 5

结果显而易见 修改了数据卷内的文件 容器内的文件 也会发生变化 反之 修改了容器内的文件数据卷内的文件也发送变化了

一对多

一个数据卷对应多个容器

比如 现在有3个容器 都需要 a.txt这个文件 那么我每次修改都要去 这3个容器里改?? 这不累死

在比如这3个容器都需要某一个功能 难道我一个一个去下载???

解决上面的问题我们可以 使用一对多的关系 来将一个数据卷关联多个容器

修改数据卷内容那么其他容器也会被影响 同理 其他容器修改了绑定文件夹内的内容那么其他所有 关联的容器和数据卷都会受到影响

很简单 就是创建多个容器 绑定相同的本地目录就行了

演示:

创建两个容器 都绑定到 /root/data数据卷

docker run -id --name=centos-bing2-1  -v   /root/data:/root/data_container centos:7 		
docker run -id --name=centos-bing2-2  -v  /root/data:/root/data_container centos:7 
  • 1
  • 2

在上面的案例中 /root/data 里是有一个a.txt文件 我们看看是否同步了

docker exec -it centos-bing2-1  /bin/bash   
cd  /root/data_container
ls
cat  a.txt

exit

docker exec -it centos-bing2-2  /bin/bash 
cd  /root/data_container
ls
vi a.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

结果显而易见 都同步到 各个容器里了

容器和容器之间的共享

什么是容器和容器之间的共享呢 ?

简单来说就是 将容器内的某个目录设置为数据卷 简称:容器数据卷(父容器)

其他容器继承自该父容器 绑定的目录。 这样容器和容器之间就共享了

使用 --volumes-from 父容器名称

演示:

#创建数据卷容器  指定容器内/volume这个目录为共享目录   如果不存在自动创建
docker run -id --name=centos0  -v /volume centos:7 /bin/bash
  • 1
  • 2
#创建容器1 来继承 数据卷容器(父容器)
docker run -id --name=centos1  --volumes-from  centos0  centos:7 /bin/bash  
#创建容器2 来继承 数据卷容器(父容器)
docker run -id --name=centos2  --volumes-from  centos0  centos:7 /bin/bash  
  • 1
  • 2
  • 3
  • 4

测试

在数据卷容器(父容器) 里创建文件b.txt 添加内容

docker exec -it centos0  /bin/bash 
cd  /volume
vi  b.txt
exit   
  • 1
  • 2
  • 3
  • 4

然后我们到各个 子容器里看看都同步了没

docker exec -it centos1  /bin/bash 
cd  /volume
cat b.txt
exit

docker exec -it centos2  /bin/bash 
cd  /volume
cat b.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

结果显而易见 都同步到 各个子容器里了

然后我们修改子容器 看看父容器 同步了没

# 如果你按照上面的命令执行到这一步那么 现在是处于 centos2子容器里的/volum  目录中
vi   b.txt     #修改里面的内容
exit
docker exec -it centos0  /bin/bash    #进入到父容器里
cd  /volume
cat b.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

结果显而易见 子容器修改父容器也跟着变了

查询容器的数据卷信息

docker inspect  容器名称
  • 1
#会显示一大堆内容  在这些内容里 找到这些信息就对了
"Mounts": [
    {
        "Type": "volume",    # 数据卷类型  Bing  和 volume
        "Name": "xxxxxxxxxxxx",   #数据卷id  有的有  有的没
        "Source": "/root/data",    ## 数据卷的目录
        "Destination": "/root/data_container",   #绑定 到容器那个目录
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Bing 和 volume区别

Bing 的数据卷就是你指定的本地目录 删除 Source 这个目录就相当于删除数据卷了

而volum 是容器和容器之间的数据同步 所以需要一个中间商来作为平台(数据卷)就好比qq群 这个由docker自动创建

删除数据卷

删除数据卷前 对应绑定的容器必须处于关闭状态

Bing类型需要你手动 删除本地文件

以下就是删除 volum 类型的办法

使用 docker volume ls 就是查询所有数据卷 但是 你也分不清楚谁谁的

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。

docker rm  -v  容器名称或id
  • 1

无主的数据卷可能会占据很多空间,要清理请使用以下命令

删除所有未使用的卷

docker volume prune
  • 1

容器使用网络

Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。

外部访问容器

容器中可以运行一些网络应用,要让外部也可以访问这些应用,

当使用 -P (大写P)标记时,Docker 会随机映射一个端口到内部容器开放的网络端口。

使用 -p端口号(小写p) 可以指定端口号

使用 docker ps 可以查询正在运行的容器 加 -a 查询所有

我们来演示下:

先拉取一个需要 端口号的镜像 比如mysql nginx tomcat … 然后创建此镜像的容器

docker pull nginx    
docker run -id  --name=nginx1  nginx:latest 
  • 1
  • 2

其他的容器 不需要网络 所有没有端口号

nginx 默认端口号是 80 端口 那么如何访问到nginx容器里呢? 毕竟外面还有一层Cenos7系统呢

我们可以将Centos7的某个端口 进行映射到容器里的80端口号上 这样我们访问Centos7的时候 就能访问到nginx了

我们下面就来试试:

使用-P(大写) 会随机映射一个端口到内部容器开放的网络端口。 这样好处就是:如果你不知道容器内的开放端口 会给你自动匹配

docker run -id -P  --name=nginx2  nginx:latest 
  • 1

然后我们 在游览器中访问 http://192.168.93.134:32768/ 192.168.93.134 换成你的Centos7的ip

我们还可以使用 docker logs 容器名称 查看访客记录

-p (小写)则可以指定要映射的端口,并且,在一个指定本地端口上只可以绑定一个容器。

使用本地80端口映射到 nginx容器的80端口

docker run -id -p 80:80  --name=nginx3  nginx:latest 
  • 1

然后在游览器上 http://192.168.93.134/

查看映射端口配置

使用 docker port 容器名称 端口号 来查看当前映射的端口配置

docker port nginx3  80
  • 1

-p 标记可以多次使用来绑定多个端口

docker run -id --name=nginx4 -p 80:80  -p 443:443 nginx:latest 
  • 1

一个是 http 的默认端口 80 一个是htts的默认端口 这里就别测试了会失败的 80端口我们在上面已经使用了 除非你把那个容器删除

如果你嫌麻烦那么可以用 --netwokr host 开启 Host 模式, 该模式指定是容器与主机享受相同的 端口

但需要注意的是,如果你用 Windows 或 Mac 本地启动容器的话,会遇到 host 模式失效的问题。 原因是 host 模式只支持 Linux 宿主机

容器互联

就相当于 搭建局域网 把容器比做电脑 可以让多个容器之间进行交互

新建网络

下面先创建一个新的 Docker 网络。 网络名称:my-net

docker network create -d bridge my-net
  • 1

连接容器

运行二个容器并连接到新建的 my-net 网络

使用 --network my-net

docker run -id  --name=centosnetwork1 --network my-net  centos:7
docker run -id  --name=centosnetwork2 --network my-net  centos:7

  • 1
  • 2
  • 3

通过 ping 来证明 centosnetwork1 容器和 centosnetwork2 容器建立了互联关系。

docker exec -it centosnetwork1  /bin/bash
ping centosnetwork2
  • 1
  • 2

用 ping 来测试连接 centosnetwork2 容器,它会解析成 172.19.0.3

同理在 centosnetwork1 容器执行 ping centosnetwork2,也会成功连接到。

exit
docker exec -it centosnetwork2  /bin/bash
ping centosnetwork1
  • 1
  • 2
  • 3

这样,centosnetwork1 容器和 centosnetwork2 容器建立了互联关系。

如果你嫌 centos:7 太大了 我们还有一个不提供系统 但是支持各种Linux命令的支持的镜像 busybox

busybox是一个聚成了一百多个最常用linux命令和工具的软件工具箱,它在单一的可执行文件中提供了精简的Unix工具集。BusyBox可运行于多款POSIX环境的操作系统中,如 Linux(包括Android),hurd,freebsa等

busybox既包含了一些简单实用工具,如cat 和 echo ,也包含了一些更大,更复杂的工具,如 grep ,find ,mount 以及telnet.

docker pull busybox
  • 1

配置DNS

一般用不到 配置DNS 下面就简单介绍下

如何自定义配置容器的主机名和 DNS 呢?秘诀就是 Docker 利用虚拟文件来挂载容器的 3 个相关配置文件。

手动指定容器的配置,可以在使用 docker run 命令启动容器时加入如下参数:

-h HOSTNAME 或者 --hostname=HOSTNAME 设定容器的主机名,它会被写到容器内的 /etc/hostname/etc/hosts。但它在容器外部看不到,既不会在 docker container ls 中显示,也不会在其他的容器的 /etc/hosts 看到。

--dns=IP_ADDRESS 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。

--dns-search=DOMAIN 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com

注意:如果在容器启动时没有指定最后两个参数,Docker 会默认用主机上的 /etc/resolv.conf 来配置容器。

常见应用部署

容器内软件下载

在容器里下载Vim 文本编译软件 有些镜像是不带的 除非你是系统镜像 比如Contos 这些

而Mysql Tomcat Nginx… 这些 服务器 等一些功能镜像 都是不带常规的Linux工具的

在 容器内配置 国内镜像资源

cd /etc/apt
  • 1
mv /etc/apt/sources.list /etc/apt/sources.list.bak
  • 1
echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list
echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list
  • 1
  • 2
  • 3
  • 4

更新安装原

apt-get update 
  • 1

然后我们后面 就使用 apt-get install 要下载的东西

下载前先安装依赖

apt-get install libtinfo5
  • 1

然后有可能会提示问你是否继续 不要直接回车 和 yue 而是这句话 Yes, do as I say!

下载vim

然后在下载vim

apt-get install -y vim
  • 1

这时候 就可以 使用 vi 和vim 命令了

如果无法右键复制 (在命令情况下)

set mouse-=a
  • 1

而其他相似软件都可以 使用 apt-get install 软件名称 来下载

安装pnig

 apt-get install -y iputils-ping
  • 1

安装 ifconfig 查询当前容器的ip

apt-get install -y net-tools
  • 1

如果你发现 没有 apt-get 命令 也没有 yum命令 那么我们手动安装

Tomcat

在Docker 中Tomcat 是自带JDK的

1.拉取tomcat镜像 (推荐你使用的什么版本做的项目 那么就拉取什么版本)

docker pull tomcat:9.0.39-jdk8
  • 1

拉取完 使用 docker images 查询 看看 拉取下来没

2.创建容器,设置端口映射、目录映射

docker run -id --name=c_tomcat --restart=always --privileged=true \
-p 8080:8080 \
-v ~/tomcat:/usr/local/tomcat/webapps \
tomcat:9.0.39-jdk8
  • 1
  • 2
  • 3
  • 4

参数说明:

-p 8080:8080: 将容器的8080端口映射到主机的8080端口

-v ~/tomcat:/usr/local/tomcat/webapps: 将主机中~/tomcat目录挂载到Tocamt容器的webapps 否则我们每次上传项目 还要到容器里 肯定是不方便的

我们此刻还需要将容器里的webapps.dost下面的所有文件复制到 webapps里才行 否则你访问404

docker exec -it  c_tomcat  /bin/bash    #   自动会进入  /usr/local/tomcat 下面
  • 1
cp -r /usr/local/tomcat/webapps.dist/*  /usr/local/tomcat/webapps
exit
  • 1
  • 2

我们在本地~/tomcat 中创建一个test文件夹 然后添加ahtml文件 然后写入内容 之后使用游览器访问下

cd  ~/tomca

mkdir test

vi a.html

<h1>Docker-Tomcamt</h1>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

访问 http://192.168.93.136:8080/test/a.html 192.168.93.13换成你的ip

以后 都是直接将你的项目war 包上传到这里 就行了 自动会解析

访问Docker Hub仓库

仓库(Repository)是集中存放镜像的地方。

一个容易混淆的概念是注册服务器(Registry)。实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址 docker.io/ubuntu 来说,docker.io 是注册服务器地址,ubuntu 是仓库名。

大部分时候,并不需要严格区分这两者的概念。

目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 4,209,840的镜像 (统计时间2020年7月)。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。

注册

你可以在 https://hub.docker.com 免费注册一个 Docker 账号。 在上面如果你没有注册的话那现在赶紧注册吧

在ContOS登录Docker

docker login
  • 1

然后输入你的Docker账户 和密码

然后我们就可以 操作Docker 了

推送镜像

用户也可以在docker login登录后通过 docker push 命令来将自己的镜像推送到 Docker Hub。

但是在推送前需要将 本地镜像改一下名称为你的 用户名/镜像:版本号

  1. 先查询本地已有的镜像

  1. 修改为你的 镜像名称

    docker tag centos:7 huanmin123/centos:7
    
    • 1

可以发现 ID是一样的 也就代表他们本质就是一个镜像 只是名称不同了 相当于起一个别名 占用的内容大小不变 还是203mb 而不是 *2了

  1. 推送到自己账户的Docker Hub里 (会有点慢)

    docker  push  huanmin123/centos:7
    
    • 1

    有可能因为网络的原因出现 推送失败的现象 不要紧 从新试试就行了

    如果推送成功 在最后应该会给你 显示类似下面这行信息

    digest: sha256:ce6815027949d0b48e3097a94fa3ec062866a78868d50c7900c697c13574599f size: 539

    然后我们到Docker Hub 上去查询

如果出现下面 这信息那么就代表 ok没问题

我们进去看看

这就是我们推送的版本

有人就会问了如果我推送不同的版本怎么办 ? 答案: 一样 就是把版本改一下

这是我自己的Mysql 仓库 我推送了 5.6 和5.7 两个版本

代码如下:

前提是你本地Docker 镜像库里 有 5.6和 5.7 镜像

5.6

docker tag mysql:5.6  huanmin123/mysql:5.6
docker push huanmin123/mysql:5.6
  • 1
  • 2

5.7

docker tag mysql:5.7  huanmin123/mysql:5.7
docker push huanmin123/mysql:5.7
  • 1
  • 2

可以发现没什么区别 就是把版本号 改一下

拉取镜像

你可以通过 docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地。 这个我们在上面已经讲过了

那么我们来试试拉取自己Docker Hub里的镜像

如果 出现了 Status: Image is up to date for huanmin123/centos:7 代表你本地已经有centos 7 了

还有就是拉取的时候有可能因为网络原因 拉取失败 多试试就好了

自动构建

自动构建(Automated Builds)功能对于需要经常升级镜像内程序来说,十分方便。

比如你自己的网站项目 更新了 我提交到 github 上的同时 Docker Hub 镜像内存储的这网站项目也同时更新了

别人将镜像拉取下来直接就是最新的网站项目了

当GitHub 内软件(项目)发生新的提交 (commit)或者创建了新的标签(tag),Docker Hub 会自动构建镜像并推送到 Docker Hub 中。

要配置自动构建,包括如下的步骤:

  • 登录 Docker Hub;
  • 在 Docker Hub 点击右上角头像,在账号设置(Account Settings)中关联(Linked Accounts)目标网站;
  • 在 Docker Hub 中新建或选择已有的仓库,在 Builds 选项卡中选择 Configure Automated Builds
  • 选取一个目标网站中的项目(需要含 Dockerfile)和分支;
  • 指定 Dockerfile 的位置,并保存。

之后,可以在 Docker Hub 的仓库页面的 Timeline 选项卡中查看每次构建的状态。

具体操作 这里就不 写了 需要的话 你到百度上找 也不是很难 就是 需要配置很多东西

参考文章1

看完后 发现不成功 因为 你的GItHub项目没有 Dockerfile ???

文件位置

具体怎么写Dockerfile 文件 我么后面会教的 现在主要就了解 流程是怎么回事

私有仓库

有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。

本节介绍如何使用本地仓库。

安装运行 docker-registry

你可以通过获取官方 registry 镜像来运行。

docker pull registry:2   //拉取镜像

mkdir /opt/registry     //创建文件

//启动容器并关联本地文件夹  
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录了 如果主机的镜像删除了吗 容器里的镜像也会被删除

为什么要这样做 因为 Registry容器我们没法进入操作 只能通过本地 影响到容器 同时还能起到备份的作用

registry镜像

registry容器

到这里代表我们私有仓库 搭建完成 是不是很简单

然后我们 http://192.168.93.134:5000/v2/ 192.168.93.134 是的本机的Centos7的ip

出现下面情况说明registry运行正常。

如果你不想通过 游览器的方式 直接在Centos里也能查询 (下面是我之前拉取过镜像的图)

还可以直接 用 curl 查看仓库中的所有镜像。

curl 127.0.0.1:5000/v2/_catalog
  • 1

使用curl -XGET 查询指定的镜像 和 这个镜像的所有版本

curl -XGET 127.0.0.1:5000/v2/centos/tags/list
  • 1

然后我们就正式开始使用私有仓库

在私有仓库上传,下载镜像

创建好私有仓库之后,就可以使用 docker tag 来标记一个镜像,然后推送它到私有仓库。例如私有仓库地址为 127.0.0.1:5000

先在本机查看已有的镜像。在上面已经查看过滤

使用 docker tagcentosu:7 这个镜像标记为 127.0.0.1:5000/centos:7。 127.0.0.1=localhost

docker tag centos:7 127.0.0.1:5000/centos:7
  • 1

使用 docker push 上传标记的镜像。 到私有仓库里

docker push 127.0.0.1:5000/centos:7
  • 1

我们查询私有仓库 看看有没有 http://192.168.93.134:5000/v2/centos/tags/list

_catalog就是查询仓库所有镜像名称 centos/tags/list 就是 查询仓库所有镜像名称和版本号

然后我们查看私有仓库映射到本地的文件 cd /opt/registry/

删除docker 镜像库里已有的127.0.0.1:5000/centos:7 镜像,再尝试从私有仓库中下载这个镜像。

查询docker本地镜像库已有的镜像

删除127.0.0.1:5000/centos:7 镜像

docker image rm 127.0.0.1:5000/centos:7
  • 1

我们使用 docker images 查询看看删除了没

发现已经删除了127.0.0.1:5000/centos:7 那么我们试试从本地私有仓库里 将centos:7镜像拉取到 本地Docker镜像库里

docker pull 127.0.0.1:5000/centos:7
  • 1

我们使用 docker images 查询看看拉取到了没

注意事项

如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到本主机的私有仓库。

你就得把例如 192.168.93.134:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。

这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制

Ubuntu 16.04+, Debian 8+, centos 7 这些系统

请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

vi  /etc/docker/daemon.json
  • 1

按 i 编译 Esc结束编译 :wq 保存

{
  "insecure-registries": ["192.168.93.134:5000","192.168.93.134:443","192.168.93.134:10080"]
}

  • 1
  • 2
  • 3
  • 4

insecure-registries 就是我们要设置的 他主机的可推送 ip 多个ip使用 逗号隔开[xxx,xxx]

我们可以先将我们本地的Centos的ip添加进去

重启docker服务

systemctl daemon-reload
systemctl restart docker
  • 1
  • 2

如果出现重启docker服务 失败的话 那么daemon.json配置有问题 可能出现隐藏符号 你给复制进去了 …

 cd /etc/docker/    
 rm -rf daemon.json   
  • 1
  • 2

然后重启docker服务 肯定就成功了 但是阿里云镜像加速也没了 等之后你需要下载的时候在配吧 看你自己了

其他主机将镜像推送到192.168.199.100私有仓库,即可推送成功

docker push 192.168.199.100:5000/centos:7
  • 1

harbor 的搭建(必会)

docker 官方提供的私有仓库 registry,用起来虽然简单 ,但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker distribution的基础上增加了一些安全、访问控制、管理的功能以满足企业对于镜像仓库的需求。

Registry有以下缺点:

  • 没有图形界面

  • 没有项目管理

  • 没有用户权限控制

  • 看不到镜像操作记录

Harbor的优势:

  • 图形管理界面。

  • 按项目管理镜像。

  • 独立的用户管理,不同用户可以操作不同镜像,细粒度的权限控制,包含create、push 、pull、delete。

  • 镜像管理。

  • 标签管理。

  • 操作日志管理。

安装harbor前期做准备

使用harbor要先安装docker及docker-compose 我博客里都有自己找 都写在一篇文章里了

第1步下载 Harbor离线安装包

从harbor官网下载离线安装包,下载地址:https://github.com/goharbor/harbor/releases 离线包大小为500M以上 。

链接:https://pan.baidu.com/s/16RyqzlMiESs29_1PM1qRUQ
提取码:1234

第2步解压软件包修改配置文件

创建文件 用于放上传后压缩包

mkdir -p /tools/harbor/
  • 1

下载完离线包之后,将离线安装包harbor-offline-installerxxx上传到centos服务器的 /tools/harbor 下面

进入harbor离线包上传的目录,解压离线包到/usr/local/harbor下

cd   /tools/harbor/

tar zxf /tools/harbor/harbor-offline-installer-v2.0.4-rc1.tgz  -C /usr/local/             #自己修改压缩包的名称

ls /usr/local/harbor
  • 1
  • 2
  • 3
  • 4
  • 5

解压后的文件

配置harbor.yml.tmpl 文件 将这个模板文本复制一份为 harbor.yml 然后修改这个文件

cp   /usr/local/harbor/harbor.yml.tmpl  /usr/local/harbor/harbor.yml
  • 1
vi /usr/local/harbor/harbor.yml      
  • 1

将hostname改成 本机IP或 域名 ,不要用localhost 或 127.0.0.1或0.0.0.0, 冒号后面都有一个空格

将http端口改成10080,因为默认用的80端口已经被占用,http可以指定任意端口

配置https的端口,只能使用443端口,更改证书路径,证书路径为刚刚生成的https证书的实际路径

修改后台管理密码

修改harbor的内部数据库密码

修改harbor数据存储路径与日志存储路径,目录要先创建好并赋予777权限

修改日志存放路径,默认路径为/var/log/harbor

数据存储路径

mkdir -p  /data/harbor-data
chmod  777 /data/harbor-data
  • 1
  • 2

日志文件存放地方

mkdir -p /data/harbor-log
chmod  777 /data/harbor-log
  • 1
  • 2

效果图

注意: 如果你Centos 的 ip 变化了那么 你下次启动harbor前就需修改harbor.yml 里的hostname

第3步启动harbor 和使用

执行harbor安装脚本 并启动

cd /usr/local/harbor
./install.sh
  • 1
  • 2

安装完成效果图

然后在游览器中访问 : http:192.168.93.134:10080

输入用户名 admin 密码为harbor12345(配置文件中的)大功告成

我们创建一个用户 :系统默认的有一个 admin 用户 这里不显示

系统管理->用户管理

有了用户我们就可以在Centos里访问harbor了

在访问前我们 必须添加以下代码

vi /etc/docker/daemon.json

修改如下

{
  "insecure-registries": ["192.168.93.134:5000","192.168.93.134:443","192.168.93.134:10080"]
}
  • 1
  • 2
  • 3

然后 登录

docker login 192.168.93.134:10080    #登录

docker  logout 192.168.93.134:10080   #退出登录
  • 1
  • 2
  • 3

输入你注册的用户和密码

然后我们可以拉取和推送镜像了

拉取方式和你在Docker Hub一样方式

可以看到默认给我们创建了一个项目了 所以我们就没必要在创建了 我们点击项目进去

这些都是 常用的命令 我们使用的是Docker 所以就前两条就行

修改标签:

docker tag SOURCE_IMAGE[:TAG] 192.168.93.134:10080/library/REPOSITORY[:TAG]

docker tag  centos:7   192.168.93.134:10080/library/centos:7
  • 1

推送本地镜像到 harbor -> library项目里

docker push 192.168.93.134:10080/library/REPOSITORY[:TAG]

docker push  192.168.93.134:10080/library/centos:7
  • 1

我们点击这个镜像仓库 里面就是centos 的各个版本 因为我们就上传了一个 所以下图就只有一个 centos7

可以看到有个拉取命令了吧 点击复制 … 就能下载到本地的Docekr里了

docker image rm 192.168.93.134:10080/library/centos
  • 1

我们玩点高级的 将项目 设置访问权限 只有允许的用户才能操作项目里的镜像

然后我们 在拉取镜像试试 就会报错 你没有权限

我们可以将huanmin 用户添加到 libraty 项目里就行了

然后你在拉取镜像试试 发现就可以拉取了

有人会说如何在本地查询 harbor 里的镜像呢 在网页里查询不香吗?

查询 所有项目

ls  /data/harbor-data/registry/docker/registry/v2/repositories/
  • 1

查询 指定项目下的所有镜像

ls /data/harbor-data/registry/docker/registry/v2/repositories/项目名/
列:
ls  /data/harbor-data/registry/docker/registry/v2/repositories/library/
  • 1
  • 2
  • 3

查询指定项目下的指定镜像的版本号

ls   /data/harbor-data/registry/docker/registry/v2/repositories/项目名/镜像名/_manifests/tags/
列:
ls   /data/harbor-data/registry/docker/registry/v2/repositories/library/centos/_manifests/tags/
  • 1
  • 2
  • 3
点赞 -收藏-关注-便于以后复习和收到最新内容
有其他问题在评论区讨论-或者私信我-收到会在第一时间回复
如有侵权,请私信联系我
感谢,配合,希望我的努力对你有帮助^_^
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/300539
推荐阅读
相关标签
  

闽ICP备14008679号