1、Docker简介
1.1、Docker的组成
docker 主机(host):一个物理机和虚拟机,用于运行docker服务进程和容器。
docker 服务端(server):docker守护进程,运行docker容器。
docker 客户端(client):客户端使用docker命令或其他工具调用docker API。
Docker 镜像 (Image) :镜像可以理解为创建实例使用的模板。
Docker 容器(Container): 容器是从镜像里生成对外提供服务的一个或一组服务。
Docker 仓库 (Registry): 保存镜像的仓库。官方的仓库:https://hub.docker.com/
Docker的三大核心组件也就是镜像、容器与仓库。
1.2、Docker的优缺点
优点:
- 快速部署:短时间内可以部署成百上千个应用,更快速的交付到线上。
- 高效虚拟化:不需要额外的hypervisor来支持,直接基于Linux实现应用虚拟化,相比虚拟机大幅度提高了性能和效率。
- 节省开支:提高服务器利用率,降低IT支出。
- 简化配置:将运行环境打包保存到容器,使用时直接启动即可。
- 快速迁移和扩展:可以跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从A宿主机到B宿主机,甚至可以A平台迁移到B平台。
缺点:
- 隔离性:各应用之间的隔离不如虚拟机彻底。
1.3、docker镜像(image)
简单的理解,docker镜像就是一个Linux的文件系统(Root FileSystem),这个文件系统里面包含可以运行在Linux内核的程序以及相应的数据。
Linux分为两个部分:Linux内核(Linux Kernel)与用户空间,而真正的Linux操作系统,是指Linux内核,我们常用的Ubuntu、CentOS等操作系统其实是不同厂商在Linux内核基础上添加自己的软件与工具集(tools)形成的发布版本(Linux Distribution)。
我们也可以把镜像看成是上面所说的用户空间,当Docker通过镜像创建一个容器时,就是将镜像定义好的用户空间作为独立隔离的进程运行在宿主机的Linux内核之上。
镜像的两个特征:
- 镜像是分层(Layer)的:即一个镜像可以多个中间层组成,多个镜像可以共享同一中间层,我们也可以通过在镜像添加多一层来生成一个新的镜像。
- 镜像是只读的(read-only):镜像在构建完成之后,便不可以再修改,而上面我们所说的添加一层构建新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,因为容器是可以动态改变的。
操作镜像的命令
Docker中与镜像操作相关的命令都在docker image这条子命令下,通过docker image --help这条命令,可以看到docker image子命令的详细文档,如下:
Usage: docker image COMMAND
Manage images
Commands:
build Build an image from a Dockerfile(构建镜像的命令)
history Show the history of an image(显示镜像构建历史过程)
import Import the contents from a tarball to create a filesystem image(导入一个由容器导出的镜像)
inspect Display detailed information on one or more images(显示一个镜像的详细信息)
load Load an image from a tar archive or STDIN(从一个文件或标准输入流中导入镜像)
ls List images(查看镜像列表)
prune Remove unused images(删除虚悬镜像)
pull Pull an image or a repository from a registry(从仓库拉取镜像)
push Push an image or a repository to a registry(推送镜像到仓库)
rm Remove one or more images(删除镜像)
save Save one or more images to a tar archive(streamed to STDOUT by default)(保存镜像到文件)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE(给镜像打标签)
1.4、docker容器(Container)
容器与镜像的关系,就如面向编程中对象与类之间的关系。
因为容器是通过镜像来创建的,所以必须要先有镜像才能创建容器,而生成的容器是一个独立于宿主机的隔离进程,并且有属于容器自己的网络和命名空间。
我们前面介绍过,镜像由多个中间层(layer)组成,生成的镜像是只读的,但容器却是可读可写的,这是因为容器是在镜像上面添一层读写层(writer/read layer)来实现的,如下图所示:
操作容器的相关命令
现在都直接使用docker命令了,不在后面加container了
Usage: docker container COMMAND
Manage containers
Commands:
attach Attach local standard input, output, and error streams to a runnin g container
commit Create a new image from a container's changes(把容器保存为镜像)
cp Copy files/folders between a container and the local filesystem
create Create a new container(创建一个新的容器)
diff Inspect changes to files or directories on a container's filesyste m
exec Run a command in a running container(在一个运行的容器中执行命令)
export Export a container's filesystem as a tar archive
inspect Display detailed information on one or more containers
kill Kill one or more running containers(杀死一个或多个正在运行的容器)
logs Fetch the logs of a container
ls List containers(显示本地容器列表)
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
prune Remove all stopped containers
rename Rename a container(重命名容器)
restart Restart one or more containers(重启一个或多个容器)
rm Remove one or more containers(删除一个或多个容器)
run Run a command in a new container(运行一个新的容器)
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers(停止一个或多个容器)
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes
1.5、docker仓库(Repository)
docker仓库(Repository)是集中存储镜像的地方,这里有个概念要区分一下,那就是仓库与仓库服务器(Registry)是两回事,像我们上面说的Docker Hub,就是Docker官方提供的一个仓库服务器,不过其实有时候我们不太需要太过区分这两个概念。
1.5.1、公共仓库
公共仓库一般是指Docker Hub,前面我们已经多次介绍如何从Docker Hub获取镜像,除了获取镜像外,我们也可以将自己构建的镜像存放到Docker Hub,这样,别人也可以使用我们构建的镜像。官方的hub仓库地址:https://hub.docker.com/
不过要将镜像上传到Docker Hub,必须先在Docker的官方网站上注册一个账号,注册界面如下,按要求填写必要的信息就可以注册了,很简单的。
注册好了之后,可以在本地使用命令登录到Dokcer Hub了,过程如下:
使用下面的命令登录到官方的hub仓库
# docker login
1.5.2、私有仓库
有时候自己部门内部有一些镜像要共享时,如果直接导出镜像拿给别人又比较麻烦,使用像Docker Hub这样的公共仓库又不是很方便,这时候我们可以自己搭建属于自己的私有仓库服务,用于存储和分布我们的镜像。
Docker官方提供了registry这个镜像,可以用于搭建私有仓库服务,我们把镜像拉到本地之后,用下面命令创建该镜像的容器便可以搭建一个仓库服务,如下:
# docker run -d -p 5000:5000 --restart=always --name registry registry
Docker 官方开源的镜像仓库Distribution仅满足了镜像存储和管理的功能,用户权限管理相对较弱,并且没有管理界面。
如果你想要构建一个企业的镜像仓库,Harbor是一个非常不错的解决方案。Harbor 是一个基于Distribution项目开发的一款企业级镜像管理软件,拥有RBAC(基于角色的访问控制)、管理用户界面以及审计等非常完善的功能。目前已经从CNCF毕业,这代表它已经有了非常高的软件成熟度。
harbor的官网地址:https://goharbor.io/