Docker 环境搭建及镜像制作
实验目的及要求
- Ubuntu 下使用 Docker 创建 Ubuntu 的镜像,并以此为基础镜像创建新的容器镜像
- 通过 Docker hub 构建一个容器实例
- 注意查看容器镜像各层次的构成
- 在构建好的容器实例安装任意软件 使用 Docker commit 和 Dockerfile 分别构建镜像
- 比较 docker build 和 docker commit 创建镜像的区别
- 比较虚拟机和容器的镜像大小 、启动速度等方面的区别
实验环境
宿主机配置为 Intel® Core™ i7-8700 CPU @ 3.20GHz,8G Mem,1T HDD,Intel VT 硬件虚拟化已开启
真实系统为 Ubuntu 20.04.1 x64 (Linux version 5.13.0-39-generic)
实验步骤
第一步:安装 Docker 环境所需的依赖包
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
- 更新 apt 软件包索引并安装软件包以允许 apt 通过 HTTPS 使用存储库
第二步:添加 GPG 证书秘钥并验证是否拥有带有指纹的密钥
# 添加GPG证书秘钥并验证是否拥有带有指纹的密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 写入软件源信息
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
第三步:安装 docker,并运行 hello-world 容器
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo docker run hello-world
- containerd.io :与 OS API 进行交互的守护程序,从本质上将 Docker 与 OS 分离,还为非 Docker 容器管理器提供容器服务
- docker-ce : Docker 守护程序, 这是完成所有管理工作的部分
- docker-ce-cli :用于控制守护程序的 CLI 工具,如果要控制远程 Docker 守护程序,则可以单独安装它们
- 注:如果 hello-world 镜像不在本地,则会从镜像仓库下载,然后再执行

第四步:从 Docker hub 上下载 ubuntu 20.04 镜像
sudo docker pull ubuntu:20.04
-
下载过程中注意界面的输出,每个 ID 代表 docker 镜像的一个层

第五步:使用该镜像运行一个容器,并在该容器中测试任意 linux 命令
sudo docker run -it --name ubuntu ubuntu:20.04 bash
root@a0da3a535881:/# apt-get update
root@a0da3a535881:/# apt-get install inetutils-ping
root@a0da3a535881:/# ping localhost
- docker run :创建一个新的容器并运行一个命令
- -it :以交互模式运行容器 并为容器重新分配一个伪输入终端
- –name ubuntu :为容器指定一个名字
- 还可以设置 CPU 绑定 、 运行内存等
- 如果容器已经存在,可以直接使用 exec 命令进入
docker exec -it ubuntu bash

第六步:基于 ubuntu 14.04 基础镜像安装任意软件,并生成新的 docker 镜像
root@a0da3a535881:/# apt-get update
root@a0da3a535881:/# apt-get install openssh-server
root@a0da3a535881:/# exit
sudo docker commit -m "Just installed a new software" -a "zys" ubuntu ubuntu-test1
- docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]],从已有容器创建一个新的镜像,可以给出镜像名称和标签
- -m :提交时的说明文档
- -a :提交的镜像作者
第七步:使用 Dockerfile 创建虚拟机
- 创建 Dockerfile 文件
mkdir dockerfile
cd dockerfile
touch Dockerfile
- 编辑刚刚创建的 Dockerfile
vim Dockerfile
- Dockerfile 内容具体如下,根据需求修改
# This is a dockerfile writing by {your ID number and your name}
# A brief introduction of this docker image
FROM ubuntu:20.04
MAINTAINER your name <yourname@seu.edu.cn>
RUN apt-get update
RUN apt-get install -y openssh-server
EXPOSE 22
RUN echo "OpenSSH server installed."
- 基于 Dockerfile 创建镜像
sudo docker build -t ubuntu-test2 .
- docker build [OPTIONS] PATH | URL | - :用于使用 Dockerfile 创建镜像
- -f :指定要使用的 Dockerfile 路径
- -t :镜像的名字及标签,通常 name:tag 或者 name 格式
- 查看刚刚创建的镜像信息,并比较和 docker commit 所创建镜像的区别
sudo docker images

- docker commit 与 docker build 的对比区别
-
docker commit
基本上是对“运行”容器的当前状态进行“快照”并将其保存为镜像,这基本上意味着如果“正在运行”的容器正在生成日志文件、更新包或进行文件更改,它们将保存到映像中。每次运行 docker commit 时,都会创建一个新镜像,相当于 git commit 操作,对当前改动打一个包操作。使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像。另外,镜像所使用的分层存储,每一次修改都会让镜像更加臃肿一次。其优点是操作简单,易上手。 -
docker build
通过引用脚本(Dockerfile)来创建镜像,效率高且操作透明。对镜像的操作每一步都有记录,步骤清晰,方便后期维护,拓展性更强。但需要熟悉相关文件编写语法,需要一定的基础。
-
实验小结
通过对Docker容器的学习使用,将其与之前的虚拟机相比,不难发现容器速度明显比虚拟机更快,性能更强,使用更方便。但是容器也有弊端,需要基于宿主机系统内核,基本上就限定于Linux内核,并且上手使用需要一定的成本,不如虚拟机直接虚拟出环境再安装系统来得直观且易操作,但同时性能也会因此大打折扣。