docker技术学习

博客 动态
0 160
羽尘
羽尘 2022-06-21 01:00:48
悬赏:0 积分 收藏

docker技术学习

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:      trueServer: 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/dockersudo tee /etc/docker/daemon.json <<-'EOF'{  "registry-mirrors": ["https://cgys1rlc.mirror.aliyuncs.com"]} sudo systemctl daemon-reloadsudo systemctl restart docker

回顾helloword的整个流程

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

docker常用命令

帮助命令

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

帮助文档地址:

镜像命令:

docker images #查看所有镜像

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

docker search #搜索镜像

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

docker pull #下载镜像

docker pull mysql #下载mysqldocker 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			#删除制定的容器 ,如果删除正在运行的容器  -fdocker 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 容器iddocker 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                CMDroot                18275               18256               0                   15:17               ?                   00:00:00            /bin/sh -c while true;do echo kuangshen;sleep 1;doneroot                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归档文件对应importhistory 展示一个镜像形成历史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.查找mysql2.下载镜像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 nginxdocker run -d -p --name nginx01 -v juming-nginx:/etc/nginx:ro nginx

dockerfile

1编写镜像文件dockerfile1

FROM centosVOLUME ["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 /]# lsbin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var	   volume02dev  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# lsdemo01.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.7docker 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 centosMAINTAINER  kuangshen<24736743@qq.com>ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vimRUN  yum  -y install net-toolsEXPOSE 80CMD echo A$MYPATHCMD  /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 centosCMD ['ls',"-a"]
docker build -f xxx -t cmdtest .
docker run aa1111  会自动将最后的cmd命令执行,如果想追加命令不能在后面直接加应该这样写docker run aa1111  ls-al

entrypoint的file

FROM centosENTRYPOINT ['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 forever2: 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 forever3: 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中所有的网络接口都是虚拟的,虚拟转发效率高(内网传递文件)

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

场景:编写了一个微服务,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 tomcatdocker 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 lsNETWORK ID     NAME      DRIVER    SCOPE430c633bd795   bridge    bridge    locala288f78f519b   host      host      local74783c519ad2   mynet     bridge    local7d3b1deefd46   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 lsdocker network inspect redis

3.创建6个redis服务

for port in $(seq 1 6); \do \mkdir -p /mydata/redis/node-${port}/conftouch /mydata/redis/node-${port}/conf/redis.confcat << EOF > /mydata/redis/node-${port}/conf/redis.confport 6379bind 0.0.0.0Cluster-enabled yesCluster-config-file nodes.confCluster-node-timeout 5000Cluster-announce-ip 192.168.0.1${port}Cluster-announce-port 6379Cluster-announce-bus-port 16379appendonly yesEOFdone

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 -c127.0.0.1:6379> cluster infocluster_state:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0cluster_slots_fail:0cluster_known_nodes:6cluster_size:3cluster_current_epoch:6cluster_my_epoch:1cluster_stats_messages_ping_sent:209cluster_stats_messages_pong_sent:229cluster_stats_messages_sent:438cluster_stats_messages_ping_received:224cluster_stats_messages_pong_received:209cluster_stats_messages_meet_received:5cluster_stats_messages_received:438

8.设置值

set a bget a可以正常获取

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

192.168.0.13:6379> cluster nodesdda9df6e38727c5ad0667278cb77f96d91973f65 192.168.0.15:6379@16379 slave f6dc83295bb2d7e9a0436fff935dbd6e441ef8cf 0 1655738988807 5 connectedcf8b3f0cc101c2bce9f57d10349676a37ed0538c 192.168.0.14:6379@16379 slave 2c1949dcb59bff7a4cb49b0af04d15978987daaa 0 1655738988507 4 connected2c1949dcb59bff7a4cb49b0af04d15978987daaa 192.168.0.13:6379@16379 myself,master - 0 1655738986000 3 connected 10923-1638386ad41983210bdd6fd8c723851820852e57f2c0d 192.168.0.12:6379@16379 master - 0 1655738988306 2 connected 5461-109221e1386760e3421384022567658601b9dcae3ef02 192.168.0.16:6379@16379 slave 86ad41983210bdd6fd8c723851820852e57f2c0d 0 1655738988000 6 connectedf6dc83295bb2d7e9a0436fff935dbd6e441ef8cf 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:8COPY *.jar /app.jarCMD ["--server.port=8080"]EXPOSE 8080ENTRYPOINT ["java","-jar","/app.jar"]

4.构建镜像

将dockerfile+jar包上传到服务器

docker build -t kuangshen666 .

5发布运行

docker run -d -p 8080:8080 --name kunagshen-springboot-web kuangshen666
posted @ 2022-06-20 23:48 三号小玩家 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    羽尘

    羽尘 (王者 段位)

    2335 积分 (2)粉丝 (11)源码

     

    温馨提示

    亦奇源码

    最新会员