Docker学习1——Docker入门

Docker学习1——Docker入门

参考资料

1、Docker简介

2、尚硅谷2022版Docker实战教程(docker教程天花板)

1.1 Docker简介

1.1.1 Docker引入

假定您在开发一个尚硅谷的谷粒商城,您使用的是一台笔记本电脑而且您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。此外,您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。您希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销。请问?您要如何确保应用能够在这些环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复?

答案就是使用容器。Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案-----系统平滑移植,容器虚拟化技术。 环境配置相当麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。

为了程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式,开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况。Docker的出现使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。

Docker是基于Go语言实现的云开源项目。Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。

Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

1.1.2 容器与虚拟机

虚拟机存在以下缺点:资源占用多;冗余步骤多;启动慢

由于前面虚拟机存在某些缺点,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写为LXC)

Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

Docker学习1——Docker入门_第1张图片

从概念上来看 Docker 和我们传统的虚拟机比较类似,只是更加轻量级,更加方便使,Docker 和虚拟机最主要的区别有以下几点:

  • 虚拟化技术依赖的是物理CPU和内存,是硬件级别的;而我们的 Docker 是构建在操作系统层面的,利用操作系统的容器化技术,所以 Docker 同样的可以运行在虚拟机上面。
  • 我们知道虚拟机中的系统就是我们常说的操作系统镜像,比较复杂;而 Docker 比较轻量级,我们可以用 Docker 部署一个独立的 Redis,就类似于在虚拟机当中安装一个 Redis 应用,但是我们用 Docker 部署的应用是完全隔离的。
  • 我们都知道传统的虚拟化技术是通过快照来保存状态的;而 Docker 引入了类似于源码管理的机制,将容器的快照历史版本一一记录下来,切换成本非常之低。
  • 传统虚拟化技术在构建系统的时候非常复杂;而 Docker 可以通过一个简单的 Dockerfile 文件来构建整个容器,更重要的是 Dockerfile 可以手动编写,这样应用程序开发人员可以通过发布 Dockerfile 来定义应用的环境和依赖,这样对于持续交付非常有利。

1.2 Docker安装

安装过程请参考官网https://docs.docker.com/engine/install/ubuntu/

docker run hello-world

以上过程图示如下:

Docker学习1——Docker入门_第2张图片

1.2.1 Docker的基本组成

需要正确的理解仓库/镜像/容器这几个概念:

Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

  • 镜像文件:image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
  • 容器实例:一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
  • 仓库:就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。

镜像image

Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。它也相当于是一个root文件系统。比如官方镜像 centos7 就包含了完整的一套 centos7 最小系统的 root 文件系统。相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。

Docker 面向对象
容器 对象
镜像

容器container

从面向对象角度

Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台

从镜像容器角度

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

仓库repository

仓库(Repository)是集中存放镜像文件的场所。

类似于

Maven仓库,存放各种jar包的地方;

github仓库,存放各种git项目的地方;

Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。

库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub(https://hub.docker.com/),

存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等

1.2.2 Docker架构

Docker 使用 C/S (客户端/服务器)体系的架构,Docker 客户端与 Docker 守护进程通信,Docker 守护进程负责构建,运行和分发 Docker 容器。Docker 客户端和守护进程可以在同一个系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护进程。Docker 客户端和守护进程使用 REST API 通过UNIX套接字或网络接口进行通信。

Docker学习1——Docker入门_第3张图片

1.2.3 Docker底层原理

1️⃣ 为什么Docker会比VM虚拟机快

由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。

2️⃣ Docker利用的是宿主机的内核,而不需要加载操作系统OS内核

当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟

1.3 Docker常用命令

1.3.1 帮助启动类命令

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

1.3.2 镜像命令

  • 列出本地主机上的镜像:docker images

    root@yjq-KPR-WX9 /h/yjq# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
    hello-world   latest    feb5d9fea6a5   12 months ago   13.3kB
    

    REPOSITORY:表示镜像的仓库源

    TAG:镜像的标签版本号

    IMAGE ID:镜像ID

    CREATED:镜像创建时间

    SIZE:镜像大小

  • 搜索镜像:docker search [OPTIONS] NAME

    root@yjq-KPR-WX9 /h/yjq [1]# docker search --limit 5 mysql
    NAME             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    mysql            MySQL is a widely used, open-source relation…   13234     [OK]       
    mariadb          MariaDB Server is a high performing open sou…   5062      [OK]       
    phpmyadmin       phpMyAdmin - A web interface for MySQL and M…   640       [OK]       
    percona          Percona Server is a fork of the MySQL relati…   588       [OK]       
    circleci/mysql   MySQL is a widely used, open-source relation…   27                   
    
  • 拉取镜像:docker pull [image][:TAG]

    没有TAG就是最新版

    root@yjq-KPR-WX9 /h/yjq# docker pull redis
    Using default tag: latest
    latest: Pulling from library/redis
    31b3f1ad4ce1: Pull complete 
    ff29a33e56fb: Pull complete 
    b230e0fd0bf5: Pull complete 
    9469c4ab3de7: Pull complete 
    6bd1cefcc7a5: Pull complete 
    610e362ffa50: Pull complete 
    Digest: sha256:b4e56cd71c74e379198b66b3db4dc415f42e8151a18da68d1b61f55fcc7af3e0
    Status: Downloaded newer image for redis:latest
    docker.io/library/redis:latest
    root@yjq-KPR-WX9 /h/yjq# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
    redis         latest    9da089657551   11 days ago     117MB
    hello-world   latest    feb5d9fea6a5   12 months ago   13.3kB
    
  • 查看镜像/容器/数据卷所占的空间:docker system df

    root@yjq-KPR-WX9 /h/yjq# docker system df
    TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
    Images          2         1         116.9MB   116.9MB (99%)
    Containers      1         0         0B        0B
    Local Volumes   0         0         0B        0B
    Build Cache     0         0         0B        0B
    
  • 删除镜像:docker rmi [image]

    docker rmi allen_mysql:5.7
    

1.3.3 容器命令

有镜像才能创建容器——根本前提,以拉取一个ubuntu镜像来演示。

root@yjq-KPR-WX9 /h/yjq# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
redis         latest    9da089657551   11 days ago     117MB
ubuntu        latest    2dc39ba059dc   4 weeks ago     77.8MB
hello-world   latest    feb5d9fea6a5   12 months ago   13.3kB
  • 新建+启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

    root@yjq-KPR-WX9 /h/yjq [127]# docker run -it ubuntu /bin/bash
    

    参数说明:

    • -i: 交互式操作。
    • -t: 终端。
    • ubuntu: ubuntu 镜像。
    • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
  • 容器后台运行

    docker run -itd --name ubuntu-test ubuntu /bin/bash
    
    root@yjq-KPR-WX9 /h/yjq# docker run -itd --name ubuntu-test ubuntu /bin/bash
    bd51961c7bee455cbfd527aa57a9723da4a7c51728910e8af319c526d2da41ac
    root@yjq-KPR-WX9 /h/yjq [1]# docker ps
    CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
    bd51961c7bee   ubuntu    "/bin/bash"   13 seconds ago   Up 11 seconds             ubuntu-test
    
  • 查看所有的容器:docker ps -a

    root@yjq-KPR-WX9 /h/yjq# docker ps -a
    CONTAINER ID   IMAGE         COMMAND       CREATED         STATUS                          PORTS     NAMES
    18bf53854840   ubuntu        "/bin/bash"   3 minutes ago   Exited (0) About a minute ago             gallant_gagarin
    c0267969dda9   hello-world   "/hello"      28 hours ago    Exited (0) 28 hours ago                   tender_borg
    
  • 启动一个容器:docker start <容器 ID>

    root@yjq-KPR-WX9 /h/yjq# docker start 18bf53854840
    18bf53854840
    root@yjq-KPR-WX9 /h/yjq# docker ps -a
    CONTAINER ID   IMAGE         COMMAND       CREATED         STATUS                    PORTS     NAMES
    18bf53854840   ubuntu        "/bin/bash"   7 minutes ago   Up 2 seconds                        gallant_gagarin
    6d275f4586e9   ubuntu        "/bin/fish"   7 minutes ago   Created                             nice_heisenberg
    c0267969dda9   hello-world   "/hello"      28 hours ago    Exited (0) 28 hours ago             tender_borg
    
    
  • 停止一个容器:docker stop <容器 ID>

    root@yjq-KPR-WX9 /h/yjq# docker stop 18bf53854840
    18bf53854840
    
  • 重启一个容器:docker restart <容器 ID>

  • 进入容器

    在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:

    • docker attach

    • docker exec:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止

      root@yjq-KPR-WX9 /h/yjq# docker exec -it bd51961c7bee /bin/bash
      root@bd51961c7bee:/# exit
      exit
      root@yjq-KPR-WX9 /h/yjq# docker ps
      CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
      bd51961c7bee   ubuntu    "/bin/bash"   7 minutes ago   Up 7 minutes             ubuntu-test
      

      注意: 如果从这个容器退出,容器不会停止,这就是为什么推荐大家使用 docker exec 的原因。

  • 导出容器:docker export [容器ID] > [导出名]

    root@yjq-KPR-WX9 /h/y/mynote# docker export bd51961c7bee > ubuntu.tar
    root@yjq-KPR-WX9 /h/y/mynote# ls
    docker-learning  ubuntu.tar
    
  • 导入容器

    可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:

    root@yjq-KPR-WX9 /h/y/mynote [SIGPIPE|125]# cat ubuntu.tar |docker import - test/ubuntu:v1
    sha256:993856043ed01fe9cf6d613d59e45c4a57caddf8e6921a7426e6af1579045b91
    root@yjq-KPR-WX9 /h/y/mynote# docker images
    REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
    test/ubuntu   v1        993856043ed0   5 seconds ago   77.8MB
    redis         latest    9da089657551   11 days ago     117MB
    ubuntu        latest    2dc39ba059dc   4 weeks ago     77.8MB
    hello-world   latest    feb5d9fea6a5   12 months ago   13.3kB
    

    此外,也可以通过指定 URL 或者某个目录来导入,例如:

    $ docker import http://example.com/exampleimage.tgz example/imagerepo
    
  • 删除容器:docker rm

    root@yjq-KPR-WX9 /h/y/mynote# docker ps
    CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
    bd51961c7bee   ubuntu    "/bin/bash"   23 minutes ago   Up 23 minutes             ubuntu-test
    root@yjq-KPR-WX9 /h/y/mynote# docker rm -f bd51961c7bee 
    bd51961c7bee
    root@yjq-KPR-WX9 /h/y/mynote# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    

1.4 Docker镜像详解

1.4.1 概念

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

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

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

1.4.2 Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统为UnionFS。

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs

这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

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

Docker学习1——Docker入门_第4张图片

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?

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

为什么 Docker 镜像要采用这种分层结构呢

  • 镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

1.4.3 重点理解

Docker镜像层都是只读的,容器层是可写的。

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

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

Docker学习1——Docker入门_第5张图片

1.4.4 Docker镜像commit操作案例

docker commit提交容器副本使之成为一个新的镜像

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

案例演示ubuntu安装vim

从Hub上下载ubuntu镜像到本地并成功运行

原始的默认Ubuntu镜像是不带着vim命令的

1️⃣ 启动ubuntu容器

root@yjq-KPR-WX9 /h/y/m/cloud-learning# docker run -it ubuntu /bin/bash

2️⃣ 在docker容器上执行以下命令

root@00d0c38a0fdf:/# apt-get update
root@00d0c38a0fdf:/# apt-get install vim

3️⃣ 安装完成后,commit自己的新镜像

root@yjq-KPR-WX9 /h/y/m/cloud-learning# docker commit -m"add vim" -a"yjq" 00d0c38a0fdf yjq/myubuntu:1.1
sha256:42df175cf90a8c4ca0cb568d93489b5fa422bb3e738584ea3d0fde8fafdaeb9a
root@yjq-KPR-WX9 /h/y/m/cloud-learning# docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
yjq/myubuntu   1.1       42df175cf90a   7 seconds ago    175MB
test/ubuntu    v1        993856043ed0   47 minutes ago   77.8MB
redis          latest    9da089657551   11 days ago      117MB
ubuntu         latest    2dc39ba059dc   4 weeks ago      77.8MB
hello-world    latest    feb5d9fea6a5   12 months ago    13.3kB

4️⃣ 启动新镜像

root@yjq-KPR-WX9 /h/y/m/cloud-learning# docker run -it 42df175cf90a 
root@76755c8281fb:/# vim test.txt
root@76755c8281fb:/# 

1.4.5 小结

Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层

Docker学习1——Docker入门_第6张图片

1.5 本地镜像发布到阿里云

Docker学习1——Docker入门_第7张图片

进入阿里云的容器镜像服务:https://cr.console.aliyun.com/cn-hangzhou/instance/dashboard

Docker学习1——Docker入门_第8张图片

以myubuntu为例子

╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker images
REPOSITORY     TAG       IMAGE ID       CREATED         SIZE
yjq/myubuntu   1.1       42df175cf90a   24 hours ago    175MB
test/ubuntu    v1        993856043ed0   24 hours ago    77.8MB
redis          latest    9da089657551   12 days ago     117MB
ubuntu         latest    2dc39ba059dc   4 weeks ago     77.8MB
hello-world    latest    feb5d9fea6a5   12 months ago   13.3kB

1️⃣ 创建镜像仓库

Docker学习1——Docker入门_第9张图片

2️⃣ 选择本地仓库

Docker学习1——Docker入门_第10张图片

操作指南如下:

Docker学习1——Docker入门_第11张图片

3️⃣ 登录阿里云Docker Registry

╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker login --username=aliyun0576298139 registry.cn-hangzhou.aliyuncs.com

4️⃣ 设置tag

╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker tag 42df175cf90a  registry.cn-hangzhou.aliyuncs.com/yjqrep/yjqubuntu:1.1

5️⃣ 进行push

╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker push registry.cn-hangzhou.aliyuncs.com/yjqrep/yjqubuntu:1.1
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/yjqrep/yjqubuntu]
640ee0f8eaf1: Pushed 
7f5cbd8cc787: Pushed 
1.1: digest: sha256:3d2686f683917bb77e5571aadc7a48ec43f1e901b3f09255be3a751d63ecd56b size: 741

Docker学习1——Docker入门_第12张图片

6️⃣ 也可以将阿里云上的镜像下载到本地

╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker pull registry.cn-hangzhou.aliyuncs.com/yjqrep/yjqubuntu:1.1
1.1: Pulling from yjqrep/yjqubuntu
Digest: sha256:3d2686f683917bb77e5571aadc7a48ec43f1e901b3f09255be3a751d63ecd56b
Status: Image is up to date for registry.cn-hangzhou.aliyuncs.com/yjqrep/yjqubuntu:1.1
registry.cn-hangzhou.aliyuncs.com/yjqrep/yjqubuntu:1.1
╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker images
REPOSITORY                                           TAG       IMAGE ID       CREATED         SIZE
yjq/myubuntu                                         1.1       42df175cf90a   24 hours ago    175MB
registry.cn-hangzhou.aliyuncs.com/yjqrep/yjqubuntu   1.1       42df175cf90a   24 hours ago    175MB

1.6 本地镜像发布到私有库

1.6.1 为什么需要私有库

官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。

Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。

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

1.6.2 发布流程

1️⃣ 下载镜像Docker Registry

╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker pull registry
Using default tag: latest
latest: Pulling from library/registry
213ec9aee27d: Pull complete 
5299e6f78605: Pull complete 
4c2fb79b7ce6: Pull complete 
74a97d2d84d9: Pull complete 
44c4c74a95e4: Pull complete 
Digest: sha256:83bb78d7b28f1ac99c68133af32c93e9a1c149bcd3cb6e683a3ee56e312f1c96
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

2️⃣ 运行私有库Registry,相当于本地有个私有Docker hub

默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调

╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker run -d -p 5000:5000 -v /yjquse/myregistry/:/tmp/registry --privileged=true registry          
cdaa55937a362d35b66786d8d5068dda0e88a4db7647efef2259d0d2001d39fd

3️⃣ 案例演示创建一个新镜像,ubuntu安装ifconfig命令

原始的Ubuntu镜像是不带着ifconfig命令的

╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker run -it ubuntu /bin/bash
root@0b21fbc4a41a:/# ifconfig
bash: ifconfig: command not found
root@0b21fbc4a41a:/# apt-get update
root@0b21fbc4a41a:/# apt-get install net-tools
root@0b21fbc4a41a:/# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 5682  bytes 23846075 (23.8 MB)
        RX errors 0  dropped 0  overruns 0  frame 0

安装完成后,commit我们自己的新镜像

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker commit -m"add config" -a"yjq" 0b21fbc4a41a  yjq/myubuntu:1.2
sha256:fa8aa281743e931850c8e637c12d9805217f23aaac5e8093030c24ec10995acc

启动我们的新镜像,发现ifconfig已经预装了。

╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker run -it yjq/myubuntu:1.2 /bin/bash                                                                                                               ↵ 125
root@b0a74b50dccd:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 26  bytes 3557 (3.5 KB)

4️⃣ cur验证私服库上的镜像

curl是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl设计为无用户交互下完成工作;curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传…

╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                                       NAMES
cdaa55937a36   registry   "/entrypoint.sh /etc…"   11 minutes ago   Up 11 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   compassionate_darwin
╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ curl -XGET http://192.168.1.131:5000/v2/_catalog
{"repositories":[]}

发现并无镜像

5️⃣ 将新镜像修改为符合私服规范的tag

╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker tag yjq/myubuntu:1.2 192.168.1.131:5000/yjq/myubuntu:1.2
╭─root@yjq-KPR-WX9 /home/yjq  ‹system› 
╰─$ docker images
REPOSITORY                                           TAG       IMAGE ID       CREATED         SIZE
192.168.1.131:5000/yjq/myubuntu                      1.2       fa8aa281743e   7 minutes ago   117MB
yjq/myubuntu                                         1.2       fa8aa281743e   7 minutes ago   117MB

6️⃣ 修改配置文件使之支持http

docker默认不允许http方式推送镜像,通过配置选项来取消这个限制

{  
    "registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"],  
    "insecure-registries": ["192.168.1.131:5000"]
}

7️⃣ push到私服库

╭─root@yjq-KPR-WX9 /etc/docker  ‹system› 
╰─$ docker push 192.168.1.131:5000/yjq/myubuntu:1.2
The push refers to repository [192.168.1.131:5000/yjq/myubuntu]
10617f4d8384: Pushed 
7f5cbd8cc787: Pushed 
1.2: digest: sha256:7e33a1a34ef0f76ceff6ae4d76ae472c26e895d3068aca48eecdcbe472ac57cc size: 741

可以进行验证

╭─root@yjq-KPR-WX9 /etc/docker  ‹system› 
╰─$ curl -XGET http://192.168.1.131:5000/v2/_catalog
{"repositories":["yjq/myubuntu"]}

8️⃣ pull到本地

╭─root@yjq-KPR-WX9 /etc/docker  ‹system› 
╰─$ docker rmi 192.168.1.131:5000/yjq/myubuntu:1.2
Untagged: 192.168.1.131:5000/yjq/myubuntu:1.2
Untagged: 192.168.1.131:5000/yjq/myubuntu@sha256:7e33a1a34ef0f76ceff6ae4d76ae472c26e895d3068aca48eecdcbe472ac57cc
╭─root@yjq-KPR-WX9 /etc/docker  ‹system› 
╰─$ docker pull 192.168.1.131:5000/yjq/myubuntu:1.2
1.2: Pulling from yjq/myubuntu
Digest: sha256:7e33a1a34ef0f76ceff6ae4d76ae472c26e895d3068aca48eecdcbe472ac57cc
Status: Downloaded newer image for 192.168.1.131:5000/yjq/myubuntu:1.2
192.168.1.131:5000/yjq/myubuntu:1.2

可运行

─root@yjq-KPR-WX9 /etc/docker  ‹system› 
╰─$ docker run -it 192.168.1.131:5000/yjq/myubuntu:1.2
root@5dc057011a9b:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

1.7 Docker容器数据卷

❓ Docker挂载主机目录访问如果出现cannot open directory .: Permission denied

解决办法:在挂载目录后多加一个--privileged=true参数即可

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

1.7.1 卷是什么

docker run -d -p 5000:5000 -v /yjquse/myregistry/:/tmp/registry --privileged=true registry 

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷.

将docker容器内的数据保存进宿主机的磁盘中运行一个带有容器卷存储功能的容器实例

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录     镜像名

1.7.2 卷能做什么

将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的。

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

特点:

1:数据卷可在容器之间共享或重用数据

2:卷中的更改可以直接实时生效

3:数据卷中的更改不会包含在镜像的更新中

4:数据卷的生命周期一直持续到没有容器使用它为止

1.7.3 案例说明

╭─root@yjq-KPR-WX9 /etc/docker  ‹system› 
╰─$ docker run -it --name myu3 --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash   
//Docker容器内目录
root@91de29254214:/tmp# cd /tmp/myDockerData/
root@91de29254214:/tmp/myDockerData# ls
//宿主机目录
╭─root@yjq-KPR-WX9 /etc/docker  ‹system› 
╰─$ cd /tmp/myHostData/

查看数据卷是否挂载成功: docker inspect myu3

"Mounts": [
    {
        "Type": "bind",
        "Source": "/tmp/myHostData",
        "Destination": "/tmp/myDockerData",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

容器和宿主机之间数据共享

1 docker修改,主机同步获得

2 主机修改,docker同步获得

读写规则映射说明

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:[读写规则]  镜像名

读写:rw(默认)

只读:ro

卷的继承和共享

docker run -it  --privileged=true --volumes-from 父类  --name u2 ubuntu

1.8 Docker常规安装简介

1.8.1 总体步骤

搜索镜像
拉取镜像
查看镜像
启动镜像
停止容器
移除容器

1.8.2 安装tomcat

1️⃣ docker hub上面查找tomcat镜像:docker search tomcat

╭─root@yjq-KPR-WX9 /tmp/myHostData  ‹system› 
╰─$ docker search --limit 5 tomcat
NAME                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
tomcat                        Apache Tomcat is an open source implementati…   3399      [OK]       
tomee                         Apache TomEE is an all-Apache Java EE certif…   98        [OK]       
bitnami/tomcat                Bitnami Tomcat Docker Image                     47                   [OK]
secoresearch/tomcat-varnish   Tomcat and Varnish 5.0                          0                    [OK]
wnprcehr/tomcat                                                               0                    

2️⃣ 从docker hub上拉取tomcat镜像到本地:docker pull tomcat

╭─root@yjq-KPR-WX9 /tmp/myHostData  ‹system› 
╰─$ docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
0e29546d541c: Pull complete 
9b829c73b52b: Pull complete 
cb5b7ae36172: Pull complete 
6494e4811622: Pull complete 
668f6fcc5fa5: Pull complete 
dc120c3e0290: Pull complete 
8f7c0eebb7b1: Pull complete 
77b694f83996: Pull complete 
0f611256ec3a: Pull complete 
4f25def12f23: Pull complete 
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest

3️⃣ docker images查看是否有拉取到的tomcat

╭─root@yjq-KPR-WX9 /tmp/myHostData  ‹system› 
╰─$ docker images tomcat
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
tomcat       latest    fb5657adc892   9 months ago   680MB

4️⃣ 使用tomcat镜像创建容器实例(也叫运行镜像)

╭─root@yjq-KPR-WX9 /tmp/myHostData  ‹system› 
╰─$ docker run -it -p 8080:8080 tomcat
-p 小写,主机端口:docker容器端口
-P 大写,随机分配端口
-i:交互
-t:终端
-d:后台

5️⃣ 解决404 not found问题

╭─root@yjq-KPR-WX9 /usr/local  ‹system› 
╰─$ docker run -d -p 8888:8080 tomcat
9d7bc0bbde03fae935055fc598de452385044bec0df4e50945fc2c8ba791346e
╭─root@yjq-KPR-WX9 /usr/local  ‹system› 
╰─$ docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED             STATUS             PORTS                                       NAMES
9d7bc0bbde03   tomcat     "catalina.sh run"        10 seconds ago      Up 9 seconds       0.0.0.0:8888->8080/tcp, :::8888->8080/tcp   inspiring_blackwell
4e58e7f0e1b7   registry   "/entrypoint.sh /etc…"   About an hour ago   Up About an hour   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   frosty_williamson
╭─root@yjq-KPR-WX9 /usr/local  ‹system› 
╰─$ docker exec -it 9d7bc0bbde03 /bin/bash                                                                   
root@9d7bc0bbde03:/usr/local/tomcat# ls -l
total 160
-rw-r--r-- 1 root root 18994 Dec  2  2021 BUILDING.txt
-rw-r--r-- 1 root root  6210 Dec  2  2021 CONTRIBUTING.md
-rw-r--r-- 1 root root 60269 Dec  2  2021 LICENSE
-rw-r--r-- 1 root root  2333 Dec  2  2021 NOTICE
-rw-r--r-- 1 root root  3378 Dec  2  2021 README.md
-rw-r--r-- 1 root root  6905 Dec  2  2021 RELEASE-NOTES
-rw-r--r-- 1 root root 16517 Dec  2  2021 RUNNING.txt
drwxr-xr-x 2 root root  4096 Dec 22  2021 bin
drwxr-xr-x 1 root root  4096 Oct  5 15:16 conf
drwxr-xr-x 2 root root  4096 Dec 22  2021 lib
drwxrwxrwx 1 root root  4096 Oct  5 15:16 logs
drwxr-xr-x 2 root root  4096 Dec 22  2021 native-jni-lib
drwxrwxrwx 2 root root  4096 Dec 22  2021 temp
drwxr-xr-x 2 root root  4096 Dec 22  2021 webapps
drwxr-xr-x 7 root root  4096 Dec  2  2021 webapps.dist
drwxrwxrwx 2 root root  4096 Dec  2  2021 work
root@9d7bc0bbde03:/usr/local/tomcat# rm -r webapps
root@9d7bc0bbde03:/usr/local/tomcat# mv webapps.dist webapps
root@9d7bc0bbde03:/usr/local/tomcat# exit

Docker学习1——Docker入门_第13张图片

你可能感兴趣的:(云原生学习,docker,学习,容器)