Docker 基础篇

路线

Docker 概述

Docker 为什么出现 ?


Docker 的历史

聊聊 Docker

Docke 能干嘛?

之前的虚拟技术

容器化技术

DevOps (开发、运维)

Docker 安装

Docker 的基本组成


安装 Docker

环境准备






阿里云镜像加速

附录:腾讯云镜像加速请看

# 配置腾讯云镜像加速
$ tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
     "https://mirror.ccs.tencentyun.com"
  ]
}
EOF

回顾 HelloWorld 流程

底层原理

Docker 是怎么工作的?

Docker 为什么比 VM 快?

Docker 的常用命令

帮助命令


https://docs.docker.com/engine/reference/commandline/cli/

镜像命令

搜索命令

docker pull 下载镜像


docker rmi 删除镜像

容器命令


列出所有运行的容器

退出容器

删除容器

启动和停止容器的操作

常用其他命令

查看日志

查看日志中 提到的下面这个 命令拆解

docker run -d centos /bin/bash -c "while true;do echo kayakyx;sleep 1;done"

while true;do echo hello;sleep 1;done

为一段 shell 脚本 详见 shell 脚本

意思为 无限循环 输出 hello 字符串, 并等待 1s。

(可以直接在 Linux 命令行中,或 Window 的 Git Bash Here 中,运行查看效果)

/bin/bash

为 Linux 系统 命令行(黑框框, 雷士 window 的 CMD), 随便找个 Linux 系统都可以运行 /bin/bash --help (window 系统可以使用 Git Bash Here 来运行)。

查看完 help 信息之后 可以看到 /bin/bash 后面可以跟 -c c 代表 command 命令。shell 脚本语句也是 命令啊。所以可以跟在 -c 后面。

所以

docker run -d centos /bin/bash -c "while true;do echo hello;sleep 1;done"

翻译过来就是

使用 docker 后台运行 centos , centos 的 /bin/bash 命令中 运行 脚本 while true;do echo hello;sleep 1;done

查看容器中进程信息

查看进行的元数据









进入当前正在运行的容器

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


小结




作业练习

Docker 安装 Nginx

下图中的
1、搜索镜像 docker search nginx
2、下载镜像 docker pull nginx

whereis nginx 带包搜索 nginx 文件和文件夹。 详见 Linux whereis命令

端口暴露的概念

Docker 来装一个 Tomcat


检查 tomcat 是否安装成功


访问 3355 端口

发现 404 (Tomcat 下的 webapps 文件夹是空的导致,没有网页),理论上启动成功是有一个 Tomcat 的网页的, (看 安装 Tomcat 的图中的 【发现问题】),接下来把 Tomcat 网页搞出来啦,
其实 Tomcat 镜像中的网页都放到 webapps.dist 文件夹下了。我们只要把 webapps.dist 中的内容都拷贝到 webapps 下即可.(以后部署自己的网页就部署到 webapps 目录下)


在访问就出来了

部署 es + kibana



附:关闭旧 elasticsearch docker stop elasticsearch

↓↓↓ docker stats

附:增加内存限制 通过 -e 参数

docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.14.1

占用内存最小 64M 最大 512M


通过 curl 测试

作业:使用 kibana 连接 es ? 思考网路如何才能连接过去?

可视化


附:

[root@VM-8-3-centos ~]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

选择本地的

Docker 镜像讲解

镜像是什么

Docker 镜像加载原理



分层理解

分层的镜像






特点


commit 镜像





--- 可忽略开始 ---
Docker 实战 关键技术名词

--- 可忽略结束 ---

容器数据卷

什么是容器数据卷


使用数据卷



实战安装 MySQL



具名和匿名挂载




拓展:

初识 Dockerfile


启动自己写的容器


查看一下卷挂载的路径

# 启动刚才通过 Dockerfile 构建的镜像
# 然后查看 启动的 容器 
docker inspect 容器ID

附:
刚才在 容器的 volume01 文件夹下 新建了一个 container.txt

数据卷容器






多个 mysql 实现数据共享

结论

DockerFile

DockerFile 介绍




DockerFile 构建过程

基础知识

DockerFile 的指令



实战测试

创建自己的 centos


docker build -f dockerfile文件路径 -t 镜像名:[tag] .
对比:之前的原生的 centos

我们增加之后的镜像

我们可以列出镜像的变更历史

CMD 和 ENTRYPOINT 区别


测试 cmd

测试 ENTRYPOINT



实战:Tomcat 镜像


1、准备镜像文件 tomcat 压缩包, jdk的压缩包!
工作目录为 home/kuangshen/build/tomcat

apache-tomcat-9.0.22.tar.gz
链接:https://pan.baidu.com/s/1TmKXceqvIkc5Ngq7mblALQ
提取码:pky6
jdk-8u11-linux-x64.tar.gz
链接:https://pan.baidu.com/s/1GcoAIIw8h0igFzh-9uymxQ
提取码:krc7

2、编写 dockerfile 文件, 官方命名 Dockerfile, build会自动寻找这个文件按,就不需要 -f 指定了!

FROM centos

MAINTAINER kayakyx<1522025433@qq.com>

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

ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/


RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINS_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

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

3、构建镜像

4、启动镜像

5、访问测试

内网

[root@VM-8-3-centos tomcat]# curl localhost:9090

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/9.0.22</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
    </head>

    <body>
        <div id="wrapper">
            <div id="navigation" class="curved container">
                <span id="nav-home"><a href="https://tomcat.apache.org/">Home</a></span>
                <span id="nav-hosts"><a href="/docs/">Documentation</a></span>
                <span id="nav-config"><a href="/docs/config/">Configuration</a></span>
                <span id="nav-examples"><a href="/examples/">Examples</a></span>
                <span id="nav-wiki"><a href="https://wiki.apache.org/tomcat/FrontPage">Wiki</a></span>
                <span id="nav-lists"><a href="https://tomcat.apache.org/lists.html">Mailing Lists</a></span>
                <span id="nav-help"><a href="https://tomcat.apache.org/findhelp.html">Find Help</a></span>
                <br class="separator" />
            </div>
            <div id="asf-box">
                <h1>Apache Tomcat/9.0.22</h1>
            </div>
            <div id="upper" class="curved container">
                <div id="congrats" class="curved container">
                    <h2>If you're seeing this, you've successfully installed Tomcat. Congratulations!</h2>
                </div>
                <div id="notice">
                    <img src="tomcat.png" alt="[tomcat logo]" />
                    <div id="tasks">
                        <h3>Recommended Reading:</h3>
                        <h4><a href="/docs/security-howto.html">Security Considerations How-To</a></h4>
                        <h4><a href="/docs/manager-howto.html">Manager Application How-To</a></h4>
                        <h4><a href="/docs/cluster-howto.html">Clustering/Session Replication How-To</a></h4>
                    </div>
  # ......

也可以外网测试

6、发布项目

创建 /home/kuangshen/build/tomcat/test/WEB-INF/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://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">

</web-app>

附:代码来自:Web应用与web.xml
注意缩进,标签一定要顶到头,我被坑了许久
如果遇到你了什么 问题可以参考 容器内的 ROOT 下的是怎么写的

创建 /home/kuangshen/build/tomcat/test/index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello, kuangshen</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("---- my test web logs ----");
%>
</body>
</html>

附:代码改自:JSP 语法

访问测试

查看日志

进入刚才创建的容器

[root@VM-8-3-centos tomcat]# docker exec -it 2535f25d1c66 /bin/bash
[root@2535f25d1c66 local]# pwd
/usr/local
[root@2535f25d1c66 local]# ls
apache-tomcat-9.0.22  bin  etc  games  include  jdk1.8.0_11  lib  lib64  libexec  readme.txt  sbin  share  src
[root@2535f25d1c66 local]# cat readme.txt
先读我
[root@2535f25d1c66 local]#

发布自己的镜像







腾讯云基本同阿里云


点击快速指令

参考: https://console.cloud.tencent.com/tcr/repository?rid=1

小结

# 保存一个镜像
[root@VM-8-3-centos home]# docker save -o [/youpath/文件名.tar.gz] [镜像ID]
# 加载一个 镜像.tar.gz 文件
[root@VM-8-3-centos home]# docker load -i [镜像文件名.tar.gz]
Loaded image ID: sha256:96deed707df80f93150dd1b9cae09edf84581cd2f94d008d4e44c6a47f0343e9

Docker 网络


清空所有镜像(环境), 方便学习 Docker 网络

$ docker rmi -f $(docker images -aq)




---- 附 ---
如果遇到了问题:

  1. ip addr 看不到 inet4 地址
  2. 容器(这里是 tomcat)内 ip addr 命令 not found
  3. 容器(这里是 tomcat)内 ping 命令 not found

解决 问题1:
如果 通过

$ ip addr


没有显示 ipv4 的地址, 我们可以通过


[root@VM-8-3-centos ~]# docker inspect [容器 ID]
[
    {
        "Id": "a25472a92dcf67bdeaf1b2f93ae8dc3c34b8a3cfd521c3855f60b0a84fc577b6",
        "Created": "2021-11-17T13:57:00.120704891Z",
        ......
        "NetworkSettings": {
            ......
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "b256dc9f1f5e9371b9b476f705aea70a16ee545217e6590459dee1426a968236",
                    "EndpointID": "8117cc3587bcb63a0a6fc01c95601b019e2990f0263de3aff4d1393cb9ed9965",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",  # 这就是 inet4 (IPV4) 地址
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]


来查看

解决 问题2 和 3 :

如果 在 tomcat 容器中 执行 如下两个命令,提示 ip 和 ping not found

[root@VM-8-3-centos ~]# docker exec -it tomcat01 ip addr
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ip": executable file not found in $PATH: unknown

[root@VM-8-3-centos ~]# docker exec -it tomcat01 ping 172.72.0.3
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ping": executable file not found in $PATH: unknown

简而言之:可以通过 agt-get 来安装这两个命令


# 更新 apt-get
$ apt-get update

# 安装 ip 命令
$ apt-get install iproute2 iproute2-doc

# 安装 ping 命令
$ apt-get install iputils-ping

下面时详细的 处理过程

exec: "ip": executable file not found in $PATH: unknown
解决过程如下


[root@VM-8-3-centos ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED        STATUS                    PORTS     NAMES
cf938fe054f8   hello-world   "/hello"   23 hours ago   Exited (0) 23 hours ago             vigorous_feistel
[root@VM-8-3-centos ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
tomcat        latest    5db6fed793e9   2 days ago    680MB
hello-world   latest    feb5d9fea6a5   7 weeks ago   13.3kB
[root@VM-8-3-centos ~]# docker run -d -P --name tomcat01 tomcat
e85547eda6a51bf2e2d6ef8820b6922c52efd475a50211cfa9f06e846cf1ec93
[root@VM-8-3-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                         NAMES
e85547eda6a5   tomcat    "catalina.sh run"   17 seconds ago   Up 16 seconds   0.0.0.0:49159->8080/tcp, :::49159->8080/tcp   tomcat01

# 如果运行 报 找不到 ip 命名
[root@VM-8-3-centos ~]# docker exec -it tomcat01 ip addr
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ip": executable file not found in $PATH: unknown

# 我们需要进入容器将 这个命令安装上
[root@VM-8-3-centos ~]# docker exec -it tomcat01 /bin/bash

# 进入后执行安装命令
root@e85547eda6a5:/usr/local/tomcat# apt-get install iproute2 iproute2-doc
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package iproute2
E: Unable to locate package iproute2-doc
root@e85547eda6a5:/usr/local/tomcat# ip addr
bash: ip: command not found

# 发现没有安装成功,需要先更新一下 apt-get
root@e85547eda6a5:/usr/local/tomcat# apt-get update
[1] 44
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package iproute2
E: Unable to locate package iproute2-doc
Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:2 http://security.debian.org/debian-security bullseye-security InRelease [44.1 kB]
Get:3 http://security.debian.org/debian-security bullseye-security/main amd64 Packages [92.8 kB]
Get:4 http://deb.debian.org/debian bullseye-updates InRelease [39.4 kB]
Get:5 http://deb.debian.org/debian bullseye/main amd64 Packages [8180 kB]
Get:6 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [2592 B]
Fetched 8475 kB in 4min 31s (31.3 kB/s)
Reading package lists... Done

[1]+  Done                    apt-get update

# 重新安装 iproute2 iproute2-doc
root@e85547eda6a5:/usr/local/tomcat# apt-get install iproute2 iproute2-doc
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libatm1 libbpf0 libcap2 libcap2-bin libelf1 libmnl0 libpam-cap libxtables12
The following NEW packages will be installed:
  iproute2 iproute2-doc libatm1 libbpf0 libcap2 libcap2-bin libelf1 libmnl0 libpam-cap libxtables12
0 upgraded, 10 newly installed, 0 to remove and 1 not upgraded.
Need to get 1424 kB of archives.
After this operation, 4734 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://deb.debian.org/debian bullseye/main amd64 libelf1 amd64 0.183-1 [165 kB]
Get:2 http://deb.debian.org/debian bullseye/main amd64 libbpf0 amd64 1:0.3-2 [98.3 kB]
Get:3 http://deb.debian.org/debian bullseye/main amd64 libcap2 amd64 1:2.44-1 [23.6 kB]
Get:4 http://deb.debian.org/debian bullseye/main amd64 libmnl0 amd64 1.0.4-3 [12.5 kB]
Get:5 http://deb.debian.org/debian bullseye/main amd64 libxtables12 amd64 1.8.7-1 [45.1 kB]
Get:6 http://deb.debian.org/debian bullseye/main amd64 libcap2-bin amd64 1:2.44-1 [32.6 kB]
Get:7 http://deb.debian.org/debian bullseye/main amd64 iproute2 amd64 5.10.0-4 [930 kB]
Get:8 http://deb.debian.org/debian bullseye/main amd64 iproute2-doc all 5.10.0-4 [30.1 kB]
Get:9 http://deb.debian.org/debian bullseye/main amd64 libatm1 amd64 1:2.5.1-4 [71.3 kB]
Get:10 http://deb.debian.org/debian bullseye/main amd64 libpam-cap amd64 1:2.44-1 [15.4 kB]
Fetched 1424 kB in 60s (23.9 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package libelf1:amd64.
(Reading database ... 12676 files and directories currently installed.)
Preparing to unpack .../0-libelf1_0.183-1_amd64.deb ...
Unpacking libelf1:amd64 (0.183-1) ...
Selecting previously unselected package libbpf0:amd64.
Preparing to unpack .../1-libbpf0_1%3a0.3-2_amd64.deb ...
Unpacking libbpf0:amd64 (1:0.3-2) ...
Selecting previously unselected package libcap2:amd64.
Preparing to unpack .../2-libcap2_1%3a2.44-1_amd64.deb ...
Unpacking libcap2:amd64 (1:2.44-1) ...
等待安装成功...

# 安装成功后在容器中 执行 ip addr 测试, 发现测试通过
root@e85547eda6a5:/usr/local/tomcat# 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
24: eth0@if25: <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

# CTRL + Q + P 不停止容器并退出

# 然后 在宿主机中 测试 运行, 发现 成功解决
[root@VM-8-3-centos ~]# docker exec -it tomcat01 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
24: eth0@if25: <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


# 在 tomcat01 容器里执行 ping 时 如果包如下命令, 解决方法 同 ip 命令找不到一样,通过 apt-get 进行安装
[root@VM-8-3-centos ~]# docker exec -it tomcat01 ping 172.17.0.3
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ping": executable file not found in $PATH: unknown

# 我们再次进入容器 
[root@VM-8-3-centos ~]# docker exec -it tomcat01/bin/bash



bash: ping: command not found
解决过程如下

# 再次确认 ping 命令不可用
root@e85547eda6a5:/usr/local/tomcat# ping 172.17.0.2
bash: ping: command not found

# 安装 ping 命令, 如果直接安装失败 尝试 apt-get update 后 再运行
root@e85547eda6a5:/usr/local/tomcat# apt-get install iputils-ping
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
等待安装成功...

root@e85547eda6a5:/usr/local/tomcat# ping --help
ping: invalid option -- '-'

Usage
  ping [options] <destination>

Options:
  <destination>      dns name or ip address
  -a                 use audible ping
  -A                 use adaptive ping
  -B                 sticky source address
  -c <count>         stop after <count> replies
  -D                 print timestamps
  -d                 use SO_DEBUG socket option
  -f                 flood ping
  -h                 print help and exit
  -I <interface>     either interface name or address
  -i <interval>      seconds between sending each packet
  -L                 suppress loopback of multicast packets
  -l <preload>       send <preload> number of packages while waiting replies
  -m <mark>          tag the packets going out
  -M <pmtud opt>     define mtu discovery, can be one of <do|dont|want>
  -n                 no dns name resolution
  -O                 report outstanding replies
  -p <pattern>       contents of padding byte
  -q                 quiet output
  -Q <tclass>        use quality of service <tclass> bits
  -s <size>          use <size> as number of data bytes to be sent
  -S <size>          use <size> as SO_SNDBUF socket option value
  -t <ttl>           define time to live
  -U                 print user-to-user latency
  -v                 verbose output
  -V                 print version and exit
  -w <deadline>      reply wait <deadline> in seconds
  -W <timeout>       time to wait for response

IPv4 options:
  -4                 use IPv4
  -b                 allow pinging broadcast
  -R                 record route
  -T <timestamp>     define timestamp, can be one of <tsonly|tsandaddr|tsprespec>

IPv6 options:
  -6                 use IPv6
  -F <flowlabel>     define flow label, default is random
  -N <nodeinfo opt>  use icmp6 node info query, try <help> as argument

For more details see ping(8).

# 安装成功了

# CTRL + Q + P 不停止容器并退出

# 宿主机中运行 测试, 发现成功了
[root@VM-8-3-centos ~]# docker exec -it tomcat01 ping 172.72.0.3
PING 172.72.0.3 (172.72.0.3) 56(84) bytes of data.
64 bytes from 172.72.0.3: icmp_seq=1 ttl=42 time=235 ms
64 bytes from 172.72.0.3: icmp_seq=2 ttl=42 time=232 ms
64 bytes from 172.72.0.3: icmp_seq=4 ttl=42 time=234 ms
^C
--- 172.72.0.3 ping statistics ---
5 packets transmitted, 3 received, 40% packet loss, time 4003ms
rtt min/avg/max/mdev = 231.502/233.542/234.908/1.470 ms
[root@VM-8-3-centos ~]#

---- 附 结束---




查看新启动的容器的网卡信息







小结



通过 docker network 查看 docker 的网络


标注 docker network inspect 输出的内容

  • 1.通过 docker inspect tomcat03 命令查看

  • 2.通过 Host 文件 查看
    下面的 /etc/hostswindow 上的 host 文件是同一个功能的东西

自定义网络


网络模式

测试

创建网络前 清空 所有的容器 保持环境



在自己创建的网络上 运行两个 tomcat 容器

再来检查一下我们创建的网络情况



网络连通


答案:是不能的。

下面我们来测试。

再 docker0 网络上 启动两个 tomcat 容器

ping 一下

发现确实是 ping 不通的

正确的方式应该是 将 docker01 网络中的 容器连接到 我们的 自定义网络(mynet)中

使用命令 docker network connet


tomcat01 连接到 mynet 网络,并 检查 mynet

PS:

结论:

实战:部署 Redis 集群




缩写 r-m1 redis-master1 主机
r-s1 redis-slave 从机 主 redis 的 副本 redis
redis 服务挂掉(红色)的 时候 备份的要顶上去。


启动6个 太多了,通过 shell 脚本启动

(文本形式的命令 在本小节内容的最下面, 可直接复制)

通过循环启动的话, 把下面的语句加入到 for 循环中

手动依次启动





启动完毕后 查看启动情况

进入 一个 redis 后, 创建集群

启动 redis-cli -c 代表集群

查看集群节点


设置一个 key 为a 值 为 'b' 的, 发现 是 172.38.0.13 取处理的

然后 去停到这个节点的服务,看时候还能获取到 a 的值

尝试获取

172.38.0.13 的 从机 172.38.0.14 上获取到了


上面 搭建 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

# 依次启动 redis 服务
# 1.
docker run  -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 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 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 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 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 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 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 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 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 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 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 进入一个 redis 容器
docker exec -it redis-1 /bin/sh

# 创建集群 副本为 1
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

# 启动客户端 redis-cli
redis-cli -c

# 查看集群情况
cluster info

# 查看集群节点
cluster nodes

# 设置一个 值 为 'b' 的 key  a
set a b

# 停止 设置 a key 的 主 redis 服务 (我这里是 redis-3, 你的可不一定)
docker stop redis-3

# 连接 redis 集群
redis-cli -c

# 查询 a 的值
get a


SpringBoot 微服务打包 Docker 镜像


创建项目

创建完毕

编写 hello world

本地自测

打包

生成

jar 包 启动测试

可选 步骤(可以不弄) 装 Docker 插件

下载后可以从这里 连接 docker 仓库

编写 Dockerfile

将 jar 包 和 Dockerfile 传到服务器

构建 docker 镜像

查看 构建的 镜像

启动镜像

访问测试, 打印出了 hello

思考:
如果有多个镜像,比如 100 个镜像, 怎么维护它呢???

要用到

Docker Compose 容器编排

Docker Swarm 集群部署 (相当于 精简的 k8s )

CI/CD 之 Jenkins

posted @ 2021-11-02 22:39  暗恋桃埖源  阅读(393)  评论(0编辑  收藏  举报