docker心得体会
==并不是笔记,而是针对自己需要记忆的东西,留下痕迹。一定要学会 好好用==
docker所解决的问题如下
docker火的原因是十分的轻巧 docker是容器化技术
docker是基于go语言开发的
Docker Documentation | Docker Documentation docker的文档非常详细
Docker Hub docker的仓库地址Docker如果是安在阿里云服务器上的话 还可以配置镜像加速
Docker Run的原理示意图
启动Docker指令 systemctl start docker 运行Docker指令 docker run XXX
底层原理
==Docker常用的命令(其余不多记 直接看笔记)==
打包后的就是类似于这样,类似虚拟机的快照
docker images -q显示镜像id dockers images -aq 显示所有镜像id 有些隐藏的镜像也可以显示
Docker下载镜像采用的是分层下载 如果你下载一个镜像 他一些层级已经被下载过了 他就可以共用而不用下载了
markdown的使用小技巧 ```+编程语言会创建代码段
docker run -d XXX 默认是执行/bin/bash这个命令在后台启动成功后执行了就直接关闭了,如果要持久化的话 要指定一个持久的命令
touch用来新建文件 mkdir用来新建文件夹 rm用来删除文件
当下载一个新的镜像时 可以去dockerHub上查看关注文档
Linux命令 whereis
-b 只查找二进制文件。-B<目录> 只在设置的目录下查找二进制文件。
-f 不显示文件名前的路径名称。
-m 只查找说明文件。
-M<目录> 只在设置的目录下查找说明文件。
-s 只查找原始代码文件。
-S<目录> 只在设置的目录下查找原始代码文件。
-u 查找不包含指定类型的文件。
用完后会自动移除 而不是还存在
像这些镜像其实很大程度都是被阉割过的 保证最小运行就行 就比如说tomcat webapp里没东西 其实在webapp.dist中有 把它复制过来就行了
镜像分层的理解 如果加一层是之前那层的更新 会进行替换 拉取镜像的时候 已经存在的就不会再拉了
镜像都是只读的 当我们镜像启动容器的时候 会有个新的可写层加到镜像层的顶部,这一层我们可以进行操作 这层通常来说叫做容器层 我们所有的操作都是基于容器层的 我做的修改什么的会保存在容器层
docker -p 可以设置要映射的端口和容器端口 一个端口上只能绑定一个容器
卷技术,就是容器目录的挂载,容器间的数据共享机制 目的就是容器的持久化和同步操作、容器间数据共享
映射过后 对容器内部的文件进行操作 会自动同步到外部 对外部进行操作 会自动同步到容器内部(就算是容器停止运行了 也会同步) 好处:我们以后修改直接在本地修改即可,容器内部会自动同步
==卷技术的使用 指令==
也可以使用dockerfile进行挂载
容器间的挂载:--volumes-from
拷贝的概念当两个挂载一到一个上面的时候 相当于全部都挂载上了 就算把挂载的那个对象删了 其他两个照样同步
当我拉取mysql镜像的时候,拉了mysql8版本太高 读取需要些插件 换成5.7就可以了
docker启动mysql需要做的
有些镜像启动需要配置环境 -e 需要去docker hub上看帮助文档进行测试
就算在本地把对应的容器删了 但你容器中挂载出来的文件还是会存在 数据并不会丢失
图床指的是存储图片的服务器
如果要查看docker挂载的对应目录在哪 用docker inspect 容器id 查看具体信息 在mounts看到挂载的信息 可以找到对应的目录
通过dockerfile 挂载卷 如果容器内没有对应的文件夹 也会自动生成 如果没有挂载卷 那么之后就要以手动的方式 -v挂载卷
==DockFile指令==
例子什么的 在最全笔记中看
yum -y中 -y的意思就是代替手动输入yes
$符号在Linux的shell中使用 作用就是获取一个变量的值
docker build -f 指定要使用dockerfile的路径
docker build -f zytdockfile-centos -t mycentos:0.1 ==.== 这个点的意思就是目的地址为当前地址 构建这个镜像在这个目的地址
CMD ENTRYPOINT的区别
在CMD命令下 如果运行时追加参数 会将CMD的命令进行替换 比如说 CMD里是 ls -a 我们在外面写个-l 会报错 除非我们些的是 ls -al 就不报错 因为会被替换
实战Tomcat这是精髓一定要好好看,之后自己有机会发布镜像的时候 模仿这个进行构建
构建dockerfile采用官方命名
Dockerfile
这样build的时候 都不需要指定-f了 会自动去寻找 直接1
docker build -t "name" #即可 会自动去寻找Dockerfile
WORKDIR 是进去的第一个落脚点 ENV 就是设置环境变量
设置PATH变量是为了让操作系统找到指定的工具程序,那么设置CLASSPATH变量的目的就是让执行环境找到程序对应的class文件以及程序中引用的其他class文件
javaweb生成项目后默认的其实页是index.jsp和index.html
tomcat是热部署的
自己push的镜像一定要带版本号 使用 docker tag 给镜像附上版本也可以一开始取名的时候就附上 前面一定是要自己
docker hub的用户名
/镜像名:版本号!除了推送到docker hub还有推送到阿里云上,阿里云推送有固定的方法
Docker 网络
容器和容器之间是可以互相ping通的
容器和容器之间联通实际上是通过路由器相接 删掉对应的容器 网卡就会消失
通过服务名直接ping通 不用ip地址 这样有助于当我们对应的服务器ip地址进行更换 不用重启 修改
“hosts文件是一个用于储存计算机网络中各节点信息的计算机文件;作用是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址。” 所以很多代理映射都放到这里面
docker中--link的操作就是在hosts配置中加了一个映射
目前已经不建议使用–link了 而是使用自定义网络 不适用docker0 因为docker0不支持服务名访问网络模式
- bridge : 桥接 docker(默认,自己创建也使用桥接模式)
- none : 不配置网络
- host : 和宿主机共享网络
- container : 容器网络连同!(用的少!局限大)
直接启动 它会默认连接docker0 我们想用自己网络的话 可以创建一个网络 按照上面的方法启动- docker0特点:默认,域名不能访问 能通过–link打通连接 有局限性
- 所以我们可以自定义网络
自定义网络可以直接ping 名字网络联通 在不同网段中的容器是无法联通的
联通了之后可以在对应的network inspect中看到 这就是一个容器 多个ip地址
假如要跨网络操作别人,就需要使用 docker network connect联通
创建集群 看狂神笔记 玩玩看
网关是实现不同网络之间的通信 像仅仅是搭建redis集群 可以不设置网关