暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一文带你了解容器技术Docker

AISeer 2021-09-23
2263

dreamhomes

读完需要

9
分钟

速读仅需 7 分钟


本文介绍下docker容器技术,学习docker的目的是可以将自己的开发环境部署到多台机器上,不需要重复造轮子了!

什么是 docker

docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。

docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux服务器,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类iphone的app),并且容器开销极其低。

下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

docker 优点

  • 灵活:即使是最复杂的应用也可以集装箱化。
  • 轻量级:容器利用并共享主机内核。
  • 可互换:您可以即时部署更新和升级。
  • 便携式:您可以在本地构建,部署到云,并在任何地方运行。
  • 可扩展:您可以增加并自动分发容器副本。
  • 可堆叠:您可以垂直和即时堆叠服务。

docker 应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

docker 架构

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。

架构图如下所示:

概念说明
ImagesDocker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Container容器是独立运行的一个或一组应用,是镜像运行时的实体。
ClientDocker 客户端通过命令行或者其他工具使用 Docker SDK[1] 与 Docker 的守护进程通信。
Host一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
RegistryDocker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。
MachineDocker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,例如VirtualBox。

PS:Docker Hub[2] 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签>
的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest
作为默认标签

Ubuntu 18.04 安装 Docker-ce

  1. 推荐更换ubuntu国内软件源为中科大的源(视服务器而定):
    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
    sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    sudo apt update

  2. 安装需要的包:
    sudo apt install apt-transport-https ca-certificates software-properties-common curl

  3. 添加 GPG 密钥,并添加 Docker-ce 软件源,以中国科技大学的 Docker-ce 源为例:
    curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
    $(lsb_release -cs) stable"


  4. 添加成功后更新软件包缓存:
    sudo apt update

  5. 安装docker-ce:
    sudo apt install docker-ce

  6. 设置开机自启动并启动 Docker-ce(安装成功后默认已设置并启动,可忽略):
    sudo systemctl enable docker
    sudo systemctl start docker

  7. 测试运行:
    sudo docker run hello-world

终端显示以下内容时说明安装成功:PS:可以添加当前用户到 docker
用户组,可以不用 sudo
运行 docker(可选):

sudo groupadd docker
sudo usermod -aG docker $USER

镜像使用

管理和使用本地 Docker 主机镜像

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

    参数说明:

    • REPOSITORY:表示镜像的仓库源
    • TAG:镜像的标签。同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本;使用REPOSITORY:TAG 来定义不同的镜像。
    • IMAGE ID:镜像ID
    • CREATED:镜像创建时间
    • SIZE:镜像大小
  • docker search name
    :在Docker Hub中查找镜像。

    参数说明:

    • NAME: 镜像仓库源的名称
    • DESCRIPTION: 镜像的描述
    • STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。
    • OFFICIAL: 是否 docker 官方发布
    • AUTOMATED: 自动构建。
  • docker pull name
    :从Docker Hub中下载镜像。

  • docker rmi name
    :删除镜像。前提是基于该镜像的容器已不再处于使用状态。

创建镜像

  • 从已经创建的容器中更新镜像,并且提交这个镜像。更新镜像之前需要使用镜像来创建一个容器:例如用ubuntu镜像创建的容器中进行apt update
    更改,然后exit
    退出容器。此时容器ID为04f3b433a4a9
    。可以通过命令 docker commit 来提交容器副本,提交后可以再次查看本地镜像文件: docker commit -m="update" -a="dreamhomes" 04f3b433a4a9 dreamhomes/ubuntu
  • docker tag IMAGE_ID dreamhomes/ubuntu:version
    :设置镜像标签
  • 使用 Dockerfile 指令来创建一个新的镜像。对此方法无需求暂不介绍,可以参考:
    • https://www.w3cschool.cn/reqsgr/awqcnozt.html[3]
    • https://www.runoob.com/docker/docker-dockerfile.html[4]

容器使用

  • docker run -it --name ubuntu-test ubuntu bash
    :创建容器;

    参数说明:

    • -i: 交互式操作。
    • -t: 终端。
    • --name:容器名字。
    • ubuntu: ubuntu 镜像。
    • /bin/bash:在镜像名后的是命令,交互式 Shell为 bin/bash。要退出终端,直接输入 exit;
  • docker ps -a
    :查看所有容器(包括已停止的)
  • docker start ID
    :启动一个已停止的容器(加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec)
  • docker stop ID
    :停止运行的容器;
  • docker run -itd --name ubuntu-test ubuntu bin/bash
    :容器后台运行;
  • docker exec -it ID bin/bash
    :进入运行的容器;docker attach ID
    :进入容器后退出会导致容器停止!
  • docker export ID > name.tar
    :导出容器快照到本地文件;
  • cat docker/ubuntu.tar | docker import - test/ubuntu:v1
    :从本地快照文件导入为镜像;
  • docker import http://example.com/exampleimage.tgz example/imagerepo
    :从URL或目录导入镜像;
  • docker rm -f ID
    :删除运行的容器;
  • docker container prune
    :清理掉所有处于终止状态的容器;

容器连接

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P
-p
参数来指定端口映射。也可通过-v
参数将主机文件映射到容器中。

端口映射

  • docker run -d -P training/webapp python app.py
    -P
    :是容器内部端口随机映射到主机的高端口。
  • docker run -d -p 5000:5000 training/webapp python app.py
    -p
    : 是容器内部端口绑定到指定的主机端口。
  • docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
    指定容器绑定的网络地址。

数据卷

  • sudo docker run -d -P --name test -v home/dreamhomes:/home/dreamhomes:ro ubuntu bash
    挂载一个主机目录作为数据卷,本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它;:ro
    表示文件只读。
  • sudo docker run -it --rm -v home/v-smj19:/home/v-smj19 ubuntu bash
    --rm
    参数表示在容器退出时自动清理容器内部的文件系统。等价于:docker rm -v

了解上述命令后即可满足基础的开发需求了,如果有更复杂的需求可以参考官网哦!https://docs.docker.com/engine/reference/run/[5]

参考资料

[1]

Docker SDK: https://docs.docker.com/develop/sdk/

[2]

Docker Hub: https://hub.docker.com

[3]

https://www.w3cschool.cn/reqsgr/awqcnozt.html: https://www.w3cschool.cn/reqsgr/awqcnozt.html

[4]

https://www.runoob.com/docker/docker-dockerfile.html: https://www.runoob.com/docker/docker-dockerfile.html

[5]

https://docs.docker.com/engine/reference/run/: https://docs.docker.com/engine/reference/run/



文章推荐

1.如何成为一个高效的算法工程师?算法攻城狮の自我修养

2.2020年如何选择国内外云服务器?全面盘点助您选择!

3.windows10中高效软件推荐!

4.服务器端脚本实现自动定时给女票发送暖心情话





dreamhomes


博客:dreamhomes.top

隐形字

公众号:DreamHub


长按识别二维码关注






文章转载自AISeer,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论