初识docker

目录

一,docker是什么

二,docker的使用场景

三,docker引擎和架构

1,docker引擎(docker engine)

2,docker架构(docker architecture)

四,docker原理

1,namespace

2,控制组(control groups)

五,docker部署

总结:


一,docker是什么

Docker 是一个开源的应用容器引擎,基于GO 语言并遵从 Apache2.0 协议开源。

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

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了

沙箱机制:

Sandboxie(又叫沙箱、沙盘)即是一个虚拟系统程序,允许你在沙盘环境中运行浏览器或其他程序,因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。 在网络安全中,沙箱指在隔离环境中,用以测试不受信任的文件或应用程序等行为的工具。

二,docker的使用场景

K8S(更方便管理集群性质容器的软件) image镜像+container容器的方式

工作流程:war,jar包—》GitHub(公共仓库)gitlib(私有仓库)—》Jenkins(测试)—》应用程序封装/构建镜像—》运维下载,使用容器技术进行运行发布。

打包应用程序简单部署

可脱离底层硬件任意迁移(实现了应用隔离,将应用拆分并进行解耦)

持续集成和持续交付(CI/CD):开发到测试

部署微服务

提供PASS{OpenStack的云主机类似于阿里云的ecs属于IAAS,docker(K8S)属于PASS}

IAAS:基础设施即服务

SAAS:应用即服务

PASS:平台即服务

docker的三要素

镜像(docker image):模板

容器(docker container):基于镜像,运行时状态

仓库:存放镜像模板。① 公共仓库(docker hub)②私有仓库(registry harbor)

使用docker有什么意义:

docker是一种标准化的封装和运行平台(docker引擎),统一的封装方式是镜像,统一的运行方式是容器方式。

三个统一:

docker引擎统一了基础设施环境(docker环境用镜像封装一个简易的操作系统)

docker引擎统一了程序打包方式(docker镜像images)

docker引擎统一了程序部署(运行)方式:docker容器基于镜像运行为容器

实现了一次构建,多次多处使用

三,docker引擎和架构

1,docker引擎(docker engine)

docker引擎是具有以下主要组件的C/S(客户端/服务器)应用程序

server端:服务器是一种长期运行的程序,称为守护程序进程(dockerd)

client端:rest api接口,它指定程序可以用来与守护程序进行通信并指示其操作

 客户端与守护进程通过rest api接口互动。

2,docker架构(docker architecture)

 docker使用C/S架构,docker客户端与docker守护进程进行对话,该守护进程完成构建,运行和发布docker容器的繁重工作。

docker区别于传统的虚拟化,不需要虚拟化硬件资源直接使用容器引擎,所以速度较快。

docker client:

①客户端提供提供一个与用户交互展示的平台

②管理控制docker服务端功能的的工具

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

docker daemon(守护进程):

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

docker与VM的区别

不同点containervm 
启动速度秒级(进程控制)分钟级(来宾操作系统管理)
运行性能接近原生(直接在内核中运行90%)50%左右损失 
磁盘占用MBGB
数量成百上千(进程)一般几十台 
隔离性进程级别系统级别(更彻底)
操作系统主要支持Linux(只需要支持引擎)几乎所有
封装程度只打包项目代码和依赖关系,共享宿主机内核完整的操作系统,与宿主机隔离 

四,docker原理

Docker核心解决的问题是利用LX容器来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LX容器 其并不是一套硬件虚拟化方法 - 无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化到docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。

用户需要考虑虚拟化方法,尤其是硬件虚拟化方法,需要借助其解决的主要是以下4个问题:

  • 隔离性 - 每个用户实例之间相互隔离, 互不影响。 硬件虚拟化方法给出的方法是VM, LX容器给出的方法是container,更细一点是kernel namespace

  • 可配额/可度量 - 每个用户实例可以按需提供其计算资源,所使用的资源可以被计量。硬件虚拟化方法因为虚拟了CPU, memory可以方便实现, LX容器则主要是利用cgroups来控制资源

  • 移动性 - 用户的实例可以很方便地复制、移动和重建。硬件虚拟化方法提供snapshot和image来实现,docker(主要)利用AUFS实现

  • 安全性 - 这个话题比较大,这里强调是host主机的角度尽量保护container。硬件虚拟化的方法因为虚拟化的水平比较高,用户进程都是在KVM等虚拟机容器中翻译运行的, 然而对于LXC, 用户的进程是lxc-start进程的子进程, 只是在Kernel的namespace中隔离的, 因此需要一些kernel的patch来保证用户的运行环境不会受到来自host主机的恶意入侵, dotcloud(主要是)利用kernel grsec patch解决的.

cgroup和namespace两者构成了docker的底层原理

1,namespace

LX容器所实现的隔离性主要是来自内核的namespace, 其中pid, net, ipc, mnt, uts 等namespace将container的进程, 网络, 消息, 文件系统和hostname 隔离开。

容器隔离了6个名称空间

mount文件系统,挂载点
user操作进程的用户和用户组
pid进程编号
UTS主机名或主机域
ipc信号量,消息队列,共享内存
net网络设备,网络协议栈,端口等

PS:linux内核版本3.8才完善了6个命名空间,因此linux内核版本3.8+才可以运行docker

2,控制组(control groups)

cgoups是linux内核态中的资源管理模块,linux上的docker引擎还依赖与另一种称为控制组(cgroups)的技术。cgroups将应用程序限制为一组特定的资源,控制组允许docker engine将可用的硬件资源共享给容器,并有选择的实施限制和约束。例如可以限制特定容器可用的内存。

cgroups 实现了对资源的配额和度量。 cgroups 的使用非常简单,提供类似文件的接口,在 /cgroup目录下新建一个文件夹即可新建一个group,在此文件夹中新建task文件,并将pid写入该文件,即可实现对该进程的资源控制。具体的资源配置选项可以在该文件夹中新建子 subsystem ,{子系统前缀}.{资源项} 是典型的配置方法,

如memory.usage_in_bytes 就定义了该group 在subsystem memory中的一个内存限制选项。

另外,cgroups中的 subsystem可以随意组合,一个subsystem可以在不同的group中,也可以一个group包含多个subsystem - 也就是说一个 subsystem。

五,docker部署

准备环境关闭防火墙和selinux

[root@node2 ~]# systemctl stop firewalld
[root@node2 ~]# setenforce 0

更改主机名

[root@node2 ~]# hostnamectl set-hostname docker
[root@node2 ~]# su
[root@docker ~]# 

安装docker依赖环境

[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
软件包 yum-utils-1.1.31-42.el7.noarch 已安装并且是最新版本
软件包 device-mapper-persistent-data-0.7.0-0.1.rc6.el7.x86_64 已安装并且是最新版本
软件包 7:lvm2-2.02.171-8.el7.x86_64 已安装并且是最新版本
无须任何处理

设置阿里云镜像源

[root@docker ~]# cd /etc/yum.repos.d/       ##切换目录到yum源  
[root@docker yum.repos.d]# ls
111               CentOS-Debuginfo.repo  CentOS-Vault.repo
centos7.repo      CentOS-fasttrack.repo  
CentOS-Base.repo  CentOS-Media.repo
CentOS-CR.repo    CentOS-Sources.repo
[root@docker yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com
/docker-ce/linux/centos/docker-ce.repo   ##设置阿里云镜像
已加载插件:fastestmirror, langpacks
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
[root@docker yum.repos.d]# ls
111               CentOS-Debuginfo.repo  CentOS-Vault.repo
centos7.repo      CentOS-fasttrack.repo  docker-ce.repo
CentOS-Base.repo  CentOS-Media.repo
CentOS-CR.repo    CentOS-Sources.repo
[root@docker yum.repos.d]# cat docker-ce.repo     ###查看阿里云镜像
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

安装docker-ce社区版

[root@docker yum.repos.d]# yum install -y docker-ce
已加载插件:fastestmirror, langpacks
docker-ce-stable                             | 3.5 kB     00:00     
(1/2): docker-ce-stable/7/x86_64/updateinfo    |   55 B   00:00     
(2/2): docker-ce-stable/7/x86_64/primary_db    |  70 kB   00:01     
Loading mirror speeds from cached hostfile
正在解决依赖关系
--> 正在检查事务

开启docker

[root@docker yum.repos.d]# systemctl start docker  ##开启docker
[root@docker yum.repos.d]# systemctl enable docker  ##开机自启动docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service
 to /usr/lib/systemd/system/docker.service.

设置镜像加速(阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

先登录阿里云

将加速地址复制

[root@docker yum.repos.d]# sudo mkdir -p /etc/docker  
[root@docker yum.repos.d]# sudo tee /etc/docker/daemon.json <<-'EOF'> {
>   "registry-mirrors": ["https://dencvy7n.mirror.aliyuncs.com"]
> }
> EOF
{
  "registry-mirrors": ["https://dencvy7n.mirror.aliyuncs.com"]
}
[root@docker yum.repos.d]# sudo systemctl daemon-reload   ##重载server端配置文件
[root@docker yum.repos.d]# sudo systemctl restart docker  ##重启docker
[root@docker yum.repos.d]# cd /etc/docker/
[root@docker docker]# ls
daemon.json  key.json
[root@docker docker]# cat daemon.json   ##查看加速地址
{
  "registry-mirrors": ["https://dencvy7n.mirror.aliyuncs.com"]
}

网络优化(设置转发)

[root@docker docker]# vim /etc/sysctl.conf 

# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward=1   ##在末行添加

[root@docker docker]# sysctl -p   ##刷新配置文件
net.ipv4.ip_forward = 1

查看容器查看镜像

[root@docker docker]# docker ps -a   ##查看容器
CONTAINER ID   IMAGE         COMMAND    CREATED   STATUS   PORTS     NAMES
经过加密容器id   镜像            命令     创建时间     状态    端口       名字
[root@docker docker]# docker images  ##查看镜像
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
 名称        标签     MD5加密的镜像id    状态           大小

docker镜像制作

docker run hello-world  命令  

run:①pull dockerhub 在公共仓库下载镜像②start hello-world-image 运行镜像

[root@docker docker]# docker run hello-world
Unable to find image 'hello-world:latest' locally   ##本地仓库没有最新的镜像
latest: Pulling from library/hello-world   ##最新的镜像在library项目(dockerhub)
2db29710123e: Pull complete                ##MD5加密id的一部分:下载     
Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Status: Downloaded newer image for hello-world:latest ##状态已经下载最新镜像

Hello from Docker!
This message shows that your installation appears to be working correctly.
           ###这条信息表示现在已经能正常工作了

To generate this message, Docker took the following steps: ###它会经过以下步骤
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

[root@docker docker]#

内部运行的工作步骤(原理)(上述英文中的四个步骤)

①docker client端连接到了服务端(通过restful api接口) (服务端是一个以守护进程的形式运行在系统中的)

②由docker服务端的守护进程从dockerhub 上下载镜像(PS:服务端会先检查本地仓库是否有镜像)

③服务端创建了一个新的容器,然后从拉取的这个镜像启动了一个容器。容器执行了可执行程序,让我们可以查看使用(client端)

④docker服务端把这些信息流返回给客户端并展示在终端上。

查看容器和镜像

[root@docker docker]# docker ps -a  ##查看镜像
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                  
    PORTS     NAMES
48e68c8c28d5   hello-world   "/hello"   22 minutes ago   Exited (0) 
22 minutes ago             condescending_dewdney
[root@docker docker]# docker images  ##查看容器
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   3 months ago   13.3kB

总结:

1,docker的三要素:镜像,容器,仓库

2,使用容器的意义,docker引擎的三个统一:基础设施环境,程序打包方式,程序运行方式

3,C/S架构交互:客户端传入docker指令通过restAPI进入内核server端,server端处理,通过restAPI将结果返回给客户端展示。

4,docker与虚拟化的区别

5,docker底层原理:namespace隔离的6个名称空间:mount,user,pid,uts,ipc,net。cgroups控制资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值