Docker容器(一)——Docker的介绍与部署

(1).Docker概述

  Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。几乎没有性能开销,可以很容易地在机器和数据中心运行。最重要的是,不依赖于任何语言、框架或包装系统。Docker是PaaS提供商dotCloud开源的一个基于LXC的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。

  沙箱也叫沙盒,英文名sandbox。在计算机领域指一种虚拟技术,且多用于计算机安全技术,是一种安全机制,为运行中的程序提供的隔离环境。通常是作为一些来源不可信、具破坏力或无法判定程序意图的程序提供实验之用。

  LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。LXC在资源管理方面依赖于Linux内核的cgroups子系统,cgroups子系统是Linux内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。LXC在隔离控制方面依赖于Linux内核的namespace特性,具体而言就是在clone时加入相应的flag(NEWNS NEWPID等等)。

  Namespace(命名空间)——实现Container的进程、网络、消息、文件系统和主机名的隔离。

  Cgroup——实现对资源的配额和度量。注意:Cgroup的配额,可以指定实例使用的cpu个数,内存大小等。

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

(2).Docker容器技术与虚拟机对比

  下图是虚拟机的结构,从下到上分别是:

    Infrastructure(基础设施),它可以是个人电脑、数据中心的服务器或者云主机;

    Host Operating System(主机操作系统),在Infrastructure(基础设施)之上,运行的可能是MacOS、Windows或者某个Linux发行版;

    Hypervisor(虚拟机管理系统),利用Hypervisor(虚拟机管理系统)可以在主操作系统之上运行多个不同的从操作系统,例如:类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM,类型2的Hypervisor有VirtualBox和VMWare;

    Guest Operating System(虚拟操作系统),假设你需要运行3个相互隔离的应用,则需要使用Hypervisor(虚拟机管理系统)启动3个从操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存;

    BINS/LIBS是各种依赖。每一个从操作系统都需要安装许多依赖。如果你的的应用需要连接PostgreSQL的话,则需要安装libpq-dev;如果你使用Ruby的话,应该需要安装gems;如果使用其他编程语言,比如Python或者Node.js,都会需要安装对应的依赖库;

    APP是应用。安装依赖之后,就可以在各个从操作系统分别运行应用了,这样各个应用就是相互隔离的。

  下图是Docker容器的结构,从下到上分别是:

    Infrastructure(基础设施),它可以是个人电脑、数据中心的服务器或者云主机;

    Host Operating System(主机操作系统)所有主流的Linux发行版都可以运行Docker。对于MacOS和Windows,也有一些办法"运行"Docker;

    Docker Daemon(Docker守护进程),Docker守护进程取代了Hypervisor,它是运行在操作系统之上的后台进程,负责管理Docker容器;

    BINS/LIBS是各种依赖。对于Docker,应用的所有依赖都打包在Docker镜像中,Docker容器是基于Docker镜像创建的;

    APP是应用。应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。

  相同点:Docker容器技术和虚拟机技术都是虚拟化技术

  不同点:1.启动时间:Docker容器秒级启动,虚拟机分钟级启动;2.占用空间:Docker容器镜像大小通常以M为单位,虚拟机以G为单位;3.性能:Docker容器共享宿主机内核,系统级虚拟化,占用资源少,没有Hypervisor层开销,性能基本接近物理机。虚拟机需要Hypervisor层支持,虚拟化一些设备,具有完整的GuestOS,虚拟化开销大,因而降低性能,没有容器性能好;4.安全性:Docker容器由于共享宿主机内核,只是进程级隔离,因此隔离性和稳定性不如虚拟机,Docker容器具有一定权限访问宿主机内核,存在一定安全隐患;5.使用要求:虚拟机基于硬件的虚拟化,需要硬件CPU虚拟化技术支持。Docker容器共享宿主机内核,可运行在主流的Linux发行版,不用考虑CPU是否支持虚拟化技术。

(3).Docker运行流程

  服务器上运行Docker Engine服务,该服务上存在许多容器Container。从外网DockerHub上下载系统镜像image,放到容器Container中运行。最后通过客户端Docker Client对Docker容器虚拟化平台进行控制。

  DockerHub是docker官方的镜像存储站点,其中提供了徆多常用的镜像供用户下载, 如ubuntu, centos等系统镜像。通过dockerhub用户也可以发布自己的docker镜像,为此用户需要 注册一个账号,在网站上创建一个 docker 仓库。

(4).Dorcker的特点和优缺点

  特点:1、文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里。2、资源隔离:系统资源,像 CPU 和内存等可以分配到不同的容器中,使用 cgroup。3、网络隔离:每个进程容器运行在自己的网络空间,虚拟接口和IP地址。4、日志记录:Docker 将会收集和记录每个进程容器的标准流stdout/stderr/stdin,用于实时检索或批量检索。5、变更管理:容器文件系统的变更可以提交到新的镜像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。6、交互式shell:Docker可以分配一个虚拟终端幵关联到任何容器的标准输入上,例如运行一个一次性交互shell。

  优点:1、启动快,体积小。2、可移植性高,支持Linux/Unix/Windows/Mac。3、隔离程序,避免开发和生产环境之间的摩擦,降低成本。4、CPU无需支持虚拟化,对硬件要求低。5、快速搭建开发环境,提高开发效率。6、谷歌、微软、亚马逊、IBM等都支持Docker。

  缺点:Docker必须运行在64位机器上,如果是Linux系统内核必须3.8以上支持各种存储格式,还需要内核支持Cgroup和Namespace。另外Docker不适合存储大量数据,日志、跟踪和数据库(例如oracle)通常放在Docker容器之外,通过外部挂载的方式使用,例如使用NFS、ipsan、MFS等时,使用-v选项映射磁盘分区。

(5).部署Docker容器虚拟化平台

 1)安装Docker

  配置阿里云base源和epel源,安装Docker环境依赖

[root@youxi1 ~]# cd /etc/yum.repos.d/
[root@youxi1 yum.repos.d]# mkdir back
[root@youxi1 yum.repos.d]# mv *.repo back/  //备份源
[root@youxi1 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@youxi1 yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@youxi1 yum.repos.d]# yum clean all  //清空yum缓存
[root@youxi1 yum.repos.d]# yum list  //生成缓存
[root@youxi1 yum.repos.d]# cd
[root@youxi1 ~]# yum -y install yum-utils device-mapper-persistent-data lvm2  //安装依赖
[root@youxi1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  //配置阿里云的Docker的yum源

  安装Docker,启动并设置开机自启

[root@youxi1 ~]# yum -y install docker-ce docker-ce-cli containerd.io
[root@youxi1 ~]# systemctl start docker
[root@youxi1 ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@youxi1 ~]# docker version  //显示Docker版本信息
Client: Docker Engine - Community
 Version:           19.03.2
 API version:       1.40
 Go version:        go1.12.8
 Git commit:        6a30dfc
 Built:             Thu Aug 29 05:28:55 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.2
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.8
  Git commit:       6a30dfc
  Built:            Thu Aug 29 05:27:34 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
[root@youxi1 ~]# docker info  //查看Docker信息,包括镜像和容器数
Client:
 Debug Mode: false

Server:
 Containers: 0  //容器
  Running: 0  //运行
  Paused: 0  //暂停
  Stopped: 0  //关闭
 Images: 0  //镜像
 Server Version: 19.03.2  //版本
 Storage Driver: overlay2  //存储启动程序
  Backing Filesystem: xfs  //备份文件系统格式
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc version: 425e105d5a03fabd737a126ad93d62a9eeede87f
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-862.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 1.936GiB
 Name: youxi1
 ID: FR4U:DHB6:QGST:B3SB:NHKD:GDBX:PZL3:2RSX:SUMM:WFZO:KPPU:W423
 Docker Root Dir: /var/lib/docker  //Docker的主目录
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

  说明:Docker最早的版本名是docker和docker-engine,现在的名字是docker-ce(开源)和docker-ee(闭源)。并且2017年年初,docker开源项目改名为moby,所以其实有三个版本:moby是源代码;docker-ce和docker-ee是容器产品,rpm包。

 2)下载Docker镜像

  从DockerHub上搜索镜像,第一列Docker镜像名字(下载根据该列),第二列描述,第三列欢迎程度,第四列是否是官方提供(一般下载官方Docker镜像),第五列是否自动化。

[root@youxi1 ~]# docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5556                [OK]                
ansible/centos7-ansible            Ansible on Centos7                              123                                     [OK]
jdeathe/centos-ssh                 CentOS-6 6.10 x86_64 / CentOS-7 7.6.1810 x86…   112                                     [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC session…   99                                      [OK]
centos/mysql-57-centos7            MySQL 5.7 SQL database server                   62                                      
imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              57                                      [OK]
tutum/centos                       Simple CentOS docker image with SSH access      45                                      
centos/postgresql-96-centos7       PostgreSQL is an advanced Object-Relational …   39                                      
kinogmt/centos-ssh                 CentOS with SSH                                 29                                      [OK]
pivotaldata/centos-gpdb-dev        CentOS image for GPDB development. Tag names…   10                                      
guyton/centos6                     From official centos6 container with full up…   9                                       [OK]
nathonfowlie/centos-jre            Latest CentOS image with the JRE pre-install…   8                                       [OK]
drecom/centos-ruby                 centos ruby                                     7                                       [OK]
pivotaldata/centos                 Base centos, freshened up a little with a Do…   3                                       
darksheer/centos                   Base Centos Image -- Updated hourly             3                                       [OK]
pivotaldata/centos-gcc-toolchain   CentOS with a toolchain, but unaffiliated wi…   2                                       
pivotaldata/centos-mingw           Using the mingw toolchain to cross-compile t…   2                                       
miko2u/centos6                     CentOS6 日本語環境                                   2                                       [OK]
blacklabelops/centos               CentOS Base Image! Built and Updates Daily!     1                                       [OK]
mcnaughton/centos-base             centos base image                               1                                       [OK]
indigo/centos-maven                Vanilla CentOS 7 with Oracle Java Developmen…   1                                       [OK]
pivotaldata/centos6.8-dev          CentosOS 6.8 image for GPDB development         0                                       
smartentry/centos                  centos with smartentry                          0                                       [OK]
pivotaldata/centos7-dev            CentosOS 7 image for GPDB development           0                                       
fortinj66/centos7-s2i-nodejs       based off of ryanj/centos7-s2i-nodejs.  Bigg…   0                                       

方法一:由于Docker镜像都在国外的DockerHub网站上,所以下载会非常慢,最好使用加速器加速。例如说阿里云服务器提供的免费加速器地址。登录阿里云账号,在左侧的菜单中有产品和服务选项,在该选项中找到容器镜像服务,点击后面的星星即可添加到菜单中。然后点击容器镜像服务,进入下一个界面。

  第一次进入容器镜像服务页面,会要求设置密码。设置完成后选择左侧菜单栏中的镜像中心-->镜像加速器-->加速器地址。我的加速器地址是https://8mkqrctt.mirror.aliyuncs.com

  当然加速器地址也非要使用阿里云的,也可以使用网易云的。

  加速器地址可以用于两个地方,二选一即可。

//可以用于/etc/docker/daemon.json文件
[root@youxi1 ~]# vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://8mkqrctt.mirror.aliyuncs.com"]
}
[root@youxi1 ~]# systemctl restart docker

//也可以用于修改docker服务
[root@youxi1 ~]# vim /usr/lib/systemd/system/docker.service
//修改第14行
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
 --registry-mirror=https://8mkqrctt.mirror.aliyuncs.com
[root@youxi1 ~]# systemctl daemon-reload
[root@youxi1 ~]# systemctl restart docker

  配置好加速器地址后,我们就可以拉取Docker镜像了

[root@youxi1 ~]# docker pull centos  //拉取镜像
Using default tag: latest
latest: Pulling from library/centos
d8d02d457314: Pull complete 
Digest: sha256:307835c385f656ec2e2fec602cf093224173c51119bbebd602c53c3653a3d6eb
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@youxi1 ~]# docker images  //查看已有镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              67fa590cfc1c        3 weeks ago         202MB

  注意:docker镜像有两种识别方式,[REPOSITORY(库)]:[TAG(标签)]以及IMAGE ID(镜像ID)。如果下载了一个相同的镜像或[REPOSITORY(库)]:[TAG(标签)]相同的镜像,虽然还可以通过镜像ID来调用,但旧的镜像REPOSITORY(库)和TAG(标签)会变为<None>,所以下载和导入前请先确认好防止造成不必要的麻烦。

方法二:将之前下载好的或从其他服务器上导出的镜像导入

[root@youxi1 ~]# docker load -i docker.io-centos-lastest-image.tar

  docker load -i [镜像文件]  导入镜像

方法三:从其他网站下载镜像

[root@youxi1 ~]# docker pull hub.c.163.com/library/tomcat:latest
latest: Pulling from library/tomcat
[DEPRECATION NOTICE] registry v2 schema1 support will be removed in an upcoming release. Please contact admins of the hub.c.163.com registry NOW to avoid future disruption.
9af7279b9dbd: Pull complete 
31816c948f2f: Pull complete 
c59a1cdf83d3: Pull complete 
232c7a75d568: Pull complete 
de412d312979: Pull complete 
80315ba34693: Pull complete 
5d3f97bd90e8: Pull complete 
dc8dc63f6baa: Pull complete 
f6c6e2d67f03: Pull complete 
9123b340aa92: Pull complete 
76abaea2279d: Pull complete 
4476602e3346: Pull complete 
12e1fda011bd: Pull complete 
Digest: sha256:db1a8ca2fe44449d265e5505f300be6f34fc63211a5506400a0a8c24653af91f
Status: Downloaded newer image for hub.c.163.com/library/tomcat:latest
hub.c.163.com/library/tomcat:latest
[root@youxi1 ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
centos                         latest              67fa590cfc1c        3 weeks ago         202MB
hub.c.163.com/library/tomcat   latest              72d2be374029        2 years ago         292MB

 3)开启网络转发功能

  该功能是默认开启的,如果没有开启可以手动设置一下

[root@youxi1 ~]# cat /proc/sys/net/ipv4/ip_forward     
1
//如没有开启手动进行如下设置
[root@youxi1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@youxi1 ~]# sysctl -p  //使配置生效
net.ipv4.ip_forward = 1

  该功能一定要开启,否则Docker实例会启动失效

 4)最后启动

  启动并测试网络

[root@youxi1 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@youxi1 ~]# docker run -it centos:latest /bin/bash
[root@3ecc9bafd429 /]# ping www.baidu.com
PING www.a.shifen.com (180.101.49.11) 56(84) bytes of data.
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=1 ttl=127 time=8.78 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=2 ttl=127 time=8.33 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=3 ttl=127 time=8.79 ms
^C
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 8.334/8.637/8.792/0.240 ms
[root@3ecc9bafd429 /]# exit  //退出使用exit
exit

  注意:前期测试建议关闭防火墙。

  如果想要查看正在运行的docker实例,可以使用docker ps命令

[root@youxi1 ~]# docker run -it centos:latest /bin/bash  //启动一个docker实例
[root@9a81af9b4134 /]#

//另外打开一个连接窗口
[root@youxi1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9a81af9b4134        centos:latest       "/bin/bash"         8 seconds ago       Up 7 seconds                            pensive_dijkstra

  

参考:https://www.jianshu.com/p/50f48eb25215

   https://yq.aliyun.com/articles/110806

猜你喜欢

转载自www.cnblogs.com/diantong/p/11498649.html