目录
一、前言
本篇为对上一篇Docker容器技术内容的补充
二、Docker概念
1、容器与镜像的关系
容器通过运行镜像启动。镜像是一个可执行的软件包,其中包含运行应用程序时所需的一切资源——代码、运行时、库、环境变量和配置文件。
构建镜像通常要创建一个Dockerfile文件来指定创建该镜像并运行它所需的全部步骤。
容器是镜像可运行的实例,运行中的容器是位于内存中且有状态的镜像,本质上是一个用户进程。
镜像是用于创建Docker容器的只读模板,容器是从镜像创建的运行时实例。
从应用程序的角度看,镜像是应用程序生命周期的构建和打包阶段,而容器则是启动和运行阶段。
2、容器与虚拟机
容器之间共享主机的操作系统,容器引擎将容器当作进程在主机上运行,其内核使用的是主机操作系统的内核。
虚拟机有自己的操作系统,且独立于主机操作系统,其操作系统内核可以和主机不同。
3、Docker应用
实现应用程序快速、一致的交付;
响应式部署和应用程序;
运行更多的工作负载;
部署微服务应用;
4、Docker底层技术
命名空间:对全局系统资源的一种封装隔离技术,处于不同名称空间的进程拥有彼此独立的全局系统资源,改变一个名称空间中的系统资源只会影响当前名称空间中的进程,而不会影响其他名称空间中的进程。
联合文件系统:是为Linux、FreeBSD和NetBSD操作系统设计的,将其他文件系统合并到一个联合挂载点的一种文件系统,通过创建层来操作,是实现Docker镜像的技术基础。Docker镜像可以通过分层进行继承。
三、Docker部分外部操作
1、开启Docker远程访问
①编辑docker.service文件
[root@goodwood ~]vim /usr/lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
②重载systemctl配置,重启docker
[root@goodwood ~]systemctl daemon-reload
[root@goodwood ~]systemctl restart docker.service
③检查对应端口是否开启监听
[root@goodwood ~]# netstat -lntp | grep dockerd
tcp6 0 0 :::2375 :::* LISTEN 13327/dockerd
④在Docker客户端中指定要连接的远程主机
[root@client ~]# docker -H tcp://192.168.233.20:2375 info
Containers: 1
Running: 0
四、Docker镜像
1、基本概念
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了为运行时准备的一些配置参数。镜像不包含任何动态数据,其内容在构建之后也不会被改变,是创建容器的基础。
2、基本信息
镜像ID:镜像的唯一标识,采用UUID的形式表示,通常采用前12个字符的缩略形式。
镜像名称(即标签):TAG,用于标注同一仓库(REPOSITORY)的不同镜像版本。
镜像摘要值:镜像可以使用IMAGE[@DIGEST] 格式标识,其中IMAGE表示镜像仓库名称。
3、镜像名字格式
index/name:tag
tag为latest时不用书写。
4、镜像命令
构建 docker build
搜索 docker search keyWord
拉取 docker pull [OPTIONS] imageName
--all-tags(-a):表示下载该仓库的所有标签(版本)的镜像。
--disable-content-trust:默认值true,表示忽略镜像验证。
--platform:如果服务器支持多平台,则可以指定平台。
上传 docker push imageName
登录上传 docker login
查看 docker images
查看历史记录 docker history
查看详细信息 docker inspect imageName[IMAGE ID]
删除镜像 docker rmi imageName
删除所有无标签镜像:docker rmi $( docker images -f dangling=true -q)
--force(-f) 强制删除镜像。
--no-prune 不删除没有标签的父镜像。
清理未使用镜像 docker image prune
-a 删除没有被现有容器使用的所有镜像
导出1 docker save oldName[REPOSITORY:TAG] -o filePath/fileName
-o表示保留源文件
导入1 docker load -i filePath/fileName
导出1与导入1(即save与load)配合使用,不要与export和import混用!
导出容器为归档包 docker export imageName -o filePath/fileName
归档包导入为镜像 docker import newName[REPOSITORY:TAG]
添加新名称 docker tag oldName[REPOSITORY:TAG] newName[REPOSITORY:TAG]
五、Docker容器
1、容器的概念
容器是指从镜像创建的应用程序运行实例,实质上就是进程,但与直接在主机上执行的进程不同,容器进程运行在属于自己的独立的名称空间内;通常容器之间是彼此隔离、互不可见的。
2、容器的基本信息与标识
容器ID:容器的唯一标识,采用UUID的形式标识,类似镜像ID。
容器名称:类似镜像名称,可使用容器名称来代替容器ID对容器进行操作。
3、容器状态
created(创建未启动),对应命令:docker create
up(启动),对应命令:docker start、docker run、docker restart
exited(退出),对应命令:stop
退出时还可能会有容器运行异常(如进入错误shell)
paused(暂停),对应命令:docker pause、docker unpause
4、磁盘上容器的大小
用docker ps -s命令查看运行中容器大小
[root@host-a ~]# docker ps -s
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
7e9a96fb1f83 httpd "httpd-forearound" 7 seconds ago Up 6 seconds 80/tcp ecstatic gangulv 2B(virtual 132MB)
第1个值表示每个容器的可写层当前所用的数据大小。
第2个值是虚拟大小值,位于括号内并标注virtual,表示该容器所用只读镜像的数据大小加上容器可写层大小的和。
正在运行的容器所用的磁盘空间是每个容器大小和虚拟大小值的组合。
5、运行容器操作
语法: docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
OPTIONS表示选项
COMMAND参数是可选项,定义容器启动后可以运行的命令(如/bin/bash)
一次性运行:docker run -it REPOSITORY:TAG /bin/bash
后台运行:docker run -itd REPOSITORY:TAG /bin/bash
不会直接运行容器
容器的自启动:
--restart=no:容器退出时不要自动重启。
--restart=on-failure[:max-retries]:只在容器以非0状态码退出时重启。
--restart=always:不管是什么退出状态始终重启容器。
--restart=unless-stopped:不管是什么退出状态始终重启容器,只是当Docker守护进程启动时,如果容器之前已经为停止状态,则不会尝试启动它。
以特权模式运行容器:--privileged
容器的自动清理:--rm,在容器退出时自动删除容器,并删除与它关联的匿名数据卷。
容器的退出状态:
·来自docker run命令的退出代码会给出容器运行失败或者退出的原因。
·当docker run命令以非0代码退出时,退出代码符合chroot标准。
6、其他操作
查看容器 docker ps -a
-a 查看所有容器(包括已停止的)
--no-trunc 查看详细信息(查看详细的COMMAND参数)
进入容器 docker exec -it CONTAINER_ID /bin/bash
容器ID写至不重复即可
-i 让容器的输入保持打开
-t Docker 分配一个伪终端
退出容器 exit
创建容器 docker create [选项] REPOSITORY:TAG
-i 容器输入保持打开
-t 让Docker分配一个伪终端
d 守护进程形式运行
创建的容器不直接运行
启动容器 docker start
重启容器 docker restart
停止容器 docker stop
暂停容器 docker pause
解除暂停 docker unpause
杀死容器 docker kill
删除容器 docker rm
默认只能删除没有正在运行的容器
-f(--force) 通过SIGKILL信号强制删除
7、端口映射
通过端口映射,可在外部访问容器(如主机访问nginx容器对应网页):
docker run -it -p hostPort:containerPort REPOSITORY:TAG [COMMAND]
-P 随机端口映射,默认32768
-p hostPort:containerPort 指定端口映射
若发现不能正常访问,可能是运行shell不正确(不为常用的/bin/bash)
解决方法:通过docker ps -a --no-trunc 查看容器详细信息,找到所需COMMAND,再通过docker run使用对应COMMAND。