Docker--简介与实践

一、什么是容器技术

Docker 是一个开源的应用容器引擎,要了解Docker的前提就是要了解什么是容器技术。说到容器技术,这里就要联系一下我们经常使用到的虚拟机中的虚拟化技术了,两者在功能、目的上相似,都是将一系列的程序进行打包,建立一个独立的运行环境,也就是我们所说的沙盒,但在实现的环节与特点方面,两者截然不同。

1.1 虚拟化技术

虚拟化技术是指在同一台计算机上通过hypervisor(运行在基础物理服务器和操作系统之间的中间软件层,让多个操作系统和应用共享硬件),虚拟出多个包括完整虚拟机系统镜像,每个虚拟机拥有独立的操作系统和硬件资源。

在这里插入图片描述

虽然虚拟化技术可以在按需构建操作系统实例的过程当中为系统管理员提供极大的灵活性,但hypervisor虚拟化技术存性能和资源使用效率方面的问题,从而大大增加应用开发的消耗,而容器技术的诞生就是为了解决这问题。

1.2 容器技术

容器技术直接将一个应用程序所需的相关程序代码、函式库、环境配置文件都打包起来建立沙盒执行环境,从而有效的将单个操作系统的资源划分到孤立的组中,以便更好的在独立的组之间平衡有冲突的资源使用需求,创建好的这个沙盒执行环境就被称作为容器。

在这里插入图片描述

1.3 容器引擎

容器引擎不是只有docker一家,除了docker还有coreos等,而在众多的容器引擎中,Docker几乎是容器引擎的代表,下面就最典型的容器技术Docker进行介绍。

二、 什么是Docker

2.1 Docker简介

Docker 是一个开源的应用容器引擎,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器完全使用沙箱机制,相互之间不会有任何接口,同时容器性能开销极低。

2.2 Docker基本概念

在这里插入图片描述

镜像 (Image):

镜像简单的来说,就是面向对象中的类,相当于一个模板。从本质上来说,镜像相当于一个文件系统。Docker 镜像是一个特殊的文件系统,提供了容器运行时所需的程序、库、资源、配置等。同时镜像不包含任何动态数据,其内容在构建之后也不会被改变。

容器 (Container):

与上面的镜像相对应,容器就是类创建的实例,是以某一个镜像为模板创建出来的实体。容器的实质是进程,但与直接在系统运行的进程不同,容器进程有自己独立的命名空间。因此容器可以拥有自己的root 文件系统、网络配置、内存空间,从而创建出一个隔离的环境里,就好像是一个独立于Host系统的系统。

仓库 (Registry):

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,仓库(Docker Registry) 就是这样的服务。仓库存放了每个类别镜像不同的版本,通过仓库可以获得需要的目的镜像。

客户端/服务器:

Docker 使用客户端/服务器体系结构。Docker 客户端通过接受命令与用户进行交互, Docker 客户端与 Docker 服务器进行交互,Docker服务端负责构建、运行和分发 Docker 镜像,以及对应镜像容器的创建。最典型的Docker 客户端就是docker的命令行程序。

分层存储:

镜像需要包含操作系统完整的root 文件系统,而Docker将其设计为分层存储的架构,镜像构建时,会一层层构建,同时在修改、删除的时候也是在镜像最上面添加相应的操作层。该存储结构方便了镜像的复用,使得代码的构建变得简单起来,我们可以通过在原有的镜像添加、修改配置,从而实现自己的镜像。

2.3 Docker优势
  • 更高效的利用系统资源。docker 容器直接与内核交互,几乎没有性能损耗,性能优于通过 Hypervisor 层与内核层的虚拟化

  • 更快速的启动时间。传统的虚拟机技术启动应用服务往往需要数分钟,而Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。

  • 实现自动化测试和持续的集成、部署。使用Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过Dockerfile 来进行镜像构建,并结合持续集成系统进行集成测试,而运维人员则可以直接快速部署该镜像,同时结合持续部署系统可以集进行自动部署。

  • 兼容性。不需要再去考虑操作系统、依赖环境的影响,各种依赖环境都可以在docker中安装体现,而不是依赖于操作系统的环境。

从下面可以更加明显看出,与虚拟机相比容器的优势:

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般是几十个

三、CentOS下Docker配置

Docker 分为 CE 和 EE 两大版本。 CE 即社区版(免费,支持周期 7 个月), EE 即企业版,强调安全,付费使用,支持周期 24 个月。

docker安装

在Centos安装docker需要先配置docker仓库,配置docker仓库成功后,就可以直接使用yum命令进行docker的安装了。

  • 仓库添加

    仓库添加前需要先安装需要的软件包,下面的yum-utils提供的yum-config-manager可以管理添加yum的安装仓库,而 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2的。

    $ sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2
    

在这里插入图片描述

安装好需要的软件包后,就可以使用yum-config-manager命令设置docker安装的仓库了。

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

在这里插入图片描述

  • docker engine-community安装

    添加完docker的仓库,就可以直接使用yum install 命令安装docker

    $ sudo yum install docker-ce docker-ce-cli containerd.io
    

在这里插入图片描述

  • 安装测试

    安装成功后,可以使用以下的命令检测docker的安装是否成功,如果没有错误输出,则安装成功。

    docker version
    

在这里插入图片描述

Docker 启动
  • 虽然Docker安装成功了,但是其服务端的进程还没有启动,所以这里需要通过命令行使docker服务端在后台启动。

    sudo systemctl start docker
    

在这里插入图片描述

  • 输入完命令后,可以再使用version命令测试Docker服务端的守护进程是否成功启动,启动成功后,version命令除了Client项外,还会多出一个Server项,表明Docker服务端的守护进程已经在后台运行了。

    docker version
    

在这里插入图片描述

Docker镜像测试
  • 在安装并启动好docker后,可以获取并运行一个最简单的镜像hello-world,这个事docker社区中自带的一个镜像,可以直接输入run进行运行。当docker发现本地没有该镜像时,会直接去docker社区进行下载,然后再运行该镜像。下面可以看到docker下载镜像的过程,已经镜像运行的过程,同时该镜像在运行后就会自动退出。

    sudo docker run libray/hello-world
    

    另外也可以通过pull命令先拉取镜像,然后在运行。 library/hello-world 是 image 文件在仓库里面的位置,其中 library 是镜像文件所在的组, hello-world是镜像文件的名字,因为library是docker默认的组,所以可以省略不写。

    sudo docker pull libray/hello-world
    

在这里插入图片描述

  • 镜像获取后,可以通过以下的命令查看本地存在的镜像。

    sudo docker images
    

在这里插入图片描述

配置国内镜像

因为Docker的镜像仓库在国外,下载的速度都比较慢,所以这里可以配置国内的加速镜像仓库。

  • 使用vim访问daemon.json文件,可能不存在,vim会自动创建一个新的。

    vim /etc/docker/daemon.json
    

在这里插入图片描述

  • 在该文件中找到registry-mirrors项,没有就自己添加一个,在列表中添加我们要加的国内加速镜像仓库。这里提供一个网易的加速镜像仓库。

    "registry-mirrors":["http://hub-mirror.c.163.com"]
    
    

在这里插入图片描述

  • 命令行重启docker,可以使用info命令查看在下面的registry mirror项看镜像仓库是否添加成功,下面是加速镜像添加成功后的结果。

    sudo systemctl restart docker
    sudo docker info
    
    

在这里插入图片描述

四、Docker 容器使用

Mysql容器使用
  • 首先拉去mysql镜像,在设置好国内镜像后速度会快一点。这里的冒号后面表示的是镜像的标签,也就是版本号,输入命令后可以看到Docker在拉去mysql相关的镜像依赖,镜像前面的十进制数是镜像的ID,同时这里省略了library。

    docker pull mysql:5.7
    

在这里插入图片描述

  • 启动Mysql服务器容器,启动后会返回运行容器的ID。命令中,

    sudo docker run -p 3306:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
    

在这里插入图片描述

参数说明:

-p 3306:3306 :表示将容器服务的 3306 端口映射到到宿主机的 3306 端口,这样就可以直接通过宿主机的3306端口访问到容器的Mysql的服务器了。

-e MYSQL_ROOT_PASSWORD=root: -e表示后面设置环境变量,后面表示的是mysql的root账号密码。

--name mysql2:创建容器的名字,不能重复。

-d:表示容器创建运行后不进入容器。

  • 启动成功后,可以使用ps命令查看已经成功启动的容器,这里可以添加-a包含上已经中止了的容器。

    docker ps
    

在这里插入图片描述

  • 然后使用以下命令进入容器的终端,在容器终端可以运行mysql的客户端,这里可以使用exit命令退出容器终端。

    docker run -it --net host mysql:5.7 "sh"docker exec -it mysql2 bash
    mysql -h127.0.0.1 -P3306 -uroot -proot
    

在这里插入图片描述

参数说明:

-it:表示主机的输入输出流与容器终端的连接。

"sh":表示启动容器的终端。

  • 在退出终端后,可以通过prune命令删除停止运行的容器以及未挂载的卷,-f表示强制删除。

    docker container prune -f
    docker volume prune –f
    

在这里插入图片描述

五、镜像创建

1. Dockerfile

镜像的构建需要使用到dockerfile,Dockerfile是用来构建镜像的文本文件,文本由多条的命令组成。

常用命令

FROM

镜像的创建一般都是在其他镜像的基础上创建的,FROM命令一般用于dockerfile的开头,用于指定基础的镜像,多次使用可以指定多个基础镜像。

FROM <image>
或者
FORM <image>:<tag>

RUN

用于在构建镜像(docker build)过程过程中执行后面给出的命令,有两种不同的使用方法格式。

shell 格式:

RUN <命令>

Exec 格式:

RUN ["可执行文件", "参数1", "参数2"]

COPY

复制指令,从源路径复制文件到目标路径,这可以设置多个源路径。

shell 格式:

COPY <源路径1>...  <目标路径>

Exec 格式:

COPY ["源路径1",...  "<目标路径>"]

同时可以使用通配符进行作为源路径

COPY hom* /mydir/
COPY hom?.txt /mydir/

ENV

用于设置、定义环境变量

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷,避免重要的数据,因容器重启而丢失。

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

CMD

启动的容器指定默认要运行的命令,与RUN命令不同,命令在镜像运行时(docker run)进行,同时如果Dockerfile 中存在多个 CMD 指令,仅最后一个生效。

CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]			//提供ENTRYPOINT时才能使用

同时CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖,如上面运行镜像的终端:

docker run -it --net host mysql:5.7 "sh"

其中"sh"就是替代的命令。

ENTRYPOINT

类似于 CMD 指令,但不会被 docker run 的命令行参数指定的指令所覆盖。同时如果Dockerfile 中存在多个 ENTRYPOINT指令,仅最后一个生效。

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

EXPOSE

声明端口,给用户说明使用的端口,以方便配置映射。

EXPOSE <端口1> [<端口2>...]

2. 创建简单镜像
  • 创建一个新文件夹,在文件夹中创建好名为dockerfile的文件。

在这里插入图片描述

  • 使用vi编辑dockerfile,并输入以下的命令,这里的top是显示运行中进程的命令。

    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
    
    

在这里插入图片描述

  • 输入好后保存回到文件夹中,使用build命令进行镜像构建,其中./参数表示镜像根目录在当前目录,-t hello表示镜像的名字。

    docker build ./ -t hello
    
    

在这里插入图片描述

  • 创建成功后,可以直接使用docker run 运行刚刚创建好的镜像,可以看到运行成功后可以看到控制台上有top命令进程运行。

    docker run -it --rm hello -H
    
    

在这里插入图片描述

六、阿里云镜像服务实践

上面介绍了如何在本地构建镜像,但单单在本地构建的对象是不够的,我们往往还需要一个平台来发布并且管理自己构建的镜像,这时就可以使用阿里云提供的镜像服务。

1.建立仓库
  • 首先访问阿里云官方网站https://cr.console.aliyun.com,选择登录,没有账号就注册一个账号。

在这里插入图片描述

  • 注册完成后,如果想要上传镜像,还要为自己的阿里云账号这里需要选择好镜像服务器的地域,以及命名空间

    仓库和命名空间组合起来就形成了上面所说的镜像的组,这里自己根据情况输入就好了。

在这里插入图片描述

  • 仓库信息填写完后,系统还要求选择代码源,因为接下来是直接在CentOs中上传镜像的,所以这里选择的代码源是本地仓库。

在这里插入图片描述

  • 创建成功后回到仓库列表,就可以看到刚刚创建好的仓库的状态与信息。

在这里插入图片描述

2. 上传镜像
  • 仓库创建完成后回到CentOs终端,使用docker的login命令进行登录该命令中username 为创建好的阿里云用户名,命令的参数为阿里云的镜像地址,这里根据上面创建好仓库的地域选择,其中shenzhen 代表的是镜像服务器在深圳的地址,另外还有许多的镜像地址,自己看情况选择一个,不过接下来要用相同的地址进行操作。同时,login命令输入后会要求用户输入密码,输入成功后会有登录成功的提示。

    docker login --username=ouzj5 registry.cn-shenzhen.aliyuncs.com
    
    

在这里插入图片描述

  • 在上传镜像前,还需要根据刚刚创建好的仓库名字对将要上传的镜像进行标记,标记的作用是将其归入某一仓库。这里的镜像名字前依次是响应仓库的地址、命名空间以及仓库的名字,同时还可以在镜像名字后面添加:tag作为标签,这里使用hello-wrold作为标签,默认的则为latest

    docker tag registry.cn-shenzhen.aliyuncs.com/ouzj5/repo:hello-world
    
    

在这里插入图片描述

  • 标记成功后,就可以直接使用push命令上传建好的镜像了,上传成功后结果如下。

    docker push registry.cn-shenzhen.aliyuncs.com/ouzj5/repo:hello-world
    
    

在这里插入图片描述

  • 上传成功后可以点进刚刚创建好的仓库,选择镜像版本,在仓库中可以看到对应标签的镜像已经成创建好了,同时有该标签镜像的各种信息。

在这里插入图片描述

3.获取仓库中的镜像
  • 上传成功后,可以尝试获取自己创建好的镜像,首先获取前先删除原来的镜像,这里使用docker的rmi命令,这里看到似乎并没有真正的删除,只是把标签去掉,要真正删除需要添加-f参数。

    docker rmi registry.cn-shenzhen.aliyuncs.com/ouzj5/repo:hello-world
    
    

在这里插入图片描述

  • 然后使用pull命令进行拉取,命令的参数就是上面push的参数,命令行会显示从阿里云中下载新的镜像。

    docker pull registry.cn-shenzhen.aliyuncs.com/ouzj5/repo:hello-world
    
    

在这里插入图片描述

  • 拉去成功后,可以使用images命令查看镜像是否拉去成功,下面可以看到对应的仓库标签的镜像。

    docker images
    
    

在这里插入图片描述

  • 最后还有一个docker命令是logout操作,其会将对应的登录状态从本地中清除。

    docker log out registry.cn-shenzhen.aliyuncs.com
    
    

在这里插入图片描述

七、docker hub自动构建实践

上面介绍了如何去上传自己构建好的镜像了,但是每一个版本的更新还要进行登录上传,就会感觉十分的麻烦,所以下面实践的是如何利用github 以及 docker hub实现应用的自动构建化,通俗来讲就是每当docker hub检测到github有更新(push),其会自动调用github上的dockerfile进行镜像构建,并且上传到仓库中。

1. 创建账号并且链接github账号
  • 这里使用到的平台是外国的docker hub平台,提供与阿里云类似的镜像管理服务,在使用前同样需要先注册一个用户账号,其网站为https://hub.docker.com/,注册成功后进入以下页面。

在这里插入图片描述

  • 因为这里实现的是对github上面仓库的自动构建,所以需要将docker hub的账号和github 的账号链接起来,选择右上角菜单的Account Setting选项,进入用户设置页面,然后选择Linked Accounts选项。

在这里插入图片描述

  • 进入到Linked Accounts页面后,可以看到有GitHub链接的选项,可以看到新的账号没有链接,这里选择github上的Connect选项,接下来页面就会要求输入github的账号密码。

在这里插入图片描述

  • 登录成功后,就可以看到Linked Account中的GitHub项变成了对应的账号了。

在这里插入图片描述

2.创建自动化构建镜像仓库
  • 在设置自动化构建前,需要在github仓库中给出对应的dockerfile

在这里插入图片描述

  • 选择菜单上的Repositories选项,进入仓库管理页面,该页面的右上方有一个Create仓库按钮,点下开始创建仓库。

在这里插入图片描述

  • 进入镜像仓库页面,填写好仓库的基本信息,点击创建仓库后进入仓库页面。

在这里插入图片描述

  • 在仓库页面中,选择仓库的builds选项

在这里插入图片描述

  • 进入builds页面后会要求选择构建的仓库的源,这里选择刚刚登录上的额github账号。

在这里插入图片描述

  • 选择github后,会要求填写github中需要自动构建的源码仓库,填写好其他基本信息点击save and build保存并构建。

在这里插入图片描述

在这里插入图片描述

  • 设置保存后,仓库的build页面就变成了以下的状态,证明开始构建了。

在这里插入图片描述

  • 设置好后,可以尝试随便push更新github上的代码,可以看到push后build会再次运行,自动构建就弄好了。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40135006/article/details/103643962