1.个人对docker的理解
docker类似一个虚拟机,是一个软件级别的虚拟机,安装使用方便,镜像小又丰富,在docker中的centos7的镜像只有200兆左右,去除了没必要的工具软件,只留必要的运行环境
1.1对镜像和容器的理解:
关系和java类似:
镜像=类
容器=实例对象
镜像run后会得到一个容器实例,每run一次就得一个容器实例,当然也可以启动停止的容器。
1.2镜像原理:
基于联合文件系统的分层原理(UnionFS),每个镜像可能得依赖于其他镜像 才能运行
如tomcat:kernel》Centos》jdk》tomcat,类似java中类的继承关系,kernel就想当于Object
在pull 拉tomcat的时候,依次拉这些依赖,对外暴露的只是tomcat,这也是tomcat有400多兆的原因
为什么联合文件系统的分层?
最大的好处就是共享资源,类似本地maven仓库的jar,为不同项目所共享
比如:有多个镜像都是从相同的base镜像构建而来,那么宿主机上只需要保存一份base镜像,
由其他要依赖的镜像共享
特点:docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,
这一层被称为“容器层”,之下的都叫“镜像层”
2.相关命令
辅助命令:
docker versiondocker infodocker --help
镜像命令:
docker images 列出本机的镜像-a 显示全部 包括中间层镜像-q 只显示镜像的id--digests 显示镜像的信息--no-trunc 显示完整的镜像信息docker search 镜像名字 {网址:https://hub.docker.com}docker -s 30 tomcat 搜索热度大于30 的tomcat镜像docker rmi 镜像明/id 删除镜像(启动过有实例的 删不了)docker rmi -f 镜像明/id 强制删除镜像docker rmi -f 镜像明1/id1 镜像明1/id1 强制删除多个镜像 中间空格隔开docker rmi -f $(docker images -q) 删除全部docker history 镜像id 查看镜像历史
容器命令:
docker run [OPTIONS] IMAGE [COMMAND] [ARG..]OPTIONS说明:--name="容器新名字" 为容器指定一个名字-d:后台运行容器,并返回容器id,即启动守护式容器-i:已交互式运行容器,通常与-t同时使用-t:为容器重新分配一个伪输入终端,通常与-i同时使用-P:随机端口映射-p:指定端口映射,有以下四种格式:ip:hostPort:containerPortip::containerPorthostPort:containerPortcontainerPort--privileged=true 有时run 有错误,加这个参数 消除错误进入了容器终端,exit是退出停止,ctrl+p+q是暂时退出 不关闭容器docker ps 查看正在运行的容器-l 查看上次运行过的容器-a 查看运行过的容器 历史 在运行的或已经退出的-n 3 查看上3次运行过的容器-q 静默模式,只显示容器编号--no-trunc 不截断输出doeker start 容器id或名字 启动关闭的容器doeker restart 容器id或名字 重启正在运行的容器doeker stop 容器id或名字 优雅停止运行的容器doeker kill 容器id或名字 强制停止运行的容器docker rm 容器id或名字 删除已停止的容器(未停止的删不成功)docker rm -f 容器id或名字 强制删除容器docker rm -f $(docker ps -a -q) 强制删除所有容器 或 docker ps -a -q | xargs ocker rmdocker logs -f -t --a-tail 3 容器id 查看容器运行日志 后3条f:跟随最新的日志打印t: 加入时间戳tail 数字:显示最后多少条日志
重新进入后台运行的容器:
1. docker attach 容器id 直接进入容器的终端2. docker exec -it 容器id 要执行的命令 进入执行命令 返回结果回当前终端
拷贝容器里的文件到宿主机(位置互换 方向相反):
docker cp 容器id:容器文件路径 存到宿主机的路径
以json串显示容器的信息
docker inspect 容器id
提交现有容器为镜像:
docker commit -a="作者" -m="描述" 容器id wpx/mytomcat:8.5
3.docker容器数据卷:
容器的持久化
容器间继承+共享数据
解决容器停止或删除时数据问题
卷的目的就是:数据持久化,完全独立于容器的生命周期,因此docker不会在容器删除时产出其挂载的数据卷
特点:
- 据卷可在容器之间共享或重用数据
- 中的更改可以直接生效
- 据卷中的更改不会包含在镜像的更新中
-
添加数据卷:直接命令添加、DockerFile添加
1.直接命令添加
启动centos时 建立同步文件夹 宿主机dataH 容器内dataC,下次启动该容器时也会同步宿主机的过来docker run -it -v /dataH:/dataC centos
加上:ro 是只读的意思,能同步 但容器里面不能写改
docker run -it -v /dataH:/dataC:ro centos
2.DockerFile添加
新建dockerfile文件,继承该镜像后 添加相应命令,编译成新镜像
文件内容:FROM centosVOLUME ["dataC1","dataC2"]CMD echo "finished---------succes!"CMD /bin/bash
编译:
docker build -f /mydocker/dockerfile -t wpx/centos .
ps看到 新的镜像
启动会看到已经生成好2个 数据卷文件夹dataC1 dataC2,读写都为true
使用 docker inspect 容器id 可以查看对应宿主机那边的数据卷文件夹位置
相同镜像 不同实例之间的共享:
首先启动的第一个容器d1 添加了数据卷
其他实例启动时 去继承d1即可,所有继承者之间都能相互同步共享数据卷
即使d1挂了,子孙之间依然保持
命令:docker run -it —name d2 —volumes-from d1 镜像名或ID4.dockerFile构建:
步骤:
辑dockerfile文件 及相关资料放在同目录
- 译dockerfile,得到的镜像在本地镜像库中
编译命令:
docker build -f /mydocker/dockerfile -t wpx/centos .
提交现有容器为镜像:(对容器的改动都会保住)
docker commit -a="作者" -m="描述" 容器id wpx/mytomcat:8.5
dockerFile保留字指令:
FROM 基于镜像,或继承那个镜像
MAINTAINER 作者及邮箱
RUN 容器构建时需要执行的命令
EXPOSE 当前容器对外暴露的端口
WORKDIR 指定才创建容器后 终端登录进来的工作目录
ENV 用来在构建过程中设置环境变量(ENV 变量名 值)
ADD 讲宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和tar压缩包
COPY 复制文件或目录到镜像中,COPY src dest,COPY[“src”,”dest”]
VOLUME 建立容器数据卷,用于数据的保存和持久化工作
CMD 指定容器启动后 要执行的命令,可以又多个但只有最后一个有效,CMD会被docker run 后面的参数替换
ENTRYPOINT 指定容器启动后 要执行的命令,和CMD一样,但其命令会在docker run 都追加
ONBUILD 当构建一个被继承的dockerFile是运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发
5.push提交本地镜像到阿里云的云端仓库
进入阿里云 容器镜像服务,创建相应仓库,仓库列表右侧“管理”,点击去 按照操作指南即可
6.安装常用软件
安装mysql:
加-d后台运行还不行,因为mysql默认只是本机登录,外面无法操作,所以docker启动又立刻停掉了
可以 -e MYSQL_ROOT_PASSWORD=123456 设置一下密码,有密码的root可以外机访问
-v挂载mysql 相关文件
-v /opt/mysql/data:/var/lib/mysql
-v /opt/mysql/my.cnf:/etc/mysql/my.cnf
安装redis:
docker run -d -p 6379:6379
-v /mydata/redis/data:/data
-v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf
redis redis-server /usr/local/etc/redis/redis.conf
—appendonly yes
docker run -d -p 6379:6379 -v /mydata/redis/data:/data -v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf redis redss-server /usr/local/etc/redis/redis.conf --appendonly yes
