Docker核心概念
一、Docker的核心概念
1.1 Docker的系统
docker系统有两个程序:docker 服务端和docker 客户端
1.1.1 Docker服务端
是一个服务进程,管理着所有的容器
1.1.2 Docker客户端
扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程
1.2 Docker 核心组件
1.2.1Docker仓库
docker registeries
用来保存镜像,可以理解为代码控制中的代码仓库,同样,docker仓库也有公有的和私有的概念。
公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。
1.2.2 Docker镜像
docker image
镜像的名称组成:registery/repo:tag
Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。
在docker的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。
由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不可写,所以镜像是无状态的。
每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。下层那个镜像是上层镜像的父镜像。
所有镜像都是通过一个 64 位十六进制字符串 (内部是一个 256 bit 的值)来标识的。 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的碰撞机率,所以服务器总是返回长ID。(认识即可,后面实验就明白了)
1.2.3 Docker 容器
Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。
每一个 Docker 容器都是从 Docker 镜像创建的。
Docker 容器可以运行、开始、停止、移动和删除。
每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。
1.2.4 docker镜像和docker容器的区别
1.2.4.1 docker镜像
假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的。这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态。
一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。
Docker镜像通过镜像ID进行识别。镜像ID是一个64字符的十六进制的字符串。但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。
要列出本地所有有效的镜像,可以使用命令
docker images

1.2.4.2 docker容器
docker 容器可以使用命令创建
docker run image_name
![]()
它会在所有的镜像层之上增加一个可写层。这个可写层有运行在CPU上的进程,而且有两个不同的状态:运行态(Running)和退出态 (Exited)。这就是Docker容器。当我们使用docker run启动容器,Docker容器就进入运行态,当我们停止Docker容器时,它就进入退出态。
当我们有一个正在运行的Docker容器时,从运行态到停止态,我们对它所做的一切变更都会永久地写到容器的文件系统中。要切记,对容器的变更是写入到容器的文件系统的(可写层),而不是写入到Docker镜像中的。
我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身。
如果对容器的底层镜像进行修改,那么当前正在运行的容器是不受影响的,不会发生自动更新现象。(目前涉及不到)
64字符的十六进制的字符串来定义容器ID,它是容器的唯一标识符。容器之间的交互是依靠容器ID识别的,由于容器ID的字符太长,我们通常只需键入容器ID的前4个字符即可。当然,我们还可以使用容器名,但显然用4字符的容器ID更为简便。
二、镜像管理
2.1 查看本地镜像
docker image list
or
docker iamges

2.2 搜索镜像
docker search docker.1ms.run/centos
# star数至少为100的镜像
docker search docker.1ms.run/centos -f stars=100


2.3 拉取镜像
docker pull 镜像
# 由于国际关系,上面的拉不下来,可以用下面的拉取
docker docker.1ms.run/library/镜像
# 使用上面的命令下载下来的之后可以使用docker tag 重新起个名
docker tag docker.1ms.run/library/镜像 new_name

2.4 查看镜像详情
docker image inspect 镜像ID

2.5 删除镜像
docker rmi 镜像ID
# 强制删除
docker rmi --force 镜像id
# 只查看所有镜像
docker images -q
# 删除所有镜像
docker images $(docker iamges -q)
2.6 给镜像打tag
前面拉取镜像处有例子了
2.7 查看镜像的制作过程,相当于Dockerfile
docker history 镜像名称

三、Docker 容器管理及镜像制作
3.1 Docker容器管理
3.1.1 创建新容器(不启动)
3.1.1.1 拉取镜像
docker pull 镜像
docker create -it 镜像 /bin/bash


3.1.1.2 创建并运行容器
"""
同一个镜像可以启动多个容器,每次执行run子命令都会运行一个全新的容器
-i :捕获标准输入输出
-t :分配一个终端或者控制台
--restart=always: 容器随docker engine自启动,因为在重启docker(systemctl restart docker)的时候默认容器都会被关闭。 也适用于create选项,创建容器时,随服务启动该容器实例
"""
docker run -it --restart=always 镜像 /bin/bash
# 退出容器
exit
或者在键盘上ctrl + p + q
下面划线的两处的提示符发生了变化,容器已经开始运行。

3.1.1.3 查看容器
# 查看运行容器
docker ps
# 查看所有容器
docker ps -a
# 查看若有容器id
docker ps -a -q


3.1.1.4 启动容器
docker start 容器id


3.1.1.5 关闭容器
"""
docker stop命令给容器中的进程发送SIGTERM信号,默认行为是会导致容器退出,当然,容器内程序可以捕获该信号并自行处理,例如可以选择忽略。
而docker kill则是给容器的进程发送SIGKILL信号,该信号将会使容器必然退出。
"""
docker stop 容器id
docker kill 容器id

3.1.1.6 暂停和恢复容器
# 暂停容器
docker pause 容器id
# 恢复容器
docker unpause 容器id


3.1.1.7 附着容器
docker attach 容器ID

3.1.1.8 后台运行
"""
-d:后台启动命令
-c: 启动并运行命令
while 循环输出,证明容器在运行
"""
docker run -it -d --name mytest centos:7 /bin/sh -c "while true; do echo hello world; sleep 2; done"


3.1.1.9 容器更名
docker rename old_name new_name

3.1.1.10 端口映射
"""
20 真机(宿主机)
2020 容器
"""
docker run -it --name=test-port --restart=always -p 20:2020 centos:7 /bin/bash


3.1.1.11 容器监控
# 使用logs命令查看守护式容器
docker logs 容器ID
# -f 可以跟踪日志的输出,直到手动停止
docker logs -f 容器ID
# top显示一个运行的容器里面的进程
docker top 容器ID
# event 实时输出Docker 服务器端的事件
docker event
# wait 捕捉容器停止时的退出码
docker wait 容器名称
# diff查看容器内发生改变的文件
docker diff 容器名称
# 宿主机和容器之间相互copy文件
docker cp /root/c.txt test-post:/home/c.txt
更多推荐
所有评论(0)