Docker入门
Ubuntu 16.04
Docker 19.03.0(安装可参考官网)
1. Docker是什么?
1.1 定义
[1]中对Docker的定义如下:
Docker 使用 Google 公司推出的 Go 语言进行开发实现,基于 Linux 内核的 cgroup,namespace,以及AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
通俗一点的话,可以对Docker理解为:
- 是一种虚拟化技术,与常用的虚拟机区别在于——
- 虚拟机是虚拟化出完整的操作系统,应用在这个操作系统上运行
- Docker是在同一个操作系统上的虚拟化,用户间相互隔离
1.2 镜像、容器、仓库
1.2.1 镜像
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
1.2.2 容器
镜像(
Image
)和容器(Container
)的关系,就像是面向对象程序设计中的类
和实例
一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
1.2.3 仓库
Docker仓库是一个集中的存储、分发镜像的服务,用户可以上传自己构建的镜像供其他人使用,也可以下载其他人构建好的镜像。
一个 Docker Registry 中可以包含多个 仓库(
Repository
);每个仓库可以包含多个 标签(Tag
);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。
1. 基本使用
安装Docker的部分网上有很多教程,此处就省略啦。
1.1 拉取镜像 pull
Docker拉取镜像的指令是pull,如下:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
没有指定Registry,则默认从Docker Hub获取,仓库名为ubuntu,标签为18.04,使用docker image ls
可以看到已经将ubuntu:18.04的镜像拉取到本地。
1.2 启动镜像 run
有了镜像之后,可以使用run指令启动镜像,即运行一个镜像实例(容器)。
docker run [选项] 仓库名[:标签] [命令]
运行后,会先在本地找有没有相应的镜像,若没有,则会到Docker Hub下载(pull)到本地,再运行。
运行一个可交互的bash,如下,i
表示交互式操作,t
表示终端,可以看到进入了容器的bash终端,用完可以通过exit
指令退出。
1.3 删除镜像 rm
删除本地镜像的命令如下,这里的<镜像>
可以是镜像ID、镜像名、镜像摘要等。
docker image rm [选项] <镜像1> [<镜像2> ...]
此处9b9是某个镜像的ID前三位,一般输几位使得可以区分出要删除的镜像即可。
此处删除提示已被某个容器引用,可以像上面一样强制删除,也可以按照下面的步骤:
1. docker stop container_id //中止容器
2. docker rm container_id //删除容器
3. docker image rm <镜像> //删除镜像
2. 镜像定制commit
以下过程参考教程[1],定制一个Web服务器。
- 使用nginx启动一个容器,命名为
myserver
,端口为80,可在本地访问
- 现在要修改提示的文字,可以通过
exec
进入容器,修改html文件
yczheng@yczheng-vm ~> docker exec -it myserver bash //进入容器myserver,启动bash
root@1949d5f6a58c:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@1949d5f6a58c:/# exit
- 查看网页,可以看到文字已修改
- 现在容器已经在原来镜像的基础上,做了一部分修改,这些修改保存在容器存储层中,如果容器关闭,原来的镜像不会有任何修改。若我们想要保存这些修改,可以通过
commit
命令将原镜像和容器存储层合并为一个新的镜像,如下:
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
- 运行新的镜像,端口映射为81,访问结果如下,可以看到是修改后的内容
使用commit可以方便地定制自己的镜像,但这种方式也会导致大量无关的东西被添加进来导致镜像臃肿,且只有操作者知道到底修改了什么,不方便之后的维护。
因此一般不会采用这种方式来制作镜像,更好的方式是使用下面的Dockerfile方式。
3. 镜像定制Dockerfile
Dockerfile记录了从基础镜像一层层叠加至最终镜像的操作,使得整个过程可重复、易维护。
仍然是上面的nginx,定制过程如下:
- 创建一个文件夹,在文件夹中创建Dockerfile,如下:
mkdir hello-nginx
cd hello-nginx
vim Dockerfile
- 写入数据如下,
FROM
指定基础镜像,每个RUN
指令表示搭建一层(不需要每个指令都用RUN,而是可以用一个RUN执行多个指令,指令间用&&连接)
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
- 使用
build
指令构建镜像,如下:
- 运行新的镜像,如下:
关于build指令后的路径.
,指定的是Docker中的上下文路径。
docker build
命令上下文路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎- Docker引擎获取这些文件后,使用这些文件构建镜像,因此所有需要的文件都必须放在上下文路径中
- 默认会从上下文路径中找到Dockerfile