Docker容器——Docker的介绍与部署

Posted 软件测试自动化测试

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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个数,内存大小等。

  官网:Empowering App Development for Developers | Docker

(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环境依赖

1

2

3

4

5

6

7

8

9

10

[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,启动并设置开机自启

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

[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镜像),第五列是否自动化。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

[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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

//可以用于/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镜像了

1

2

3

4

5

6

7

8

9

10

[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>,所以下载和导入前请先确认好防止造成不必要的麻烦。

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

1

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

[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)开启网络转发功能

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

1

2

3

4

5

6

7

[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)最后启动

  启动并测试网络

1

2

3

4

5

6

7

8

9

10

11

12

13

14

[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命令

1

2

3

4

5

6

7

[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


感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 ① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

上图的资料 在我的QQ技术交流群里(技术交流和资源共享,广告进来腿给你打断)

可以自助拿走,群号953306497(备注“csdn111”)群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

以上是关于Docker容器——Docker的介绍与部署的主要内容,如果未能解决你的问题,请参考以下文章

Docker入门与应用系列介绍和部署

Docker-容器介绍与配置镜像分层部署nginx优化镜像

docker与docker-compose介绍,对比与使用

Docker 快速入门- 情况介绍和安装

Docker及常用软件的安装部署

Docker系列- 原理与基本操作