笔记分享:
根底篇:https://blog.csdn.net/Mr_YanM...
进阶篇:https://blog.csdn.net/Mr_YanM...
一、Docker概述
二、Docker装置
# 卸载旧版本dockeryum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 所需的安装包yum install -y yum-utils# 设置镜像仓库yum-config-manager \ --add-repo \http://download.docker.com/linux/centos/docker-ce.repo# 阿里云镜像yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 更新软件包索引yum makecache fast# 装置docker docker-ce社区版 ee 企业版yum install docker-ce docker-ce-cli containerd.io# 启动dockersystemctl start docker# 查看是否装置胜利docker version## 卸载dockeryum remove docker-ce docker-ce-cli containerd.io# 删除资源【/var/lib/docker是docker的默认资源门路】rm -rf /var/lib/docker
三、Docker命令
docker version // 显示docker的版本信息docker info // 显示docker的零碎信息,包含镜像和容器的数量
3.1 镜像命令
docker images --helpdocker images -adocker images -qdocker images -aqdocker search --help// 过滤docker search mysql --filter=STARS=3000docker pull mysql:5.7 // 下载mysql5.7镜像// 删除镜像docker rmi -f 镜像id// 删除多个镜像docker rmi -f 镜像id 镜像id 镜像id// 删除所有镜像docker rmi -f $(docker images -aq)
3.2 容器命令
// 拉取centos镜像docker pull centos// 新建容器并启动docker run [可选参数] centos// 参数阐明--name="名字" // 容器名称-d // 后盾运行-it // 进入容器-p //指定容器的端口 -p 8080:8080 -p 宿主机端口:容器端口// 列出所有正在运行的容器docker ps -a // 所有容器 -q // 只显示容器编号// 删除指定容器docker rm 容器id // 不能删除正在运行的容器// 删除所有容器docker rm -f $(docker ps -aq)// 退出容器exit // 间接进行容器并退出Ctrl + P + Q // 容器不进行退出// 启动和进行容器docker start 容器iddocker restart 容器iddocker stop 容器iddocker kill 容器id // 强制进行
3.3 操作命令[ 操作日志-元数据-过程 ]
// 查看日志docker log -f -t --tail 容器id-tf // 显示日志--tail number // 要显示的日志条数// 查看容器中的过程信息docker top 容器id// 查看镜像的元数据docker inspect 容器id// 进入以后正在运行的容器// 进入容器开启一个新的终端docker exec -it 容器id /bin/bash// 进入容器正在执行的终端,不会启动新过程docker attach 容器id// 从容器内拷贝文件到宿主机docker cp 容器id:/home/test.java /home
四、Docker镜像
docker commit -m="形容" -a="作者" 容器id 指标镜像名:[TAG]docker images // 就能够查看到自定义的镜像
五、容器数据卷
// 同步centos容器内的home目录到宿主机/home/ceshi目录docker run -it -v /home/ceshi:/home centos /bin/bash// 查看挂在是否胜利docker inspect 容器id
// mysqldocker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7-d // 后盾运行-p // 端口映射-v // 挂载数据卷-e // 环境配置--name // 容器名称
具名和匿名挂载
docker volume ls// 匿名挂载local 3c130e08d1a1421c8ae858f509aead83ab0707878a53255428f3cb57f409e62b
// 具名挂载,通过-v 卷名:容器内门路-P 随机端口映射docker run -d -P --name nginx001 -v juming-nginx:/etc/nginx nginx// 查看挂在卷docker volume ls// 通过具名查找卷docker volume insepect juming-nginx
# 通过【-v 容器内门路:ro rw】扭转读写权限ro readonly # 只读rw readwrite # 只写# 一旦这个设置了容器权限,容器对咱们挂在进去的内容就有了限定docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginxdocker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:rw nginx# ro 只有看到ro就阐明这个门路只能通过宿主机操作,容器外部是无奈操作的。
# 应用Dockerfile挂载卷FROM centosVOLUME ["volume01","volume02"]CMD echo "-------end-------"CMD /bin/bash
# 创立镜像docker build -f dockerfile1 -t sxakgs/centos .-f # 指dockerfile地址-t # target:镜像. # 当前目录
六、Dockerfile
dockerfile是用来构建docker镜像的文件,命令参数脚本。
构建步骤:
1、编写一个dockerfile文件
2、docker build 构建一个镜像
3、docker run 运行镜像
4、docker push 公布镜像(DockerHUb、阿里云)Dockerfile是面向开发的,咱们当前要公布我的项目,做镜像,就须要编写dockerfile文件。
Docker镜像逐步成为企业交付的规范。
步骤:
Dockerfile:构建文件,定义了所有的步骤,源代码。
DockerImages:通过Dockerfile构建生成的镜像,最终公布和运行的产品。
DockerContainer:容器就是镜像运行起来的服务器。
Dockerfile命令
FROM # 根底镜像,所有从这里开始构建MAINTAINER # 镜像是谁写的,姓名+邮箱RUN # 镜像构建时须要运行的命令ADD # 步骤:tomcat镜像,这个镜像压缩包(主动解压),增加内容WORKDIR # 镜像的工作目录VOLUME # 挂载的目录EXPOSE # 保留端口配置CMD # 指定这个容器启动时候要运行的命令,只有最初一个会失效,可被代替ENTRYPOINT # 指定这个容器启动时候要运行的命令,能够追加命令ONBUILD # 当构建一个被继承的Dockerfile, 这个时候就会运行ONBUILD命令,触发指令COPY # 相似ADD,将咱们的文件copy到镜像中ENV # 构建的时候设置环境变量
Dockerfile实战一
# 编写dockerfile[root@iZbp14dzrpdjklcu26tp66Z dockerfile]# cat dockerfileFROM centosMAINTAINER albinguo<888888@qq.com>ENV MYPATH=/usr/local# 工作目录,进入容器之后间接就到该目录WORKDIR $MYPATH# 装置vimRUN yum -y install vimEXPOSE 80CMD echo $MYPATHCMD echo "---------------end----------"CMD /bin/bash
# 通过 docker build 构建镜像docker build -f dockerfile -t mycentos:1.0 .
Dockerfile实战二(CMD和ENTRYPOINT的区别)
CMD命令
# Dockerfile - ENTRYPOINT命令[root@iZbp14dzrpdjklcu26tp66Z dockerfile]# cat dockerfile-cmdFROM centosENTRYPOINT ["ls","-a"]
# 最终命令追加为["ls","-a","-l"]docker run -it docker-cmd-test -l
# Dockerfile - CMD命令[root@iZbp14dzrpdjklcu26tp66Z dockerfile]# cat dockerfile-cmdFROM centosCMD ["ls","-a"]
# -l命令报错,因为-l替换了["ls","-a"]命令,-l未找到docker run -it docker-cmd-test -l
Dockerfile实战三 - 自定义Tomcat镜像
下载jdk和tomcat
# 编写Dockerfile脚本FROM centosMAINTAINER albinguo<8888888@qq.com>COPY readme.txt /usr/local/readme.txtADD jdk-8u11-linux-x64.tar.gz /usr/local/ADD apache-tomcat-9.0.22.tar.gz /usr/local/RUN yum -y install vimENV MYPATH /usr/localWORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_11ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
# 构建Tomcat镜像(如果你的脚本名称是Dockerfile,那么就不必再去指定-f 文件名)docker build -t diytomcat .
# 查看镜像docker images# 运行镜像docker run -d -p 9090:8080 guo-tomcat -v /home/guo/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /usr/guo/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs diytomcat# 进入容器docker exec -it 容器id /bin/bash#测试(拜访胜利)curl localhost:9090
公布镜像
Dockerhub
阿里云镜像仓库
容器间数据同步(--volumes-from)
# 查看镜像sxakgs/centosdocker imagesREPOSITORY TAG IMAGE ID CREATED SIZEsxakgs/centos latest cbf93e9f8437 45 minutes ago 231MB
# 生成容器docker01docker run -it --name docker01 sxakgs/centos# 生成容器docker02 (docker02继承docker01)docker run -it --name docker02 --volumes-from docker01 sxakgs/centos
# 查看容器docker psdocker01docker02# 进入容器docker01docker attach 706baef1fb00
# 在volume01中创立一个文本cde volume01touch test.txt
# 进入docker02容器docker attach e6fd7c6bb95ccd volume01# 能够能看到test.txt文件曾经同步过去
即便删除了docker01容器数据也不会失落
多个mysql实现数据共享
# mysql01docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7# mysql02docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
七、Docker网络
# 容器之间是能够ping通的docker exec -it tomcat02 ping 172.18.0.2
Docker中的所有网络接口都是虚构的,虚构的转发效率高(内网传递文件)
只有容器删除了,对应的网桥就没有了
容器互联
场景:咱们编写了一个微服务,database url=ip,我的项目不重启,然而数据库ip换了,咱们心愿能够解决这个问题,能够应用服务名来进行容器拜访。
Link - 容器互联
docker exec -it tomcat02 ping tomcat01ping: tomcat01: Name or service not known如何解决?docker run -d -P --name tomcat03 --link tomcat02 tomcatdocker exec -it tomcat03 ping tomcat02(反向不能ping通)ping success
自定义网路 - 容器互联
# 网络模式[root@iZbp14dzrpdjklcu26tp66Z /]# docker network lsNETWORK ID NAME DRIVER SCOPEefa36e734234 bridge bridge local5fa10a79855c host host localc5c9922cadd7 none null local[root@iZbp14dzrpdjklcu26tp66Z /]#
[root@iZbp14dzrpdjklcu26tp66Z /]# docker network inspect mynet[ { "Name": "mynet", "Id": "59699da6f528aecf2ca5359e62c44f10130b5a4dcf5100e953ea90bf8bf918e6", "Created": "2022-07-09T12:54:37.983610057+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.0.0/16", "Gateway": "192.168.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} }]
# 自定义网路# --driver bridge# -- subnet 192.168.0.0/16 -范畴- 192.168.0.2到192.168.255.255# -- 网关 192.168.0.1[root@iZbp14dzrpdjklcu26tp66Z /]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet59699da6f528aecf2ca5359e62c44f10130b5a4dcf5100e953ea90bf8bf918e6[root@iZbp14dzrpdjklcu26tp66Z /]# docker network lsNETWORK ID NAME DRIVER SCOPEefa36e734234 bridge bridge local5fa10a79855c host host local59699da6f528 mynet bridge localc5c9922cadd7 none null local[root@iZbp14dzrpdjklcu26tp66Z /]#
# 构建两个tomcat容器,将容器放入自定义网络中,而后容器之间就能够间接互通了[root@iZbp14dzrpdjklcu26tp66Z /]# docker run -d -P --name tomcat-net-01 --net mynet 451d25ef45839e19ad3095698ba45176bc0e866cf51d5a07cddf2a7bb2d5ed49e1f5fe299ea2[root@iZbp14dzrpdjklcu26tp66Z /]# docker run -d -P --name tomcat-net-02 --net mynet 451d25ef4583d924cd6d1ed64918e3698238cfac7c527119bcf7f11e4da2c0e33aa1353584f5[root@iZbp14dzrpdjklcu26tp66Z /]# docker network inspect mynet[ { "Name": "mynet", "Id": "59699da6f528aecf2ca5359e62c44f10130b5a4dcf5100e953ea90bf8bf918e6", "Created": "2022-07-09T12:54:37.983610057+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.0.0/16", "Gateway": "192.168.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "9e19ad3095698ba45176bc0e866cf51d5a07cddf2a7bb2d5ed49e1f5fe299ea2": { "Name": "tomcat-net-01", "EndpointID": "0c3f6ddfaaf8dbc1799944ff7cb481617d85969e1a98f90e0aa1dafce9079ab0", "MacAddress": "02:42:c0:a8:00:02", "IPv4Address": "192.168.0.2/16", "IPv6Address": "" }, "d924cd6d1ed64918e3698238cfac7c527119bcf7f11e4da2c0e33aa1353584f5": { "Name": "tomcat-net-02", "EndpointID": "58caa7eb08fb20a9a6193580e5c781a56e265691883fd56d6c2f9185f6647451", "MacAddress": "02:42:c0:a8:00:03", "IPv4Address": "192.168.0.3/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} }]
# 两个容器之间就能够互通了docker exec -it tomcat-net-01 ping tomcat-net-02
不同网络下的容器互联
tomcat01和tomcat02属于docker0(bridge)网段下,tomcat-net-01和tomcat-net-02属于自定义网络mynet下。不同网段下的容器不能互通。
咱们能够将docker0网段下的容器连贯到mynet网段下,这样不同网段下的容器就能够通信了
如图
# 将tomcat02退出到mynet网段下(这样tomcat02容器就领有两个IP)[root@iZbp14dzrpdjklcu26tp66Z /]# docker network connect mynet tomcat02[root@iZbp14dzrpdjklcu26tp66Z /]# docker network inspect mynet[ { "Name": "mynet", "Id": "59699da6f528aecf2ca5359e62c44f10130b5a4dcf5100e953ea90bf8bf918e6", "Created": "2022-07-09T12:54:37.983610057+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.0.0/16", "Gateway": "192.168.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "30c27f4629b4b44b00cfe1947c42af3c119aa9ebf84d08ae48ea090c5815b938": { "Name": "tomcat02", "EndpointID": "5d450bbf4f65dc682b43945475262f3a75a81a63ec345200ae977ea2f608ce2e", "MacAddress": "02:42:c0:a8:00:04", "IPv4Address": "192.168.0.4/16", "IPv6Address": "" }, "9e19ad3095698ba45176bc0e866cf51d5a07cddf2a7bb2d5ed49e1f5fe299ea2": { "Name": "tomcat-net-01", "EndpointID": "0c3f6ddfaaf8dbc1799944ff7cb481617d85969e1a98f90e0aa1dafce9079ab0", "MacAddress": "02:42:c0:a8:00:02", "IPv4Address": "192.168.0.2/16", "IPv6Address": "" }, "d924cd6d1ed64918e3698238cfac7c527119bcf7f11e4da2c0e33aa1353584f5": { "Name": "tomcat-net-02", "EndpointID": "58caa7eb08fb20a9a6193580e5c781a56e265691883fd56d6c2f9185f6647451", "MacAddress": "02:42:c0:a8:00:03", "IPv4Address": "192.168.0.3/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} }]
测试ping
docker exec -it tomcat-net-01 ping tomcat02ping success!