docker技术学习流程

Docker学习笔记 - 第一篇:初识 最近疫情闹的,在家温习之前在私塾在线买的cc老师的课程Docker,为了加深印象及鞭策一下自己换高薪工作,坚持做系列笔记,记录自己成长的点点滴滴。不过看到消息cc老师最新一期的高级架构师课程也要推出了,里面包含了现在主流的架构,以及最新的技术,据说从理论到运用全部带着做,像现在面试常用的 Netty, Redis, Kafka,Zookeeper, Dubbo, Nginx + openResty + kong + Lua, ElasticSearch等技术都深入源码层级,现在出门面试动辄源码也挺伤不起. 阅读详情

docker安装

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

官网: Install Docker Engine on Ubuntu | Docker Documentation

帮助文档:

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
Java Webservice Axis2 Client(含soapheader验证) 立即下载

相关推荐

【软路由】旁路由使用配置教程

【软路由】旁路由使用配置教程简介旁路由好处旁路由配置步骤1、修改管理地址网段 简介 我们都知道,软路由一般有两种使用方式,一种是作为承担DHCP分配的主路由,而另一种就是作为不承担DHCP分配功能的旁路由使用。今天就来介绍如何将软路由配置成为旁路由。 旁路由好处 旁路由最大的好处就是它不承担DHCP分配任务,这意味着它的对网络的影响极小。即使突然故障也不会导致整个网络瘫痪。更别提软路由的配置复杂,用户可能还经常修改上面的网络配置,一旦出错就是整个网络瘫痪,如果家中还有其他人使用网络,影响实在是不好。 建议有

博客 4万+

【ROS使用RealSense-D435i,RealSense-ROS】

https://www.intelrealsense.com/get-started-depth-camera/请访问 GitHub 上的 Linux* 发行版页面以获取安装说明。安装软件包:https://github.com/IntelRealSense/librealsense/blob/development/doc/distribution_linux.md#installing-the-packages 确保安装了 apt HTTPS 支持: 将服务器添加到存储库列表中: 安装库(

u013454780的博客 1万+

【20230415】Ubuntu22.04双屏显示触屏设置,解决触摸点和响应位置不一致的问题

双屏显示时,如果存在一个触摸屏,有可能会出现触摸点和响应位置不一致的问题。我的显示器配置如下:一个34寸,3440*1440;一个22英寸触摸屏,1920*1080。

Creationyang的博客 3216

精通 Scala 机器学习(一)

这本书是关于机器学习的,以 Scala 的函数式编程方法为重点,以 Spark 大数据处理为目标。大约九个月前,当我被邀请撰写这本书时,我的第一个反应是,虽然上述提到的每个主题都已经被彻底研究和撰写过,但我确实参与过足够的讨论,知道将任何两个主题结合起来都会面临挑战,更不用说将这三个主题全部结合在一本书中。这个挑战激起了我的兴趣,结果就是这本书。并非每一章都像我期望的那样流畅,但在每天技术都有巨大进步的世界里,这可能是在所难免的。我确实有一份真正的工作,写作只是表达我想法的一种方式。让我们从机器学习开始。机

龙哥盟 2884

基于Web的智能家居(源码+开题)

实践上,智能家居系统的普及和应用将极大改善人们的居住体验,提高生活质量,同时也有助于促进智能家居产业链的发展和完善,为社会经济发展注入新的活力。此外,本研究还将对基于Web的智能家居系统的用户体验进行深入研究,通过用户调研和数据分析,不断优化系统功能和界面设计,提升用户的使用体验和满意度。针对以上问题,本研究将综合运用物联网、云计算、大数据等新一代信息技术,通过系统架构设计、功能模块开发、安全性保障、用户体验优化等多个方面的研究工作,力求为基于Web的智能家居系统的研发和应用提供全面而有效的解决方案。

sryue06的博客 1904

Python爬虫实战:手把手教你用Selenium绕过药监局网站的反爬机制(附完整代码)

本文详细介绍了如何使用Selenium绕过药监局网站的反爬机制,提供了一套完整的Python爬虫实战方案。通过浏览器指纹伪装、动态等待策略、会话维持技巧以及分布式采集设计,帮助开发者高效爬取药监局数据,解决政府类网站常见的反爬挑战。

weixin_42620255的博客 738

Docker

Docker个人学习笔记

kkoyy459的博客 2万+

OS实验xv6 6.S081 开坑

OS实验xv6 6.S081 开坑 终于把xv6 2019 6.S081做完了,网络部分没有写,因为有计网实验了。怎么说呢,xv6的坑有点多,能做完多亏了:和我同学ljj交流,参考RedemptionC老哥的博客(他写的非常详细,遗憾的是,他好像没有写mmap),再者就是参考这位老哥的做法(没有源码,写得不是特别详细,不过有借鉴作用,mmap就是借鉴了他的思想)……废话不多说了,直接开始。 实验指导 首推RedemptionC的博客 这位老哥的个人博客 xv6 6.S081官网(后面的实验都要参考官网

不定期更新系统使用、编程小技巧,哔哩哔哩账号:https://space.bilibili.com/399455629,欢迎关注 4493

Linux 系统管理的哲学(二)

命令行是一种在用户和操作系统之间提供文本模式界面的工具。命令行允许用户将命令输入计算机进行处理并查看结果。Linux 命令行接口是用 bash(Bourne shell)、csh (C shell)和 ksh (Korn shell)这样的 shell 实现的,这里仅举三个例子。任何 shell 的功能都是将用户输入的命令传递给操作系统,操作系统执行命令并将结果返回给 shell。对命令行的访问是通过某种终端接口进行的。现代 Linux 计算机中常见的终端接口主要有三种类型,但术语可能会令人混淆。

龙哥盟 910

HQChart实战教程54:Renko砖形K线图实现详解

Renko图(砖形图)起源于日本,只关注价格变动而忽略时间和成交量因素: 2.2 算法说明 初始化:使用第一根K线的收盘价创建第一个砖块 变动检测:计算当前价格与最后一个砖块的差值 砖块生成: 当价格变动≥砖块大小时,生成新砖块 当价格变动不足时,更新当前砖块的高低价 方向判断:根据价格变动方向确定砖块颜色 三、完整实现代码 四、Renko图的高级应用 4.1 动态砖块大小调整 4.2 Renko交易策略 三砖反转策略:趋势跟踪策略:本文详细介绍了Renko图的实现原理和在HQChart中的应

QQ_778132974的博客 875

1、开启 Microsoft Power Automate 自动化之旅

本文介绍了 Microsoft Power Automate 的基本概念和其在信息时代自动化需求中的重要作用。Power Automate 是 Power Platform 的一部分,能够通过无代码/低代码的方式自动化处理重复性任务,例如邮件处理、文件复制等,从而提升工作效率。文章还详细讲解了 Power Automate 的核心术语、登录方式、创建第一个流程的操作步骤,并通过示例帮助用户快速上手。无论是终端用户还是管理员,都可以通过本文了解如何利用 Power Automate 实现业务流程自动化。

corn8的博客 170

使用Docker部署机器学习服务

1. 背景介绍 随着机器学习和深度学习技术的快速发展,越来越多的企业和开发者开始将这些技术应用于实际项目中。然而,在部署机器学习服务时,往往会遇到各种环境配置、依赖管理和版本控制等问题。为了解决这些问题,Docker作为一种轻量级的容器技术,为部署机器学习服务提供了便捷的解决方案。 本文将详细介绍如何使用Docker部署机器学习服务,包括核心概念、算法原理、具体操作步骤、最佳实践、实际应用场景...

AI天才研究院 1230

SST专题(2-2)MMC-SST 输入级的工作原理及数学模型

本文研究了MMC-SST和iMMC-SST的电路结构及工作原理。系统由前级MMC电路和后级DC/DC电路组成,MMC负责电能转换和能量存储,DC/DC电路进行电压电流调节。重点分析了半桥型子模块(SM)的开关组态和工作原理,建立了平均值模型,推导了上下桥臂电压方程和环流特性。研究表明,通过合理控制子模块充放电模态可维持端口电压平衡,上下桥臂电压调控可影响网侧功率吸收,而环流特性对中压直流侧电压具有重要影响。

嵌入式老牛的博客 773

Docker镜像存储最佳实践:全面了解OverlayFS的优势

Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

yy1715713348的博客 385

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

使用Docker、jenkins、git技术搭建完整的CI流程

1- 持续集成是在源代码变更后自动检测、拉取、构建和(在大多数情况下)进行单元测试的过程。

软件测试小dao 1267

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Docker 学习笔记】Docker架构及三要素

这篇文章带你一起了解下,docker的架构及三个基本概念:镜像、容器、仓库

小青龍 的博客 4万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

一文掌握 Docker 技术体系

提起 Docker,很多软件工程师都会认为那是运维工程师需要掌握的技能。殊不知互联网日益内卷,极限环境下如何脱颖而出——成为佼佼者,这才是值得思考的问题。因此,我们不要局限在特定领域的“一亩三分地”,掌握“应用全生命周期”的各个环节,才是万全之策。当“领域深耕+边界扩宽”逐渐成为一种趋势,T 型人才将会立于不败之地,这就是所谓的底层逻辑。 而 Docker 技术就是这样一种神奇的存在:懂,万物皆可容器化;不懂,则重复“搬砖”,繁忙而不自知。 因此,作为软件工程师,不妨提高自身壁垒,储备一些 Docker 技

博文视点(北京)官方博客 1166

机器学习从入门到精通 - 模型部署落地:Docker+Flask构建API服务全流程

本文介绍了如何将训练好的机器学习模型通过Docker+Flask部署为API服务。首先阐述了API服务的重要性,它能实现跨平台调用模型功能。然后推荐使用轻量级Flask框架构建API,并配合Gunicorn提升性能。重点讲解了Docker容器化技术如何解决环境不一致的部署难题,通过打包应用及其依赖来确保服务稳定运行。文章提供了详细的实践指南,包括项目目录结构、Flask应用核心代码示例,以及如何处理模型预测请求。最后强调了特征转换这一关键环节的注意事项,为读者构建可靠的模型API服务提供了完整解决方案。

THMAIL的博客 1496

Docker实践(Ubuntu)+深度学习配置Docker

1.2.3.查看ubuntu版本uname -m查看ubuntu架构。

2402_89529814的博客 1454

探索高效机器学习项目开发:Cookiecutter Docker Science

探索高效机器学习项目开发:Cookiecutter Docker Science 在机器学习和数据分析领域,确保实验的可重复性和环境的一致性是至关重要的。Cookiecutter Docker Science项目正是为此而生,它提供了一个强大的模板,帮助开发者在一个Docker容器中高效地进行机器学习项目开发。本文将深入介绍该项目的特点、技术分析以及应用场景,帮助你了解并利用这一开源工具。 项目介...

gitblog_00207的博客 970

Docker基础内容学习(三)

本文记录了作者在Docker训练营的学习成果,重点完成了两个项目:单容器Jupyter环境和多用户JupyterHub环境搭建。在单容器项目中,通过Dockerfile构建了基于Python的数据科学环境,使用docker-compose实现容器编排和数据持久化。多用户项目则基于JupyterHub搭建,实现了用户隔离、资源管理和自动清理功能。两个项目都详细展示了关键配置文件(Dockerfile、docker-compose.yml等)的技术细节和实现思路,体现了Docker在数据科学环境搭建中的灵活应用

qq_69439570的博客 1833

Docker学习笔记

Docker是一种开源的应用容器引擎,允许开发者将应用及其依赖打包成一个可移植的容器,从而能够在任何流行的Linux机器上运行。Docker以其轻量级、快速启动和隔离性质著称,可以实现虚拟化,但与传统虚拟机相比,它几乎没有性能开销。Docker使用沙盒机制,确保不同容器之间相互独立,避免了系统间的干扰,这使得应用的部署和管理更加高效。此外,Docker不依赖于特定的编程语言、框架或包装系统,增强了其通用性。小知识:沙盒(Sandbox)沙盒是一种虚拟化技术,常用于计算机安全领域。

m0_74293254的博客 1572

云原生时代,作为技术人员,如果不了解 Docker 和 Kubernetes(K8s),那绝对是技术栈上的一个短板。那么,什么是 Docker?什么又是 Kubernetes?

本文,我们先从理论上分析了 Docker 和 Kubernetes的核心概念以及它们之间的关系。接着,我们从代码实战的角度,带大家一步一步实操了如何编写一个简单的 Java Web应用,并将其 Docker容器化,最后部署到 Kubernetes集群中,然后在浏览器访问。在实操的期间,因为所有的环境都是本地环境临时搭建,所以遇到了很多的问题,但最终还是成功了。

qq_39220145的博客 1296

深度学习的REST API || docker

2019/12/09 我也在疑惑,当时看到各种招聘上的深度学习框架是不是就是这个东西,不太理解,有机会再看吧。 文章[1]就是将深度学习的模型进行变现的方式,利用Flask的WEB框架,然后通过REST API的方式将结果传回,关于模型部分可以看他前一篇文章。看他这个部署过程感觉,好简单啊, 这部分东西难度在什么地方?也是不了解。 2019/12/29 - 他文章的介绍部分,感觉没什么东西,就是按...

围城 711

认识Docker

大家好,这里是七七,今天起开起我们的Docker技术篇,本文是介绍Docker的,不介绍如何使用和安装Docker,只是单纯的介绍Docker。

m0_63024355的博客 1093

Docker 安装教程

Docker 是一种轻量级的容器化技术,广泛用于软件开发、测试和部署。本文介绍 Docker 在 Windows、Linux 和 macOS 上的安装流程。至此,你已经成功安装 Docker,并完成了基本的运行测试。后续可以学习如何使用。进行容器编排,以及如何创建和管理 Docker 镜像。

laoxian0311的博客 570
上一篇: 应用配置管理,基础原理分析
下一篇: JavaGUI——Java图形用户界面
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值