docker concept | install | Basic use

 

Docker is the world's leading software platform container, so I want to get to know the concept of Docker we must begin to start talking about container.

 

Start with a beginning understanding of container

Let's look more official explanation container

Sentence container: container is packaging software into a standardized unit for the development, delivery and deployment.

  • Mirroring container is lightweight, standalone executable package that contains everything you need to run the software: code, run-time environment, system tools, system libraries and settings.
  • Containerized software for Linux and Windows-based applications, are able to consistently run in any environment.
  • Container gives software independence from the effects of external environmental differences (eg, differences in the development and rehearsal environment), thus helping to reduce conflicts between teams running different software on the same infrastructure.

Let's look at the more popular explanation container

If you need to describe in simple containers, I think that is where a container for storing things like bag can hold all kinds of stationery, wardrobe can put all kinds of clothes, shoe racks can put all kinds of shoes the same. We are talking about something container storage may prefer to use such sites, and even program the system environment.

 

 

 

 Two come to talk about some of the concepts of Docker

 2.1 What is the Docker?

To tell the truth about what is and Docker good to say, here I explain to you by four points Docker in the end is what.

    • Docker is the world's leading software platform container.
    • Docker use Google launched the Go language development to achieve, based on cgroup, namespace, and UnionFS AUFS class technology such as the Linux kernel, the process of encapsulation isolation, belonging to the virtualization operating system level. Since the process of isolation and independently of the host into other isolation
      processes, and therefore also referred to as a container. Docke initial implementation is based on LXC.
    • Docker can automate repetitive tasks such as set up and configure the development environment, which frees developers so that they can focus on the really important things: building great software.
    • Users can easily create and use a container, put their applications into the container. The container may also be version management, copying, sharing, modifying, managing general code like the same.

 

2.2 Docker thought

  • container
  • Standardization: ① ② transportation storage ③ API Interface
  • isolation

2.3 Docker容器的特点

  • 轻量
    在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
  • 标准
    Docker 容器基于开放式标准,能够在所有主流 Linux 版本、Microsoft Windows 以及包括 VM、裸机服务器和云在内的任何基础设施上运行。
  • 安全
    Docker 赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker 默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。

2.4 为什么要用Docker

  • Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码在我机器上没问题啊” 这类问题;——一致的运行环境
  • 可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。——更快速的启动时间
  • 避免公用的服务器,资源会容易受到其他用户的影响。——隔离性
  • 善于处理集中爆发的服务器使用压力;——弹性伸缩,快速扩展
  • 可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。——迁移方便
  • 使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。——持续交付和部署

 

三 容器 VS 虚拟机

 

简单来说: 容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。

容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。因此容器的隔离级别会稍低一些。

 

3.1 两者对比图

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便.

3.2 容器与虚拟机 (VM) 总结

 

  • 容器是一个应用层抽象,用于将代码和依赖资源打包在一起。 多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行 。与虚拟机相比, 容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动 。
  • 虚拟机 (VM) 是一个物理硬件层抽象,用于将一台服务器变成多台服务器。 管理程序允许多个 VM 在一台机器上运行。每个VM都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此 占用大量空间 。而且 VM 启动也十分缓慢 。

通过Docker官网,我们知道了这么多Docker的优势,但是大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而 Docker通常用于隔离不同的应用 ,例如前端,后端以及数据库。

 

3.3 容器与虚拟机 (VM)两者是可以共存的

就我而言,对于两者无所谓谁会取代谁,而是两者可以和谐共存。

 

 

 

 四 Docker基本概念

Docker 包括三个基本概念

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

理解了这三个概念,就理解了 Docker 的整个生命周期

4.1 镜像(Image)——一个特殊的文件系统

操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而Docker 镜像(Image),就相当于是一个 root 文件系统。

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

Docker 设计时,就充分利用 Union FS的技术,将其设计为 分层存储的架构 。 镜像实际是由多层文件系统联合组成。

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。 比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

 

4.2 容器(Container)——镜像运行时的实体

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。前面讲过镜像使用的是分层存储,容器也是如此。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失。

 

4.3 仓库(Repository)——集中存放镜像文件的地方

镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。

一个 Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

这里补充一下Docker Registry 公开服务和私有 Docker Registry的概念:

Docker Registry 公开服务 是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

最常使用的 Registry 公开服务是官方的 Docker Hub ,这也是默认的 Registry,并拥有大量的高质量的官方镜像,网址为: 。在国内访问Docker Hub 可能会比较慢国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像库网易云镜像服务DaoCloud 镜像市场阿里云镜像库等。

除了使用公开服务外,用户还可以在 本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。

 

 

五 安装

 

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce

# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

# step 4:查看docker安装版本

docker version

# step 5:配置文件(加速源)-可使用阿里云、中科大等
cd ~
mkdir /etc/docker
vi /etc/docker/daemon.json

{
"registry-mirrors":["https://registry.docker-cn.com"]
}

# step 6:启动
systemctl enable docker.service  :设置开启自启动
systemctl start docker.service:启动docker
systemctl stop docker.service:停止docker

 

六 基本使用

 

##搜索镜像
docker search centos7

##获取镜像
docker pull centos

##运行容器
docker run -it centos /bin/bash

##查看镜像
docker images

##删除镜像
docker rmi imageID

##导出镜像
docker save centos > /opt/centos.tar.gz

##导入镜像
docker load < /opt/centos.tar.gz


##运行1 启动一个容器,执行 echo,然后关闭 加 -d 以守护进程的方式启动
docker run centos /bin/echo "123"

##运行2 启动一个终端,进行交互 --name 名字 -i 标准输入打开 -t 分配一个伪终端
##退出的时候,想再继续运行 用 CTRL+P+Q
docker run --name he -it centos /bin/bash

##标准操作

检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂在一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个ip地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
##运行的容器
docker ps -a

##启动已经关闭的容器
docker start CONTAINER ID
docker stop CONTAINER ID

##删除容器 -f 删除正在运行的
docker rm CONTAINER ID

##日志
docker logs ${container_id}

##参数
docker -p ip:端口:端口 -e 环境变量 -v 本地目录:容器目录:rw/ro --volumes-from 容器名字 挂载该容器的数据卷
--link 容器名字:链接别名

##登录
docker exec -it web /bin/bash

 

 

七 常用命令

    1. 查看docker信息(version、info)
    2. 查看docker版本
      $docker version
    3. 显示docker系统的信息
      $docker info
      1. 对image的操作(search、pull、images、rmi、history)
    4. 检索image
      $docker search image_name
    5. 下载image
      $docker pull image_name
    6. 列出镜像列表; -a, --all=false 显示所有镜像; --no-trunc=false 不要截断输出; -q, --quiet=false 仅显示数字ID
      $docker images
    7. 删除一个或者多个镜像; -f, --force=false 强行; --no-prune=false 不要删除未标记的父级
      $docker rmi image_name
    8. 显示一个镜像的历史; --no-trunc=false 不要截断输出; -q, --quiet=false 仅显示数字ID
      $docker history image_name
      1. 启动容器(run)
        docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。
    9. 在容器中运行"echo"命令,输出"hello word"
      $docker run image_name echo "hello word"
    10. 交互式进入容器中
      $docker run -i -t image_name /bin/bash
    11. 在容器中安装新的程序
      $docker run image_name apt-get install -y app_name
      注意: 在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。apt-get 命令执行完毕之后,容器就会停止,但对容器的改动不会丢失。
      1. 查看容器(ps)
    12. 列出当前所有正在运行的container
      $docker ps
    13. 列出所有的container$docker ps -a
    14. 列出最近一次启动的container
      $docker ps -l
      1. 保存对容器的修改(commit)
        当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。
    15. 保存对容器的修改; -a, --author="" 作者; -m, --message="" 提交消息
      $docker commit ID new_image_name
      注意: image相当于类,container相当于实例,不过可以动态给实例安装新软件,然后把这个container用commit命令固化成一个image。
      1. 对容器的操作(rm、stop、start、kill、logs、diff、top、cp、restart、attach)
    16. 删除所有容器
      $docker rm `docker ps -a -q`
    17. 删除单个容器; -f, --force=false; -l, --link=false 删除指定的链接,而不是基础容器; -v, --volumes=false 删除与容器关联的卷
      $docker rm Name/ID
    18. 停止、启动、杀死一个容器
      $docker stop Name/ID
      $docker start Name/ID
      $docker kill Name/ID
    19. 从一个容器中取日志; -f, --follow=false 按照日志输出; -t, --timestamps=false 显示时间戳
      $docker logs Name/ID
    20. 列出一个容器里面被改变的文件或者目录,list列表会显示出三种事件,A 增加的,D 删除的,C 被改变的
      $docker diff Name/ID
    21. 显示一个运行的容器里面的进程信息
      $docker top Name/ID
    22. 从容器里面拷贝文件/目录到本地一个路径
      $docker cp Name:/container_path to_path
      $docker cp ID:/container_path to_path
    23. 重启一个正在运行的容器; -t, --time=10 尝试在停止容器之前停止的秒数, 默认=10
      $docker restart Name/ID
    24. 附加到一个运行的容器上面; --no-stdin=false 不要附加标准输入(stdin); --sig-proxy=true 将所有接收到的信号代理给进程
      $docker attach ID
      注意: attach命令允许你查看或者影响一个运行的容器。你可以在同一时间attach同一个容器。你也可以从一个容器中脱离出来,是从CTRL-C。
      1. 保存和加载镜像(save、load)
        当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。
    25. 保存镜像到一个tar包; -o, --output="" 写入文件
      $docker save image_name -o file_path
    26. 加载一个tar包格式的镜像; -i, --input="" 从tar存档文件读取
      $docker load -i file_path
    27. 机器a
      $docker save image_name > /home/save.tar
    28. 使用scp将save.tar拷到机器b上,然后:
      $docker load < /home/save.tar
      8、 登录registry server(login)
    29. 登陆registry server; -e, --email="" 电子邮件; -p, --password="" 密码; -u, --username="" 用户名
      $docker login
      1. 发布image(push)
    30. 发布docker镜像
      $docker push new_image_name
      1. 根据Dockerfile 构建出一个容器
    31. build
      --no-cache=false 在构建映像时不要使用缓存
      -q, --quiet=false 抑制由容器生成的详细输出
      --rm=true 成功构建后删除中间容器
      -t, --tag="" 在成功的情况下应用于生成的图像的存储库名称(以及可选的标记)
      $docker build -t image_name Dockerfile_path

 

 

参考:

https://zhuanlan.zhihu.com/p/38552635

https://studygolang.com/articles/9483

https://blog.51cto.com/hequan/2073186

Guess you like

Origin www.cnblogs.com/-wenli/p/11369134.html