Docker入门

2020/01/15 虚拟容器 共 8382 字,约 24 分钟

Docker

1. Docker介绍

1.1 容器技术

在计算机的世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化(hypervisor virtualization,HV)有所不同,管理程序虚拟化通过中间层将一台或者多台独立的机器虚拟运行与物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间。因此,容器虚拟化也被称为“操作系统级虚拟化”,容器技术可以让多个独立的用 户空间运行在同一台宿主机上。

由于“客居”于操作系统,容器只能运行与底层宿主机相同或者相似的操作系统,这看起来并不是非常灵活。例如:可以在Ubuntu服务中运行Redhat Enterprise Linux,但无法再Ubuntu服务器上运行Microsoft Windows。

相对于彻底隔离的管理程序虚拟化,容器被认为是不安全的。而反对这一观点的人则认为,由于虚拟容器所虚拟的是一个完整的操作系统,这无疑增大了攻击范围,而且还要考虑管理程序层潜在的暴露风险。

尽管有诸多局限性,容器还是被广泛部署于各种各样的应用场合。在超大规模的多租户服务部署、轻量级沙盒以及对安全要求不太高的隔离环境中,容器技术非常流行。最常见的一个例子就是“权限隔离监牢”(chroot jail),它创建一个隔离的目录环境来运行进程。如果权限隔离监牢正在运行的进程被入侵者攻破,入侵者便会发现自己“身陷囹圄”,因为权限不足被困在容器所创建的目录中,无法对宿主机进一步破坏。

最新的容器技术引入了OpenVZ、Solaris Zones以及Linux容器(LXC)。使用这些新技术,容器不在仅仅是一个单纯的运行环境。在自己的权限类内,容器更像是一个完整的宿主机。容器和宿主机之间的隔离更加彻底,容器有独立的网络和存储栈,还拥有自己的资源管理能力,使得同一台宿主机中的多个容器可以友好的共存。

容器被认为是精益技术,因为容器需要的开销有限。和传统虚拟化以及半虚拟化相比,容器不需要模拟层(emulation layer)和管理层(hypervisor layer),而是使用操作系统的系统调用接口。这降低了运行单个容器所需的开销,也使得宿主机中可以运行更多的容器。

尽管有着光辉的历史,容器仍未得到广泛的认可。一个很重要的原因就是容器技术的复杂性:容器本身就比较复杂,不易安装,管理和自动化也很困难。而Docker就是为了改变这一切而生的。

https://www.cnblogs.com/kevingrace

1.2 docker介绍

Docker是一个开发,运输和运行应用程序的开放平台。Docker使您可以将应用程序与基础架构分离,以便快速交付软件。使用Docker,您可以像管理应用程序一样管理基础架构(OS)。通过利用Docker的方法快速发送,测试和部署代码,您可以显着减少编写代码和在生产中运行代码之间的延迟。(代码改了)

1.3 docker的优势

容器提供了隔离性,结论是,容器可以为各种测试提供很好的沙盒环境。并且,容器本身就具有“标准性”的特征,非常适合为服务创建构建块。Docker的一些应用场景如下:

  • 加速本地开发和构建流程,使其更加高效、更加轻量化。本地开发人员可以构建、运行并分享Docker容器。容器可以在开发环境中构建,然后轻松的提交到测试环境中,并最终进入生产环境。开发人员与运维人员进行职责的逻辑分离
  • 能够让独立的服务或应用程序在不同的环境中,得到相同的运行结果。这一点在面向服务的架构和重度依赖微型服务的部署由其实用。
  • 用Docker创建隔离的环境来进行测试。例如,用Jenkins CI这样的持续集成工具启动一个用于测试的容器。(持续化集成war 实际部署:jenkins持续化集成Jenkins+git )
  • Docker可以让开发者先在本机上构建一个复杂的程序或架构来进行测试,而不是一开始就在生产环境部署、测试。
  • 构建一个多用户的平台即服务(PaaS)基础设施
  • 为开发、测试提供一个轻量级的独立的沙盒环境
  • 提供软件即服务(SaaS)应用程序,例如Memcached即服务
  • 高性能、超大规模的宿主机部署(可以很多容器)

1.4 集装箱思想

Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Dock将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker运输软件、应用程序。

和集装箱一样,Docker在执行上述操作时,并不关心容器中到底装了什么,它不管是web服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容“装载”进去。

Docker也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱一样,Docker容器方便替换,可以叠加,易于分发,并且尽量通用。image-20200303200707694

1.5 容器与虚拟机的区别

物理机:

image-20200303200759384

虚拟机:

image-20200303200830836

容器:最大化利用资源

image-20200303200933782

通过上面这三张抽象图,我们大概可以通过类比概括出:容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。

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

容器在Linux上本机运行,并与其他容器共享主机的内核。它运行一个独立的进程,不占用任何其他可执行文件的内存,使其轻量级。相比之下,虚拟机(VM)运行一个完整的“客户”操作系统,通过虚拟机管理程序对主机资源进行虚拟访问。通常,VM提供的环境比大多数应用程序需要的资源更多。

2. docker版本及安装

docker分为社区版(CE)和企业版(EE)

官网:https://www.docker.com/

Docker CE 在17.03 版本之前叫Docker Engine, Docker Engine 的版本号范围: 0.1.0 ~1.13.1

在2017 年3 月2 日, docker 团队宣布企业版Docker Enterprise Edition ( EE ) 发布. 为了一致, 免费的Docker Engine 改名为Docker Community Edition ( CE ), 并且采用基于时间的版本号方案. 就在这一天, Docker EE 和Docker CE 的17.03 版本发布, 这也是第一个采用新的版本号方案的版本。

Docker CE/EE 每个季度发布一次季度版本, 也就是说每年会发布4 个季度版本, 17.03,17.06, 17.09, 17.12 就是2017 年的4 个季度版本的版本号, 同时Docker CE 每个月还会发布一个EDGE 版本,比如17.04, 17.05, 17.07, 17.08, 17.10, 17.11 ……

Docker CE 季度版本自发布后会有4 个月的维护期.在基于时间的发布方案中,版本号格式为: YY.MM.,YY.MM 代表年月,patch 代表补丁号,从0 开始,在季度版本(如17.03) 的维护期内,bug 修复相关的更新会以patch 递 增的方式发布, 比如17.03.0 -> 17.03.1 -> 17.03.2

Docker is available in two editions:

  • Community Edition (CE):社区版
  • Enterprise Edition (EE):企业版

2.1 Docker安装

2.1.1 版本要求

目前,CentOS 仅发行版本中的内核支持 Docker。

Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。

Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。

查看内核版本命令: uname -r

查看系统版本命令: cat /etc/redhat-release

docker在7.0以上与6.x的安装方式有所不同,官网给出的是7.0版本的安装方式。

2.1.2 centOS6.8安装

  1. Docker使用EPEL发布,RHEL系的OS首先要确保已经持有EPEL仓库,否则先检查OS的版本,然后安装相应的EPEL包。所以第一步需要安装 epel。使用命令 :yum install -y epel-release
  2. 安装docker: yum install -y docker-io 提示找不到 包。。
  3. 换个命令从下载源安装:yum install <https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm>
  4. 执行docker --version,出现版本号。OK安装成功。

2.1.3 centOS7.X安装

登录官网文档: https://docs.docker.com/

来到centOS,可以看到,要求是7以上版本。

image-20200304122840838

  1. 如果有安装旧版本则执行下面命令进行删除

    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  2. 设置docker仓库,你可以通过docker仓库来获取或者升级docker。

    #升级
    sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2
         
     #设置仓库 
    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo  
         
    
  3. 执行docker安装命令。

    sudo yum install -y docker-ce docker-ce-cli containerd.io
    
  4. 测试docker是否安装成功。

    docker --version
    

2.1.4 docker engine

  1. docker info 查看docker的详细信息。
  2. docker --version 查看docker的版本信息
  3. systemctl start/stop/restart docker 启动/停止/重启 docker服务端
  4. systemctl status docker 查看docker服务的状态。默认是需要手动开启
  5. systemctl enable docker 设置开机启动docker服务。

3. docker的架构

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

image-20200304202917141

3.1 docker daemon

Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象,如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。

3.2 docker client

Docker客户端(docker)是许多Docker用户与Docker交互的主要方式。当您使用诸如docker run之类的命令时,客户端会将这些命令发送到dockerd,后者将其执行。docker命令使用Docker API。Docker客户端可以与多个守护进程通信。

3.3 docker registry

Docker注册表存储Docker镜像。Docker Hub是任何人都可以使用的公共注册中心,Docker配置为默认在Docker Hub上查找镜像。您甚至可以运行自己的私人注册表。如果您使用DockerDatacenter(DDC),它包括Docker Trusted Registry(DTR)。使用docker pull或docker run命令时,将从配置的注册表中提取所需的映像。使用docker push命令时,图像将被推送到配置的注册表。

4. docker镜像操作

Docker 镜像是容器的基础。镜像是一个有序集合,其中包含根文件系统更改和在容器运行时中使用的相应执行参数。镜像通常包含堆叠在彼此之上的联合分层文件系统。镜像没有状态并且始终不会发生更改。当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

4.1 列出本地镜像

docker images

image-20200304204143310

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签(版本),同一仓库源可以有多个TAG,代表这个仓库源的不同个版本
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

这些镜像都是存储在Docker宿主机的/var/lib/docker目录下。

4.2 查找镜像

docker search [镜像名称]

image-20200304204454337

  • NAME:镜像仓库源的名称
  • DESCRIPTION:镜像的描述
  • starts:用户评价,反应一个镜像的受欢迎程度
  • OFFICIAL:是否docker官方发布
  • auto commit:自动构建,表示该镜像由Docker Hub自动构建流程创建的

4.3 拉取镜像

docker pull [镜像名称]:[版本号] 不写版本号,则默认拉取最新版本

image-20200304204804185

Docker镜像首页,包括官方镜像和其它公开镜像。Docker Hub上最受欢迎的10大镜像(通过Docker registry API获取不了镜像被pull的个数,只能通过镜像的stars数量,来衡量镜像的流行度。毫无疑问,拥有最高stars数量的库都是官方库。国情的原因,国内下载Docker HUB 官方的相关镜像比较慢,可以使用国内(docker.io)的一些镜像加速器,镜像保持和官方一致,关键是速度块,推荐使用。配置镜像加速器:

  • 阿里云(先加入阿里云开发者平台:https://dev.aliyun.com)
  • docker中国加速器(https://www.docker‐cn.com)
  • USTC加速器(https://lug.ustc.edu.cn/wiki/ ) 真正的公共服务(无需任何操作)
  • daocloud、网易蜂巢加速器:略

4.3.1 配置镜像加速

centos 6.8

修改配置文件 /etc/sysconfig/docker

image-20200117113330704

centos 7.X

sudo vim /etc/docker/daemon.json
    #配置内容:
    {
        "registry‐mirrors": ["https://XXXX.mirror.aliyuncs.com"]
    }
sudo systemctl daemon‐reload
sudo systemctl restart docker

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://i5a8sndj.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

4.4 删除镜像

docker rmi [镜像名称] 删除镜像

docker rmi [镜像名称] [镜像名称] .. 删除多个镜像

docker rmi ’docker images -q‘ 删除所有镜像,这里用到了组合命令。

5. docker容器操作

容器是docker镜像的运行实例。

5.1 创建容器

docker run [选项] image command [ARG…]

选项:-i(交互式容器)、-t(附带终端)、-d(后台启动)、–name(给容器命名)

创建的容器名称不能重复。

centOS7.0安装

参考官网命令。

Docker命令

docker中存在这样三个概念 docker镜像、docker容器、docker仓库(注册中心registry)

从仓库中pull下镜像,然后启动镜像产生容器。

docker安装使用 service docker start来启动docker服务

​ 关闭 service docker stop

查看状态 service docker status

镜像命令

1.获取镜像

命令: docker pull 镜像名称:版本号

版本号可以在https://hub.docker.com/r/library/地址 搜索后查看

2. 搜索镜像

执行搜索镜像命令可以查询该镜像的所有列表,并按照星级从高到低排列

docker search 镜像名称

容器命令

1.启动容器

docker run 【参数】 镜像名称

参数可选: -i 交互式 -t 带命令窗口 -d守护进程

docker run -it –name=c1 镜像名称

启动一个容器命名为 c1,并切换到当前容器的命令窗口。

输入exit则退当前容器,容器自动关闭。

按ctrl+p+q退出容器,但容器不关闭。

2. 常用容器的启动命令

1.zookeeper

docker run -p 2181:2181 –privileged=true –name zookeeper -d zookeeper

2.mysql
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-itd mysql:5.7 

语句说明:

  1. -p 3306:3306 将外部主机的3306端口映射为容器内的3306端口。

  2. -v /mydata/mysql/log:/var/log/mysql 将外部主机目录与容器mysql日志目录挂载

    -v /mydata/mysql/data:/var/lib/mysql 将外部主机目录与容器mysql的数据目录挂载

    -v /mydata/mysql/log:/var/log/mysql 将外部主机目录与容器mysql的

  3. -e MYSQL_ROOT_PASSWORD=root 设置mysql的root用户密码,不设置无法启动

3.redis
docker run -p 6379:6379 \ 
-v /mydata/redis/data:/data \ 
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf  \
-d redis:4.0.0 redis-server /etc/redis/redis.conf --appendonly yes

在config目录下创建elasticsearch.yml,并添加配置 network.port: 0.0.0.0 表示任意ip均可访问,生产时不可如此分配。

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.3.2
# 注意修改创建的目录权限  chmod 755 容器内使用的是非root用户。
5 .kibana
docker run --name kibana -p 5601:5601 -e ELASTICSEARCH_HOSTS=http://192.168.171.129:9200 -d kibana:7.3.2
6.Nginx
#先随便启动一个nginx容器,将容器内的配置复制出来
docker cp ngxin:/etc/nginx ./conf/
#删除镜像,并整理目录。重新正式启动nginx镜像
docker run --name nginx -p 80:80  \
-v /mydata/nginx/conf:/etc/nginx   \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/html:/usr/share/nginx/html -d nginx:1.10

文档信息

Search

    Table of Contents