docker
docker基本组成
docker文档网址:https://docs.docker.com/
镜像(image):
docker镜像好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像==>run==>tomcat01容器,
通过这个镜像可以创建多个容器,最终服务运行或者项目运行就是在容器中的
容器(container):
docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的
启用,停止,删除,基本命令, 目前就可以把这个容器理解为就是一个简易的linux系统
仓库(repostitory):
docker就是存放镜像的地方
仓库分为共有仓库和私有仓库!
安装
环境准备
1.linux基础
2.centos7
系统内核是3.10以上的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jiOpcRSx-1619059968893)(C:\Users\lenovo\AppData\Local\Temp\1592378036822.png)]
开始安装
1.先卸载旧版本的docker
yum list installed | grep docker
yum remove docker-ce.x86_64 docker-ce-cli.x86_64 -y
rm -rf /var/lib/docker
2.在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker
yum install -y yum-utils
3.设置镜像的仓库 https://dqun6srk.mirror.aliyuncs.com dzt账户的镜像加速地址
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo 这个是国外的仓库地址
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 使用这个阿里云的镜像
4.安装之前再更新一下yum的索引
yum makecache fast
5.安装最新版本的Docker Engine和容器
yum install docker-ce docker-ce-cli containerd.io
6.启动docker
systemctl start docker
7.是否安装成功
docker version
8.拉取hello-world
docker pull hello-world
9.卸载docker
yum remove docker-ce docker-ce-cli containerd.io 卸载依赖
rm -rf /var/lib/docker 删除资源
aliyun镜像加速
1.登录阿里云,找到镜像加速地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W2zL3rYv-1619059968895)(C:\Users\lenovo\AppData\Local\Temp\1592382753321.png)]
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://dqun6srk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
底层原理
docker是怎么工作的?
docker是一个client-server结构的系统,docker的守护进程运行在宿主机上,通过socket从客户端访问!
dockerserver接收到docker-client的指令,就会执行这个命令!
docker为什么比vm快?
1.docker有着比虚拟机更少的抽象层
2.docker利用的是宿主机的内核,虚拟机使用的是自己的内核
所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导,
虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了复杂的过程,秒级
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oPBWV3Jz-1619059968897)(C:\Users\lenovo\AppData\Local\Temp\1592384634999.png)]
docker常用命令
帮助命令
docker version docker的版本信息
docker info 显示docker的系统信息 包括镜像和容器的数量
docker --help 帮助命令
镜像命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jHy1jbZh-1619059968901)(C:\Users\lenovo\AppData\Local\Temp\1592385176128.png)]
docker search 搜索镜像
docker search --filter =STARS=3000 镜像的star>3000的
docker pull 拉取镜像
docker pull xx:tag 拉取对应版本的镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-izhOTuTY-1619059968905)(C:\Users\lenovo\AppData\Local\Temp\1592385500310.png)]
指定版本下载: docker pull mysql:5.7
docker rmi xx 删除镜像
docker rmi -f $(docker images -aq) 递归删除所有镜像
容器命令
核心: docker run
docker run [可选参数] image
参数说明
--name="name" 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-P 指定容器的端口 -p 8080:8080
-p 随机指定端口
docker run -it centos /bin/bash 启动并进入容器
docker ps 查看正在运行的容器
docker ps -a 列出当前正在运行的容器以及历史运行过的容器
docker ps -a -n=1 列出当前正在运行的容器以及历史运行过的容器并指定个数
docker ps -aq 列出当前正在运行的容器以及历史运行过的容器只显示ID编号
退出容器
exit 直接停止容器并退出
ctrl +pq 退出容器但不停止容器
删除容器
docker rm 容器名/容器ID 删除指定容器
docker rm -f 强制删除所有容器(包括正在运行的容器)
启动和停止容器
docker start 容器ID 启动容器
docker restart 容器ID 重启容器
docker stop 容器ID 停止容器
docker kill 容器ID 强制杀掉容器
常用其他命令
docker logs -f -t --tail 行数 容器ID
-tf 显示日志 --tail 显示日志条数
查看容器中进程信息
docker top 容器ID
查看镜像的元数据信息
docker inspevct 容器ID
进入当前正在运行的容器
通常容器都是使用后台的方式运行的,需要进入容器,修改一些配置
方式一: docker exec -it 容器ID /bin/bash
方式二: docker attach 容器ID
以上两种
一 是进入容器打开一个新的终端,可以在里面操作
二是进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 宿主机路径
从宿主机拷贝文件到容器
docker cp /opt/test/file.txt mycontainer:/opt/testnew/
将容器生成新的镜像
docker commit --author "dyh <dyh@126.com>" --message "修改默认网页" 容器ID nginx:v2
docker安装Nginx
docker pull nginx
docker run -d --name nginx01 -p 80:80 nginx
docker安装tomcat
docker run -it --rm tomcat:8.5 此命令为下载完启动,停止后即刻删除
docker安装es+kibana
es暴露的端口很多
es十分的消耗内存
es数据一般需要放置到安全目录挂载
–net somenetwork 网络配置
docker pull elasticsearch:7.6.2
启动es
xxxdocker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
启动后发现非常卡顿,docker stats查看状态 发现内存占比非常高
那么改变一下启动命令,添加上最大堆内存的限制:
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx256m" elasticsearch:7.6.2
docker安装运行kibana后连接es,那么网络的配置是十分关键的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YRX2BgZj-1619059968909)(C:\Users\lenovo\AppData\Local\Temp\1592407843888.png)]
所以进到容器里对配置文件进行修改
docker exec -it 容器ID /bin/bash
vi confg/elasticsearch.yml
内容如下:
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: “*”
重启es容器
docker restart 容器ID
kibana
docker pull kibana:7.6.2
运行
docker run -di --name kibana -e ELASTICSEARCH_URL=http://内网IP:9200 -p 5601:5601 kibana:7.6.2
进入容器修改配置
docker exec -it 容器ID /bin/bash
vi config/kibana.yml
内容:
elasticsearch.hosts: [ "http://es的IP(内网):9200" ]
重启kibana容器
docker restart 容器ID
docker安装redis
拉取镜像
docker pull redis:latest
运行
docker run -itd --name redis-test -p 6379:6379 redis
进入容器
docker exec -it redis-test /bin/bash
使用客户端
redis-cli
docker 镜像深入
镜像是什么?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DH0uYpvR-1619059968911)(C:\Users\lenovo\AppData\Local\Temp\1592467531912.png)]
如何得到镜像:
- 仓库下载镜像
- 制作镜像 DockerFile
docker镜像加载原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dvT7d9PA-1619059968912)(C:\Users\lenovo\AppData\Local\Temp\1592467662903.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IiNeNP1v-1619059968914)(C:\Users\lenovo\AppData\Local\Temp\1592467740673.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K8NlbKpg-1619059968915)(C:\Users\lenovo\AppData\Local\Temp\1592467949173.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-heU9DONz-1619059968917)(C:\Users\lenovo\AppData\Local\Temp\1592467998968.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YbrTcznB-1619059968919)(C:\Users\lenovo\AppData\Local\Temp\1592468013446.png)]
特点:
docker镜像都是只读的,但是容器启动后,一个新的可写层被加载到镜像的顶部,
这一层就是我们通常说的容器层,那么也可以将这容器层和原有的镜像层重新打包成一个新的镜像
如何提交自己的镜像?
docker commit 提交容器成为一个新的副本
docker commit -m="描述信息" -a="作者" 容器ID 目标镜像名:tag
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MM7VtDRN-1619059968920)(C:\Users\lenovo\AppData\Local\Temp\1592470959791.png)]
容器数据卷
数据问题
如果没有对数据的目录做处理,那么当容器删除后,容器中的数据也会丢失掉
需求: 数据可持久化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CGMLKGUa-1619059968921)(C:\Users\lenovo\AppData\Local\Temp\1592472167104.png)]
核心: 容器的持久化和同步操作! 容器之间也是可以数据共享的
使用数据卷
方式一: 直接使用命令来挂载 -v
docker run -d -v 主机目录:容器目录 容器ID
其实就是实现了这两个对应目录的双向绑定,但凡其中一个目录发生变化,另一个目录也会跟着变化
所以:
比如修改配置文件,我们就可以直接在宿主机上进行修改,然后通过-v挂载目录,将宿主机目录同步到容器内
mysql示例:
mysql数据持久化的问题?
1.获取镜像
docker pull mysql:5.7
2.运行,进行数据挂载, 注意:mysql启动需要配置账号密码
docker run -d -p 3307:3306 -v /opt/tmp/mysql/conf/:/etc/mysql/conf.d
-v /opt/tmp/mysql/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1314youni@..
--name mysql01 mysql:5.7
3.启动后宿主机的本地目录便会生成刚才启动命令中的挂载目录以及文件,
我们对mysql进行写数据,之后将容器停掉删除,但是数据仍然会存在于宿主机中
具名挂载和匿名挂载
匿名挂载
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yS88WIuo-1619059968922)(C:\Users\lenovo\AppData\Local\Temp\1592474474472.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vrfva9vE-1619059968924)(C:\Users\lenovo\AppData\Local\Temp\1592474528255.png)]
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/卷名/_data
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yWBfo7Fw-1619059968925)(C:\Users\lenovo\AppData\Local\Temp\1592474740497.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W9h1Dmoq-1619059968926)(C:\Users\lenovo\AppData\Local\Temp\1592487906075.png)]
DockerFile
dockerFile就是用来构建镜像的构建文件
初体验:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E3Vk5wcF-1619059968927)(C:\Users\lenovo\AppData\Local\Temp\1592488612240.png)]
构建步骤:
1.编写一个dockerfile文件
2.docker build 构建成一个镜像
3.docker run 运行镜像
4.docker push 发布镜像 (DockerHub ,阿里云镜像仓库)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qU4K2xN4-1619059968928)(C:\Users\lenovo\AppData\Local\Temp\1592490011716.png)]
DockerFile构建过程
指令:
1.每个关键字都必须是大写字母
2.执行从上至下
3.#表示注释
4.每一个指令都会创建提交一个新的镜像层,并提交!
dockerFile是面向开发的,发布项目需要编写dockerFile文件!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKcHeVzk-1619059968929)(C:\Users\lenovo\AppData\Local\Temp\1592490582035.png)]
FROM 基础镜像
MAINTAINER 镜像作者-> 姓名+邮箱
RUN 镜像构建成功后要运行的命令
ADD 步骤:构建的镜像要加什么模块 比如基础镜像centos,这里可以加jdk,tomcat等等
WORKDIR 镜像的工作目录
VOLUMN 挂载的目录
EXPOSE 指定要暴露的端口
RUN 容器启动后要做的事情
CMD 指定这个容器启动的时候要做的事情,只有最后一个会生效,可被替代
ENTRYPOINT 指定这个容器启动的时候要做的事情,不会被替代,命令是可追加的
ONBUILD 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令
COPY 类似add命令将文件拷贝到镜像中
ENV 构建的时候设置环境变量
构建自己的centos
大多数镜像的基础镜像-> FROM scratch,然后配置需要的软件和配置来进行的构建
编写dockerfile文件
FROM centos #基础镜像
MAINTAINER dzt<1866735017@163.com> #作者
ENV MYPATH /usr/local
WORKDIR $MYPATH #设置进入容器后默认的目录
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80 #暴露80端口
CMD echo $MYPATH
CMD echo "end..."
CMD /bin/bash
执行文件,开始构建
docker build -f dockerfile-centos -t dzt_centos:0.1 .
测试运行
CMD 和 ENTRYPOINT区别
CMD: 指定这个容器启动的时候要做的事情,只有最后一个会生效,可被替代
ENTRYPOINT: 指定这个容器启动的时候要做的事情,不会被替代,命令是可追加的
示例:tomcat镜像
1.准备镜像文件 tomcat压缩包,jdk压缩包
2.编写dockerfile,如果名字为Dockerfile
,开始构建的时候就不需要-f 来指定文件了
发布镜像至dockerhub
1.地址https://hub.docker.com/ 注册自己的账号!(账号:cmdidocker 密码:通用)
2.docker login
在centos上登录docker
3.登录成功后即可 docker push 镜像:tag
失败: 如若出现denied: requested access to the resource is denied
说明该镜像没有账号信息,或者账号信息不正确
例: docker push dzt/xxx:1.0 此处dzt要和dockehub上的账号名称相对应
可以使用命令修改账号信息: docker tag 镜像ID 作者/镜像名:tag
发布镜像至阿里云
1.登录阿里云,找到容器镜像服务
2.创建命名空间
3.创建镜像仓库
4.然后参考文档一步步执行就可以了
离线保存镜像
docker save -o /路径/xx.tar 镜像ID 将镜像保存至本地路径
docker load -i /opt/xx.tar 将本地tar包生成镜像
1. 登录阿里云Docker Registry
$ sudo docker login --username=前方有你dzt registry.cn-beijing.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
$ sudo docker pull registry.cn-beijing.aliyuncs.com/dzt/dzt-test:[镜像版本号]
3. 将镜像推送到Registry
$ sudo docker login --username=前方有你dzt registry.cn-beijing.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-beijing.aliyuncs.com/dzt/dzt-test:[镜像版本号]
$ sudo docker push registry.cn-beijing.aliyuncs.com/dzt/dzt-test:[镜像版本号]
数据卷容器
定义: 也就是此容器 和其他容器之间能够实现数据的共享,互通有无,并且任何一个容器宕机并不会影响其他容器的数据
命令:
docker run -d --name docker02 --volumes-from docker01 镜像ID
--volumes-from: 类似于java中的继承关系 -> extends
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZdIjURam-1619059968930)(C:\Users\lenovo\AppData\Local\Temp\1592489581906.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kikU2Qmt-1619059968931)(C:\Users\lenovo\AppData\Local\Temp\1592489781494.png)]
Docker网络
理解docker网络
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dmJZEvVk-1619059968932)(C:\Users\lenovo\AppData\Local\Temp\1592728998842.png)]
docker如何处理容器间的网络访问?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7DoZSJ7R-1619059968934)(C:\Users\lenovo\AppData\Local\Temp\1592729063472.png)]
查看容器内部的网络地址
docker exec -it tomcatxx ip addr
linux宿主机可以ping 通docker容器
docker容器内部也可以ping 通linux宿主机
原理
1.我们每启动一个docker容器,docker就会给docker容器分配一个IP,我们只要安装了docker ,就会有一个docker0
使用的就是桥接模式,使用的技术是evth-paie技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EX9Y4Pgt-1619059968936)(C:\Users\lenovo\AppData\Local\Temp\1592730292160.png)]
我们发现容器的网卡都是成对出现的
evth-pair 就是一对的虚拟设备接口,成对出现,一边连着协议,一边连着彼此
正因为这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的
所以发现 两个容器内 是可以 ping通的
网络模型图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aX3m7Ej3-1619059968937)(C:\Users\lenovo\AppData\Local\Temp\1592730677160.png)]
结论:tomcat01和tomcat02是共有的一个路由器,docker0
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们分配一个默认的可用的IP
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8f81FRH8-1619059968938)(C:\Users\lenovo\AppData\Local\Temp\1592730954145.png)]
场景[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z51NDeRd-1619059968939)(C:\Users\lenovo\AppData\Local\Temp\1592731049922.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZySLYPbi-1619059968940)(C:\Users\lenovo\AppData\Local\Temp\1592731085347.png)]
可以看到正常情况下在容器内部 ping 另一个容器的名字是ping 不通的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l7vtzWeF-1619059968941)(C:\Users\lenovo\AppData\Local\Temp\1592731175778.png)]
反向可以ping 通吗?
不可以的
那么 通过–link就可以实现通过容器名字 ping另一个容器的网络
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JprGqjDK-1619059968942)(C:\Users\lenovo\AppData\Local\Temp\1592731514426.png)]
但是,不推荐使用
现在都是用自定义网络!
自定义网络
查看所有的docker网络
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sTuvOPC6-1619059968943)(C:\Users\lenovo\AppData\Local\Temp\1593070531459.png)]
网络模式:
bridge: 桥接 (默认.自己创建也是用桥接模式)
none: 不配置网络
host: 主机模式(和宿主机共享网络)
container: 容器内网络连通(用的少)
测试:
修改本地镜像容器存储路径方法
修改Docker本地镜像与容器的存储位置的方法
方法一、软链接
默认情况下Docker的存放位置为:/var/lib/docker
可以通过下面命令查看具体位置:
sudo docker info | grep "Docker Root Dir"1
解决这个问题,最直接的方法当然是挂载分区到这个目录,但是我的数据盘还有其他东西,这肯定不好管理,所以采用修改镜像和容器的存放路径的方式达到目的。
这个方法里将通过软连接来实现。
首先停掉Docker服务:
systemctl restart docker
或者
service docker stop123
然后移动整个/var/lib/docker目录到目的路径:
mv /var/lib/docker /root/data/docker
ln -s /root/data/docker /var/lib/docker12
这时候启动Docker时发现存储目录依旧是/var/lib/docker,但是实际上是存储在数据盘的,你可以在数据盘上看到容量变化。
容器随docker的启动而启动
容器启动命令 跟随docker的启动容器也启动 在启动命令中加 --restart=always 如果容器已经启动了,不想重启也是可以修改的 docker update 容器ID --restart=always