docker
docker安装
卸载旧版
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
需要的安装包
yum install -y yum-util
设置镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新软件包的索引
yum makecache fast
安装最新版的docker引擎
yum install docker-ce docker-ce-cli containerd.io
启动docker
systemctl start docker
查看docker版本
docker version
测试helloworld
docker run hello-world
查看镜像
docker images
卸载docker
# 卸载docker yum remove docker-ce docker-ce-cli containerd.io # 删除资源 rm -rf /var/lib/docker
阿里云镜像加速

docker run的分析流程图

docker底层原理
docker是一个c/s结构系统,docker的守护进程运行在主机上,通过socket客户端访问!
dockerServer接收到Docker-Client 的指令,就会执行这个命令。

docker为什么比VM快?
- docker有比虚拟机更少的抽象
- docker利用的是宿主机的内核 ,vm需要的是Guest OS
镜像命令
docker images
docker images (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE #解释: 1.REPOSITORY 镜像的仓库源 2.TAG 镜像的标签 3.IMAGE ID 镜像的id 4.CREATED 镜像的创建时间 5.SIZE 镜像的大小 # 可选参数 -a/--all 列出所有镜像 -q/--quiet 只显示镜像的id
docker search 搜索镜像
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11676 [OK]
mariadb MariaDB Server is a high performing open sou… 4448 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 867 [OK]
percona Percona Server is a fork of the MySQL relati… 561 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 369 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 91
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 89
centurylink/mysql Image containing mysql. Optimized to be link… 59 [OK]
databack/mysql-backup Back up mysql databases to... anywhere! 52
prom/mysqld-exporter 43 [OK]
#可选参数
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
#搜索收藏数大于3000的镜像
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker search mysql --filter=STARS=3000
docker pull 镜像名[:tag] 下载镜像
Using default tag: latest latest: Pulling from library/mysql #如果不写tag默认是last b380bbd43752: Pull complete # 分层下载 f23cbf2ecc5d: Pull complete 30cfc6c29c0a: Pull complete b38609286cbe: Pull complete 8211d9e66cd6: Pull complete 2313f9eeca4a: Pull complete 7eb487d00da0: Pull complete 4d7421c8152e: Pull complete 77f3d8811a28: Pull complete cce755338cba: Pull complete 69b753046b9f: Pull complete b2e64b0ab53c: Pull complete Digest: sha256:6d7d4524463fe6e2b893ffc2b89543c81dec7ef82fb2020a1b27606666464d87 #签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #下载来源地址
下载指定版本
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql b380bbd43752: Already exists f23cbf2ecc5d: Already exists 30cfc6c29c0a: Already exists b38609286cbe: Already exists 8211d9e66cd6: Already exists 2313f9eeca4a: Already exists 7eb487d00da0: Already exists a71aacf913e7: Pull complete 393153c555df: Pull complete 06628e2290d7: Pull complete ff2ab8dac9ac: Pull complete Digest: sha256:2db8bfd2656b51ded5d938abcded8d32ec6181a9eae8dfc7ddf87a656ef97e97 Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7
docker rmi 删除镜像
#单个 (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker rmi -f 镜像id #多个 (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker rmi -f 镜像id 镜像id 镜像id # 删除多个 (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker rmi -f $(docker images -aq)
容器命令
拉取镜像
docker pull centos
运行容器
docker run [可选参数] image #参数说明 --name="名字" 指定容器名字 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 ( -p ip:主机端口:容器端口 配置主机端口映射到容器端口 -p 主机端口:容器端口 -p 容器端口 ) -P 随机指定端口(大写的P)
进入容器
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker run -it centos /bin/bash [root@18334bc4d947 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
退出容器
# 停止并退出容器
[root@18334bc4d947 /]# exit
exit
# Ctrl+P+Q 不停止退出容器
列出显示过的容器
#docker ps # 列出当前正在运行的容器 -a # 列出所有容器的运行记录 -n=? # 显示最近创建的n个容器 -q # 只显示容器的编 (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1aa7c01b3521 centos "/bin/bash" 2 days ago Up 2 days affectionate_robinson (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 18334bc4d947 centos "/bin/bash" 3 minutes ago Exited (0) 2 minutes ago distracted_lamport 1aa7c01b3521 centos "/bin/bash" 2 days ago Up 2 days affectionate_robinson 4030621a004a centos "/bin/bash" 2 days ago Exited (0) 2 days ago vibrant_edison (base) [root@izbp13b6n9vmw09d96m7suz ~]#
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -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 logs -tf 容器id docker logs --tail number 容器id #num为要显示的日志条数
查看容器中进程信息
base) [root@izbp13b6n9vmw09d96m7suz ~]# docker top 1aa7c01b3521 UID PID PPID C STIME TTY TIME CMD root 14335 14300 0 Nov11 pts/0 00:00:00 /bin/bash root 14477 14300 0 Nov11 pts/1 00:00:00 /bin/bash
查看容器元数据信息
[ { "Id": "1aa7c01b352173b8742e030a644b48c0e042f975dd1366ea4c4dd907c36066b2", "Created": "2021-11-10T16:13:41.354347938Z", "Path": "/bin/bash", "Args": [], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 14335, "ExitCode": 0, "Error": "", "StartedAt": "2021-11-10T16:13:41.726695064Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6", "ResolvConfPath": "/var/lib/docker/containers/1aa7c01b352173b8742e030a644b48c0e042f975dd1366ea4c4dd907c36066b2/resolv.conf", "HostnamePath": "/var/lib/docker/containers/1aa7c01b352173b8742e030a644b48c0e042f975dd1366ea4c4dd907c36066b2/hostname", "HostsPath": "/var/lib/docker/containers/1aa7c01b352173b8742e030a644b48c0e042f975dd1366ea4c4dd907c36066b2/hosts", "LogPath": "/var/lib/docker/containers/1aa7c01b352173b8742e030a644b48c0e042f975dd1366ea4c4dd907c36066b2/1aa7c01b352173b8742e030a644b48c0e042f975dd1366ea4c4dd907c36066b2-json.log", "Name": "/affectionate_robinson", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": [ "438315d841011e552b3d4233a729963fb41c0489a6d209be7a5a312d85fa2339" ], "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/98211bc9a3ebcfe37543bee0b99de54c0fe220801e31a1e8e598d1fbf09d56f4-init/diff:/var/lib/docker/overlay2/0dd1cf1678aea592576c7e779d29e0bf0cd6cbd4d3e412fb0f584229fe56bc2d/diff", "MergedDir": "/var/lib/docker/overlay2/98211bc9a3ebcfe37543bee0b99de54c0fe220801e31a1e8e598d1fbf09d56f4/merged", "UpperDir": "/var/lib/docker/overlay2/98211bc9a3ebcfe37543bee0b99de54c0fe220801e31a1e8e598d1fbf09d56f4/diff", "WorkDir": "/var/lib/docker/overlay2/98211bc9a3ebcfe37543bee0b99de54c0fe220801e31a1e8e598d1fbf09d56f4/work" }, "Name": "overlay2" }, "Mounts": [], "Config": { "Hostname": "1aa7c01b3521", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "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": "77f0069239dce7d80e22ccb19b07175416353d74a92aa41b96e8e02bd1455204", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/77f0069239dc", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "ab6fe032f532d269122b4e7508fc215e43b2778a717e349bea6ac9f5725ce259", "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": "05cf75429b1d15b2c84e4f98f08b9724fd8cbc9e1ffae4557256b2aa61902af2", "EndpointID": "ab6fe032f532d269122b4e7508fc215e43b2778a717e349bea6ac9f5725ce259", "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 进入容器后开启一个新的终端,可以在里面操作 docker exec -it 1aa7c01b3521 /bin/bash docker attach 进入容器正在执行的终端,不会启动新的进程 docker attach 1aa7c01b3521
从容器拷贝文件到目标主机
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d2e0e6a3eae centos "/bin/bash" 2 minutes ago Up 2 minutes sharp_diffie (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker cp 2d2e0e6a3eae:/home/Test.java /home (base) [root@izbp13b6n9vmw09d96m7suz ~]# ls /home flask_min_shop go_blog jenkins quantaxis superset test_flaskapp_builder Test.java yaozhiSpider.py fsociety home jinkou.txt spider taiga test_flask_dev wx_food ZeroNet
常用命令小结

安装nginx
# 搜索镜像 docker search nginx # 下载镜像 docker pull nginx
# 进入容器
docker exec -it nginx01 /bin/bash # 启动nginx docker run -d --name nginx01 -p 3344:80 nginx -d 后台运行 --name 容器名称 -p 宿主机端口
端口暴露的概念

安装tomcat
# 官方安装 docker run -it --rm tomcat:9.0(一般用于测试,用完就删除) #下载镜像 docker pull tomcat # 运行 docker run -it -p 3355:8080 --name tomcat01 tomcat # 测试访问(官方的是阉割版,没有webapps,默认最小的镜像)
部署es+kibana
es
# es暴露很多的端口 # es十分耗内存 1.j几个G # es的数据一般要挂载到安全目录 # --net somenetwork 网络配置 # 启动容器 elasticsearch docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2 # 测试es是否成功 #增加内存限制 修改配置文件 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms64m -Xms512m" -e "discovery.type=single-node" elasticsearch:7.6.2
kibana连接es

可视化
portainer
Docker图形化界面管理工具!
# 镜像启动 docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name prtainer-test portainer/portainer # 访问 localhost:9000
Docker镜像的加载原理
什么是docker镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。
所有的应用,直接打包docker镜像,直接跑起来
如何获取镜像
- 从远程仓库下载
- 自己制作一个镜像dockerfile
- 其他地方
Docker镜像加载的原理
unionFS(联合文件系统)
联合文件系统(UnionFS)是一种轻量级的高性能分层文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,应用看到的是挂载的最终结果。
联合文件系统是实现Docker镜像的技术基础。Docker镜像可以通过分层来进行继承。例如,用户基于基础镜像(用来生成其他镜像的基础,往往没有父镜像)来制作各种不同的应用镜像。这些镜像共享同一个基础镜像层,提高了存储效率。此外,当用户改变了一个Docker镜像(比如升级程序到新的版本),则会创建一个新的层(layer)。因此,用户不用替换整个原镜像或者重新建立,只需要添加新层即可。用户分发镜像的时候,也只需要分发被改动的新层内容(增量部分)。这让Docker的镜像管理变得十分轻量级和快速。
docker镜像加载原理
docker的镜像实际上是由一层一层的文件系统构成

bootfs(boot file system) 主要包含bootloader和kernel, bpotloader 主要是引导加载kernel,当我们加载镜像的时候,会通过bootloader加载kernal,Docker镜像最底层是bootfs,当boot加载完成后整个kernal内核都在内存中了,bootfs也就可以卸载,值得注意的是,bootfs是被所有镜像共用的,许多镜像images都是在base image(rootfs)基础上叠加的
rootfs (root file system),在bootfs之 上.包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是 各种不同的操作系统发行版,比如Ubuntu, Centos等等
分层理解
可以看到docker下载镜像是一层层的

通过docker images inspect命令查看镜像分层

所有的docker镜像都是起始于一个docker镜像,当进行修改或者增加新的内容的时候,就会在当前镜像层上创建新的层



docker镜像默认都是只读的,当容器启动时,一个新的可写层被加载到镜像顶部
这一层就是所说的容器层,容器之下叫做镜像层!

Commit镜像
使用docker commit 命令提交容器成为一个新的版本
docker commit -m=“提交的描述信息” -a="作者" 容器id 目标镜像名:[TAG]
由于默认的Tomcat镜像的webapps文件夹中没有任何内容,需要从webapps.dist中拷贝文件到webapps文件夹。下面自行制作镜像:就是从webapps.dist中拷贝文件到webapps文件夹下,并提交该镜像作为一个新的镜像。使得该镜像默认的webapps文件夹下就有文件。具体命令如下:
docker commit -a="qijunL" -m="add webapps app" 5c6e2f39e6ab tomcat02:1.0

容器数据卷
什么是容器数据卷
数据不应该放到容器中,数据要持久化
例如:mysql数据要存储在本地
容器间的数据共享技术,docker容器中产生的数据,同步到本地,就是卷技术
实际上就是目录挂载,将容器内的目录挂载到服务器上

容器的持久化和同步,容器间的数据共享。
使用数据卷
命令挂载 -v,实现数据的双向绑定
docker run -it -v 主机目录:容器目录
docker run -it -v /home/test:/home centos /bin/bash
# 通过docker inspect 容器id 查看挂载情况

测试
- 停止容器
- 修改宿主机上的文件
- 启动容器
- 容器内的数据依旧同步
好处:
在本地修改,不用进入容器
docker 安装mysql
mysql持久化的问题
#下载镜像 docker pull mysql:5.7 #运行容器 mysql数据挂载 -d:后台运行 -p:端口映射 -v:卷挂载 -e 环境配置 --name 容器名字 docker 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
新建数据库,并查看所挂载到本地的数据卷,实现容器数据持久化功能

具名和匿名挂载
# 匿名挂载 -v 容器内路径 docker -d -P --name nginx01 -v /etc/nginx nginx #查看volume的情况 docker volume ls base) [root@izbp13b6n9vmw09d96m7suz data]# docker volume ls DRIVER VOLUME NAME local 0abd9f8442fa92c34a14b12a9bf99e2f7445ff4b3c8a69c661f9d9892b640926 #具名挂载 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx # 通过:-v 卷名:容器内路径 (base) [root@izbp13b6n9vmw09d96m7suz data]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx bba50008c4f7a4e7465b2eaba3f3efc55f590d6feb906e8747801e1b46d5514e (base) [root@izbp13b6n9vmw09d96m7suz data]# docker volume ls DRIVER VOLUME NAME local juming-nginx

如果没有指定主机目录,默认挂载在:/var/lib/docker/volumes/xxx/_data
通过具名挂载可以方便找到我们的一个卷,所以推荐使用具名挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
拓展
# 通过 -v 容器路径:ro rw改变读写权限
一旦设置权限,容器对挂载出来的内容就有了限定
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
# ro说明这个路径只能通过宿主机来操作,容器内是无法操作的
dockerfile挂载
FROM centos VOLUME ["volume01","volume02"] CMD echo "---end----" CMD /bin/bash

启动容器

自动挂载数卷(匿名挂载)

查看卷的挂载路径
docker inspect 容器id

如果构建镜像时没有挂载卷,就要手动挂载 -v 卷名:容器内路径
数据容器卷
容器之间数据同步

启动三个容器来测试
启动父容器(数据卷容器)

启动第二个容器

数据同步测试

同理其他的容器也可以通过--volumes-from 挂载到1或者2
这里文件是个互相拷贝,技术数据卷容器删除或者停止,其他的容器数据还在。
多个mysql数据共享
docker 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
#第二个mysql
docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
容器间配置信息传递,数据卷容器的生命周期一致持续到没有容器使用为止
一旦数据持久化到本地,本地的数据也不会因为容器的消失而删除
DockerFile
用来构架docker镜像文件!命令参数脚本
构建步骤
- 编写一个dockerfile文件
- docker build构建一个镜像
- docker 运行镜像
- docker push发布镜像(DockerHub、阿里云镜像)
指令说明
- 每个保留关键字都是大写字母
- 从上到下执行
- #表示注释
- 每一个指令都会被创建一个新的镜像层,并提交。

dockerfile是面向开发的,以后我们要发布项目,需要做镜像,企业交互的标准
Dockerfile:构建文件,定义一切的步骤
DockerImages:通过Dockerfile构建生成的镜像,最终发布和运行产品
Docker容器:容器就是镜像运行起来的服务器
指令使用
FROM #基础镜像,从这里开始 MAINTAINER # 镜像作者等信息 RUN #构建镜像时候需要运行的命令 ADD # 步骤,tomcat镜像,tomacat压缩包 WORKDIR #镜像的工作目录 VOLUME #挂载目录 EXPOSE #保留端口配置 CMD # 指定容器启动的时候需要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT #指定这个容器启动时候要运行的命令,可以追加命令 ONBUILD #当构建一个被继承的DockerFile 会运行 COPY #类似ADD 将文件拷贝到镜像中 ENV #构建的时候设置环境变量

实战测试:构建centos
编写Dockerfile文件
FROM centos MAINTAINER qijunl<1754168810@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "----end---" CMD /bin/bash
构建镜像
docker build -f mydockerfile-centos -t mycentos:0.1 .
构建成功
Removing intermediate container 5773ceddb8c8
---> 43f0c80aabf5
Successfully built 43f0c80aabf5
Successfully tagged mycentos:0.1
测试运行
(base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker run -it mycentos:0.1
[root@f82c568f4d57 local]# pwd
/usr/local
[root@f82c568f4d57 local]# vim
[root@f82c568f4d57 local]#
查看镜像构建过程
(base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker history 43f0c80aabf5 IMAGE CREATED CREATED BY SIZE COMMENT 43f0c80aabf5 4 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B 1b534adc5e28 4 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 50d9578d128e 4 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B ee4d20e9e7e0 4 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B 18b6b20f059b 4 minutes ago /bin/sh -c yum -y install net-tools 14.6MB 32ff8c1cb934 4 minutes ago /bin/sh -c yum -y install vim 64.7MB 6bb401d5044b 5 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B 2215d4b1ce09 5 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B 03fbb81bc3f0 5 minutes ago /bin/sh -c #(nop) MAINTAINER qijunl<1754168… 0B 5d0da3dc9764 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 3 months ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB
CMD 和ENTRYPOINT 说明
CMD
测试cmd:指定这个容器启动要运行命令,只有最后一个会生效,可以被替代
(base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# vim dockerfile-cmd-test FROM centos CMD ["ls","-a"] (base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker build -f dockerfile-cmd-test -t cmdtest . (base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker run 4e453e592d1b . .. .dockerenv bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var (base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker run 4e453e592d1b -l #追加-l ls -al docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown. (base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker run 4e453e592d1b ls -la total 56 drwxr-xr-x 1 root root 4096 Dec 28 14:31 . drwxr-xr-x 1 root root 4096 Dec 28 14:31 .. -rwxr-xr-x 1 root root 0 Dec 28 14:31 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 340 Dec 28 14:31 dev drwxr-xr-x 1 root root 4096 Dec 28 14:31 etc drwxr-xr-x 2 root root 4096 Nov 3 2020 home lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64 drwx------ 2 root root 4096 Sep 15 14:17 lost+found drwxr-xr-x 2 root root 4096 Nov 3 2020 media drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt drwxr-xr-x 2 root root 4096 Nov 3 2020 opt dr-xr-xr-x 152 root root 0 Dec 28 14:31 proc dr-xr-x--- 2 root root 4096 Sep 15 14:17 root drwxr-xr-x 11 root root 4096 Sep 15 14:17 run lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Nov 3 2020 srv dr-xr-xr-x 13 root root 0 Dec 28 14:31 sys drwxrwxrwt 7 root root 4096 Sep 15 14:17 tmp drwxr-xr-x 12 root root 4096 Sep 15 14:17 usr drwxr-xr-x 20 root root 4096 Sep 15 14:17 var
ENTRYPOINT:命令追加
(base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker build -f mydockerfile-entrypoint -t entrypoint-test . Sending build context to Docker daemon 4.096kB Step 1/2 : FROM centos ---> 5d0da3dc9764 Step 2/2 : ENTRYPOINT ["ls","-a"] ---> Running in 80579cc767e9 Removing intermediate container 80579cc767e9 ---> 78f17773f684 Successfully built 78f17773f684 Successfully tagged entrypoint-test:latest (base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker run 78f17773f684 . .. .dockerenv bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var (base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker run 78f17773f684 -l total 56 drwxr-xr-x 1 root root 4096 Dec 28 14:58 . drwxr-xr-x 1 root root 4096 Dec 28 14:58 .. -rwxr-xr-x 1 root root 0 Dec 28 14:58 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 340 Dec 28 14:58 dev drwxr-xr-x 1 root root 4096 Dec 28 14:58 etc drwxr-xr-x 2 root root 4096 Nov 3 2020 home lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64 drwx------ 2 root root 4096 Sep 15 14:17 lost+found drwxr-xr-x 2 root root 4096 Nov 3 2020 media drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt drwxr-xr-x 2 root root 4096 Nov 3 2020 opt dr-xr-xr-x 153 root root 0 Dec 28 14:58 proc dr-xr-x--- 2 root root 4096 Sep 15 14:17 root drwxr-xr-x 11 root root 4096 Sep 15 14:17 run lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Nov 3 2020 srv dr-xr-xr-x 13 root root 0 Dec 28 14:58 sys drwxrwxrwt 7 root root 4096 Sep 15 14:17 tmp drwxr-xr-x 12 root root 4096 Sep 15 14:17 usr drwxr-xr-x 20 root root 4096 Sep 15 14:17 var
Tomcat镜像
1、准备镜像文件Tomcat压缩包,jdk压缩包

2、编写Dockerfile文件,官方Dockerfile,build会自动寻找这个文件,就不需要-f指定
FROM centos MAINTAINER qijunl<1754168810@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u11-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.56.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_11 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.56 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.56 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 808 CMD /usr/local/apache-tomcat-9.0.56/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.56/bin/logs/catalina.out
3、构建镜像
docker build -t diytomcat .
4、运行容器
docker run -d -p 8080:8080 --name qijunl-tomcat-test -v /home/tomcat/build/tomcat/test:/usr/local/apache-tomcat-9.0.56/webapps/test -v /home/tomcat/build/tomcat/logs/:/usr/local/apache-tomcat-9.0.56/logs diytomcat
5、在挂载的目录中添加index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <title>这是个标题</title> </head> <body> <h1>这是一个一个简单的HTML</h1> <p>Hello World!</p> </body> </html>
6、访问测试

发布镜像到DockerHub
1.登录https://hub.docker.com/ DockerHub官网进行注册
2.进行登录,docker login -u 用户名
Docker网络
------------恢复内容开始------------
docker安装
卸载旧版
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
需要的安装包
yum install -y yum-util
设置镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新软件包的索引
yum makecache fast
安装最新版的docker引擎
yum install docker-ce docker-ce-cli containerd.io
启动docker
systemctl start docker
查看docker版本
docker version
测试helloworld
docker run hello-world
查看镜像
docker images
卸载docker
# 卸载docker yum remove docker-ce docker-ce-cli containerd.io # 删除资源 rm -rf /var/lib/docker
阿里云镜像加速

docker run的分析流程图

docker底层原理
docker是一个c/s结构系统,docker的守护进程运行在主机上,通过socket客户端访问!
dockerServer接收到Docker-Client 的指令,就会执行这个命令。

docker为什么比VM快?
- docker有比虚拟机更少的抽象
- docker利用的是宿主机的内核 ,vm需要的是Guest OS
镜像命令
docker images
docker images (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE #解释: 1.REPOSITORY 镜像的仓库源 2.TAG 镜像的标签 3.IMAGE ID 镜像的id 4.CREATED 镜像的创建时间 5.SIZE 镜像的大小 # 可选参数 -a/--all 列出所有镜像 -q/--quiet 只显示镜像的id
docker search 搜索镜像
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11676 [OK]
mariadb MariaDB Server is a high performing open sou… 4448 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 867 [OK]
percona Percona Server is a fork of the MySQL relati… 561 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 369 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 91
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 89
centurylink/mysql Image containing mysql. Optimized to be link… 59 [OK]
databack/mysql-backup Back up mysql databases to... anywhere! 52
prom/mysqld-exporter 43 [OK]
#可选参数
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
#搜索收藏数大于3000的镜像
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker search mysql --filter=STARS=3000
docker pull 镜像名[:tag] 下载镜像
Using default tag: latest latest: Pulling from library/mysql #如果不写tag默认是last b380bbd43752: Pull complete # 分层下载 f23cbf2ecc5d: Pull complete 30cfc6c29c0a: Pull complete b38609286cbe: Pull complete 8211d9e66cd6: Pull complete 2313f9eeca4a: Pull complete 7eb487d00da0: Pull complete 4d7421c8152e: Pull complete 77f3d8811a28: Pull complete cce755338cba: Pull complete 69b753046b9f: Pull complete b2e64b0ab53c: Pull complete Digest: sha256:6d7d4524463fe6e2b893ffc2b89543c81dec7ef82fb2020a1b27606666464d87 #签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #下载来源地址
下载指定版本
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql b380bbd43752: Already exists f23cbf2ecc5d: Already exists 30cfc6c29c0a: Already exists b38609286cbe: Already exists 8211d9e66cd6: Already exists 2313f9eeca4a: Already exists 7eb487d00da0: Already exists a71aacf913e7: Pull complete 393153c555df: Pull complete 06628e2290d7: Pull complete ff2ab8dac9ac: Pull complete Digest: sha256:2db8bfd2656b51ded5d938abcded8d32ec6181a9eae8dfc7ddf87a656ef97e97 Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7
docker rmi 删除镜像
#单个 (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker rmi -f 镜像id #多个 (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker rmi -f 镜像id 镜像id 镜像id # 删除多个 (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker rmi -f $(docker images -aq)
容器命令
拉取镜像
docker pull centos
运行容器
docker run [可选参数] image #参数说明 --name="名字" 指定容器名字 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 ( -p ip:主机端口:容器端口 配置主机端口映射到容器端口 -p 主机端口:容器端口 -p 容器端口 ) -P 随机指定端口(大写的P)
进入容器
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker run -it centos /bin/bash [root@18334bc4d947 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
退出容器
# 停止并退出容器
[root@18334bc4d947 /]# exit
exit
# Ctrl+P+Q 不停止退出容器
列出显示过的容器
#docker ps # 列出当前正在运行的容器 -a # 列出所有容器的运行记录 -n=? # 显示最近创建的n个容器 -q # 只显示容器的编 (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1aa7c01b3521 centos "/bin/bash" 2 days ago Up 2 days affectionate_robinson (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 18334bc4d947 centos "/bin/bash" 3 minutes ago Exited (0) 2 minutes ago distracted_lamport 1aa7c01b3521 centos "/bin/bash" 2 days ago Up 2 days affectionate_robinson 4030621a004a centos "/bin/bash" 2 days ago Exited (0) 2 days ago vibrant_edison (base) [root@izbp13b6n9vmw09d96m7suz ~]#
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -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 logs -tf 容器id docker logs --tail number 容器id #num为要显示的日志条数
查看容器中进程信息
base) [root@izbp13b6n9vmw09d96m7suz ~]# docker top 1aa7c01b3521 UID PID PPID C STIME TTY TIME CMD root 14335 14300 0 Nov11 pts/0 00:00:00 /bin/bash root 14477 14300 0 Nov11 pts/1 00:00:00 /bin/bash
查看容器元数据信息
[ { "Id": "1aa7c01b352173b8742e030a644b48c0e042f975dd1366ea4c4dd907c36066b2", "Created": "2021-11-10T16:13:41.354347938Z", "Path": "/bin/bash", "Args": [], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 14335, "ExitCode": 0, "Error": "", "StartedAt": "2021-11-10T16:13:41.726695064Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6", "ResolvConfPath": "/var/lib/docker/containers/1aa7c01b352173b8742e030a644b48c0e042f975dd1366ea4c4dd907c36066b2/resolv.conf", "HostnamePath": "/var/lib/docker/containers/1aa7c01b352173b8742e030a644b48c0e042f975dd1366ea4c4dd907c36066b2/hostname", "HostsPath": "/var/lib/docker/containers/1aa7c01b352173b8742e030a644b48c0e042f975dd1366ea4c4dd907c36066b2/hosts", "LogPath": "/var/lib/docker/containers/1aa7c01b352173b8742e030a644b48c0e042f975dd1366ea4c4dd907c36066b2/1aa7c01b352173b8742e030a644b48c0e042f975dd1366ea4c4dd907c36066b2-json.log", "Name": "/affectionate_robinson", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": [ "438315d841011e552b3d4233a729963fb41c0489a6d209be7a5a312d85fa2339" ], "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/98211bc9a3ebcfe37543bee0b99de54c0fe220801e31a1e8e598d1fbf09d56f4-init/diff:/var/lib/docker/overlay2/0dd1cf1678aea592576c7e779d29e0bf0cd6cbd4d3e412fb0f584229fe56bc2d/diff", "MergedDir": "/var/lib/docker/overlay2/98211bc9a3ebcfe37543bee0b99de54c0fe220801e31a1e8e598d1fbf09d56f4/merged", "UpperDir": "/var/lib/docker/overlay2/98211bc9a3ebcfe37543bee0b99de54c0fe220801e31a1e8e598d1fbf09d56f4/diff", "WorkDir": "/var/lib/docker/overlay2/98211bc9a3ebcfe37543bee0b99de54c0fe220801e31a1e8e598d1fbf09d56f4/work" }, "Name": "overlay2" }, "Mounts": [], "Config": { "Hostname": "1aa7c01b3521", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "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": "77f0069239dce7d80e22ccb19b07175416353d74a92aa41b96e8e02bd1455204", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/77f0069239dc", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "ab6fe032f532d269122b4e7508fc215e43b2778a717e349bea6ac9f5725ce259", "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": "05cf75429b1d15b2c84e4f98f08b9724fd8cbc9e1ffae4557256b2aa61902af2", "EndpointID": "ab6fe032f532d269122b4e7508fc215e43b2778a717e349bea6ac9f5725ce259", "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 进入容器后开启一个新的终端,可以在里面操作 docker exec -it 1aa7c01b3521 /bin/bash docker attach 进入容器正在执行的终端,不会启动新的进程 docker attach 1aa7c01b3521
从容器拷贝文件到目标主机
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d2e0e6a3eae centos "/bin/bash" 2 minutes ago Up 2 minutes sharp_diffie (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker cp 2d2e0e6a3eae:/home/Test.java /home (base) [root@izbp13b6n9vmw09d96m7suz ~]# ls /home flask_min_shop go_blog jenkins quantaxis superset test_flaskapp_builder Test.java yaozhiSpider.py fsociety home jinkou.txt spider taiga test_flask_dev wx_food ZeroNet
常用命令小结

安装nginx
# 搜索镜像 docker search nginx # 下载镜像 docker pull nginx
# 进入容器
docker exec -it nginx01 /bin/bash # 启动nginx docker run -d --name nginx01 -p 3344:80 nginx -d 后台运行 --name 容器名称 -p 宿主机端口
端口暴露的概念

安装tomcat
# 官方安装 docker run -it --rm tomcat:9.0(一般用于测试,用完就删除) #下载镜像 docker pull tomcat # 运行 docker run -it -p 3355:8080 --name tomcat01 tomcat # 测试访问(官方的是阉割版,没有webapps,默认最小的镜像)
部署es+kibana
es
# es暴露很多的端口 # es十分耗内存 1.j几个G # es的数据一般要挂载到安全目录 # --net somenetwork 网络配置 # 启动容器 elasticsearch docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2 # 测试es是否成功 #增加内存限制 修改配置文件 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms64m -Xms512m" -e "discovery.type=single-node" elasticsearch:7.6.2
kibana连接es

可视化
portainer
Docker图形化界面管理工具!
# 镜像启动 docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name prtainer-test portainer/portainer # 访问 localhost:9000
Docker镜像的加载原理
什么是docker镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。
所有的应用,直接打包docker镜像,直接跑起来
如何获取镜像
- 从远程仓库下载
- 自己制作一个镜像dockerfile
- 其他地方
Docker镜像加载的原理
unionFS(联合文件系统)
联合文件系统(UnionFS)是一种轻量级的高性能分层文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,应用看到的是挂载的最终结果。
联合文件系统是实现Docker镜像的技术基础。Docker镜像可以通过分层来进行继承。例如,用户基于基础镜像(用来生成其他镜像的基础,往往没有父镜像)来制作各种不同的应用镜像。这些镜像共享同一个基础镜像层,提高了存储效率。此外,当用户改变了一个Docker镜像(比如升级程序到新的版本),则会创建一个新的层(layer)。因此,用户不用替换整个原镜像或者重新建立,只需要添加新层即可。用户分发镜像的时候,也只需要分发被改动的新层内容(增量部分)。这让Docker的镜像管理变得十分轻量级和快速。
docker镜像加载原理
docker的镜像实际上是由一层一层的文件系统构成

bootfs(boot file system) 主要包含bootloader和kernel, bpotloader 主要是引导加载kernel,当我们加载镜像的时候,会通过bootloader加载kernal,Docker镜像最底层是bootfs,当boot加载完成后整个kernal内核都在内存中了,bootfs也就可以卸载,值得注意的是,bootfs是被所有镜像共用的,许多镜像images都是在base image(rootfs)基础上叠加的
rootfs (root file system),在bootfs之 上.包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是 各种不同的操作系统发行版,比如Ubuntu, Centos等等
分层理解
可以看到docker下载镜像是一层层的

通过docker images inspect命令查看镜像分层

所有的docker镜像都是起始于一个docker镜像,当进行修改或者增加新的内容的时候,就会在当前镜像层上创建新的层



docker镜像默认都是只读的,当容器启动时,一个新的可写层被加载到镜像顶部
这一层就是所说的容器层,容器之下叫做镜像层!

Commit镜像
使用docker commit 命令提交容器成为一个新的版本
docker commit -m=“提交的描述信息” -a="作者" 容器id 目标镜像名:[TAG]
由于默认的Tomcat镜像的webapps文件夹中没有任何内容,需要从webapps.dist中拷贝文件到webapps文件夹。下面自行制作镜像:就是从webapps.dist中拷贝文件到webapps文件夹下,并提交该镜像作为一个新的镜像。使得该镜像默认的webapps文件夹下就有文件。具体命令如下:
docker commit -a="qijunL" -m="add webapps app" 5c6e2f39e6ab tomcat02:1.0

容器数据卷
什么是容器数据卷
数据不应该放到容器中,数据要持久化
例如:mysql数据要存储在本地
容器间的数据共享技术,docker容器中产生的数据,同步到本地,就是卷技术
实际上就是目录挂载,将容器内的目录挂载到服务器上

容器的持久化和同步,容器间的数据共享。
使用数据卷
命令挂载 -v,实现数据的双向绑定
docker run -it -v 主机目录:容器目录
docker run -it -v /home/test:/home centos /bin/bash
# 通过docker inspect 容器id 查看挂载情况

测试
- 停止容器
- 修改宿主机上的文件
- 启动容器
- 容器内的数据依旧同步
好处:
在本地修改,不用进入容器
docker 安装mysql
mysql持久化的问题
#下载镜像 docker pull mysql:5.7 #运行容器 mysql数据挂载 -d:后台运行 -p:端口映射 -v:卷挂载 -e 环境配置 --name 容器名字 docker 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
新建数据库,并查看所挂载到本地的数据卷,实现容器数据持久化功能

具名和匿名挂载
# 匿名挂载 -v 容器内路径 docker -d -P --name nginx01 -v /etc/nginx nginx #查看volume的情况 docker volume ls base) [root@izbp13b6n9vmw09d96m7suz data]# docker volume ls DRIVER VOLUME NAME local 0abd9f8442fa92c34a14b12a9bf99e2f7445ff4b3c8a69c661f9d9892b640926 #具名挂载 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx # 通过:-v 卷名:容器内路径 (base) [root@izbp13b6n9vmw09d96m7suz data]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx bba50008c4f7a4e7465b2eaba3f3efc55f590d6feb906e8747801e1b46d5514e (base) [root@izbp13b6n9vmw09d96m7suz data]# docker volume ls DRIVER VOLUME NAME local juming-nginx

如果没有指定主机目录,默认挂载在:/var/lib/docker/volumes/xxx/_data
通过具名挂载可以方便找到我们的一个卷,所以推荐使用具名挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
拓展
# 通过 -v 容器路径:ro rw改变读写权限
一旦设置权限,容器对挂载出来的内容就有了限定
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
# ro说明这个路径只能通过宿主机来操作,容器内是无法操作的
dockerfile挂载
FROM centos VOLUME ["volume01","volume02"] CMD echo "---end----" CMD /bin/bash

启动容器

自动挂载数卷(匿名挂载)

查看卷的挂载路径
docker inspect 容器id

如果构建镜像时没有挂载卷,就要手动挂载 -v 卷名:容器内路径
数据容器卷
容器之间数据同步

启动三个容器来测试
启动父容器(数据卷容器)

启动第二个容器

数据同步测试

同理其他的容器也可以通过--volumes-from 挂载到1或者2
这里文件是个互相拷贝,技术数据卷容器删除或者停止,其他的容器数据还在。
多个mysql数据共享
docker 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
#第二个mysql
docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
容器间配置信息传递,数据卷容器的生命周期一致持续到没有容器使用为止
一旦数据持久化到本地,本地的数据也不会因为容器的消失而删除
DockerFile
用来构架docker镜像文件!命令参数脚本
构建步骤
- 编写一个dockerfile文件
- docker build构建一个镜像
- docker 运行镜像
- docker push发布镜像(DockerHub、阿里云镜像)
指令说明
- 每个保留关键字都是大写字母
- 从上到下执行
- #表示注释
- 每一个指令都会被创建一个新的镜像层,并提交。

dockerfile是面向开发的,以后我们要发布项目,需要做镜像,企业交互的标准
Dockerfile:构建文件,定义一切的步骤
DockerImages:通过Dockerfile构建生成的镜像,最终发布和运行产品
Docker容器:容器就是镜像运行起来的服务器
指令使用
FROM #基础镜像,从这里开始 MAINTAINER # 镜像作者等信息 RUN #构建镜像时候需要运行的命令 ADD # 步骤,tomcat镜像,tomacat压缩包 WORKDIR #镜像的工作目录 VOLUME #挂载目录 EXPOSE #保留端口配置 CMD # 指定容器启动的时候需要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT #指定这个容器启动时候要运行的命令,可以追加命令 ONBUILD #当构建一个被继承的DockerFile 会运行 COPY #类似ADD 将文件拷贝到镜像中 ENV #构建的时候设置环境变量

实战测试:构建centos
编写Dockerfile文件
FROM centos MAINTAINER qijunl<1754168810@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "----end---" CMD /bin/bash
构建镜像
docker build -f mydockerfile-centos -t mycentos:0.1 .
构建成功
Removing intermediate container 5773ceddb8c8
---> 43f0c80aabf5
Successfully built 43f0c80aabf5
Successfully tagged mycentos:0.1
测试运行
(base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker run -it mycentos:0.1
[root@f82c568f4d57 local]# pwd
/usr/local
[root@f82c568f4d57 local]# vim
[root@f82c568f4d57 local]#
查看镜像构建过程
(base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker history 43f0c80aabf5 IMAGE CREATED CREATED BY SIZE COMMENT 43f0c80aabf5 4 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B 1b534adc5e28 4 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 50d9578d128e 4 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B ee4d20e9e7e0 4 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B 18b6b20f059b 4 minutes ago /bin/sh -c yum -y install net-tools 14.6MB 32ff8c1cb934 4 minutes ago /bin/sh -c yum -y install vim 64.7MB 6bb401d5044b 5 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B 2215d4b1ce09 5 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B 03fbb81bc3f0 5 minutes ago /bin/sh -c #(nop) MAINTAINER qijunl<1754168… 0B 5d0da3dc9764 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 3 months ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB
CMD 和ENTRYPOINT 说明
CMD
测试cmd:指定这个容器启动要运行命令,只有最后一个会生效,可以被替代
(base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# vim dockerfile-cmd-test FROM centos CMD ["ls","-a"] (base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker build -f dockerfile-cmd-test -t cmdtest . (base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker run 4e453e592d1b . .. .dockerenv bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var (base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker run 4e453e592d1b -l #追加-l ls -al docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown. (base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker run 4e453e592d1b ls -la total 56 drwxr-xr-x 1 root root 4096 Dec 28 14:31 . drwxr-xr-x 1 root root 4096 Dec 28 14:31 .. -rwxr-xr-x 1 root root 0 Dec 28 14:31 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 340 Dec 28 14:31 dev drwxr-xr-x 1 root root 4096 Dec 28 14:31 etc drwxr-xr-x 2 root root 4096 Nov 3 2020 home lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64 drwx------ 2 root root 4096 Sep 15 14:17 lost+found drwxr-xr-x 2 root root 4096 Nov 3 2020 media drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt drwxr-xr-x 2 root root 4096 Nov 3 2020 opt dr-xr-xr-x 152 root root 0 Dec 28 14:31 proc dr-xr-x--- 2 root root 4096 Sep 15 14:17 root drwxr-xr-x 11 root root 4096 Sep 15 14:17 run lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Nov 3 2020 srv dr-xr-xr-x 13 root root 0 Dec 28 14:31 sys drwxrwxrwt 7 root root 4096 Sep 15 14:17 tmp drwxr-xr-x 12 root root 4096 Sep 15 14:17 usr drwxr-xr-x 20 root root 4096 Sep 15 14:17 var
ENTRYPOINT:命令追加
(base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker build -f mydockerfile-entrypoint -t entrypoint-test . Sending build context to Docker daemon 4.096kB Step 1/2 : FROM centos ---> 5d0da3dc9764 Step 2/2 : ENTRYPOINT ["ls","-a"] ---> Running in 80579cc767e9 Removing intermediate container 80579cc767e9 ---> 78f17773f684 Successfully built 78f17773f684 Successfully tagged entrypoint-test:latest (base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker run 78f17773f684 . .. .dockerenv bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var (base) [root@izbp13b6n9vmw09d96m7suz mydockerfile]# docker run 78f17773f684 -l total 56 drwxr-xr-x 1 root root 4096 Dec 28 14:58 . drwxr-xr-x 1 root root 4096 Dec 28 14:58 .. -rwxr-xr-x 1 root root 0 Dec 28 14:58 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 340 Dec 28 14:58 dev drwxr-xr-x 1 root root 4096 Dec 28 14:58 etc drwxr-xr-x 2 root root 4096 Nov 3 2020 home lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64 drwx------ 2 root root 4096 Sep 15 14:17 lost+found drwxr-xr-x 2 root root 4096 Nov 3 2020 media drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt drwxr-xr-x 2 root root 4096 Nov 3 2020 opt dr-xr-xr-x 153 root root 0 Dec 28 14:58 proc dr-xr-x--- 2 root root 4096 Sep 15 14:17 root drwxr-xr-x 11 root root 4096 Sep 15 14:17 run lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Nov 3 2020 srv dr-xr-xr-x 13 root root 0 Dec 28 14:58 sys drwxrwxrwt 7 root root 4096 Sep 15 14:17 tmp drwxr-xr-x 12 root root 4096 Sep 15 14:17 usr drwxr-xr-x 20 root root 4096 Sep 15 14:17 var
Tomcat镜像
1、准备镜像文件Tomcat压缩包,jdk压缩包

2、编写Dockerfile文件,官方Dockerfile,build会自动寻找这个文件,就不需要-f指定
FROM centos MAINTAINER qijunl<1754168810@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u11-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.56.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_11 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.56 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.56 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 808 CMD /usr/local/apache-tomcat-9.0.56/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.56/bin/logs/catalina.out
3、构建镜像
docker build -t diytomcat .
4、运行容器
docker run -d -p 8080:8080 --name qijunl-tomcat-test -v /home/tomcat/build/tomcat/test:/usr/local/apache-tomcat-9.0.56/webapps/test -v /home/tomcat/build/tomcat/logs/:/usr/local/apache-tomcat-9.0.56/logs diytomcat
5、在挂载的目录中添加index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <title>这是个标题</title> </head> <body> <h1>这是一个一个简单的HTML</h1> <p>Hello World!</p> </body> </html>
6、访问测试

发布镜像到DockerHub
1.登录https://hub.docker.com/ DockerHub官网进行注册
2.进行登录,docker login -u 用户名
3、登录
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
(base) [root@izbp13b6n9vmw09d96m7suz ~]#
4、登录成功

5、提交镜像,带上版本号

发布镜像到阿里云镜像服务
1、登录阿里云
2、找到容器镜像服务
3、创建命名空间
4、创建容器镜像
5、登录(参考官方文档)
6、创建带有版号的镜像
7、push
总结

Docker网络

Docker 0
每启动一个docker容器,docker就会给docker容器分配一个ip,就会有一个docker0桥接模式,使用的就是veth-pair技术

容器与容器之间是能相互ping通的

tomcat01 和tomcat02是公用一个路由器的,docker0

Docker使用的linux的桥接,宿主机是一个docker容器的网桥 docker0,docker网络是虚拟的
容器删除,对应网桥就不存在
--link
host映射
自定义网络
查看所以的docker网络

网络模式
bridge:桥接模式
none:不配置网络
host:和宿主机共用网络
container:容器网络连通
docker run -d -P --name tomcat01 --net bridge tomcat
# 自定义一个网络连接
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
5ef33b87510f484b79df2b63fec30862a4c872456a2e645457bdcde648ab0947
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
05cf75429b1d bridge bridge local
899c82b625e1 host host local
5ef33b87510f mynet bridge local
19ac7425a9a4 none null local

分别启动两个tomcat
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat bc149eead0df28d408a3b201b4776bc44447e620decfd48324e5f804a0fd57df (base) [root@izbp13b6n9vmw09d96m7suz ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat 795ad630dc260e3bd3d6a56e22e679a0ac82f1085e3a78f39561dae25f1abbc1
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker inspect myne

可以通过名字直接ping,推荐使用
网络连接
连接一个网络到一个容器上


(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker network connect mynet tomcat01
(base) [root@izbp13b6n9vmw09d96m7suz ~]# docker network inspect mynet

Redis集群
搭建三主三从redis集群

首先停掉所有的容器
docker rm -f $(docker ps -qa)
创建网络名为redis的自定义网络
docker network create redis --subnet 172.16.0.0/16

通过脚本创建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 172.38.0.1${port} cluster-announce-port 6379 cluster-announce-bus-port 16379 appendonly yes EOF done
分别启动6个Redis容器,设置对应的容器数据卷
docker run -p 6371:6379 -p 16371: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 172.16.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf 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 172.16.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf 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 172.16.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf 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 172.16.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf 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 172.16.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf 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 172.16.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
通过脚本一次性启动6个Redis容器
for port in $(seq 1 6); \ do docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \ -v /mydata/redis/node-${port}/data:/data \ -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.16.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \ done

进入redis-1创建集群
docker exec -it redis-1 sh redis-cli --cluster create 172.16.0.11:6379 172.16.0.12:6379 172.16.0.13:6379 172.16.0.14:6379 172.16.0.15:6379 172.16.0.16: 6379 --cluster-replicas 1
查看集群信息
redis-cli -c cluster info
查看节点信息
cluster nodes
SpringBoot 微服务打包
DockerCompose
管理容器,定义和运行多个容器
定义和配置多个容器
YAML配置环境
批量容器编排
下载
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-compose docker-compose --version
yaml编写规则
#第一层 version: "3.9" #第二层 services: web: build: . ports: - "5000:5000" volumes: - .:/code environment: FLASK_ENV: development redis: image: "redis:alpine" # 第三层 其他------
docker-compose启动一个wp
docker-compose.yml
version: "3.9" services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest volumes: - wordpress_data:/var/www/html ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: db_data: {} wordpress_data: {}
启动
docker-compose up -d
docker-compose启动springboot服务
1、编写代码
2、Dockerfile构建镜像
FROM java:8 COPY *.jar /app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
3、docker-compose 编排项目
version: '3.3' services: demo: build: . image: demo depends_on: - redis ports: - "8080:8080" redis: image: "library/redis:alpine"
4、上传服务器 docker-compose -up

总结
假设项目更新
docker-compose up --build #重新构建
工程、服务、容器
Docker swarm
安装四台服务器
工作模式
集群搭建
初始化节点
docker swarm init --advertise-addr 192.168.80.128
加入节点
docker swarm join --token SWMTKN-1-32rtob9179zpgeqsw7qfu9lef9aziuitou883n8gvnlnsomsq3-1zk4kaj5yhsk814hocm00cc1k 192.168.80.128:2377
获取令牌,在初始化的主节点
docker swarm join-token manager
docker swarm join-token worker
删除指定的节点
docker node rm g36lvv23ypjd8v7ovlst2n3yt
主动离开集群,让节点处于down状态,才能删除
docker swarm leave
管理节点,解散集群
docker swarm leave --force
RAFT
至少三个节点 集群高可用 >1台管理节点存活
swarm集群创建弹性服务
灰度发布:金丝雀发布
先创建集群
docker run 容器启动 不具有扩缩容
docker service 服务 #具有具有扩缩容滚动更新
查看服务
docker service ls
动态扩缩容
docker service update --replicas 3 my-nginx
docker service scale my-nginx=5
总结
swarm

浙公网安备 33010602011771号