docker知识点总结
所属分类 docker
浏览量 664
Docker三要素
镜像 Image
一个只读的模板,用来创建 Docker 容器,一个镜像可以创建多个容器
容器 Container
独立运行的一个或一组应用,应用程序或服务运行在容器里面,
容器类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例 ,
容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除
仓库 Repository 集中存放镜像文件的场所
Docker基础命令
systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl status docker
systemctl enable docker
docker info
docker --help
docker 具体命令 --help
镜像命令
docker images [OPTIONS]
-a :列出本地所有的镜像(含历史镜像)
-q :只显示镜像ID
docker search [OPTIONS] 某个XXX镜像名字
–limit 只列出N个镜像,默认25个
docker pull 镜像名字[:TAG]
查看镜像/容器/数据卷所占的空间
docker system df
删除镜像:docker rmi [OPTIONS] 镜像名或镜像ID
-f 强制删除
容器命令
新建+启动容器:docker run [OPTIONS] **IMAGE** [COMMAND] [ARG...]
–name=“容器名字”
-d: 后台运行容器并返回容器ID
-i:以交互模式运行容器
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用,即启动交互式容器
-P: 随机端口映射
-p: 指定端口映射
列出当前所有正在运行的容器:docker ps [OPTIONS]
-a:列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器
-n:显示最近n个创建的容器
-q:静默模式,只显示容器编号
退出容器
run进去容器,exit退出,容器停止
run进去容器,ctrl+p+q退出,容器不停止
启动已停止运行的容器:docker start 容器ID或者容器名
重启容器:docker restart 容器ID或者容器名
停止容器:docker stop 容器ID或者容器名
强制停止容器:docker kill 容器ID或者容器名
删除已停止的容器:docker rm 容器ID
-f 强制删除
查看容器日志:docker logs 容器ID
查看容器内运行的进程:docker top 容器ID
查看容器内部细节:docker inspect 容器ID
进入正在运行的容器并以命令行交互:docker exec -it 容器ID /bin/bash
重新进入容器:docker attach 容器ID
退出容器直接停止,exec就不会,建议使用exec
从容器内拷贝文件到主机:docker cp 容器ID:容器内路径 目的主机路径
导出容器:docker export 容器ID > 文件名.tar
导入容器:cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
数据卷
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,
因此能够绕过Union File System提供一些用于持续存储或共享数据的特性
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
一般用法
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
默认读写(rw)
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
卷的继承和共享
容器1完成和宿主机的映射:docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu
容器2继承容器1的卷规则:docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
数据卷可在容器之间共享或重用数据
卷中的更改可以直接实时生效
数据卷中的更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止
DockerFile
Dockerfile是用来构建Docker镜像的文本文件,由一条条构建镜像所需的指令和参数构成
构建三步骤
编写Dockerfile文件
docker build命令构建镜像
docker run镜像运行容器实例
Dockerfile基础知识
每条保留字指令都必须为大写字母且后面要跟随至少一个参数
指令按照从上到下,顺序执行
#表示注释
每条指令都会创建一个新的镜像层并对镜像进行提交
Docker执行Dockerfile的大致流程
docker从基础镜像运行一个容器
执行一条指令并对容器作出修改
执行类似docker commit的操作提交一个新的镜像层
docker再基于刚提交的镜像运行一个新容器
执行dockerfile中的下一条指令直到所有指令都执行完成
DockerFile常见保留字指令
FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROM
MAINTAINER:镜像维护者的姓名和邮箱地址
RUN:容器构建时需要运行的命令,两种格式
shell 格式:RUN < 命令行指令 > 例如:RUN yum -y install vim
exec 格式:RUN [“可执行文件”,“参数1”,“参数2”] 例如:RUN ["./test.php",“dev”,“offline”]
RUN是在 docker build时运行
EXPOSE:当前容器对外暴露出的端口
WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root
ENV:用来在构建镜像过程中设置环境变量
ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY:类似ADD,拷贝文件和目录到镜像中。功能没ADD强大,推荐使用ADD
VOLUME:容器数据卷,用于数据保存和持久化工作
CMD:指定容器启动后的要干的事情
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
和RUN命令的区别
CMD是在docker run 时运行,RUN是在 docker build时运行
ENTRYPOINT 用来指定一个容器启动时要运行的命令
类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参
Docker网络
类似于VMware虚拟机的网络连接方式:NAT,网桥,仅主机模式,但是又与之不同。
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),
该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
Docker 默认指定了 docker0 接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信
常用命令
查看网络:docker network ls
查看网络源数据:docker network inspect 网络名字
创建网络:docker network create 网络名字
删除网络:docker network rm 网络名字
网络模式
bridge模式:使用–network bridge指定,默认使用docker0
host模式:使用–network host指定
none模式:使用–network none指定
container模式:使用–network container:NAME或者容器ID指定
bridge
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),
Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,
同时Docker网桥是每个容器的默认网关
因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信
docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0
网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配
每个容器实例内部也有一块网卡,每个接口叫eth0
docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配
host
直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换
容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace
容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口
none
在none模式下,不为Docker容器进行任何网络配置。
这个Docker容器没有网卡、IP、路由等信息,只有一个lo,需要我们自己为Docker容器添加网卡、配置IP等
container
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享
新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。
两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
自定义网络
自定义网络默认使用的是桥接网络bridge
新建一个自定义网络,新建多个容器加入自定义网络,多个容器在同一个网络中可以通过容器名(服务名)互ping成功,而不必须使用IP
自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)
容器编排
Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用
需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系
然后,只要一个命令,就能同时启动/关闭这些容器
使同时部署多个服务时使用
例如一个Web微服务项目,除了Web服务容器本身,往往还需要再加上后端的数据库mysql服务,redis服务器,注册中心Nacos,负载均衡等,
如果手动一个个创建容器,很麻烦,且先后顺序也可能出错
Compose使三步骤:
编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务
最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线
Compose常用命令
docker-compose -h
docker-compose up
docker-compose up -d
docker-compose down # 停止并删除容器、网络、卷、镜像
docker-compose exec yml里面的服务id # 进入容器实例内部
docker-compose ps
docker-compose top
docker-compose logs yml里面的服务id
docker-compose config
docker-compose config -q # 检查配置,有问题才有输出
docker-compose restart
docker-compose start
docker-compose stop
上一篇
下一篇
密码学数论基础
k8s知识点
k8s知识点总结
软件复用
微服务 SpringCloud k8s istio
BIO NIO AIO 区别