题目:Docker的安装和使用
实验环境:ubuntu16.04,虚拟机的网络模式设为NAT模式,IP地址通过虚拟 DHCP 服务器自动分配。
实验内容和要求:安装Docker并进行相关实验,熟悉Docker的相关操作。实验包括Docker的安装、镜像和容器的使用、容器的连接、容器间的通信和Nginx的使用。
实验原理和机制:
Docker是一种构建在LXC之上,基于进程容器的轻量级虚拟化解决方案,实现了应用程序级别的资源隔离。通过Docker技术,开发者把应用以及依赖包封装到一个镜像中,可以发布到Linux或Windows机器上。
Docker镜像就像停止运行的容器,镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。Docker镜像存储在镜像仓库服务(Image Registry)当中。Docker客户端的镜像仓库服务是可配置的,默认使用Docker Hub。镜像仓库服务包含多个镜像仓库(Image Repository)。同样,一个镜像仓库中可以包含多个镜像。
容器是镜像的运行时实例。正如从虚拟机模板上启动VM一样,用户也同样可以从单个镜像上启动一个或多个容器。虚拟机和容器最大的区别是容器更快并且更轻量级——与虚拟机运行在完整的操作系统之上相比,容器会共享其所在主机的操作系统/内核。容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或-p参数来指定端口映射。
容器之间可通过IP、Docker DNS Server或joined容器三种方式通信。两个容器要能通信,必须要有属于同一个网络的网卡。满足这个条件后,容器就可以通过IP交互了。具体做法是在容器创建时指定相应的网络,或者将现有容器加入到指定网络。通过IP访问容器虽然满足了通信的需求,但还是不够灵活。因为我们在部署应用之前可能无法确定IP,部署之后再指定要访问的IP会比较麻烦。对于这个问题,可以通过docker自带的 DNS 服务解决。从 Docker 1.10 版本开始,docker daemon实现了一个内嵌的DNS server,使容器可以直接通过“容器名”通信。但使用 docker DNS 有个限制:只能在user-defined网络中使用。也就是说,默认的bridge网络是无法使用DNS的。joined容器可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined容器之间可以通过127.0.0.1直接通信。
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强。
实验步骤:
实验1、Docker安装
1.查看linux内核的版本。
在这里插入图片描述
2.用清华大学的源替换原来的源。在这里插入图片描述
3.更新ubuntu16.04的源。在这里插入图片描述
在这里插入图片描述
4.安装docker。
在这里插入图片描述
在这里插入图片描述
5.查看docker版本。
在这里插入图片描述
6.启动docker服务,查看 docker 服务状态。在这里插入图片描述
8.测试运行docker Hello World。在这里插入图片描述
9.停止 docker 服务。
在这里插入图片描述
二、Docker使用
1.镜像使用
(1)列出镜像列表。
在这里插入图片描述
(2)拉取镜像(在本地主机上使用一个不存在的镜像前预先下载它)。
在这里插入图片描述
(3)搜索镜像。
在这里插入图片描述
实验2.docker 容器的使用
(1)查看docker客户端的所有命令使用方法。
在这里插入图片描述
(2)了解Docker运行时的命令使用方法。
在这里插入图片描述
(3)列出后台运行的容器列表。
在这里插入图片描述
(4)通过ubuntu14.04镜像创建一个容器,但不启动它。
在这里插入图片描述
(5)运行容器,运行成功后在容器中可以使用ubuntu14.04。(-i:以交互模式运行容器,通常与-t同时使用,表示开启了input功能。-t:为容器重新分配一个伪输入终端,通常与-i同时使用,表示开启了连接容器里的终端。ll:查看容器内所有文件。)
在这里插入图片描述
(6)在docker容器中运行一个Python Flask应用来运行一个web应用。
a.拉取镜像
在这里插入图片描述
b.运行容器(-d:让容器在后台运行,-P:将容器内部使用的网络端口映射到我们使用的主机上)
在这里插入图片描述
c.查看正在运行的容器
在这里插入图片描述
d.由图可知Docker开放了5000端口映射到主机端口32768 上,可以通过浏览器访问web应用
在这里插入图片描述
e.查看web应用程序日志(-f:让docker logs像使用tail -f一样来输出容器内部的标准输出)
在这里插入图片描述
f.停止web应用容器
在这里插入图片描述
g.移除web应用容器(容器必须是停止状态)
在这里插入图片描述
3.容器连接
(1)创建一个python应用的容器。
在这里插入图片描述
(2)将容器内部端口绑定到指定的主机端口(-P:容器内部端口随机映射到主机端口)。
在这里插入图片描述
(3)查看后台正在运行的容器。
在这里插入图片描述
(4)指定容器绑定的网络地址,这样我们就可以通过访问127.0.0.1:5001来访问容器的5000端口。
在这里插入图片描述
(5)容器命名。
在这里插入图片描述
4.docker容器间通信
(1)创建bridge网络 my_net2,指定网段和网关参数。
在这里插入图片描述
(2)参看网络配置。
在这里插入图片描述
(3)通过DNS server进行通信。
a.启动bbox1和bbox2两个容器
在这里插入图片描述
b.验证bbox2可以ping到bbox1
在这里插入图片描述
(4)默认的bridge网络无法使用docker DNS,如下。
a.创建bbox3和bbox4,均连接到bridge网络
在这里插入图片描述
b.bbox4无法ping到bbox3
在这里插入图片描述
(5)通过joined容器通信。
a.创建一个httpd容器,名为web1
在这里插入图片描述
b.创建busybox容器并通过–network=container:web1指定joined容器为web1,并查看busybox容器中的网络配置信息(Container模式就是在运行容器时通过–net指定另一个已经在运行的有单独Network Namespace的容器,与这个容器共享一个Network Namespace。在这种情况下,新建的容器没有自己的网卡,也不会给它分配IP,而是两个容器共享IP和端口空间)
在这里插入图片描述
c.查看 web1 的网络配置(docker exec命令能够在运行着的容器中执行命令)
在这里插入图片描述在这里插入图片描述

d.可以看出busybox和web1的网卡mac地址与IP 完全一样,它们共享了相同的网络栈。 因此,busybox可以直接用127.0.0.1访问web1的http 服务
在这里插入图片描述

5.docker安装Nginx(engine x)
(1)以后台模式启动一个交互式容器,并将容器的 80 端口映射到主机随机端口。
在这里插入图片描述
(2)对容器内资源进行更新和升级。
在这里插入图片描述
(3)在容器内安装Nginx服务(指令中的y=yes,表示跳过系统提示,直接安装)
在这里插入图片描述
(4)在容器内安装文本编辑器vim。
在这里插入图片描述
(5)在容器中创建静态页面(-p表示创建目录及其下面的子目录)。
在这里插入图片描述在这里插入图片描述
(6)在容器中编辑Nginx配置文件,修改路径。
在这里插入图片描述在这里插入图片描述

(7)在容器中运行Nginx。
在这里插入图片描述
(8)在容器中查看进程(-e:显示所有进程,-f:全格式显示)。
在这里插入图片描述
(9)验证网站访问。
a.用ctrl+p ctrl+q将容器放于后台运行,再用docker ps命令查看后台运行的容器
在这里插入图片描述
b.访问nginx
在这里插入图片描述
c.在宿主机的浏览器,通过ubuntun16.04的ip地址和端口访问
在这里插入图片描述

出现的问题:
1.列出镜像列表失败。
2.拉取镜像失败。
3.两个容器无法通过“容器名”通信。(bbox1与bbox2)
4.在web1容器中找不到ip a命令。(command not found)
解决方案:
1.要先启动docker。
2.新建daemon.json配置文件,设置国内镜像源加速地址。
3.修改daemon.json文件,配置全部容器的DNS,重启docker使之生效
4.进行资源更新和升级。(apt-get update/apt-get upgrade)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐