Docker笔记

Docker概述

Docker为什么会出现

一款产品开发–上线 两套环境,应用配置

开发–运维 :在我的电脑上可以运行! 版本更新导致服务不可用

环境配置是十分麻烦的,每一个机器都要部署环境,费时费力,

发布项目(jar+redis+mysql+jdk+es),能不能带上环境安装打包

配置麻烦不能跨平台

传统:开发jar,运维来做

现在:开发打包部署上线,一套流程做完

java --apk --发布 – 使用安装即可

Java–jar(环境)-- 打包项目带上环境(镜像)–Docker仓库–下载安装–运行即可

Docker提供了解决方案

Docker思想来自于集装箱!

jre --多个应用(端口冲突)–原来是交叉的

隔离:Docker核心思想!打包装箱!每个箱子是相互隔离的,

Docker通过隔离机制,可以将服务器利用到极致

Docker的历史

2010年一家美国公司dotCoud

公司做一些pass的云计算服务!LXC有关技术!

他们将自己的技术命名Docker!

Docker刚刚诞生时候没有引起行业的注意

开源

2013年,Docker开源!火了!

2014年,Docker1.0发布

Docker为什么会火?

应为Docker十分轻巧,在容器技术出来之前,我们都是使用的虚拟机

虚拟机:在window中装一个软件(vmware),通过软件我们可以虚拟出来一个电脑(虚拟多台电脑,比较笨重)虚拟机也属于虚拟化技术Docker也是一种虚拟化技术

vm:linux centos原生镜像(一个电脑)隔离:需要多个虚拟机! 大小:几个g 启动:几分钟 
Docker:隔离 ,镜像(最核心的环境4m+jdk+mysql)十分小巧 运行镜像就可以 大小:小巧 启动:秒级启动

Docker官网

Docker是基于Go语音开发的!开源项目!

官网:https://www.docker.com/

Docker能干嘛

之前的虚拟机技术

在这里插入图片描述

虚拟机技术缺点

1、资源占用十分多

2、沉余步骤多

3、启动慢

容器化技术

容器化技术不是模拟一个完整的操作系统

在这里插入图片描述

比较

1、传统虚拟机,运行一条硬件,运行一个完整的操作系统,然后在系统上面运行

2、容器内的应用直接运行在宿主机上面,容器是没有自己的内核的也没有硬件操作,所以轻巧了

3、每个容器是相互隔离的,每个容器内部有一个属于自己的文件系统,互不影响

DevOps(开发、运维)

应用更快的交付和部署

传统:一堆帮助文档,安装程序

Docker:打包镜像发布测试,一键运行

更便捷的升级和扩容

使用Docker,部署应用和搭积木一样

项目打包为一个镜像扩展

更简单的系统运维

在容器化之后,我们的开发,测试环境都是高度一致的,

更高效的计算机资源利用:

Docker 是内核级别的虚拟化,可以在一个物理机上运行很多实例 !服务器可以运行到极致!

Docker安装

Docker的基本组成

在这里插入图片描述

  1. 镜像:(image):docker镜像就好比一个模板,可以通过这个模板来创建容器服务,镜像==》run==》容器(提供服务)通过这个镜像可以创建多个容器(最终服务运行或项目运行就是在容器中的,)
  2. 容器:(container):docker利用 容器技术,独立运行一个或多个应用,通过镜像来创建,启动,停止,删除,基本命令! 目前就可以把容器理解为一个简易的linux系统
  3. 仓库:(repository):仓库就是存放镜像的地方! 仓库分为公有的和私有的!docker HUB(默认是国外的)阿里云…都有容器服务器(配置镜像加速)!

安装docker

  1. 需要linux的技术

  2. CentOS7

  3. 使用Xshell链接远程服务器操作

  4. 参考官网

  5. 在Docker安裝完成後,必須啟動Docker daemon. 大多數的Linux發行版使用的是sudo systemctl start docker,如果這個指令無法使用,可以用sudo service docker start來替代。

    可以用
    
    systemctl start xxx
    1
    來啟動某個服務,用:
    
    systemctl stop xxx
    1
    來關閉服務。
    
    另外,如果希望某個服務在開機時就自動啟動,可以使用:
    
    systemctl enable xxx
    1
    如果希望某個服務不要在開機時自動啟動:
    
    systemctl disable xxx
    1
    並且可以用以下指令查看某個服務的狀態:
    
    systemctl status xxx
    
#1、卸载旧版本
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
#2、使用存储库安装
$ sudo yum install -y yum-utils
#3、设置镜像仓库
$sudo yum-config-manager \
    --add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#使用阿里云镜像
#3、更新yum软件索引包
yun makecache fast
#4、安装DOCKER引擎
$ sudo yum install docker-ce docker-ce-cli containerd.io
#5、启动docker
systemctl start docker
#6 使用docker version 是否安装成功

#7hello -world
docker run hello-world

在这里插入图片描述

#8、查看下载的 镜像
docker imager

卸载docker

#1、卸载依赖
sudo yum remove docker-ce docker-ce-cli containerd.io
#2、主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷:
sudo rm -rf /var/lib/docker
#/var/lib/docker 默认的工作路径

阿里云镜像加速

1.阿里云找到容器服务

在这里插入图片描述

2.找到镜像加速

在这里插入图片描述

3、配置使用

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["地址"]
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

在这里插入图片描述

底层原理

docker是怎么工作的?

docker是一个client- server 结构系统,docker的守护进程运行在主机上通过seocket从客户端访问

dockerServer接收Docker-Client的指令,就会执行这个命令!

在这里插入图片描述

docker为什么比vm快

在这里插入图片描述
在这里插入图片描述

Docker常用命令

帮助命令

docker version #版本信息
docker info #系统命令
docker 命令 --help #万能命令

官方帮助文档

镜像命令

docker images 查看所有镜像

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        9 months ago      

#标签
REPOSITORY 镜像仓库原
TAG 	   镜像标签
IMAGE ID   镜像id
CREATED	   镜像的创建时间
ZIZE       镜像的大小

#可选项
-a ,--all # 列出所有镜像
-q ,--quiet #只显示镜像id

docker search搜索镜像

Search the Docker Hub for images
[root@localhost ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10027               [OK]                
mariadb                           MariaDB is a community-developed fork of MyS…   3673                [OK]                
#可选项 通过收藏来过滤
#STARS大于3000的
docker search mysql --filter=STARS=3000

docker pull 下载镜像

#下载镜像 docker pull 镜像名称[:tag]
[root@localhost ~]# docker pull mysql
Using default tag: latest #如果不写默认是最新的
latest: Pulling from library/mysql
d121f8d1c412: Pull complete #分层下载 docker的核心 联合文件系统
f3cebc0b4691: Pull complete 
1862755a0b37: Pull complete 
489b44f3dbb4: Pull complete 
690874f836db: Pull complete 
baa8be383ffb: Pull complete 
55356608b4ac: Pull complete 
dd35ceccb6eb: Pull complete 


#等价于它
docker pull mysql
docker pull docker.io/library/mysql:latest
#指定版本
docker pull mysql:5.7

docker rmi 删除镜像

#指定id删除
docker rmi -f 容器id
#删除全部 
docker rmi -f $(docker images -aq)

容器命令

说明:有了镜像才可以创建容器,linux下载一个centos镜像来学习

docker pull centos

新建容器启动

docker run [可选参数] images
#参数说明
-- name ="Name" 容器名字
-d              后台方式运行
-it             使用交互方式运行 进入容器查看内容
-p              指定容器端口 -p 8080:8080
	-p ip:主机端口:容器端口
	-p 主机端口:容器端口(常用)
	-p 容器端口
	容器端口
-P				随机指定端口
#启动并且进入容器
[root@localhost ~]# docker run -it centos /bin/bash
[root@b5fa1084c128 /]# 
[root@b5fa1084c128 /]# ls 查看容器内
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
#退出容器
[root@b5fa1084c128 /]# exit
exit

列出所有运行的容器

#docker ps 命令
-a #列出正在运行的容器 + 历史运行过的容器
-n=?#显示最近创建的容器
-q #只显示容器编号
-aq #显示所有容器编号
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
b5fa1084c128        centos              "/bin/bash"         3 minutes ago       Exited (0) 2 minutes ago                           sweet_banach
4b334993f008        bf756fb1ae65        "/hello"            About an hour ago   Exited (0) About an hour ago                       wizardly_sammet

退出容器

exit #直接容器停止并且退出
Ctrl + p +q #容器不停止退出

删除容器

docker rm 容器id  			  #删除指定的容器
docker rm -f $(docker ps -ap) #删除所有容器
docker ps -a -q|xargs docker rm #删除所有容器

启动和停止的操作

docker start 容器id   #启动容器
docker restart 容器id #重启容器	
docker stop 容器id 	#停止当前正在运行的容器
docker kill 容器id	#强制停止当前容器

常用的其他命令

后台启动
docker run -d 镜像名

#问题docker ps 发现centos 停止了

#常见的坑,docker 容器使用后台运行 就必须要有一个前台进程 docker没有发现应用就会自动停止

查看日志
-tf  #显示日志
--tail #显示的日志条数
docker logs -tf --tail 10 容器id

#自己写一段脚本shell
 docker run -d centos /bin/sh -c "while true;do echo 123456;sleep 1;done"
查看容器进程信息
#docker top 容器id
docker top 
[root@localhost ~]# docker top f6b975fbfaea
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                18722               18702               0                   22:13               ?                   00:00:00            /bin/sh -c while true;do echo 123456;sleep 1;done
root                18777               18722               0                   22:13               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

查看镜像元素
docker inspect 容器id
#测试
docker inspect f6b975fbfaea
[
    {
        "Id": "f6b975fbfaea2e4333e5bc557198ab4a0aca6cb5b5d68cf06d5588f9aba36552",
        "Created": "2020-10-07T14:10:44.589809795Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true;do echo 123456;sleep 1;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 18722,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-10-07T14:13:28.62728912Z",
            "FinishedAt": "2020-10-07T14:12:07.889298799Z"
        },
        "Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
        "ResolvConfPath": "/var/lib/docker/containers/f6b975fbfaea2e4333e5bc557198ab4a0aca6cb5b5d68cf06d5588f9aba36552/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/f6b975fbfaea2e4333e5bc557198ab4a0aca6cb5b5d68cf06d5588f9aba36552/hostname",
        "HostsPath": "/var/lib/docker/containers/f6b975fbfaea2e4333e5bc557198ab4a0aca6cb5b5d68cf06d5588f9aba36552/hosts",
        "LogPath": "/var/lib/docker/containers/f6b975fbfaea2e4333e5bc557198ab4a0aca6cb5b5d68cf06d5588f9aba36552/f6b975fbfaea2e4333e5bc557198ab4a0aca6cb5b5d68cf06d5588f9aba36552-json.log",
        "Name": "/affectionate_galois",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "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,
            "Capabilities": null,
            "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/1fa2a24157c64b54cca3b6fc86b3c705e9614bc48661d9816ba446ba507168d3-init/diff:/var/lib/docker/overlay2/d288f5287cd09a771ed8d8b8202cfaed11b7263ae60528b153d8cf628159b1a8/diff",
                "MergedDir": "/var/lib/docker/overlay2/1fa2a24157c64b54cca3b6fc86b3c705e9614bc48661d9816ba446ba507168d3/merged",
                "UpperDir": "/var/lib/docker/overlay2/1fa2a24157c64b54cca3b6fc86b3c705e9614bc48661d9816ba446ba507168d3/diff",
                "WorkDir": "/var/lib/docker/overlay2/1fa2a24157c64b54cca3b6fc86b3c705e9614bc48661d9816ba446ba507168d3/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "f6b975fbfaea",
            "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 123456;sleep 1;done"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20200809",
                "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": "e919fe60274f24b6f894172c598aae6320d1460b823a522194d35cdf598c1683",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/e919fe60274f",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "1dfd70df54f9737fd3cd68c58d7eb7230f2200cf8a68c9117f5531a090479b58",
            "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": "79d8b622c2ba07ff5e5308155a55cd664846454690820628c597796817522cdf",
                    "EndpointID": "1dfd70df54f9737fd3cd68c58d7eb7230f2200cf8a68c9117f5531a090479b58",
                    "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
#方式一
[root@localhost ~]# docker exec -it f6b975fbfaea /bin/bash
[root@f6b975fbfaea /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@f6b975fbfaea /]# 

#方式2
docker attach 容器id


#docker exec 进入容器开启一个新的终端 可以在里面操作
#docker attach 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器id:容器内目录:目前主机目录
#进入容器
[root@localhost ~]# docker exec -it f6b975fbfaea /bin/bash
[root@f6b975fbfaea /]# cd home
[root@f6b975fbfaea home]# ls
[root@f6b975fbfaea home]# touch test.java #新建文件
[root@f6b975fbfaea home]# ls
test.java
[root@f6b975fbfaea home]# exit           #退出
exit
#复制
[root@localhost home]# docker cp f6b975fbfaea:/home/test.java /home 
[root@localhost home]# ll
总用量 4
drwx------. 16 fanxinyu fanxinyu 4096 10月  7 14:37 fanxinyu
drwx------.  3 mongod   mongod     78 3月   9 2020 mongod
-rw-r--r--.  1 root     root        0 10月  7 22:35 test.java
[root@localhost home]# ls
fanxinyu  mongod  test.java
[root@localhost home]# 

#拷贝是一个手动过程,未来我们使用 -v卷功能

小结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习

docker安装nginx

#第一步搜索镜像
docker search nginx
#第二部下载镜像
docker pull nginx
#查看
[root@localhost home]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              992e3b7be046        41 hours ago        133MB
centos              latest              0d120b6ccaa8        8 weeks ago         215MB
#启动
-d 后台运行
--name 容器名称
-p 宿主机端口
[root@localhost home]# docker run -d --name nginx01 -p 3344:80 nginx
f79efb318dd1bf718bcaf4ba50a442c4603160de2feb2a2d5a0b5d2d82efdfaf
#测试
[root@localhost home]# curl 127.0.0.1:3344


端口暴露

在这里插入图片描述

docker布置一个tomect

#官方使用
docker run -it --rm tomcat:9.0
#我们之前启动都是后台启动,停止容器之后,容器还是可以查到,
docker run -it --rm 一般用来测试用完即删

#下载在启动
docker pull tomcat:9.0
#测试
docker run -d -p 3355:8080 --name tom01 tomcat
#进入容器
docker exec -it tom01 /bin/bash

#发现问题 1、linux命令少了,没有webapps 默认最小环境 剔除了不必要的文件

部署es+kibana

#es 暴露端口很多
#es 十分消耗内存的
#es 的数据一般需要放置到安全的目录 挂载
#--net somenetwoek ?网络配置

#启动elasticsearch
[root@localhost /]#  docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

#启动就卡主了 docker ststs 查看cpu状态

#查看docker stats 

#测试一下 es 是成功的

#赶紧关闭 ,增加内存限制

[root@localhost /]# docker run -d --name el -p 9200:9200 -p 9300:9300 -e"discovery.type=single-node" -e ES_JAVA_POTS="Xms64m -Xmx512m" elasticsearch:7.6.2

root@localhost /]# docker stats 容器id

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
4ccddadd289f        el                  63.73%              1.094GiB / 972.6MiB   115.20%             656B / 0B           673MB / 389kB       19


可视化

portainer

docker run -d -p 8088:9000\
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

测试 127.0.0.1:8088

在这里插入图片描述

Docker镜像

commit镜像

docker commit 提交容器成为一个新的副本

#基本命令
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像民:【TAG】
#实战测试
#启动一个tomcat
docker run -d -p 8080:8080  --name toc01 romcat:9.0
#进入容器内部
docker exec -it 容器id /bin/bash
#复制webapps
cp -r webapps.dist/* webapps
#退出容器
exit
#提交镜像
[root@localhost /]# docker commit -a="提交人" -m="描述" 容器id 名称:[TAG]
#测试
[root@localhost /]#  docker run -d -p 8080:8080  --name toc01 romcat02:1.0
#访问

在这里插入图片描述

容器数据卷

什么是容器数据卷

docker的理念回顾
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求︰数据可以持久化
MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地!
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!|

在这里插入图片描述

总结—句话:容器的持久化和同步操作!容器中数据可以共享!

#方式一 使用命令-v 挂载
docker run -it -v 主机目录:容器内部目录

[root@localhost /]# docker run -it -v /home/ceshi:/home centos /bin/bash
#查看容器
[root@localhost ~]# docker inspect 容器id 

在这里插入图片描述

同步测试

在这里插入图片描述

好处:我们以后修改只需要在本地修改即可,容器内会自动同步!

实战:安装MySQL

#拉取端口
docker pull mysql:5.7
#运行容器需要做数据挂载 mysql需要设置密码
#官方
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=密码 -d mysql:【版本】 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
#启动
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字

[root@localhost mysql]#  docker run -d -p 3306: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

#链接测试

在这里插入图片描述

#删除容器
docker rm -f 容器id
#发现数据没有被删除

在这里插入图片描述

具名挂载和匿名挂载


#匿名挂载
docker run -d -P --name nginx01 -v/ect/nginx nginx

#查看所有的 volume情况
docker volume ls

#这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径!
[root@localhost data]# docker run -d -P --name nginx01 -v /ect/nginx nginx 
41a46d60e857f4a4178ca3aa52676829a6621ea9ae7361f2264ad797916dad13
[root@localhost data]# docker volume ls
DRIVER              VOLUME NAME
local               9c17aa3f5e17eb66c7fe7946233658402216dd81ced75d97d8e694b0e7ae744e
local               a01b80a32c9437066198bc49636876c92b795f4fcfe45f2dcb2c6c743c29aaa4
[root@localhost data]# 

#具名挂载
[root@localhost data]# docker run -d -P --name nginx02 -vjuming-nginx:/ect/nginx nginx  
#查看
docker volume ls

在这里插入图片描述

#查看
[root@localhost data]# docker volume inspect juming-nginx

在这里插入图片描述

#所有的docker容器内的卷,没有指定目录的情况下都是在[/var/1ib/docker/volumes/xxxx/_data
#我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的·具名挂载
#我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的·具名挂载 

##如何确定是具名挂载还是置名挂载,还是指定路径挂载!

#匿名挂载
-V容器内路径 

#具名挂载
-V卷名:容器内路径

#具名挂载
-V /宿主机路径: :容器内路径 #指定路径挂载!

拓展:

#通过-v容器内路径: ro rw改变读写权限
ro  readonly # 只读
rW  readwrite # 可读可写
#通过-v容器内路径: ro rw改变读写权限
ro
readonly # 只读
rW
readwrite # 可读可写
#一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P所 --name nginx02 -V juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -V juming-nginx:/etc/nginx:rw nginx
# ro只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
docker run -d -P所 --name nginx02 -V juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -V juming-nginx:/etc/nginx:rw nginx

# ro只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

初识Docerfile

Dockerfile就是用来构建docker镜像的构建文件!命令脚本!先体验一下 !

通过这个脚本可以生成镜像,镜像是一层一层的,脚本-个个的命令 ,每个命令都是一层!

#创建一个文件
里面内容
vim dockerfile1

#指令都是大写

#文件内容
FORM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash
#这里每个命令都是一个镜像

# 保存退出
wq! 
#打包镜像 后面加.很重要
docker build -f /home/docker-test-volumee/dockerfile1 -t fangxinyu/centos:1.0  .

#启动自己的容器

在这里插入图片描述

查看挂载目录
docker volume 容器id

在这里插入图片描述

测试一下刚才的文件是否同步出去了!

这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!

假设构建镜像时候没有挂载卷,要手动镜像挂载-V 卷名:容器内路径!

数据卷容器

多个mysql 同步数据
在这里插入图片描述

#启动第一个容器
docker run -d -it --name ceshi01 容器id
#启动第二个容器
dokcer run -it --name ceshi02 --volumes-from ceshi01 ae0449fa9ed8
#启动第三个
dokcer run -it --name ceshi03 --volumes-from ceshi01 ae0449fa9ed8

在这里插入图片描述

数据同步了

在这里插入图片描述

#可以删除第一个 查看剩下的是否可以访问这个文件
#测试依旧可以访问

在这里插入图片描述

多个mysql实现数据共享

#关键 --volumes-from 数据卷容器

#启动第一个容器
[root@localhost data]# docker run -d -p3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

#启动第二个容器
[root@localhost data]# docker run -d -p3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01  mysql:5.7

#测试是否共享

容器之间配置信息的传递,数据卷容器的生命周期- -直持续到没有容器使用为止。

但是- -旦你持久化到了本地,这个时候,本地的数据是不会删除的!

DockerFile

dockerfile是用来构建dokcer镜像的文件!命令参数脚本!

构建步骤:

1、编写一个dockerfile文件

2、docker build构建成为一个镜像

3、docker run运行镜像

4、docker push 发布镜像(DockerHub、阿里云镜像仓库!)

在这里插入图片描述

在这里插入图片描述

很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

官方既然可以制作镜像,那我们也可以!

DockerFile构建过程

基础知识

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

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

3、#表示注释

4、每一个指令都会创建提交一个新的镜像层,并提交!|

在这里插入图片描述

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!

Docker镜像逐渐成为企业交付的标准,必须要掌握!|

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!

Docker镜像逐渐成为企业交付的标准,必须要掌握!

步骤:开发,部署,运维。。。缺一不可!|

DockerFile :构建文件,定了-切的步骤,源代码

Dockerlmages :通过DockerFile构建生成的镜像,最终发布和运行的产品!

DockerFile的指令

FROM		#基础镜镜像,一切从这里开始构建
MAINTAINER	#镜像是谁写的,姓名+邮箱
RUN			#镜像构建的时候需要运行的命令
ADD			#步骤: tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR		#镜像的工作目录
VOLUME		#挂载的目录
EXPOST		#保留端口配置
CMD			#指定这个容器启动时要运行的明令只有最后一个会生效,可被替代
ENTRYPOINT	#指定当前容器启动时要运行的命令可以追加命令
ONBUILD		#当构建一个被继承DockerFile 这个时候就会运行ONBUILD 的指令。触发指令。
COPY		#类似ADD,将我们文件拷贝到镜像中
ENY 		#构建的时候设置环境变量

在这里插入图片描述

实战测试

Docker Hub 99的镜像都是从FROM scratch 然后配置需要的软件

在这里插入图片描述

FROM centos
#镜像是谁写的,姓名+邮箱
MAINTAINER v5v5<@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 文件路径 -t 镜像名称:版本号 .


查看官方历史步骤

docker histort 

CMD 和 ENTRYPOINT 区别

CMD			#指定这个容器启动时要运行的明令只有最后一个会生效,可被替代
ENTRYPOINT	#指定当前容器启动时要运行的命令可以追加命令

测试cmd


[root@localhost dockerfile]# vim dockerfile-test
[root@localhost dockerfile]# docker build -f dockerfile-test -t text . 
[root@localhost dockerfile]# docker run -it b7f2bbec0d0f
#命令生效
WARNING: IPv4 forwarding is disabled. Networking will not work.
.   .dockerenv	dev  home  lib64       media  opt   root  sbin	sys  usr
..  bin		etc  lib   lost+found  mnt    proc  run   srv	tmp  var
[root@localhost dockerfile]# 
#追加命令 报错
[root@localhost dockerfile]# docker run -it b7f2bbec0d0f -l
WARNING: IPv4 forwarding is disabled. Networking will not work.
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
# cmd的清理下-1替换了CMD ["1s",”'-a"] 命令,-1不是命令所以报错!

测试ENTRYPOINT

#可以直接在后面追加命令不会被替换掉
[root@localhost dockerfile]# vim dockerfile-ent
FROM centos
ENTRYPOINT ["ls","-a"]

[root@localhost dockerfile]# docker build -f dockerfile-ent -t ent .
[root@localhost dockerfile]# docker run 8454f1802caf -l
WARNING: IPv4 forwarding is disabled. Networking will not work.
total 0
drwxr-xr-x.   1 root root   6 Oct 12 09:08 .
drwxr-xr-x.   1 root root   6 Oct 12 09:08 ..
-rwxr-xr-x.   1 root root   0 Oct 12 09:08 .dockerenv
lrwxrwxrwx.   1 root root   7 May 11  2019 bin -> usr/bin
drwxr-xr-x.   5 root root 340 Oct 12 09:08 dev
drwxr-xr-x.   1 root root  66 Oct 12 09:08 etc
drwxr-xr-x.   2 root root   6 May 11  2019 home
lrwxrwxrwx.   1 root root   7 May 11  2019 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 May 11  2019 lib64 -> usr/lib64
drwx------.   2 root root   6 Aug  9 21:40 lost+found
drwxr-xr-x.   2 root root   6 May 11  2019 media
drwxr-xr-x.   2 root root   6 May 11  2019 mnt
drwxr-xr-x.   2 root root   6 May 11  2019 opt
dr-xr-xr-x. 229 root root   0 Oct 12 09:08 proc
dr-xr-x---.   2 root root 162 Aug  9 21:40 root
drwxr-xr-x.  11 root root 163 Aug  9 21:40 run
lrwxrwxrwx.   1 root root   8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 May 11  2019 srv
dr-xr-xr-x.  13 root root   0 Oct  9 14:08 sys
drwxrwxrwt.   7 root root 145 Aug  9 21:40 tmp
drwxr-xr-x.  12 root root 144 Aug  9 21:40 usr
drwxr-xr-x.  20 root root 262 Aug  9 21:40 var

实战TOMCAT镜像

准备jdk tomcat 压缩包

2编写dockerfile文件

FROM centos
MAINTAINER V5V5<@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u144-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.39.tar.gz /usr/local/

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_144
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.39
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.39
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.39/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.39/bin/logs/catalina.out

#构建镜像
docker build -t 镜像名

#启动挂载目录
docker run -d -p 9090:8080 -V 

#部署网站测试
#web.xml
[root@localhost WEB-INF]# vim web.xml 
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http//java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://hava.sun.com/xml/ns.javaee 
				http://java.sun.com/xml/nsjavaee/web-app_2_5.xsd"
	version="2.5"
>
</web-app>


#index.jsp
[root@localhost test]# vim index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>56666</title>
</head>
<body>
Hello World!<br/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>

在这里插入图片描述

发布自己的镜像

注册https://hub.docker.com/

确定账号可以登录

在服务器提交镜像

#登录
docker login -u 账号
#push
docker push 名称/镜像:版本
#提交需要版本号
docker tag 64401928cda7 xixiv5v5/diytomcat:1.0
#提交
docker push xixiv5v5/diytomcat:1.0

阿里云镜像仓库

1. 登录阿里云Docker Registry
$ sudo docker login --username=v5v5v5666 registry.cn-shenzhen.aliyuncs.com

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

您可以在访问凭证页面修改凭证密码。

2. 从Registry中拉取镜像
$ sudo docker pull registry.cn-shenzhen.aliyuncs.com/xixiv5v5/xixiv5v5:[镜像版本号]
3. 将镜像推送到Registry
$ sudo docker login --username=v5v5v5666 registry.cn-shenzhen.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/xixiv5v5/xixiv5v5:[镜像版本号]
$ sudo docker push registry.cn-shenzhen.aliyuncs.com/xixiv5v5/xixiv5v5:[镜像版本号]

请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

4. 选择合适的镜像仓库地址

从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。

如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-shenzhen.aliyuncs.com 作为Registry的域名登录。

5. 示例

使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。

$ sudo docker imagesREPOSITORY                                                         TAG                 IMAGE ID            CREATED             VIRTUAL SIZEregistry.aliyuncs.com/acs/agent                                    0.7-dfb6816         37bb9c63c8b2        7 days ago          37.89 MB
$ sudo docker tag 37bb9c63c8b2 registry-vpc.cn-shenzhen.aliyuncs.com/acs/agent:0.7-dfb6816

使用 “docker push” 命令将该镜像推送至远程。

$ sudo docker push registry-vpc.cn-shenzhen.aliyuncs.com/acs/agent:0.7-dfb6816

小结

在这里插入图片描述

Docker网络

在这里插入图片描述

1、我们每启动- -个docker容器, docker就会给docker容器分配一-个ip ,我们只要安装了docker ,就会有一-个网卡 dockerO桥接模式,使用的技术是evth-pair技术!

#启动一个容器
docker run -d -it --name tomact01 tomact:9.0
#查看网卡
root@58c5d3967a23:/usr/local# ip addr
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
30: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
root@58c5d3967a23:/usr/local# 

#ping宿主机
root@58c5d3967a23:/usr/local# ping 192.168.3.26
PING 192.168.3.26 (192.168.3.26) 56(84) bytes of data.
64 bytes from 192.168.3.26: icmp_seq=1 ttl=64 time=0.084 ms
64 bytes from 192.168.3.26: icmp_seq=2 ttl=64 time=0.073 ms
64 bytes from 192.168.3.26: icmp_seq=3 ttl=64 time=0.045 ms
64 bytes from 192.168.3.26: icmp_seq=4 ttl=64 time=0.048 ms
64 bytes from 192.168.3.26: icmp_seq=5 ttl=64 time=0.049 ms
64 bytes from 192.168.3.26: icmp_seq=6 ttl=64 time=0.070 ms
64 bytes from 192.168.3.26: icmp_seq=7 ttl=64 time=0.045 ms
64 bytes from 192.168.3.26: icmp_seq=8 ttl=64 time=0.056 ms
64 bytes from 192.168.3.26: icmp_seq=9 ttl=64 time=0.051 ms
64 bytes from 192.168.3.26: icmp_seq=10 ttl=64 time=0.067 ms
#可以ping同

#我们发现这个容器带来网卡,都是一对对的
#evth-pair就是一对的虚 拟设备接口,他们都是成对出现的,一段连着协议, 一段彼此相连
#正因为有这个特性,evth-pair 充当一个桥梁,连接各种虛拟网络设备的
# openStac, Docker容器之间的连接,OVS的连接,都是使用evth-pair 技术

在这里插入图片描述

结论: tomcat01和tomcat02是公用的一个路由器, docker0。

所有的容器不指定网络的情况下,都是docker0路由的, docker会给我们的容器分配一个默认的可用IP

Docker使用的是Linux的桥接,宿主机中是一个Dokcer容 器的网桥docker0。
在这里插入图片描述

!

Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高!

–link

思考一个场景,我们编写了一个微服务,database url=ip:,项目不重启,数据库ip换掉了,我们希望可以处理这个问题 ,可以名字来进行访问容器?

[root@kuangshen /]# docker run -d -P --name tomcat03 --1ink tomcat02 t omcat

在这里插入图片描述

分配 的随机ip

其实这个tomcat03就是在本地配置了tomcat02的配置?

在这里插入图片描述

–link就是我们在hosts配置中增加了一个172.18.0.3 tomgat02 312857 784cd4

本质探究: -ink就是我们在hosts配置中增加了-一个172.18.0.3 tomcat02 312857784cd4
我们现在玩Docker已经不建议使用-link了!

自定义网络

#查看所有的网络
[root@localhost test]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
cddda16b35d9        bridge              bridge              local
e20dc82cc20e        host                host                local
4d831dcf479c        none  

网络模式

bridge : 桥接(默认)
none	:不配置
host :和宿主机共享网络
container:容器网络连通(用的少局限大)

测试
在这里插入图片描述

#docker 直接启动默认的命令就是 --net bridge
docker run -d -p --name tomcat01 tomcatdocker rn -d -p --name tomcat01 --net bridge tomcat

# docker0特点:默认, 域名不能访问,-- link可以打通连接!
#我们可以自定义一个网络!
# --driver bridge
# --subnet 192.168.0.0/16 T 192.168.0.2192.168.255. 255
# --gateway 192.168.0.1
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

[root@localhost test]# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
cddda16b35d9        bridge              bridge              local
e20dc82cc20e        host                host                local
a5980d26096a        mynet               bridge              local
4d831dcf479c        none                null                local

docker network inspect mynet

测试

 docker run -d  --name tomcat01 --net mynet tomcat:9.0
 docker run -d  --name tomcat02 --net mynet tomcat:9.0
#ping通了
[root@localhost test]# docker exec -it tomcat01 ping tomcat02
PING tomcat02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.589 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.056 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.064 ms

我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络! .

网络连通

在这里插入图片描述

在这里插入图片描述

#测试打通
#测试打通tomcat01 一mynet
#连通之后就是将tomcat01 放到了mynet 网络下?
#一个容器两个ip地址!
#阿里云服务:公网ip 私网ip

在这里插入图片描述

#01连通ok
docker exec -it tomcat01 ping tomcat03

#02依旧打不通
docker exec -it tomcat02 ping tomcat-net-01

在这里插入图片描述

shell脚本



#创建网卡
docker network create redis --subnet 172.38.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

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.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \


docker run -d -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.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -d -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.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -d -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.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -d -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.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -d -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.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

#创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

/data # redis-cli -c
127.0.0.1:6379> clusrer info
(error) ERR unknown command `clusrer`, with args beginning with: `info`, 
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:108
cluster_stats_messages_pong_sent:110
cluster_stats_messages_sent:218
cluster_stats_messages_ping_received:105
cluster_stats_messages_pong_received:108
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:218
127.0.0.1:6379> 
#集群搭建成功

在这里插入图片描述

我们使用了docker之后,所有的技术都会慢慢的变得简单起来!

springboot 打包发布

1.新建一个springboot项目

2.上传到linux服务器

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

#生成镜像
docker build -t dockerfile .
#查看镜像是否生成成功
docker images
#启动镜像测试
docker run -d -p 8080:8080 --name v6v6 v5v5


-v /mydata/redis/node-5/data:/data
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -d -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.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

#创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

/data # redis-cli -c
127.0.0.1:6379> clusrer info
(error) ERR unknown command clusrer, with args beginning with: info,
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:108
cluster_stats_messages_pong_sent:110
cluster_stats_messages_sent:218
cluster_stats_messages_ping_received:105
cluster_stats_messages_pong_received:108
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:218
127.0.0.1:6379>
#集群搭建成功


[外链图片转存中...(img-3C6U3KLj-1604195628900)]

我们使用了docker之后,所有的技术都会慢慢的变得简单起来!

## springboot 打包发布

1.新建一个springboot项目

2.上传到linux服务器

```shell
#编写Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE  8080
ENTRYPOINT ["java","-jar","/app.jar"]

#生成镜像
docker build -t dockerfile .
#查看镜像是否生成成功
docker images
#启动镜像测试
docker run -d -p 8080:8080 --name v6v6 v5v5
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值