文章目录
Docker三要素
- 镜像:Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
- 容器:Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
- 仓库:仓库(Repository)是集中存放镜像文件的场所,类似于Maven,github,Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
Docker基础指令
帮助启动类命令
- 启动docker:
systemctl start docker
- 停止docker:
systemctl stop docker
- 重启docker:
systemctl restart docker
- 查看docker状态:
systemctl status docker
- 开机启动:
systemctl enable docker
- 查看docker概要信息:
docker info
- 查看docker总体帮助文档:
docker --help
- 查看docker命令帮助文档:
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
- 容器1完成和宿主机的映射:
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
DockerFile
定义:Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
构建三步骤:
- 编写Dockerfile文件
- docker build命令构建镜像
- docker run镜像运行容器实例
DockerFile构建镜像过程解析
- 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服务
- docker-compose up -d # 启动所有docker-compose服务并后台运行
- docker-compose down # 停止并删除容器、网络、卷、镜像
- docker-compose exec yml里面的服务id # 进入容器实例内部
- docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
- docker-compose top # 展示当前docker-compose编排过的容器进程
- docker-compose logs yml里面的服务id # 查看容器输出日志
- docker-compose config # 检查配置
- docker-compose config -q # 检查配置,有问题才有输出
- docker-compose restart # 重启服务
- docker-compose start # 启动服务
er-compose编排过的容器进程 - docker-compose logs yml里面的服务id # 查看容器输出日志
- docker-compose config # 检查配置
- docker-compose config -q # 检查配置,有问题才有输出
- docker-compose restart # 重启服务
- docker-compose start # 启动服务
- docker-compose stop # 停止服务