(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
参考:https://www.jianshu.com/p/50f48eb25215
https://yq.aliyun.com/articles/110806
原文链接:https://www.cnblogs.com/diantong/p/11498649.html