(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个数,内存大小等。
(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