docker技术学习

虚幻大学 xuhss 163℃ 0评论

? 优质资源分享 ?

学习路线指引(点击解锁) 知识定位 人群定位
? Python实战微信订餐小程序 ? 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
?Python量化交易实战? 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

docker安装

安装docker(乌班图)-需要su权限

官网:https://docs.docker.com/engine/install/ubuntu/

帮助文档:

1.卸载旧的


|  |  apt-get remove docker docker-engine docker.io containerd runc |

2.设置存储库


|  |  sudo apt-get update |
|  |  sudo apt-get install \ |
|  |  ca-certificates \ |
|  |  curl \ |
|  |  gnupg \ |
|  |  lsb-release |

3.添加 Docker 的官方 GPG 密钥:


|  | sudo mkdir -p /etc/apt/keyrings |
|  |  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg |

4.用以下命令设置存储库:


|  | echo \ |
|  | "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ |
|  | $(lsb\_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null |
|  |  |

4.安装docker相关

ce是社区,ee是企业


|  | apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin |

5启动docker 验证 Docker 引擎是否已正确安装。


|  | docker run hello-world |

6查看版本


|  | docker version |

显示


|  | Client: Docker Engine - Community |
|  | Version: 20.10.17 |
|  | API version: 1.41 |
|  | Go version: go1.17.11 |
|  | Git commit: 100c701 |
|  | Built: Mon Jun 6 23:02:57 2022 |
|  | OS/Arch: linux/amd64 |
|  | Context: default |
|  | Experimental: true |
|  |  |
|  | Server: Docker Engine - Community |
|  | Engine: |
|  | Version: 20.10.17 |
|  | API version: 1.41 (minimum version 1.12) |
|  | Go version: go1.17.11 |
|  | Git commit: a89b842 |
|  | Built: Mon Jun 6 23:01:03 2022 |
|  | OS/Arch: linux/amd64 |
|  | Experimental: false |
|  | containerd: |
|  | Version: 1.6.6 |
|  | GitCommit: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1 |
|  | runc: |
|  | Version: 1.1.2 |
|  | GitCommit: v1.1.2-0-ga916309 |
|  | docker-init: |
|  | Version: 0.19.0 |
|  | GitCommit: de40ad0 |
|  |  |

8.查看image


|  | docker images |

9.修改默认的拉取镜像地址


|  |  /etc/docker/daemon.json |

9.卸载docker的时候用


|  |  apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin |

主机上的映像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷:


|  |  sudo rm -rf /var/lib/docker |
|  |  sudo rm -rf /var/lib/containerd |

10.启动docker


|  |  |

11。停止docker


|  |  |

阿里云镜像加速

1.登录阿里云

2.直接搜索:镜像容器服务,点击进入控制台->镜像工具->镜像加速器

使用加速器可以提升获取Docker官方镜像的速度

加速器地址
https://cgys1rlc.mirror.aliyuncs.com

针对Docker客户端版本大于 1.10.0 的用户

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器


|  | sudo mkdir -p /etc/docker |
|  | sudo tee /etc/docker/daemon.json <<-'EOF' |
|  | { |
|  | "registry-mirrors": ["https://cgys1rlc.mirror.aliyuncs.com"] |
|  | } |
|  |  |
|  | sudo systemctl daemon-reload |
|  | sudo systemctl restart docker |

回顾helloword的整个流程

开始,在本机找镜像,有就用,没有就在dockerhub下载,如果dockerhub找到,下载本地运行,找不到报错。

docker常用命令

帮助命令


|  | docker version #显示版本信息 |
|  | docker info #显示更详细信息 |
|  | docker --help #帮助信息 |
|  |  |

帮助文档地址:

镜像命令:

docker images #查看所有镜像


|  | docker images --help |
|  |  |
|  |  |
|  | REPOSITORY TAG IMAGE ID CREATED SIZE |
|  | hello-world latest feb5d9fea6a5 8 months ago 13.3kB |
|  | #解释 |
|  | REPOSITORY 镜像的仓库源 |
|  | TAG 镜像的标签 |
|  | IMAGE ID 镜像的id |
|  | CREATED 镜像的创建时间 |
|  | SIZE 镜像的大小 |
|  |  |

docker search #搜索镜像


|  | docker search mysql #搜索mysql |
|  | docker search mysql --filter=STARS=3000 #搜索出来的大于等于3000 |

docker pull #下载镜像


|  | docker pull mysql #下载mysql |
|  |  |
|  | docker pull 镜像名[:tag]如果不写是默认latest  |
|  | 采用分层下载,联合文件系统,还有签名 ,docker.io是真实地址 |
|  |  |
|  | docker pull mysql==docker pull docker.io/library/mysql:latest |

docker images#查看镜像

docker rmi #删除镜像


|  | docker rmi-f 删除制定的镜像 |
|  | docker rmi -f id id 删除多个镜像 |
|  |  |
|  | docker rmi-f $(docker images -aq) 递归删除全部镜像 |
|  |  |

容器命令

启动并进入容器内部


|  | docker run -it centos /bin/bash |
|  |  |

docker run [跟的常用命令]


|  | --name 给容器的别名 |
|  | -P 随机外部端口映射容器内部端口 |
|  | -p 指定端口 比如: -p 5000:5000  |
|  | -d 容器后台运行  |

退回主机


|  | exit #容器停止退出 |
|  | ctrl+p+q#不停止退出 |

列出所有运行中的容器


|  | docker ps |

查看运行过的容器


|  | docker -ps -a |

docker 容器运行的状态


|  | 容器状态有7种: |
|  | created(已创建) |
|  | restarting(重启中) |
|  | running(运行中) |
|  | removing(迁移中) |
|  | paused(暂停) |
|  | exited(停止) |
|  | dead(死亡) |

删除容器


|  | docker rm 容器id #删除制定的容器 ,如果删除正在运行的容器 -f |
|  | docker rm -f $(docker ps -aq) #删除所有容器 |
|  |  |
|  | docker ps -a -q|xargs docker rm #删除所有容器 |
|  |  |

其他命令

启动和停止容器


|  | docker start 容器id #启动容器 |
|  | docker restart 容器id #重启容器 |
|  | docker stop 容器id #停止当前容器 |
|  | docker kill 容器id #强制停止容器 |

后台启动容器


|  | docker run -d -it 镜像名 |

查看日志


|  | docker logs -f -t 容器id |
|  | docker logs -t -f --tail 20 容器id查看20条 |
|  |  |

写一段脚本


|  | while true;do echo kuangshen;sleep 1;done |

查看容器进程信息


|  | docker top 容器id |
|  |  UID PID PPID C STIME TTY TIME CMD |
|  | root 18275 18256 0 15:17 ? 00:00:00 /bin/sh -c while true;do echo kuangshen;sleep 1;done |
|  | root 20274 18275 0 15:31 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1 |
|  |  |

查看镜像元数据


|  | docker inspect 容器id |

返回的数据


|  | [ |
|  | { |
|  | "Id": "345af6e6f41f2364d48cb91e66afbf50c994e9a4619e66f0af5ae6a42610ee8d", |
|  | "Created": "2022-06-17T07:17:00.304042239Z", |
|  | "Path": "/bin/sh", |
|  | "Args": [ |
|  | "-c", |
|  | "while true;do echo kuangshen;sleep 1;done" |
|  | ], |
|  | "State": { |
|  | "Status": "running", |
|  | "Running": true, |
|  | "Paused": false, |
|  | "Restarting": false, |
|  | "OOMKilled": false, |
|  | "Dead": false, |
|  | "Pid": 18275, |
|  | "ExitCode": 0, |
|  | "Error": "", |
|  | "StartedAt": "2022-06-17T07:17:00.902769488Z", |
|  | "FinishedAt": "0001-01-01T00:00:00Z" |
|  | }, |
|  | "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6", |
|  | "ResolvConfPath": "/var/lib/docker/containers/345af6e6f41f2364d48cb91e66afbf50c994e9a4619e66f0af5ae6a42610ee8d/resolv.conf", |
|  | "HostnamePath": "/var/lib/docker/containers/345af6e6f41f2364d48cb91e66afbf50c994e9a4619e66f0af5ae6a42610ee8d/hostname", |
|  | "HostsPath": "/var/lib/docker/containers/345af6e6f41f2364d48cb91e66afbf50c994e9a4619e66f0af5ae6a42610ee8d/hosts", |
|  | "LogPath": "/var/lib/docker/containers/345af6e6f41f2364d48cb91e66afbf50c994e9a4619e66f0af5ae6a42610ee8d/345af6e6f41f2364d48cb91e66afbf50c994e9a4619e66f0af5ae6a42610ee8d-json.log", |
|  | "Name": "/vigilant\_panini", |
|  | "RestartCount": 0, |
|  | "Driver": "overlay2", |
|  | "Platform": "linux", |
|  | "MountLabel": "", |
|  | "ProcessLabel": "", |
|  | "AppArmorProfile": "docker-default", |
|  | "ExecIDs": null, |
|  | "HostConfig": { |
|  | "Binds": null, |
|  | "ContainerIDFile": "", |
|  | "LogConfig": { |
|  | "Type": "json-file", |
|  | "Config": {} |
|  | }, |
|  | "NetworkMode": "default", |
|  | "PortBindings": {}, |
|  | "RestartPolicy": { |
|  | "Name": "no", |
|  | "MaximumRetryCount": 0 |
|  | }, |
|  | "AutoRemove": false, |
|  | "VolumeDriver": "", |
|  | "VolumesFrom": null, |
|  | "CapAdd": null, |
|  | "CapDrop": null, |
|  | "CgroupnsMode": "host", |
|  | "Dns": [], |
|  | "DnsOptions": [], |
|  | "DnsSearch": [], |
|  | "ExtraHosts": null, |
|  | "GroupAdd": null, |
|  | "IpcMode": "private", |
|  | "Cgroup": "", |
|  | "Links": null, |
|  | "OomScoreAdj": 0, |
|  | "PidMode": "", |
|  | "Privileged": false, |
|  | "PublishAllPorts": false, |
|  | "ReadonlyRootfs": false, |
|  | "SecurityOpt": null, |
|  | "UTSMode": "", |
|  | "UsernsMode": "", |
|  | "ShmSize": 67108864, |
|  | "Runtime": "runc", |
|  | "ConsoleSize": [ |
|  | 0, |
|  | 0 |
|  | ], |
|  | "Isolation": "", |
|  | "CpuShares": 0, |
|  | "Memory": 0, |
|  | "NanoCpus": 0, |
|  | "CgroupParent": "", |
|  | "BlkioWeight": 0, |
|  | "BlkioWeightDevice": [], |
|  | "BlkioDeviceReadBps": null, |
|  | "BlkioDeviceWriteBps": null, |
|  | "BlkioDeviceReadIOps": null, |
|  | "BlkioDeviceWriteIOps": null, |
|  | "CpuPeriod": 0, |
|  | "CpuQuota": 0, |
|  | "CpuRealtimePeriod": 0, |
|  | "CpuRealtimeRuntime": 0, |
|  | "CpusetCpus": "", |
|  | "CpusetMems": "", |
|  | "Devices": [], |
|  | "DeviceCgroupRules": null, |
|  | "DeviceRequests": null, |
|  | "KernelMemory": 0, |
|  | "KernelMemoryTCP": 0, |
|  | "MemoryReservation": 0, |
|  | "MemorySwap": 0, |
|  | "MemorySwappiness": null, |
|  | "OomKillDisable": false, |
|  | "PidsLimit": null, |
|  | "Ulimits": null, |
|  | "CpuCount": 0, |
|  | "CpuPercent": 0, |
|  | "IOMaximumIOps": 0, |
|  | "IOMaximumBandwidth": 0, |
|  | "MaskedPaths": [ |
|  | "/proc/asound", |
|  | "/proc/acpi", |
|  | "/proc/kcore", |
|  | "/proc/keys", |
|  | "/proc/latency\_stats", |
|  | "/proc/timer\_list", |
|  | "/proc/timer\_stats", |
|  | "/proc/sched\_debug", |
|  | "/proc/scsi", |
|  | "/sys/firmware" |
|  | ], |
|  | "ReadonlyPaths": [ |
|  | "/proc/bus", |
|  | "/proc/fs", |
|  | "/proc/irq", |
|  | "/proc/sys", |
|  | "/proc/sysrq-trigger" |
|  | ] |
|  | }, |
|  | "GraphDriver": { |
|  | "Data": { |
|  | "LowerDir": "/var/lib/docker/overlay2/28560556e74af8a61d99ee96d3b98c2defa0774274384161c559187b5fac0473-init/diff:/var/lib/docker/overlay2/fcb5c270854d34709d71337480437be0e69003ebca9daf39fd1796c293b88d2d/diff", |
|  | "MergedDir": "/var/lib/docker/overlay2/28560556e74af8a61d99ee96d3b98c2defa0774274384161c559187b5fac0473/merged", |
|  | "UpperDir": "/var/lib/docker/overlay2/28560556e74af8a61d99ee96d3b98c2defa0774274384161c559187b5fac0473/diff", |
|  | "WorkDir": "/var/lib/docker/overlay2/28560556e74af8a61d99ee96d3b98c2defa0774274384161c559187b5fac0473/work" |
|  | }, |
|  | "Name": "overlay2" |
|  | }, |
|  | "Mounts": [], |
|  | "Config": { |
|  | "Hostname": "345af6e6f41f", |
|  | "Domainname": "", |
|  | "User": "", |
|  | "AttachStdin": false, |
|  | "AttachStdout": false, |
|  | "AttachStderr": false, |
|  | "Tty": false, |
|  | "OpenStdin": false, |
|  | "StdinOnce": false, |
|  | "Env": [ |
|  | "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" |
|  | ], |
|  | "Cmd": [ |
|  | "/bin/sh", |
|  | "-c", |
|  | "while true;do echo kuangshen;sleep 1;done" |
|  | ], |
|  | "Image": "centos", |
|  | "Volumes": null, |
|  | "WorkingDir": "", |
|  | "Entrypoint": null, |
|  | "OnBuild": null, |
|  | "Labels": { |
|  | "org.label-schema.build-date": "20210915", |
|  | "org.label-schema.license": "GPLv2", |
|  | "org.label-schema.name": "CentOS Base Image", |
|  | "org.label-schema.schema-version": "1.0", |
|  | "org.label-schema.vendor": "CentOS" |
|  | } |
|  | }, |
|  | "NetworkSettings": { |
|  | "Bridge": "", |
|  | "SandboxID": "dae4f55d59e869c39417f01d08885567f026c3682c52ef279a2d544fb30e5b63", |
|  | "HairpinMode": false, |
|  | "LinkLocalIPv6Address": "", |
|  | "LinkLocalIPv6PrefixLen": 0, |
|  | "Ports": {}, |
|  | "SandboxKey": "/var/run/docker/netns/dae4f55d59e8", |
|  | "SecondaryIPAddresses": null, |
|  | "SecondaryIPv6Addresses": null, |
|  | "EndpointID": "90bf5aedb85730b19d7cfd87f940180253850909f80bd464ca857179becad8ef", |
|  | "Gateway": "172.17.0.1", |
|  | "GlobalIPv6Address": "", |
|  | "GlobalIPv6PrefixLen": 0, |
|  | "IPAddress": "172.17.0.2", |
|  | "IPPrefixLen": 16, |
|  | "IPv6Gateway": "", |
|  | "MacAddress": "02:42:ac:11:00:02", |
|  | "Networks": { |
|  | "bridge": { |
|  | "IPAMConfig": null, |
|  | "Links": null, |
|  | "Aliases": null, |
|  | "NetworkID": "1e8be48fc967fe40643b0e7ab45fd195182b044fc7e654375cb49dba6af35861", |
|  | "EndpointID": "90bf5aedb85730b19d7cfd87f940180253850909f80bd464ca857179becad8ef", |
|  | "Gateway": "172.17.0.1", |
|  | "IPAddress": "172.17.0.2", |
|  | "IPPrefixLen": 16, |
|  | "IPv6Gateway": "", |
|  | "GlobalIPv6Address": "", |
|  | "GlobalIPv6PrefixLen": 0, |
|  | "MacAddress": "02:42:ac:11:00:02", |
|  | "DriverOpts": null |
|  | } |
|  | } |
|  | } |
|  | } |
|  | ] |
|  |  |

进入容器


|  | docker exec -it 容器id/bin/bash ##进入容器打开新终端 |
|  | docker attach 容器id #进入容器在原来的终端,可以看到之前的代码 |

从容器内拷贝文件到主机上


|  | docker cp 容器id:容器内路径 目的主机路径 |

小结


|  | attach 当前shell下attach连接制定运行镜像 |
|  | build 通过dockerfile定制镜像 |
|  | commit 提交当前容器为新的镜像 |
|  | cp 从容器拷贝制定文件或者目录到宿主机 |
|  | create 创建一个新的容器,不启动 |
|  | diff 查看容器变化 |
|  | events 从服务获取容器实时时间 |
|  | exec 在已存在的容器上运行命令 |
|  | export 导出容器的内容流作为一个tar归档文件对应import |
|  | history 展示一个镜像形成历史 |
|  | images 列出系统当前镜像 |
|  | import 从tar包中的内容创建一个新的文件系统镜像 |
|  | info 显示系统的相关信息 |
|  | inspect 查看容器详细信息 |
|  | kill kill掉制定容器 |
|  | load 从一个tar包加载一个镜像[对应一个save] |
|  | login 注册或登录一个docker服务器源 |
|  | logout 从当前原服务器退出 |
|  | logs 输出当前服务器日志 |
|  | port 查看映射端口对应的容器源端 |
|  | pause 暂停容器 |
|  | ps 列出容器列表 |
|  | pull 从docker源拉取镜像 |
|  | push 推送到制定镜像或者docker源 |
|  | restart 重启运行中的镜像 |
|  | rm一处一个或多个容器 |
|  | rmi 移除镜像 |
|  | run 创建一个容器并运行 |
|  | save 保存一个镜像为tar包[对应load] |
|  | search 在dockerhub搜镜像 |
|  | start 启动镜像 |
|  | stop 停止镜像 |
|  | tag 给源镜像打标签 |
|  | top 看容器运行进程 |
|  | unpause 取消暂停容器 |
|  | version 查看docker版本 |
|  | wait 截取容器停止时的退出状态值 |
|  | status 查看docker 状态 |

作业

docker-nginx


|  | 1.搜索镜像 |
|  | 2.下载镜像 |
|  | 3.启动镜像 |
|  | 4。运行测试:docker run -d --name nginx01 -p 3344:80 nginx |

docker -tomcat


|  |  |

es+kibana


|  | es需要挂载 |
|  | es需要内存 |
|  | es需要暴露多端口 |

可视化工具


|  | portainer(先用这个) |
|  | docker图形化管理工具 |
|  |  |
|  | Rancher(ci/cd再用) |

docker镜像

提交一个自己的镜像


|  | docker commit 提交容器成为一个新副本 |
|  | docker commit -m "内容" -a "作者" 容器id 目标镜像名:[tag] |

数据卷

防止容器删除后数据丢失,有了数据卷可以保存到电脑,将容器目录挂载到linux上面


|  | -v 挂载 |
|  | docker run -it -v 主机目录:容器内目录  |

挂载完成之后:


|  | Mounts里就会绑定两者的关系 |
|  | source 主机内地址 |
|  | destination docker容器内的地址 |

容器内添加可以添加到外部,属于双向绑定了是

作业安装mysql挂载数据


|  | 1.查找mysql |
|  | 2.下载镜像 |
|  | 3.启动,需要数据挂载  |

具名挂载和匿名挂载


|  | 不指定主机名 直接是容器内的目录: docker run -d -P --name nginx01 -v /ect/nginx nginx |
|  | 所有不指定宁docker容器内的卷,在没有指定 /var/lib/docker/volumes/xxx/\_data |

|  | 区分具名匿名 |
|  | -v 容器内路径 是匿名挂载 |
|  | -v 卷名:容器内路径 具名挂载 |
|  | -v /宿主机器路径::容器内路径 指定路径挂载 |

扩展


|  | 通过 -v 容器内路径:ro rw 改变读写权限 |
|  | ro 只读 |
|  | rw 可读可写 |
|  | 一旦设置了这个容器权限 只能通过宿主机来操作,容器内部无法操作的 ,ro说明只能通过宿主机来操作,容器内部无法操作 |
|  | docker run -d -p --name nginx01 -v juming-nginx:/etc/nginx:rw nginx |
|  | docker run -d -p --name nginx01 -v juming-nginx:/etc/nginx:ro nginx |

dockerfile

1编写镜像文件dockerfile1


|  | FROM centos |
|  | VOLUME ["volume01","volume02"] |
|  | CMD echo "--------end------------" |
|  | CMD /bin/bash |
  1. 执行docker命令执行文件注意上全路径,结尾有个空格点

|  | docker build -f /home/player3/文档/dockerfile1.Dockerfile -t player3/centos . |
|  |  |

3.启动容器


|  | docker run -it player3/centos /bin/bash |
|  |  |

4.查看文件


|  | [root@d6bb2b70632d /]# ls |
|  | bin etc lib lost+found mnt proc run srv tmp var volume02 |
|  | dev home lib64 media opt root sbin sys usr volume01 |
|  |  |
|  | 我们生成的目录自动挂载的  |

5.在容器内创建一个目录,查看容器里是否有,查看匿名挂载路径

docker inspect d6bb2b70632d


|  | "Mounts": [ |
|  | { |
|  | "Type": "volume", |
|  | "Name": "d451a845fdd349e203b65f76080c57e070d7fcfecb9744363780ccc13db286b0", |
|  | "Source": "/var/lib/docker/volumes/d451a845fdd349e203b65f76080c57e070d7fcfecb9744363780ccc13db286b0/\_data", |
|  | "Destination": "volume01", |
|  | "Driver": "local", |
|  | "Mode": "", |
|  | "RW": true, |
|  | "Propagation": "" |
|  | }, |
|  | { |
|  | "Type": "volume", |
|  | "Name": "438fcc6181fde2565c4e8c995a3a1aa7973cc91fa345c2b396415f4453e3f8a9", |
|  | "Source": "/var/lib/docker/volumes/438fcc6181fde2565c4e8c995a3a1aa7973cc91fa345c2b396415f4453e3f8a9/\_data", |
|  | "Destination": "volume02", |
|  | "Driver": "local", |
|  | "Mode": "", |
|  | "RW": true, |
|  | "Propagation": "" |
|  | } |
|  | ], |
|  |  |

6进入本地目录看是否出现,本地电脑添加一个都有


|  | root@player3-TM1613:/var/lib/docker/volumes/d451a845fdd349e203b65f76080c57e070d7fcfecb9744363780ccc13db286b0/\_data# ls |
|  | demo01.txt |

7.测试删除容器,发现这个本地挂载的数据还在

可以实现什么,比如多个mysql同步数据?

小作业两个mysql进行数据同步

volumes-form 容器名,将容器数据卷挂载到其他的数据卷上,属于继承了上一层的数据卷,多个数据卷的数据相互复制,删除掉源头docker并不会对现有文件造成影响


|  | docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL\_ROOT\_PASSWORD=123456 --name mysql01 mysql:5.7 |
|  |  |
|  | docker run -d -p 3311:3307 -v /etc/mysql/conf.d -e MYSQL\_ROOT\_PASSWORD=123456 --name mysql02 mysql:5.7 --volumes-form mysql01 |

结论:容器之间的生命周期,一直到所有容器都没有使用为止,本地数据卷的数据是不会删除的。

编写docker的具体步骤

1.编写dockerfile文件,文件首字母大写

2.dockerbuild 构件成一个镜像

3.docker run 运行镜像

4.docker push 发布镜像 (ducherhub,阿里云镜像仓库)

dockerfile构建过程

dockerFile:构建文件,定义了一切的步骤,源代码

dockerimages:通过dockerfile构建生成的镜像,最终发布和运行的产品,原来是jar,war。

docker容器:容器就是镜像运行起来提供服务器

基础知识:

1.每个保留关键字(指令)都是必须大写的

2.执行从上到下顺序执行

3。#表示注释

4.每个指令都会创建提交一个新的镜像层

dockerfile常见命令


|  | FROM 指定基本镜像,一切镜像从这里开始 |
|  | MAINTAINER 负责人,一般姓名+邮箱 |
|  | RUN 构建镜像的时候需要运行的命令 |
|  | ADD 步骤,tomcat镜像的化tomcat的压缩包,添加内容 |
|  | WORKDIR 镜像的工作目录 |
|  | VOLUME 挂载的目录 |
|  | EXPOSE 对外暴露的端口 |
|  | CMD 命令行操作 |
|  | ENTRYPOINT 指定容器启动的时候要运行的命令,可以追加命令 |
|  | ONBUILD 当构建一个被继承dockerfile 这个时候就会运行ONBUILD的指令,触发指令 |
|  | COPY 类似add,将文件拷贝到镜像中 |
|  | ENV 设置构建的环境变量 |
|  |  |

小作业

1.构建一个自己的centos镜像

mycentos.Dockerfile


|  | FROM centos |
|  | MAINTAINER kuangshen<24736743@qq.com> |
|  |  |
|  | ENV MYPATH /usr/local |
|  | WORKDIR $MYPATH |
|  | RUN yum -y install vim |
|  | RUN yum -y install net-tools |
|  | EXPOSE 80 |
|  | CMD echo A$MYPATH |
|  | CMD /bin/bash |
|  |  |

2.build


|  | docker build -f /home/player3/文档/mycentos.Dockerfile -t player3/mycentos . |
|  |  |

3.运行 docker run -it dsoadihaso /bin/bash

查看镜像的构建过程 docker history odsakdlkasjdl

cnd和entrypoint区别


|  | cmd 指定这个容器启动要运行的命令,之后最后一个会生效,可以被替代 |
|  | entrypoint 指定这个容器启动要运行的命令,可以追加命令 |

cmd的file


|  | FROM centos |
|  | CMD ['ls',"-a"] |

|  | docker build -f xxx -t cmdtest . |

|  | docker run aa1111  |
|  |  |
|  | 会自动将最后的cmd命令执行,如果想追加命令不能在后面直接加应该这样写 |
|  | docker run aa1111 ls-al |
|  |  |

entrypoint的file


|  | FROM centos |
|  | ENTRYPOINT ['ls',"-a"] |

|  | docker build -f xxx -t entrypointtest . |

|  | docker run aa1111  |
|  |  |
|  | 会自动将最后的cmd命令执行,如果想追加命令可以直接填上后面 |
|  | docker run aa1111 l |

小作业tomcat镜像

发布自己的镜像

ducokerhub

1.地址:https://hub.docker.com 注册自己的账号

2.确定账号可以正常登录

3.在服务器上提交我们的镜像


|  | dockerlogin --help |
|  |  |
|  | -u -p |
|  | 用户名,密码 |

4登录之后可以提交镜像,docker push

本地提交到远程尽量带上版本信息和tag


|  | docker tag 5d0da3dc9764 player3/centos:0.0.1 |

|  | docker push player3/centos:0.0.1 |
|  |  |

发布到阿里云


|  | 1.登录到阿里云 |
|  | 2.找到容器镜像服务 |
|  | 3.找到镜像仓库 |
|  | 4.创建命名空间 |
|  | 5。创建镜像仓库 |
|  | 6其他参考官方文档 |

docker save

docker load

docker网络

docker0

ip addr

第一个是回环地址,第二个是内网地址,第三个是docker地址


|  | 1: lo: <LOOPBACK,UP,LOWER\_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 |
|  |  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 |
|  |  inet 127.0.0.1/8 scope host lo |
|  |  valid\_lft forever preferred\_lft forever |
|  |  inet6 ::1/128 scope host  |
|  |  valid\_lft forever preferred\_lft forever |
|  | 2: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER\_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 |
|  |  link/ether a0:c5:89:32:9c:d1 brd ff:ff:ff:ff:ff:ff |
|  |  inet 192.168.10.109/24 brd 192.168.10.255 scope global dynamic noprefixroute wlp2s0 |
|  |  valid\_lft 6054sec preferred\_lft 6054sec |
|  |  inet6 fe80::8d0a:e31a:72d0:f111/64 scope link noprefixroute  |
|  |  valid\_lft forever preferred\_lft forever |
|  | 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default |
|  |  link/ether 02:42:83:6a:8a:86 brd ff:ff:ff:ff:ff:ff |
|  |  inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 |
|  |  valid\_lft forever preferred\_lft forever |
|  |  |

docker是如何处理网络问题

docker 可以ping通容器内部

正常电脑本机192.168.0.1 路由器地址,手机连接WiFi了,192.168.0.2,可以相互ping 可以相互ping通。

原理

1.我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只需要安装docker就会有一个网卡docker0

使用桥接模式,使用的技术是evth-pair 技术(虚拟设备接口)。

启动容器后出现的网卡是成对出现的,一端连着协议,一端彼此相连。

2.不同容器之间可以ping通的


|  | docker exec -it tomcat2 ping xxx |

3.结论,tomcat1和tomcat是公用一个路由,docker0,所有容器不指定网络的情况下,都是使用docker0路由的,docker会给我们的容器分配一个默认的可用ip

4.docker中所有的网络接口都是虚拟的,虚拟转发效率高(内网传递文件)

只要容器删除,对应的网桥一对就没了

–link

场景:编写了一个微服务,database.rul=ip;; 项目不重启,ip换掉了,希望处理这个问题,可以名字来访问容器.

想通过服务去ping tomcat02能ping通吗?


|  | docker exec -it tomcat02 ping tomcat01 |

ping不通

启动tomcat03


|  | docker run -d -P --name tomcat3 --link tomcat02 tomcat01 |

通过—link就解决了这个问题,反向是不可以ping通的

当我们配置容器的时候不配置ip会给容器配置默认ip,我们可以通过docker inspect去看


|  | docker exec -it tomcat03 cat /etc/hosts |

通过查看tomcat03的docker host ,增加了tomcat02,tomcat01的本地映射

现在玩docker的时候已经不建议使用–link了,自定义网络,不适用docker0,docker0的问题,不支持容器名连接访问

docker network


|  |  docker network ls 查看所有的温昂罗 |
|  |  |
|  |  docker network rm id 删除某个网络 |
|  |  docker create  |

网络模式

bridge:桥接,默认

none:不配置网络

host:和宿主机共享网络

container:容器网络连接(用的少,局限很大)

测试


|  | docker run -d -p --name tomcat01 tomcat |
|  | docker run -d -p --name tomcat01 tomcat --net bridge tomcat 上面的默认执行了这个 |
|  | docker0特点;默认,域名不能访问,--link可以打通连接 |
|  |  |

我们可以自定一个网络

--driver bridge 模式

--subnet 192.168.0.0/16 多少个子网

--gateway 192.168.0.1 +网关路由


|  | docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet |

|  | root@player3-TM1613:/home/player3# docker network ls |
|  | NETWORK ID NAME DRIVER SCOPE |
|  | 430c633bd795 bridge bridge local |
|  | a288f78f519b host host local |
|  | 74783c519ad2 mynet bridge local |
|  | 7d3b1deefd46 none null local |
|  |  |

|  | docker run -d -P --name tomcat01 --net mynet tomcat |

当你不适用–link也可以ping通名字 了

好处:不同的集群使用不同的网络,集群是安全和健康的

我们都知道网段不同是无法ping通的,如何打通docker0和自定义网络呢?

docker network connect 可以打通网络


|  | docker network connect mynet tomcat01 |

联通之后就是将tomcat01放到了mynet网络下,一个容器两个ip

搭建redis集群

1.创建网卡


|  | docker network create redis --subnet 192.168.0.0/16  |

2.查看服务


|  | docker network ls |
|  | docker network inspect redis |

3.创建6个redis服务


|  | for port in $(seq 1 6); \ |
|  | do \ |
|  | mkdir -p /mydata/redis/node-${port}/conf |
|  | touch /mydata/redis/node-${port}/conf/redis.conf |
|  | cat << EOF > /mydata/redis/node-${port}/conf/redis.conf |
|  | port 6379 |
|  | bind 0.0.0.0 |
|  | Cluster-enabled yes |
|  | Cluster-config-file nodes.conf |
|  | Cluster-node-timeout 5000 |
|  | Cluster-announce-ip 192.168.0.1${port} |
|  | Cluster-announce-port 6379 |
|  | Cluster-announce-bus-port 16379 |
|  | appendonly yes |
|  | EOF |
|  | done |

4.启动redis(6个)

node-1


|  | docker run -p 6379:6379 -p 16379:16379 --name redis-1 \ |
|  | -v /mydata/redis/node-1/data:/data \ |
|  | -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \ |
|  | -d --net redis --ip 192.168.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf |

node-2


|  | docker run -p 6372:6379 -p 16372:16379 --name redis-2 \ |
|  | -v /mydata/redis/node-2/data:/data \ |
|  | -v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \ |
|  | -d --net redis --ip 192.168.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf |

node-3


|  | docker run -p 6373:6379 -p 16373:16379 --name redis-3 \ |
|  | -v /mydata/redis/node-3/data:/data \ |
|  | -v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \ |
|  | -d --net redis --ip 192.168.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf |

node-4


|  | docker run -p 6374:6379 -p 16374:16379 --name redis-4 \ |
|  | -v /mydata/redis/node-4/data:/data \ |
|  | -v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \ |
|  | -d --net redis --ip 192.168.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf |

node-5


|  | docker run -p 6375:6379 -p 16375:16379 --name redis-5 \ |
|  | -v /mydata/redis/node-5/data:/data \ |
|  | -v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \ |
|  | -d --net redis --ip 192.168.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf |

node-6


|  | docker run -p 6376:6379 -p 16376:16379 --name redis-6 \ |
|  | -v /mydata/redis/node-6/data:/data \ |
|  | -v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \ |
|  | -d --net redis --ip 192.168.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf |

redis中没有bash只有 sh

5.进入其中一个容器


|  | docker exec -it redis-1 /bin/sh |

6执行集群命令


|  | redis-cli --cluster create 192.168.0.11:6379 192.168.0.12:6379 192.168.0.13:6379 192.168.0.14:6379 192.168.0.15:6379 192.168.0.16:6379 --cluster-replicas 1 |

输入yes

7.连接集群


|  | redis-cli -c |
|  |  |
|  | 127.0.0.1:6379> cluster info |
|  |  |
|  | cluster\_state:ok |
|  | cluster\_slots\_assigned:16384 |
|  | cluster\_slots\_ok:16384 |
|  | cluster\_slots\_pfail:0 |
|  | cluster\_slots\_fail:0 |
|  | cluster\_known\_nodes:6 |
|  | cluster\_size:3 |
|  | cluster\_current\_epoch:6 |
|  | cluster\_my\_epoch:1 |
|  | cluster\_stats\_messages\_ping\_sent:209 |
|  | cluster\_stats\_messages\_pong\_sent:229 |
|  | cluster\_stats\_messages\_sent:438 |
|  | cluster\_stats\_messages\_ping\_received:224 |
|  | cluster\_stats\_messages\_pong\_received:209 |
|  | cluster\_stats\_messages\_meet\_received:5 |
|  | cluster\_stats\_messages\_received:438 |

8.设置值


|  | set a b |
|  | get a |
|  | 可以正常获取 |

9.查看主从节点,13的从是14


|  | 192.168.0.13:6379> cluster nodes |
|  | dda9df6e38727c5ad0667278cb77f96d91973f65 192.168.0.15:6379@16379 slave f6dc83295bb2d7e9a0436fff935dbd6e441ef8cf 0 1655738988807 5 connected |
|  | cf8b3f0cc101c2bce9f57d10349676a37ed0538c 192.168.0.14:6379@16379 slave 2c1949dcb59bff7a4cb49b0af04d15978987daaa 0 1655738988507 4 connected |
|  | 2c1949dcb59bff7a4cb49b0af04d15978987daaa 192.168.0.13:6379@16379 myself,master - 0 1655738986000 3 connected 10923-16383 |
|  | 86ad41983210bdd6fd8c723851820852e57f2c0d 192.168.0.12:6379@16379 master - 0 1655738988306 2 connected 5461-10922 |
|  | 1e1386760e3421384022567658601b9dcae3ef02 192.168.0.16:6379@16379 slave 86ad41983210bdd6fd8c723851820852e57f2c0d 0 1655738988000 6 connected |
|  | f6dc83295bb2d7e9a0436fff935dbd6e441ef8cf 192.168.0.11:6379@16379 master - 0 1655738987000 1 connected 0-5460 |

10.停止docker的node-3节点


|  | docker stop node-3 |

11.重新获取,发现卡顿,ctrl+c结束后,重新登录,发现从节点已经切换成功


|  | -> Redirected to slot [15495] located at 192.168.0.14:6379 |
|  | "b" |
|  | 192. |

将springboot打包成docker镜像

1.构建springboot项目


|  | 正常编写web项目并且测试 |

1.1下载dockerfile插件

2.打包应用

3.编写dockerfile


|  | FROM java:8 |
|  | COPY *.jar /app.jar |
|  | CMD ["--server.port=8080"] |
|  | EXPOSE 8080 |
|  | ENTRYPOINT ["java","-jar","/app.jar"] |

4.构建镜像

将dockerfile+jar包上传到服务器


|  | docker build -t kuangshen666 . |

5发布运行


|  | docker run -d -p 8080:8080 --name kunagshen-springboot-web kuangshen666 |

转载请注明:xuhss » docker技术学习

喜欢 (0)

您必须 登录 才能发表评论!