docker和虚拟机技术的不同
虚拟机技术:虚拟出自身硬件,运行完整的操作系统,资源占用高,冗余步骤多,启动慢
docker:直接使用宿主机的内核,没有自己的内核,仅有自己的文件系统,省去了系统引导,相当于内核级别的虚拟化,更轻量级,资源利用率高
docker基本组成:
**镜像:**模板,可创建多个容器服务
**容器:**独立运行一个或者一组应用,通过镜像来创建,类似于简易的linux系统
**仓库:**存放镜像的地方,分为公有和私有仓库



docker的安装
- 先修改配置文件 /etc/dnf/plugins/subscription-manager.conf 将main的enable设置为0,关闭该服务
- 清理缓存和加载元数据 dnf clean all && dnf makecache
- 通过dnf安装dnf-plugins-core 可以先list一下默认可能安装
- 更新dnf软件仓库配置文件:**dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo**(该链接可百度替换为阿里云的)
- 安装docker引擎(可以dnf list后再安装):dnf install containerd.io docker-ce docker-ce-cli docker-buildx-plugin docker-compose-plugin
- systemctl启动docker,检查运行状态,docker version 检查版本确定启动成功
docker run流程

底层原理
docker是一个Client-Server结构的系统,docker的守护进程运行在主机上,客户端以socket方式访问。
docker命令
docker 命令 --help 万能命令
docker version 查看docker版本信息
docker info 查看docker系统信息,包括镜像和容器的数量
docker network命令可以查看网络信息
镜像命令
docker images 查看镜像命令,常用选项:
- -a 列出所有镜像
- -q 只显示镜像的id
docker search 镜像名搜索镜像
docker pull 镜像名 下载镜像
docker push 镜像名:tag 发布镜像
docker rmi -f 镜像id 删除镜像
docker rmi -f $(docker images -aq) 删除全部镜像
docker build从DockerFile构建镜像
docker history 查看镜像构建历史
docker tag 给镜像增加标签
docker save将本地镜像保存为 Tar 文件,保存的 Tar 文件包含镜像的所有层(layers)和元数据
docker load从 Tar 文件加载镜像,加载后镜像的标签(tags)和历史记录会完整恢复。
容器命令docker run [参数] 镜像名 从镜像处创建并运行一个容器,解析器一般用**/bin/bash**,常用参数:
- --name 名称 设置容器名称
- -d 在后台方式运行
- -it 使用交互方式运行,进入容器查看内容,后需加解析器/bin/bash
- -p 主机端口:容器端口 指定容器端口运行
- -v容器和主机间数据卷挂载,后面容器数据卷详细提及
- --volumes-from 容器之间数据卷挂载,后面容器数据卷详细提及
- --net指定容器网络模式,不指定默认是走bridge模式
**注意:**docker容器采用 -d 后台运行是需要前台进程的,此时不加 -it 来进入容器,docker会认为没有应用,可能会自动停止该容器
**docker ps [参数]**列出所有运行中的容器,常用参数:
- -a 列出正在运行的和历史运行过的容器
- -n=number 列出最近创建的容器,指定个数,按时间最近排序
- -q 只显示容器编号
exit 容器停止并退出
Ctrl+P+Q 容器不停止退出,注意先P后Q
docker rm 容器id 删除指定容器,不能删除正在运行的容器,如需强制删除需要加参数-f
docker rm -f $(docker ps -aq) 删除所有容器
docker start 容器id 启动历史启动过的容器
docker restart 容器id 重启容器
docker stop 容器id 停止容器
docker kill 容器id 杀掉容器
docker export将容器文件系统导出为 Tar 文件,丢弃镜像历史和元数据
docker import从 Tar 文件创建新镜像,无历史记录或标签
进入正在运行的容器
方式1:docker exec -it 容器id /bin/bash
特点:进入容器后,开启新的命令行终端,可以进行其他操作,如果执行过Ctrl+P+Q操作后,exit不会关闭容器
方式2:docker attach 容器id
特点:进入容器后,进入正在运行的终端,不会启动新的终端,执行exit后会直接关闭容器
docker inspect 容器id 查看容器的元数据
docker logs [参数] 容器id 查看docker的日志信息,常用参数:
- -f 实时跟踪显示日志
- -t 显示日志时间戳
- --tail number 限制条数显示日志最后的打印
docker top 容器id 查看对应容器内部的进程信息
docker stats 容器id 查看容器所占CPU状态
docker cp 容器id:路径 目的路径 将容器中的文件拷贝出来,例如:docker cp 9646bbfeb610:/home/test.java /home
docker volume [参数] 具名挂载或匿名挂载的挂载卷操作,常用参数:
- ls 显示卷
- inspect 卷名 显示卷的详细信息
容器数据卷
用于容器的持久化和同步操作,容器和系统之间数据共享,容器之间的数据也可以共享(即数据卷容器)
- 容器之间的数据共享,父容器删除不会影响到其他容器的数据
- 容器数据共享到主机本地,容器删除不会影响到本地的数据
实现办法1:
通过镜像启动容器时,使用 docker run 命令添加 -v参数关联目录操作,3种方式如下。
指定路径挂载:-v 本地目录:容器内目录
匿名挂载:-v 容器内目录 容器数据卷的默认路径挂载
具名挂载:-v 卷名:容器内目录 容器数据卷的默认路径挂载(常用于生产环境)
注意:
- 具名挂载和匿名挂载默认主机路径 /var/lib/docker/volumes/
- 匿名挂载和具名挂载会产生"卷",通过docker volume可查看卷名
- 通过 -v 挂载容器数据卷时,路径后可添加ro(只读)或rw(可读写)改变挂载目录的读写权限,ro表示该路径仅可以通过宿主机操作,容器内部无权限操作,例如 docker run -d -v /home/ceshi:/etc/nginx:ro nginx
实现方法2:
DockerFile构建镜像时直接挂载。
数据卷容器
实现容器和容器之间的数据共享,注意是整体数据的共享(类似于整体备份,不是作用于某单个路径),被挂载的被称为父容器,父容器就是数据卷容器,父容器被删除后,共享的其他容器数据不受影响。
执行 docker run 命令时,添加参数 --volumes-from 容器名或id 实现容器之间的数据共享。
docker的分层管理逻辑
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像顶部,这一层即为容器层,容器之下的被称之为镜像层。
提交镜像(构建镜像)
提交容器成为一个新的镜像。
方式1:commit
docker commit [参数] 容器id 目标镜像名:[TAG] 提交镜像操作,常用参数:
- -m 加=添加描述信息
- -a 加=添加作者
例如:docker commit -m="new_list" -a="xiaoming" 859e163e8103 nginx02:1.2
方式2:build (通过DockerFile构建镜像)
docker build -f Dockerfile文件 -t 名称:版本 构建上下文的路径
其中:构建上下文的路径如果是当前目录,可以用 . 表示,如果文件不在其中,
Dockerfile无法访问它们(会报错file not found)当文件名称就叫做 Dokcerfile 时,可以不加参数 -f
DockerFile (命令参数脚本)
注意:指令必须是大写字母,指令是从上到下执行,#代表注释,每个指令都会封装一个镜像层并提交。
常见命令:
- FROM:指定基础镜像
- MAINTAINER:镜像是谁写的,姓名+邮箱
- RUN:镜像构建时需要运行的命令
- COPY:拷贝文件,不会自动解压,优先用
- ADD:拷贝文件或从链接下载,会自动解压
- WORKDIR:镜像额工作目录
- VOLUME:数据卷挂载的目录位置
- EXPOSE:指定暴露端口
- ENV:构建时设置环境变量
- CMD:指定容器启动时运行的命令,运行容器时追加命令会被替代
- ENTRYPOINT:指定容器启动时运行的命令,运行容器时可以追加命令
- ONBUILD:为子镜像添加触发指令(在子镜像构建时执行)
官方的DockerHub中绝大多数的镜像都是从基础镜像FROM scratch构建的。
Docker网络
docker安装后即会自动创建默认okcer0网桥,每启动一个docker容器,docker都会给其分配一个IP地址,使用的技术是veth-pair技术,同时ip a查看系统网卡信息时会多一对网卡。
**veth-pair技术:**虚拟以太网设备对(Virtual Ethernet Pair),由成对出现的虚拟网络接口组成,一端连接协议栈,另一端彼此互联。数据在veth-pair间双向传输时无需中继处理,类似"虚拟网线"实现透明传输。
实际容器之间网络交互的流程,不手动分配网桥时,都是走的docker0转发。

docker --link (不推荐)
只是配置容器中的hosts,可实现通过容器名访问网络,但是是单向的,不常用。
例如:docker exec -it -name tomcat01 --link tomcat02 tomcat,执行后tomcat01仅可以通过容器名ping通tomcat02,但反向不可以。
自定义网络模式(推荐)
docker network create创建自定义网络
默认具备的网络模式:
bridge:桥接模式(默认),和docker0桥接
none:未配置网络
host:主机模式,和宿主机共享网络
container:容器网络联通(局限性大,不常用)
示例:

优点:应用自定义网络的容器支持通过容器名称直接访问网络,例如可直接ping通应用自定义网络的容器名。
docker network connect 自定义网络 容器将自定义网络和容器进行打通,连通后会将对应容器直接加到对应的网络中(通过docker network inspect可以看到),相当于一个容器两个地址。