一、Docker的构成
Docker是一个Client-Server结构系统,Docker守护进程运行在主机上,然后通过Socket连接,从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。容器是一个运行时环境。
- Docker仓库:https://hub.docker.com
- Docker自身组件
- Docker Client:客户端
- Docker Server:Docker daemon的主要组成部分,接受用户通过Docker Client发出的请求,并按照相应的路由规则实现路由的分发
- Docker 镜像:Docker镜像运行之后变成容器(docker run)
二、安装
1. 下载安装
- 下载地址
docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm
运行 yum -y install * - 运行docker,执行命令
systemctl start docker
systemctl enable docker - 检验是否安装成功
运行docker run hello-world
2.加速配置
cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
chmod 777 /etc/systemd/system/docker.service
vim /etc/systemd/system/docker.service
修改配置
ExecStart=/usr/bin/dockerd --registry-mirror=https://xxxx.mirror.aliyuncs.com
检验是否成功
三、命令
docker + 命令关键字+ 参数
1.镜像命令
- docker images 列出本地主机上的镜像
- -a:列出本地所有镜像(含中间镜像层)
- -q:只显示镜像ID
- –digests:显示镜像摘要信息
- –no-trunc:显示完整的镜像信息
- docker search 搜索某个镜像
- -s:列出收藏数不小于指定数的镜像
- –no-trunc:显示完整的镜像信息
- –automated:只列出automated build类型的镜像
- docker pull name:版本号 下载镜像,不带版本号下载lalatest
- docker rmi name:版本号 删除镜像,不带版本号删除lalatest
- -f 强制删除
- 跟多个镜像名删除多个
- $(docker images -q)全部删除
- -f 强制删除
- docker commit 提交容器副本使之便成为一个新的镜像
- -m 提交的描述信息
- -a 作者信息
docker commit -a=“ccw” -m=“tomcat without docs” 5cc305c720cd ccw/mytomcat:1.2
2.容器命令
- docker run 新建并启动容器
- -i 以交互的模式启动容器,通常与-t同时使用
- -t 为容器重新分配一个伪输入终端,通常与-i同时使用
- -d 守护式进程启动,后台运行,必须有一个前台进程
- –name 设置容器的名字
- docker ps 查看正在运行的所有容器
+ -a 正在运行的容器+历史运行过的容器
+ -l 上一个运行的容器
+ -n数字 上几次运行的容器
+ -q 只显示容器编号 - 退出容器
- exit 退出容器
- ctr+P+Q 容器停止不退出
- 启动容器
- docker start 容器名 启动
- docker restart 重启容器
- 停止容器
- docker stop 容器id 温柔停止
- docker kill 容器id 强制停止
- 删除已停止的容器
- docker rm 容器id
- docker rm -f 容器id 强制删除
- docker rm -f $(docker ps -a -q)删除所有容器
- docker logs 查看容器日志
- -t 加入时间戳
- -f 跟随最新的日志打印
- –tail 数字 显示最后多少条
- docker top 容器ID 查看容器内的进程
- docker inspect 查看容器内部细节
- 进入正在运行的容器内部并以命令行交互
- docker exec 在容器中打开新的终端,并且启动新的进程 docker exec -t 55ea2cbb9d76 ls -l /tmp
- docker attach 直接进入容器启动命令终端,不会启动新的进程docker attach 55ea2cbb9d76
- 容器内拷贝数据到宿主机
- docker cp 容器id:容器内路径 宿主机路径
四、docker镜像
1.1镜像是什么
轻量级、可执行的的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,包含运行某个软件所需要的所有内容,包括代码、运行时、库、环境变量和配置文件。
- UnionFS
是一种分层的、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时将不同目录挂载到同一个系统文件下
特性:一次同时加载多个文件系统,但从外面看来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样的文件系统会包含所有的文件和目录 - 加载原理
bootfs:主要包含了bootloader和kernel,bootloader主要引导加载kernel,Linux刚启动时会加载bootfs文件系统,在docker镜像最底层的时bootfs。这一层与linux、unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就在内存中了,此时内存的使用权由boots转交给内核,系统卸载bootfs
rootfs:在bootfs之上,包含的就是典型的Linux系统中的/dev,/proc/,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统的发行版
1.2、 创建镜像
- 容器>镜像:docker commit CID -t xx.xx.xx
**工作在前台的守护进程至少一个 - DockerFile
Dockerfile是一种被Docker程序解释的脚本,Dockerfile有一条一条指令组成,每条指令对应Linux下面的一条命令。
生成命令:docker build -t
最多128行
五、Docker容器数据卷
用于数据共享和持久化
特点:
- 数据卷可在容器间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
添加命令:
docker run -it -v /宿主机绝对路径:/容器目录:ro 镜像名
ro代表容器内的数据只读
指定宿主机路径为具名挂载,相反为匿名挂载
容器间传递共享:
docker run -it --name dc02 --volumes-from dc01 镜像名字
以dc01为模板运行容器,实现容器间的数据共享
容器间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
六、DockerFile
1.是什么
是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本
2.解析过程
- 每条保留字命令都必须大写且字母后面要至少有一个参数
- 指令从上至下,顺序执行
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
3.执行大致流程
- docker从基础镜像运行一个容器
- 执行一条命令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成
4.保留字指令
- FROM 基础镜像,当前创建的镜像时基于哪一个镜像
- MAINTAINER 镜像维护者的姓名,邮箱地址
- RUN 容器构建时需要运行的命令
- EXPOSE 对外暴露的端口号
- WORKDIR 指定容器创建后,终端默认登陆进来的工作目录
- EVN 设置环境变量
- ADD 将外部文件拷贝进镜像并解压
- COPY 将外部文件拷贝进镜像
- VELUME 容器数据卷,用于数据保存和持久化
- CMD 指定一个容器启动时要运行的命令,多个CMD命令只有最后一个生效,CMD会被docker run命令后的参数替换
- ENTRYPOINT 指定一个容器启动时要运行的命令,docker run命令后追加
- ONBUILD 当构建一个被继承的dockerfile时运行的命令,父镜像在被子镜像继承后,父镜像build触发
5.构建命令
docker build -f dockerfile文件路径 -t 新镜像的名字:TAG .
七、Docker网络
1.端口映射
- 随机映射-P
- 指定映射-p宿主机端口:容器端口
2.网络管理
相关命令
docker network 查看docker网络信息
- connect 将容器连接到一个网络
- –driver 指定网络类型
- –gateway 主子网络IPV4或IPV6网关
- –subnet 网段的CIDR格式子网络
- create 创建一个网络
- disconnect 从网络断开一个容器
- inspect 显示网络详细信息
- ls 网络列表
- prune 删除所有未使用的网络
- rm 删除网络
3.网络模式
bridge模式: Docker默认模式,它会在docker容器启动时自动配置自己网络信息,同一宿主机的所有容器都在一个网络下,彼此可以通信。利用宿主机的网卡进行通信,因为涉及到网络转换,会造成资源消耗,网络效率低。
host模式: 容器使用宿主机的ip地址进行通信,和宿主机共享网络。
container模式: 新创建的容器间使用,使用已创建的容器网络,类似于局域网。容器和容器共享网络。
none模式: 不会配置任何网络,可以最大限度定制化。不提供网络服务,容器启动后无网络连接。
overlay模式: 容器彼此不在同一个网络下,而且能相互通信。
4.定制bridge模式网络
创建网络
docker network create --driver bridge bridge-test1
ip addr
自定义网段与网关
docker network create --driver bridge --gateway 172.99.0.1 --subnet 172.99.0.0/16 bridge_test2
在自定义网络中启动容器
docker run --net=网络名称 -it --name 镜像名称
注意
- 使用默认的桥接模式创建的容器可以直接联网
- 使用自定义的桥接模式创建的容器不可以直接联网,但是可以通过端口映射来实现联网
容器断开网络连接
docker network disconnect 网络名称 容器名称
容器连接网络
docker network connect 网络名称 容器名称
创建网桥、docker使用创建的网桥
使用bridge-utils创建网桥
- 下载网桥工具
yum install bridge-utils - 查看网卡
brctl show - 创建网桥
brctl addbr 网桥名称 - 设置网桥网段
ifconfig bro 网段 netmask - 配置docker文件
vim /etc/default/docker
最末尾添加 DOCKER_OPTS="-b=网桥名称" - 创建服务依赖文件
mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/Using_Environment_File.conf
添加内容
[Service]
EnvironmentFile=-/etc/default/docker
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
- 重新加载配置文件
systemctl daemon-reload - 重启docker
systemctl restart docker
5.host模式
docker run --net=host -it --name
6.none模式
docker run --net=none -it --name
八、Docker Compose
- 什么是docker compose
负责对Docker容器集群的快速编排,定义和运行多个容器,通过docker-compose.yml模板文件来定义一组相关容器 - 核心概念
- 服务(service):一个应用的容器。
- 项目(project):一组相关联的应用容器组成的一个完整的业务单元,在docker-compose.yml文件中定义。
-
使用
- 离线下载
将安装包移动到/usr/local/bin目录下并改名为docker-compose - 赋予权限
chmod +x /usr/local/bin/docker-compose
- 离线下载
-
案例
- 创建docker-compose.yml
version: "3.0"
services:
tomcat: #服务名唯一
container_name: 名字 #指定容器的名字
image: 镜像名:tag #创建当前这个服务使用的镜像
ports: #端口映射
- “8080:8080”
volumes: #容器数据卷
#- 宿主机路径:容器内路径
- tomcatwebapp:容器内路径
networks: #代表当前服务使用的哪个网络桥
- hello
environment: #环境变量
- 环境变量地址
env_file: #将environment环境中配置放入指定的配置文件,文件以.env后缀,key=value键值对
- .env文件
depends_on: #容器必须依赖哪些容器启动后才能启动
- 服务名
command: 命令 #覆盖内部命令
health_check: #心跳检测
test: ["CMD","curl","-f","ip"]
interval: 1m30s
timeout: 10s
retries: 3
sysctls: # 修改容器中系统参数
ulimits: #修改容器中最大进程数
build: # 指定dockerfile所在的目录,自动构建镜像,自动运行容器
context: 路径 #指定上下文目录dockerfile文件目录
dockerfile: DockerFile
volumes: #声明上面使用的自动创建的卷名
tomcatwebapp: #声明的卷名 compose自动创建该卷名但是会加上项目
external: #使用自定一卷名
true #确定使用指定卷名 注意:一定在使用之前手动创建卷名
networks: #定义服务使用的网络桥
hello: #定义上面服务使用的网络桥名称 默认创建就是bridge
external: #使用外部指定的网桥,网桥一定存在
true
- 运行docker-compose
docker-compose up 启动这个项目的所有服务 必须保证运行这个命令的目录存在docker-compose.yml
指令
- up 启动docker-compose中的所有服务
- -d 后台启动
- down 停止up命令启动的容器,并移除网路
- exec 服务id 进入指定容器
- ps 列出所有容器
- restart 重启服务 如果不写服务id重启所有服务
- rm 删除服务
- -f 强制删除
- -v删除数据卷
- start 启动服务
- stop 关闭服务 不会删除网络
- top 查看compose容器内运行的进程
- pause 暂停容器
- unpause 恢复暂停的服务
- logs 查看容器服务日志