Loading

Docker

Docker概述

Docker 为什么出现?

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

开发 --- 运维问题:我在我的电脑上可以运行!版本更新,导致服务不可用!对于运维来说,考验就变大了?

开发即运维!

环境配置是十分的麻烦,每一个机器都要部署环境(Redis、ES、Hadoop) ,费时费力

发布一个项目jar(Redis、MySQL、jdk、ES)项目能不能带上环境安装打包!

之前在服务器配置一个环境Redis、MySQL、jdk、ES、Hadoop,配置很麻烦,不能够跨平台

如果在Windows配置,最后部署发布在Linux的话,是会有天壤之别

传统:丢一个jar包,运维去做

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

java --- apk(软件)--- 发布(应用商店) ---- 现在有一个用户去使用这个软件 -- 安装就可以使用

java --- jar(环境都在里面) --- 打包项目带上环境(镜像) ---(Docker仓库:就好比上面的商店)--- 如果现在有人需要用(直接运行即可)

Docker给以上的问题,提出了解决方案

Docker

Docker的思想就来自于集装箱

如果现在java运行环境(JRE) -- 跑了多个应用(端口冲突) --- 原来都是交叉的!

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

Docker的历史

2010年,有几个搞IT的年轻人,在美国dotCloud

做一下pass的云计算服务 ! LXC有关的容器技术

他们将自己的技术(容器化技术)命名就是Docker!

Docker 刚刚诞生,没有引起行业的注意!dotCloud,就或不下去

开源

开放源代码!

2013年,Docker开源

Docker越来越多人发现docker的优点火了,Docker每个一个月就更新一个版本

2014年4月9日,Docker1.0发布!

Docker为什么这么火?十分的轻巧!

在容器技术出来之前,我们都是使用虚拟机技术!

虚拟机:在window中装一个Vmware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!

虚拟机也是属于虚拟化技术,Docker容器技术,也是一种虚拟化技术

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

到现在,所有开发人员都必须要会Docker!

聊聊Docker

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

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

文档地址:https://docs.docker.com/develop/

Docker能干嘛

虚拟机技术缺点:

1.资源占用十分多

2.冗余步骤多

3.启动很慢

容器化技术

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

比较Docker 和虚拟机技术的不同:

  • 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后再这个系统上安装和运行软件
  • 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
  • 每个容器间是相互隔离,每个容器内都有一个属于自己的的文件系统,互不影响

DevOps(开发,运维)

应用更快速的交付和部署

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

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

更便捷的升级和扩展和扩缩容

使用Docker之后,我们部署应用和搭积木一样

项目打包为一个镜像,扩展 服务器A 服务器B

更简单的运维

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

更高效的计算资源利用

Docker是内核级别的虚拟化,可以再一个物理机可以运行很多容器实例!服务器的性能可以被压榨到极致

Docker安装

Docker的基本组成 😭

图片显示不了就网上找

镜像(image):

docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像 => run=> tomcat01容器(提供服务器),通过这个镜像可以创建多个容器,(最终服务运行或者项目运行就是在容器中)

容器(container):

Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的

启动,停止,删除,基本命令

目前就可以把这个容器理解为就是一个简易的Linux的系统

仓库(repository)

仓库就是存放镜像的地方!

仓库分为公有仓库和私有仓库!

Docker Hub

安装Docker

环境准备

1、需要会点linux的基础

2、CentOS 7

3、我们使用Xshell连接远程服务器进行操作!

查看环境

# 系统内核是3.10
[root@iZwz94cw1gup8aldclit1qZ ~]# uname -r
3.10.0-1062.18.1.el7.x86_64
[root@iZwz94cw1gup8aldclit1qZ ~]# uname -r
3.10.0-1062.18.1.el7.x86_64
[root@iZwz94cw1gup8aldclit1qZ ~]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

安装

帮助文档

# 1.卸载旧的版本
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
# 2.需要的安装包
yum install -y yum-utils

# 3.设置镜像的仓库
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的
    
yum-config-manager \
    --add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里云

# 更新yum软件包索引
yum makecache fast


# 5.安装docker 相关的内容  docker-ce社区版  ee企业版
yum install docker-ce docker-ce-cli containerd.io


# 6.启动docker
systemctl start docker

# 注意需要启动进行以下一系列的操作
# 不然会报 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
# 查看版本
[root@iZwz94cw1gup8aldclit1qZ /]# docker version
Client: Docker Engine - Community
 Version:           19.03.11
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        42e35e61f3
 Built:             Mon Jun  1 09:13:48 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.11
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       42e35e61f3
  Built:            Mon Jun  1 09:12:26 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683


# 8、查看一下下载的这个 hello-world 镜像
[root@iZwz94cw1gup8aldclit1qZ /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        5 months ago        13.3kB

了解:卸载docker

# 1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io

# 2.删除资源
rm -rf /var/lib/docker

# /var/lib/docker docker的默认路径

阿里镜像加速

1.登录阿里云找到

image-20200604151346016

2.找到镜像加速地址

image-20200604151210550

3.配置使用

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://p3jr2wkc.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker  # 启动

回顾HelloWorld流程

image-20200604151811802

Docker运行原理图:

DockerHub:是一个仓库

image-20200604153054992

底层原理

Docker是怎么工作的?

Docker是一个Client-Server 结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!

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

Docker 为什么比VM快?

1、Docker有着比虚拟机更少的抽象层

2、docker利用的是宿主机的内核,vm需要的是Guest OS

image-20200604154849904

​ 所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导,虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略复杂的过程,秒级

Docker的常用命令

帮助命令

docker version    # 显示版本信息
docker info		  # 显示docker的系统信息,包括镜像和容器数量
docker 命令 --help # 帮助命令

帮助文档的地址:https://docs.docker.com/reference/

镜像命令

docker images 查看所有本地的主机上的镜像

[root@iZwz94cw1gup8aldclit1qZ /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        5 months ago        13.3kB

# 解析
REPOSITORY  #镜像的仓库源
TAG			#镜像的标签
IMAGE ID	#镜像的id
CREATED		#镜像的创建时间
SIZE		#镜像的大小

[root@iZwz94cw1gup8aldclit1qZ /]# docker images --help
Options:可选项
  -a, --all           # 列出所有镜像

  -q, --quiet         # 只显示镜像的id

移除所有镜像

[root@iZwz94cw1gup8aldclit1qZ /]#  docker rmi -f $(docker ps -aq)

docker search 搜索镜像

[root@iZwz94cw1gup8aldclit1qZ /]# docker search mysql
NAME           DESCRIPTION                                 STARS  OFFICIAL  AUTOMATED
mysql      MySQL is a widely used, open-source relation…   9582     [OK]                
mariadb    MariaDB is a community-developed fork of MyS…   3482     [OK]    

# 可选项  ,通过收藏来过滤
docker search mysql --filter=STARS=3000 #搜索出来的镜像就是STARS大与3000的

NAME           DESCRIPTION                                 STARS  OFFICIAL  AUTOMATED
mysql      MySQL is a widely used, open-source relation…   9582     [OK]                
mariadb    MariaDB is a community-developed fork of MyS…   3482     [OK]   

[root@iZwz94cw1gup8aldclit1qZ /]# docker search mysql --filter=STARS=5000
NAME           DESCRIPTION                                 STARS  OFFICIAL  AUTOMATED
mysql      MySQL is a widely used, open-source relation…   9582     [OK]                

docker pull 下载镜像

# 下载镜像docker pull 镜像名
[root@iZwz94cw1gup8aldclit1qZ /]# docker pull mysql
Using default tag: latest    # 如果不写tag  默认既是最新版
latest: Pulling from library/mysql 
afb6ec6fdc1c: Pull complete  # 分层下载,docker iamge的核心,联合文件系统
0bdc5971ba40: Pull complete 
97ae94a2c729: Pull complete 
f777521d340e: Pull complete 
1393ff7fc871: Pull complete 
a499b89994d9: Pull complete 
7ebe8eefbafe: Pull complete 
597069368ef1: Pull complete 
ce39a5501878: Pull complete 
7d545bca14bf: Pull complete 
211e5bb2ae7b: Pull complete 
5914e537c077: Pull complete 
Digest: sha256:a31a277d8d39450220c722c1302a345c84206e7fd4cdb619e7face046e89031d #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址

# 等价于它
docker pull mysql  == docker.io/library/mysql:latest

#指定版本下载
[root@iZwz94cw1gup8aldclit1qZ /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
afb6ec6fdc1c: Already exists 
0bdc5971ba40: Already exists 
97ae94a2c729: Already exists 
f777521d340e: Already exists 
1393ff7fc871: Already exists 
a499b89994d9: Already exists 
7ebe8eefbafe: Already exists 
4eec965ae405: Pull complete 
a531a782d709: Pull complete 
270aeddb45e3: Pull complete 
b25569b61008: Pull complete 
Digest: sha256:d16d9ef7a4ecb29efcd1ba46d5a82bda3c28bd18c0f1e3b86ba54816211e1ac4
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

image-20200604165112545

docker rmi 删除镜像

[root@iZwz94cw1gup8aldclit1qZ /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 a4fdfd462add        2 weeks ago         448MB
mysql               latest              30f937e841c8        2 weeks ago         541MB
hello-world         latest              bf756fb1ae65        5 months ago        13.3kB
[root@iZwz94cw1gup8aldclit1qZ /]# docker rmi -f bf756fb1ae65 #删除指定的容器 	
Untagged: hello-world:latest
Untagged: hello-world@sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
[root@iZwz94cw1gup8aldclit1qZ /]# docker rmi -f a4fdfd462add
Untagged: mysql:5.7
Untagged: mysql@sha256:d16d9ef7a4ecb29efcd1ba46d5a82bda3c28bd18c0f1e3b86ba54816211e1ac4
Deleted: sha256:a4fdfd462add8e63749aa08ff0044b13d342a042965f1ec6744586cda10dfce9
Deleted: sha256:637f0ff7e591e53fe997c634cf10e63ab810dd1d6cb587ce46a57f753c36bdbf
Deleted: sha256:65ba4d5ac7eb5218cfb4be1e7807584425c19f47606bc1e6d53e050d480d9581
Deleted: sha256:7d0236d50948d993a686c69889c6f016a8da89b8557c5e0eaf6af145ea5877cb
Deleted: sha256:a6219b1270405f43892a7a12895ae1e0ccff307d162cf0025df3ed87f511754b


[root@iZwz94cw1gup8aldclit1qZ /]# docker rmi -f $(docker images -aq)  # 删除全部的容器
Untagged: mysql:latest
Untagged: mysql@sha256:a31a277d8d39450220c722c1302a345c84206e7fd4cdb619e7face046e89031d
Deleted: sha256:30f937e841c82981a9a6363f7f6f35ed6b9d5e3f16df50a72207e4a2a389983f
Deleted: sha256:8a5e032615340d8936e0e3707a39ce3da51dc952368176818f879e2f868b535b
Deleted: sha256:c74673a735ca31b9b5162808ab451a8b20876a15e16a7899f2101f3c9b82df60
Deleted: sha256:430365c8e22a9207dca4638c523dc82163bca3ab8a335a71147af41d1551561f
Deleted: sha256:1ede41b1dbec1a5e4385200b62283ffb25c425275530ea9e9cc36b921186cd08
Deleted: sha256:2f6badb9fd9965261d3463591f8af4afddf5f141456de83dc994690ae64b34eb
Deleted: sha256:37803884320881cd931c77dea2ee4d8a7231dfed5a02dc595e6046ffacfa6e1b
Deleted: sha256:cefc9066dc1aa84f6cddead1bb5a8c590e8368d56fb65694e8783d70791bec20
Deleted: sha256:3bfbd2dd4507386ce56fd731b3c97d10bc058e6aa478f901466da69108db50e1
Deleted: sha256:9652363dd4c1146b3f9a519800a9f379adf0b6c4f9aece1ffe965dce5f52a8ca
Deleted: sha256:0ed190016efa0f19bcc5f1d66ffffc7b09716f3c57bcc5de74a4ce217af92278
Deleted: sha256:8399fb13d72603fdc8781075672ee25fedf8384f6721639a70dd3533250ed9e4
Deleted: sha256:ffc9b21953f4cd7956cdf532a5db04ff0a2daa7475ad796f1bad58cfbaf77a07

# docker rmi -f 镜像id #删除指定的容器 	
# docker rmi -f 镜像id,镜像id,镜像id #删除多个容器 	
# docker rmi -f $(docker images -aq)  # 删除全部的容器

容器命令

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

docker pull centos

新建容器并启动

docker run [可选参数] image

# 参数说明

--name=“Name"  容器名字   tomcat01  tomcat02 用来区分容器
-d             后台方式运行
-it            使用交互方式运行,进入容器查看内容
-p             指定容器的端口   -p  8080
	-p ip:主机段端口:容器端口
	-p 主机端口:容器端口(常用)
	-p 容器端口
	容器端口
-P             随机指定端口


# 启动并进入到容器
[root@iZwz94cw1gup8aldclit1qZ /]# docker run -it centos /bin/bash
[root@d3757d18a8e7 /]# 

列出所有的运行的容器

# docker ps  命令
      #列出当前正在运行的容器
-a    #列出当前正在运行的容器,带出历史运行过的容器
-n=? #显示最近创建的容器
-q   #只显示容器编号

[root@iZwz94cw1gup8aldclit1qZ /]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps -a
CONTAINER ID   IMAGE        COMMAND      CREATED      STATUS         PORTS        NAMES
d3757d18a8e7   centos     "/bin/bash"  3 minutes ago   Exited (0) About a minute ago                       heuristic_wilson
01c7eef64c15 bf756fb1ae65  "/hello" 2 hours ago        Exited (0) 2 hours ago 


[root@iZwz94cw1gup8aldclit1qZ /]# docker ps -a -n=1
CONTAINER ID  IMAGE    COMMAND      CREATED     STATUS        PORTS               NAMES
d3757d18a8e7 centos  "/bin/bash" 7 minutes ago  Exited(0) 5 minutes ago heuristic_wilson


[root@iZwz94cw1gup8aldclit1qZ /]# docker ps -aq
d3757d18a8e7
01c7eef64c15

退出容器

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

# 查看
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps
CONTAINER ID  IMAGE    COMMAND   CREATED     STATUS    PORT     NAMES
27f5afcc55c2 centos "/bin/bash" 34 seconds ago  Up 33 seconds   hopeful_banach

删除容器

docker rm 容器id                    #删除指定的容器   不能删除正在运行的容器,如果要强制删除rm -f
docker rm -f $(docker ps -aq)      #删除所有的容器
docker ps -aq | xargs docker rm -f #删除所有的容器

[root@iZwz94cw1gup8aldclit1qZ /]#  docker ps -aq | xargs docker rm -f
27f5afcc55c2

启动和停止容器的操作

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

常用其他命令

后台启动容器

# 命令 docker run -d 镜像名
[root@iZwz94cw1gup8aldclit1qZ /]# docker run -d centos

# 问题docker ps 发现centos 停止了

# 常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立即停止,没有程序就会停止

查看日志命令

# docker logs -f -t --tail 100 79b8c8f83b8f  查看前100条的日志

# 如果没有日志的话,自己写一个Shell脚本

# 通过docker写一个shell脚本
[root@2fae659c4a46 tmp]# vi hello.sh 
#! /bin/bash
while
 true
do 
echo 'hello shell'
sleep 1;
done

# 显示日志
-tf            # 显示日志
--tail number  #要显示日志条数

# 这里需要服务器宿主机进行访问
docker logs -tf --tail 10 2fae659c4a46


如下可以看到一监控,运行hell.sh宿主机就能够检测到日志

image-20200604235140224

查看镜像元数据

[root@iZwz94cw1gup8aldclit1qZ tmp]# docker inspect 22fa19932db2


[
    {
        "Id": "22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b",
        "Created": "2020-06-04T15:31:42.802413935Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 8240,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-06-04T15:31:43.103749077Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:470671670cac686c7cf0081e0b37da2e9f4f768ddc5f6a26102ccd1c6954c1ee",
        "ResolvConfPath": "/var/lib/docker/containers/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b/hostname",
        "HostsPath": "/var/lib/docker/containers/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b/hosts",
        "LogPath": "/var/lib/docker/containers/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b-json.log",
        "Name": "/sad_euclid",
        "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/577a554570a3b45302c3991c84d0ab78bbbf10ac559e23d688d8c88b84b64b28-init/diff:/var/lib/docker/overlay2/8da4cd669d4ba75e5aae59a0b99b386b7b54dd58da758a3eb56f91da3e3b460f/diff",
                "MergedDir": "/var/lib/docker/overlay2/577a554570a3b45302c3991c84d0ab78bbbf10ac559e23d688d8c88b84b64b28/merged",
                "UpperDir": "/var/lib/docker/overlay2/577a554570a3b45302c3991c84d0ab78bbbf10ac559e23d688d8c88b84b64b28/diff",
                "WorkDir": "/var/lib/docker/overlay2/577a554570a3b45302c3991c84d0ab78bbbf10ac559e23d688d8c88b84b64b28/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "22fa19932db2",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20200114",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS",
                "org.opencontainers.image.created": "2020-01-14 00:00:00-08:00",
                "org.opencontainers.image.licenses": "GPL-2.0-only",
                "org.opencontainers.image.title": "CentOS Base Image",
                "org.opencontainers.image.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "d4b50f9c15899a2ca59357d0d9c3effd8e42bc020c3a2ef63781b1a4f7f3d959",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/d4b50f9c1589",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "fb48cf4c42e91609af0ecb640797381368bb1f6df389426b4ffcb1b553803b29",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.8",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:08",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "97e9416f43bc7aedbbbf68e8397b5ea42431efb6a002f26187e2729c7de00ae5",
                    "EndpointID": "fb48cf4c42e91609af0ecb640797381368bb1f6df389426b4ffcb1b553803b29",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.8",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:08",
                    "DriverOpts": null
                }
            }
        }
    }
]

进入当前正在运行的容器

# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置

# 命令
docker exec -it 容器

# 第一种
[root@iZwz94cw1gup8aldclit1qZ /]#  docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
713f94102873        centos              "/bin/bash"         18 minutes ago      Up 18 minutes                           elated_dhawan
22fa19932db2        centos              "/bin/bash"         35 minutes ago      Up 35 minutes                           sad_euclid
2fae659c4a46        centos              "/bin/bash"         44 minutes ago      Up 44 minutes                           zealous_stonebraker
c0d60da80c75        centos              "/bin/bash"         2 hours ago         Up 2 hours                              xenodochial_northcutt
8cbeb2158afc        centos              "/bin/bash"         3 hours ago         Up 3 hours                              unruffled_swirles
51184e1e6ec3        centos              "/bin/bash"         3 hours ago         Up 3 hours                              jovial_roentgen
5bb81e29582d        centos              "/bin/bash"         3 hours ago         Up 3 hours                              nice_mayer
79b8c8f83b8f        centos              "/bin/bash"         6 hours ago         Up 6 hours                              elegant_lalande
[root@iZwz94cw1gup8aldclit1qZ /]# docker exec -it 5bb81e29582d /bin/bash
[root@5bb81e29582d /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@5bb81e29582d /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 13:06 pts/0    00:00:00 /bin/bash
root        19     0  0 16:08 pts/1    00:00:00 /bin/bash
root        33    19  0 16:08 pts/1    00:00:00 ps -ef
[root@5bb81e29582d /]# 


#第二种
[root@iZwz94cw1gup8aldclit1qZ /]# docker attach 22fa19932db2
[root@22fa19932db2 tmp]# ls
ks-script-_srt3u3c  ks-script-gpqu_kuo
[root@22fa19932db2 tmp]# cd ..
[root@22fa19932db2 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@22fa19932db2 /]# cd tmp

# docker exec -it 容器id   # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach 容器id     # 进入容器正在执行的终端,不会启动新的进程

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

# 进入到容器中
docker exec -it 51184e1e6ec3 /bin/bash

# 在容器中新建一个文件
[root@51184e1e6ec3 home]# touch rzk.java
[root@51184e1e6ec3 home]# ls
rzk.java
[root@51184e1e6ec3 home]# exit 
exit

# 把这个文件拷贝出来到我们主机上
[root@iZwz94cw1gup8aldclit1qZ /]# ls
bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@iZwz94cw1gup8aldclit1qZ /]# docker cp 51184e1e6ec3:/home/rzk.java /tmp
[root@iZwz94cw1gup8aldclit1qZ tmp]# ls
hello.sh  hsperfdata_root  rzk.java


#拷贝是一个手动的过程,未来我们使用的是 -v卷的技术可以实现

Docker 安装Nginx

1.搜索  nginx
# docker search nginx
2.下载  nginx
# docker pull nginx 
3.运行测试
这里的 # -p 3344:80

# -p 暴露防火墙端口 通过3344 去访问 内部80端口

[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d --name nginx02 -p 3344:80 nginx
02b2f941a66da088d4d0d814aaedb39c62f6e724cee8fbb98e272641645bd486
[root@iZwz94cw1gup8aldclit1qZ ~]# dicker ps
-bash: dicker: command not found
[root@iZwz94cw1gup8aldclit1qZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
02b2f941a66d        nginx               "/docker-entrypoint.…"   14 seconds ago      Up 13 seconds       0.0.0.0:3344->80/tcp   nginx02
c0d60da80c75        centos              "/bin/bash"              3 hours ago         Up 3 hours                                 xenodochial_northcutt
51184e1e6ec3        centos              "/bin/bash"              4 hours ago         Up 4 hours                                 jovial_roentgen
5bb81e29582d        centos              "/bin/bash"              4 hours ago         Up 4 hours                                 nice_mayer
79b8c8f83b8f        centos              "/bin/bash"              7 hours ago         Up 7 hours                                 elegant_lalande
[root@iZwz94cw1gup8aldclit1qZ ~]# curl localhost:3344
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@iZwz94cw1gup8aldclit1qZ ~]# 

# 进入容器
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it nginx02 /bin/bash
root@02b2f941a66d:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@02b2f941a66d:/# cd /etc/nginx
root@02b2f941a66d:/etc/nginx# ls
conf.d	fastcgi_params	koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params	uwsgi_params  win-utf
root@02b2f941a66d:/etc/nginx# 


Docker 安装Tomcat

# 官方使用
docker run -it --rm tomcat:9.0

# 之前使用的启动都是后台,停止了容器之后,容器还是可以查询得到,docker run -it --rm一般用来测试,用完就可以删除

# 下载启动
docker pull tomcat9.0

# 启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat

# 进入容器
docker exec -it tomcat01 /bin/bash

# 发现问题,1.linux 命令少了,2.没有webapps,阿里云镜像的原因导致的,它把不必要的都踢除了
# 保证最小运行的环境

思考问题:以后要部署项目的话,如果每次都要进入容器是不是很麻烦?我要是可以 在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了

Docker 安装Elasticsearch

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

# 启动elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

# 查看运行的状态  docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
1afed8e13fa8        elasticsearch       0.31%               1.236GiB / 3.7GiB   33.40%              0B / 0B             0B / 0B             43
8febdf517af1        toncat01            0.18%               87.5MiB / 3.7GiB    2.31%               928kB / 50.4kB      0B / 0B             36
02b2f941a66d        nginx02             0.00%               1.875MiB / 3.7GiB   0.05%               9.16kB / 11.9kB     0B / 0B             3
79b8c8f83b8f        elegant_lalande     0.00%               544KiB / 3.7GiB     0.01%               972B / 0B           0B / 0B             1


# 测试一下ES是否启动成功
[root@iZwz94cw1gup8aldclit1qZ /]# curl localhost:9200
{
  "name" : "1afed8e13fa8",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "El2Y1JA-TSW_ER82xWektA",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

# 启动成功之后就可以关闭,增加内存的测试

image-20200606201226503

# 赶紧关闭,增加内存的限制,修改配置文件  -e 配置修改

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

这样就可以发现内存消耗变小了

image-20200606210122855

[root@iZwz94cw1gup8aldclit1qZ ~]# curl localhost:9200
{
  "name" : "5c97790a32e8",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "3xE4EY7kTFGE0q4bxXlCmQ",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

使用 kibana连接es

需要加Linux内网Ip

可视化😄

  • portainer (先用这个)
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
  • Rancher (CI/CD再用)

什么portainer?

Docker 图形化界面管理工具!提供一个后台面板供我们操作

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

访问测试:外网:8088

[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -p 8088:9000 \
> --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
d1e017099d17: Pull complete 
b8084bf83dcf: Pull complete 
Digest: sha256:55c7614b1ad61eabc27214299c42d41bb49e5ef78238c0e5783031f041499284
Status: Downloaded newer image for portainer/portainer:latest
b0fbdea34c7faf0017c4e9f33c22f78d9274cb62691ff00856c1c1bb384afe84

访问测试:http://ip:8088/

通过地址访问

image-20200608094234885

image-20200608095113410

Container:运行有几个,停止有几个

Images:当前仓库有几个镜像

Volume:数据卷挂载

Docker镜像讲解

特点

Docker 镜像都是只读的,当容器启动是,一个新的可写层被加载到镜像的顶部!

这一层就是我们通常说的容器层,容器之下的都叫镜像层

如何提交一个自己的镜像

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

#命令和git原理类似
docker comit  -m="提交的描述信息" -a=“作者” 容器id  目标镜像名,[TAG]

实战测试

# 启动一个默认的tomcat

# 发现这个默认的tomcat,webapps是没有文件的,把webapps.dist 下的拷到webapps下
 cp -r webapps.dist/* webapps

# 拷完就直接
[root@iZwz94cw1gup8aldclit1qZ ~]# docker commit -a="rzk" -m="add webapps app" 5d487edfdbb4 tomcat02:1.0
sha256:4e478467565c893a0e2260eb6f34018120444576e7238cac4d5e7293d4d6b511
[root@iZwz94cw1gup8aldclit1qZ ~]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
tomcat02              1.0                 4e478467565c        4 seconds ago       647MB
nginx                 latest              4392e5dad77d        5 days ago          132MB
portainer/portainer   latest              cd645f5a4769        6 days ago          79.1MB
redis                 latest              36304d3b4540        10 days ago         104MB
tomcat                9.0                 1b6b1fe7261e        3 weeks ago         647MB
tomcat                latest              1b6b1fe7261e        3 weeks ago         647MB
elasticsearch         7.6.2               f29a1ee41030        2 months ago        791MB
centos                latest              470671670cac        4 months ago        237MB

容器数据卷

什么事容器数据卷

docker的理念回顾

将应用和环境打包成一个镜像!

数据?如果数据都在容器中,那么我吧容器删除,数据就会丢失! 需求:数据可以持久化

那要是把MySQL容器刪了,就可以删库跑路了, 需求:MySQL数据可以存储在本地!

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面

https://images.cnblogs.com/cnblogs_com/rzkwz/1782920/o_200608090451Linux.jpg

总结一句话;容器的持久化和同步操作!容器间也是可以数据共享的!

使用数据卷

方式一:直接使用命令来挂载 -v

docker inspect bc4baa086e3e

Destination: 目的地 docker容器内的地址

Source:挂载区 主机内地址

        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/ceshi",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

测试文件同步

第一步在主机编写一个hello.java:

[root@iZwz94cw1gup8aldclit1qZ ceshi]# vi hello.java
[root@iZwz94cw1gup8aldclit1qZ ceshi]# ls
hello.java
[root@iZwz94cw1gup8aldclit1qZ ceshi]# cat hello.java
!# /bin/bash
echo '你好'

查看docker容器:

[root@bc4baa086e3e home]# ls
hello.java
[root@bc4baa086e3e home]# cat -n hello.java 
     1	!# /bin/bash
     2	
     3	echo '你好'

会发现容器里面会出现一个和主机一样的文件

如果把容器停了,主机新建一个文件,容器会不会同步主机的文件呢

# 停止容器  在宿主机编写
[root@iZwz94cw1gup8aldclit1qZ ceshi]# docker stop bc4baa086e3e 
bc4baa086e3e
[root@iZwz94cw1gup8aldclit1qZ ceshi]# docker stop bc4baa086e3e
bc4baa086e3e
# 在宿主机修改文件
[root@iZwz94cw1gup8aldclit1qZ ceshi]# vi hello.java 
[root@iZwz94cw1gup8aldclit1qZ ceshi]# cat hello.java 
!# /bin/bash
echo '你好,我把容器停了,宿主机编写这段文字'
echo '哈哈哈,我又來了'
# 启动容器
[root@iZwz94cw1gup8aldclit1qZ ceshi]# docker start bc4baa086e3e
bc4baa086e3e
# 进入容器
[root@iZwz94cw1gup8aldclit1qZ ceshi]# docker attach bc4baa086e3e

[root@bc4baa086e3e home]# cat hello.java 
!# /bin/bash

echo '你好,我把容器停了,宿主机编写这段文字'
echo '哈哈哈,我又來了'

以上可以得出,只要容器不删除,把容器停了,编写文件也会被同步到里面

实战:MySQL的数据持久化的问题!

思考数据持久化

获取镜像
# docker pull mysql:5.7

# 运行容器,需要做数据挂载 
# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# 启动
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
# -v /home/mysql/data:/var/lib/mysql 把mysql里面的东西挂载到data里面
[root@iZwz94cw1gup8aldclit1qZ home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
be3e92f2f41715d7ce90c8b8af2a3506bacb6c50740d29ae88c4ec320b973279

# 启动成功之后,我们本地使用sqlyog来连接测试一下
# sqlyog -连接到服务器的3310 --- 331-  和容器内的3306映射,这个时候我们可以连接上了

# 在本地测试一个数据库,查看一下我们映射的路径是否ok!

# 步骤在SQLyog 新建一个test数据库,然后去终端mysql/data查看会不会出现一个test名字的文件
[root@iZwz94cw1gup8aldclit1qZ home]# ls
ceshi  mysql  nginx-1.14.0  nginx-1.14.0.tar.gz  rzk
[root@iZwz94cw1gup8aldclit1qZ home]# cd mysql
[root@iZwz94cw1gup8aldclit1qZ mysql]# ls
conf  data
[root@iZwz94cw1gup8aldclit1qZ mysql]# cd data
[root@iZwz94cw1gup8aldclit1qZ data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem
[root@iZwz94cw1gup8aldclit1qZ data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem   test
[root@iZwz94cw1gup8aldclit1qZ data]# 

假设把容器删除

# 删除容器
root@iZwz94cw1gup8aldclit1qZ data]# docker rm -f mysql01
[root@iZwz94cw1gup8aldclit1qZ data]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                            NAMES
# 查看mysql已经不在了
[root@iZwz94cw1gup8aldclit1qZ data]# docker ps -a
bc4baa086e3e        centos                "/bin/bash"              19 hours ago        Up 16 hours                                                          xenodochial_goldstine

数据卷还是在的
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem   test

可以发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能

具名和匿名挂载

# 匿名挂载
-v 容器内路径
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
docker run -d -P --name nginx01 -v /etc/nginx naginx

[root@iZwz94cw1gup8aldclit1qZ test]# docker volume ls
DRIVER              VOLUME NAME
local               427983870a2bffc00778cc5d1dc9d1dc9e91aae5a161fcaf6965e46b5d7b99b3


# 这里发现 ,这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径

# 具名挂载  通过 -v 卷名:容器内路径
-v 容器内路径
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
[root@iZwz94cw1gup8aldclit1qZ test]# docker run -d -P --name naginx02 -v juming-nginx:/etc/nginx nginx
50e60ad6712300264eb4acf707eac20d76a7dbc9597f08f0c9613a7877caadc3
[root@iZwz94cw1gup8aldclit1qZ test]# docker volume ls
DRIVER              VOLUME NAME
local               427983870a2bffc00778cc5d1dc9d1dc9e91aae5a161fcaf6965e46b5d7b99b3
local               b4e09d34098f10f10921f3a9b7960bb1c033b57c982d380272780c41d426857d
local               juming-nginx

# 通过  -v 卷名:容器内路径
# 查看一下这个卷
[root@iZwz94cw1gup8aldclit1qZ data]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2020-06-09T16:36:01+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/***/data

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用 具名挂载

区分具名和匿名挂载,还是指定路径挂载

# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径              # 匿名挂载
-v 卷名:容器内路径        # 具名挂载
-v /宿主机路径:容器内路径  # 指定路径挂载

拓展

# 通过 -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就说明这个路径只能通过宿主机来操作,容器内部是无法操作

初始Dockerfile

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

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

# 创建一个dockerfile文件,名字可以随意
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# pwd
/home/docker-test-volume
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# vim dockerfile1
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# 
# 文件内容
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# cat dockerfile1 
FORM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash

# 创建一个自己的镜像
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t rzk/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 470671670cac
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Using cache
 ---> 9305bf5771fa
Step 3/4 : CMD echo "----end----"
 ---> Using cache
 ---> 95ffd2f99bd0
Step 4/4 : CMD /bin/bash
 ---> Using cache
 ---> 2b667e117705
Successfully built 2b667e117705
Successfully tagged rzk/centos:1.0

# 查看镜像
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
rzk/centos            1.0                 2b667e117705        About an hour ago   237MB
rzk/centos            latest              2b667e117705        About an hour ago   237MB
tomcat02              1.0                 4e478467565c        31 hours ago        647MB
nginx                 latest              4392e5dad77d        6 days ago          132MB
portainer/portainer   latest              cd645f5a4769        7 days ago          79.1MB
redis                 latest              36304d3b4540        11 days ago         104MB
mysql                 5.7                 a4fdfd462add        2 weeks ago         448MB
tomcat                9.0                 1b6b1fe7261e        3 weeks ago         647MB
tomcat                latest              1b6b1fe7261e        3 weeks ago         647MB
elasticsearch         7.6.2               f29a1ee41030        2 months ago        791MB
centos                latest              470671670cac        4 months ago        237MB
# 运行刚刚创建的镜像
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run -it 2b667e117705 /bin/bash
[root@2dbfa8697ecf /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
# 可以看到最后两行有我们挂载的数据卷目录
[root@2dbfa8697ecf /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 May 11  2019 bin -> usr/bin
drwxr-xr-x   5 root root  360 Jun  9 11:03 dev
drwxr-xr-x   1 root root 4096 Jun  9 11:03 etc
drwxr-xr-x   2 root root 4096 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 4096 Jan 13 21:48 lost+found
drwxr-xr-x   2 root root 4096 May 11  2019 media
drwxr-xr-x   2 root root 4096 May 11  2019 mnt
drwxr-xr-x   2 root root 4096 May 11  2019 opt
dr-xr-xr-x 128 root root    0 Jun  9 11:03 proc
dr-xr-x---   2 root root 4096 Jan 13 21:49 root
drwxr-xr-x  11 root root 4096 Jan 13 21:49 run
lrwxrwxrwx   1 root root    8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 May 11  2019 srv
dr-xr-xr-x  13 root root    0 Jun  9 10:54 sys
drwxrwxrwt   7 root root 4096 Jan 13 21:49 tmp
drwxr-xr-x  12 root root 4096 Jan 13 21:49 usr
drwxr-xr-x  20 root root 4096 Jan 13 21:49 var
drwxr-xr-x   2 root root 4096 Jun  9 11:03 volume01
drwxr-xr-x   2 root root 4096 Jun  9 11:03 volume02

可以看到最后两行有我们挂载的数据卷目录

volume01和volume02有挂载肯定和外部有一个同步的目录

接下来就去查找挂载目录

# 创建一个文件
[root@2dbfa8697ecf /]# touch centainer.txt
# 在主机上查看运行的镜像id
[root@iZwz94cw1gup8aldclit1qZ ~]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                            NAMES
2dbfa8697ecf        2b667e117705          "/bin/bash"              5 minutes ago       Up 5 minutes

# 查看当前容器的信息 会看到一个Mounts
[root@iZwz94cw1gup8aldclit1qZ ~]# docker inspect 2dbfa8697ecf

# 找到
"Source": "/var/lib/docker/volumes/2bc86f85ca5cb0284857c7563ae5e3ed3fed075d88c2ccb29b9616a5896a07b4/_data"

进入到目录里面ls 查看是否同步文件

数据卷容器

centos02 ---实现数据同步---> centos01

​ -- volumes - from 数据卷容器

​ 两个或者多个容器之间实现数据共享

把01容器变成数据卷容器,然后别的容器来连接

启动3个容器,通过我们刚才自己写镜像启动
#第一个
[root@iZwz94cw1gup8aldclit1qZ /]# docker run -it --name docker10 rzk/centos:1.0 
[root@9a956c283b13 /]# 

#第二个
#  --volumes-from 进行挂载
#  通过后面的docker10 进行绑定
#  通过rzk/centos:1.0 启动
[root@iZwz94cw1gup8aldclit1qZ _data]# docker run -it --name docker20 --volumes-from docker10 rzk/centos:1.0
[root@5444e01431e3 /]# 

进行绑定后10 和20 的数据卷就同步挂载一起
只有数据卷会同步挂载,别的文件目录同步挂载不了


# 如果退出就进入正在运行的容器
docker attach 容器id

# 如果在搞第三个容器绑定的是docker10数据卷会同步吗

[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -it --name docker30 --volumes-from docker10 rzk/centos:1.0
[root@9bedcf663ac0 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01	volume02
[root@9bedcf663ac0 /]# cd volume01
[root@9bedcf663ac0 volume01]# ls
file  filedocker20
注意

进行绑定后10 和20 的数据卷就同步挂载一起
只有数据卷会同步挂载,别的文件目录同步挂载不了

测试:如果把docker10删了,查看一下20和30容器的数据卷里面的内容会不会没了

答案:不会

多个mysql实现共享

[root@iZwz94cw1gup8aldclit1qZ home]# docker run -d -p 3310:3306 -v 
/home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e 
MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

[root@iZwz94cw1gup8aldclit1qZ home]# docker run -d -p 3310:3306  -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
# 就可以实现两个容器数据同步

结论:

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

一旦你持久化到本地,这个时候回,本地的数据是不会删除

DockerFile

DockerFile介绍

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

构建:

1.编写一个dockerfile文件

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

3.docker run运行镜像

4.docker push 发布镜像(DockerHub,阿里云镜像仓库)

DockerFile构建过程

基础知识:

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

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

3.# 表示注释

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

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

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

DockerFile:构建文件,定义一切的步骤,源代码

Dockerimages:通过DockerFIle构成生成的镜像,最终发布和运行产品

Docker:容器就是镜像运行起来提供服务器

DockerFile的指令

FROM              # 基础镜像,一切从这里开始构建
MAINTAINER        # 镜像是谁写的,姓名+邮箱
RUN               # 镜像构建的时候需要运行命令
ADD				 # 步骤,Tomcat镜像,这个tomcat压缩包,添加内容
WORKDIR           # 镜像的工作目录
VOLUME            # 挂载的目录
EXPOST            # 保留端口配置


CMD               # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT        # 指定这个容器启动的时候要运行的命令,可以追加命令
COPY              # 类似ADD,将我们文件拷贝到镜像中
ENV               # 构建的时候设置环境变量

实战测试

Docker Hub中99%镜像都会从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建的

创建一个Centos

# 编写Dockerfile的文件
[root@iZwz94cw1gup8aldclit1qZ home]# cat dockerfile 
FROM centos
MAINTAINER rzk<176907@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH


RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPAH
CME echo "---end---"
CMD /bin/bash

# 2.通过这个文件构成镜像
# 命令:docker build -f dockerfile文件路径 -t 镜像名:[tag]
Successfully built efbcb7388645
Successfully tagged mycentos:0.1

# 3.测试运行
# 查看有没有创建好镜像

[root@iZwz94cw1gup8aldclit1qZ mydockerfile-centos]# docker images 
REPOSITORY            TAG                 IMAGE ID            CREATED              SIZE
mycentos              0.1                 efbcb7388645        About a minute ago   321MB
rzk/centos            1.0                 7b22da40bcbd        2 hours ago          237MB
tomcat02              1.0                 4e478467565c        47 hours ago         647MB
nginx                 latest              4392e5dad77d        7 days ago           132MB
portainer/portainer   latest              cd645f5a4769        8 days ago           79.1MB
redis                 latest              36304d3b4540        12 days ago          104MB
mysql                 5.7                 a4fdfd462add        2 weeks ago          448MB
tomcat                9.0                 1b6b1fe7261e        3 weeks ago          647MB
tomcat                latest              1b6b1fe7261e        3 weeks ago          647MB
elasticsearch         7.6.2               f29a1ee41030        2 months ago         791MB
centos                latest              470671670cac        4 months ago         237MB
# 启动镜像
[root@iZwz94cw1gup8aldclit1qZ mydockerfile-centos]# docker run -it efbcb7388645

# 这个是在配置中设定好的,直接进入到local目录
[root@c8d7cf9a1600 local]# pwd
/usr/local

官方的centos是纯净的,连pwd都没有

自己配的centos

[root@c8d7cf9a1600 local]# pwd
/usr/local

查看镜像构建历史

[root@iZwz94cw1gup8aldclit1qZ ~]# docker history efbcb7388645
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
efbcb7388645        5 hours ago         /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
f1810e7f530a        5 hours ago         /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
a648efc67641        5 hours ago         /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
125e5fb2eb41        5 hours ago         /bin/sh -c #(nop)  EXPOSE 80                    0B                  
19a643e8cb4f        5 hours ago         /bin/sh -c yum -y install net-tools             24.1MB              
7cf165e5ab89        5 hours ago         /bin/sh -c yum -y install vim                   59.8MB              
2adc83de3c37        5 hours ago         /bin/sh -c #(nop) WORKDIR /usr/local            0B                  
6d1fe1a19a57        5 hours ago         /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B                  
554a6e0ceb18        5 hours ago         /bin/sh -c #(nop)  MAINTAINER rzk<176907@qq.…   0B                  
470671670cac        4 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           4 months ago        /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           4 months ago        /bin/sh -c #(nop) ADD file:aa54047c80ba30064…   237MB 

CMD和ENTRYPOINT 区别

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

测试cmd

# 编写 dockerfile2
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# cat dockerfile2
FROM centos

CMD ["ls","-a"]

# 构建镜像
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker build -f dockerfile2 -t cmdcentos .
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
cmdcentos             latest              2df214355824        12 seconds ago      237MB
mycentos              0.1                 efbcb7388645        5 hours ago         321MB
rzk/centos            1.0                 7b22da40bcbd        7 hours ago         237MB
tomcat02              1.0                 4e478467565c        2 days ago          647MB
nginx                 latest              4392e5dad77d        7 days ago          132MB
portainer/portainer   latest              cd645f5a4769        8 days ago          79.1MB
redis                 latest              36304d3b4540        12 days ago         104MB
mysql                 5.7                 a4fdfd462add        2 weeks ago         448MB
tomcat                9.0                 1b6b1fe7261e        3 weeks ago         647MB
tomcat                latest              1b6b1fe7261e        3 weeks ago         647MB
elasticsearch         7.6.2               f29a1ee41030        2 months ago        791MB
centos                latest              470671670cac        4 months ago        237MB
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run -it 2df214355824
.   .dockerenv	dev  home  lib64       media  opt   root  sbin	sys  usr
..  bin		etc  lib   lost+found  mnt    proc  run   srv	tmp  var
# 运行会发现ls启动
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run  2df214355824

测试ENTRYPOINT

# 编写ENTRYPOINT
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# vi entrypoint 

FROM centos
entrypoint ["ls","-a"]

# 构建
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker build -f entrypoint  -t entrypoint-test .

[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run d16c0b89b79f 
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run 
sbin
srv
sys
tmp
usr
var
# entrypoint加 -l
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run d16c0b89b79f  -l
total 56
drwxr-xr-x   1 root root 4096 Jun 10 08:37 .
drwxr-xr-x   1 root root 4096 Jun 10 08:37 ..
-rwxr-xr-x   1 root root    0 Jun 10 08:37 .dockerenv
lrwxrwxrwx   1 root root    7 May 11  2019 bin -> usr/bin
drwxr-xr-x   5 root root  340 Jun 10 08:37 dev
drwxr-xr-x   1 root root 4096 Jun 10 08:37 etc
drwxr-xr-x   2 root root 4096 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 4096 Jan 13 21:48 lost+found
drwxr-xr-x   2 root root 4096 May 11  2019 media
drwxr-xr-x   2 root root 4096 May 11  2019 mnt
drwxr-xr-x   2 root root 4096 May 11  2019 opt
dr-xr-xr-x 150 root root    0 Jun 10 08:37 proc
dr-xr-x---   2 root root 4096 Jan 13 21:49 root
drwxr-xr-x  11 root root 4096 Jan 13 21:49 run
lrwxrwxrwx   1 root root    8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 May 11  2019 srv
dr-xr-xr-x  13 root root    0 Jun  9 10:54 sys
drwxrwxrwt   7 root root 4096 Jan 13 21:49 tmp
drwxr-xr-x  12 root root 4096 Jan 13 21:49 usr
drwxr-xr-x  20 root root 4096 Jan 13 21:49 var



实战:Tomcat

1.准备镜像文件 tomcat压缩包,JDK的压缩包

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


FROM centos
MAINTAINER rzk(176@qq.com>

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

ADD jdk-8u241-linux-x64.tar.gz /usr/local/

ADD apache-tomcat-9.0.31.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_241
ENV ClASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.31
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.31

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080


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

3.构建镜像

#如果有正在运行容器的端口先暂停
或者删除
# 删除容器 docker ps -a找到运行的容器id
docker rm 容器id



# 1.docker build -t diytomcat .

[root@iZwz94cw1gup8aldclit1qZ tomcat]# docker run -d -p 9889:8080 --name Tomcat -v /home/tomcat/test:/url/local/apache-tomcat-9.0.31/webapps/test -v /home/tomcat/tomcatlogs/:/url/local/apache-tomcat-9.0.31/logs diytomcat
ef08847039525522b70c461d2784c8f6bfe943d9381383a97a5affd33c5f3b7f


# 2.如果出现端口
docker: Error response from daemon: driver failed programming external connectivity on endpoint Tomcat (814bfe3ff4ce8f2e069f8199a5de21a846151ce82c810d2881c2302ea20b55cf): Error starting userland proxy: listen tcp 0.0.0.0:9090: bind: address already in use.

# 解决重启docker服务后再启动容器
systemctl restart docker

# 3.构建镜像
[root@iZwz94cw1gup8aldclit1qZ tomcat]# ls
apache-tomcat-9.0.31.tar.gz  Dockerfile  jdk-8u241-linux-x64.tar.gz  readme.txt  test  tomcatlogs
# 4.运行容器
[root@iZwz94cw1gup8aldclit1qZ tomcat]# docker run -d -p 9889:8080 --name Tomcat -v /home/tomcat/test:/url/local/apache-tomcat-9.0.31/webapps/test -v /home/tomcat/tomcatlogs/:/url/local/apache-tomcat-9.0.31/logs diytomcat
0377387f992a388d046817e652f8a80ece7f04fb9dee0c00f44055f9f32458a1
# 5.进入正在运行的容器
[root@iZwz94cw1gup8aldclit1qZ tomcat]# docker exec -it  0377387f992a /bin/bash
[root@0377387f992a local]# ls
apache-tomcat-9.0.31  bin  etc	games  include	jdk1.8.0_241  lib  lib64  libexec  readme.txt  sbin  share  src
[root@0377387f992a local]# ls -l
total 52
drwxr-xr-x 1 root  root  4096 Jun 10 09:43 apache-tomcat-9.0.31
drwxr-xr-x 2 root  root  4096 May 11  2019 bin
drwxr-xr-x 2 root  root  4096 May 11  2019 etc
drwxr-xr-x 2 root  root  4096 May 11  2019 games
drwxr-xr-x 2 root  root  4096 May 11  2019 include
drwxr-xr-x 7 10143 10143 4096 Dec 11 10:39 jdk1.8.0_241
drwxr-xr-x 2 root  root  4096 May 11  2019 lib
drwxr-xr-x 2 root  root  4096 May 11  2019 lib64
drwxr-xr-x 2 root  root  4096 May 11  2019 libexec
-rw-r--r-- 1 root  root     0 Jun 10 09:42 readme.txt
drwxr-xr-x 2 root  root  4096 May 11  2019 sbin
drwxr-xr-x 5 root  root  4096 Jan 13 21:49 share
drwxr-xr-x 2 root  root  4096 May 11  2019 src


# 测试能否访问端口
root@iZwz94cw1gup8aldclit1qZ tomcat]# curl localhost:9090

# 6.发布项目
  <?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>

如果退出容器想要进入容器的话

[root@0377387f992a local]# exit 
exit
[root@iZwz94cw1gup8aldclit1qZ tomcat]# docker exec -it 0377387f992a /bin/bash
[root@0377387f992a local]# ls -l
total 52


  <?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>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Rzk</title>
</head>
<body>
RzkBlog<br/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>

发布自己的镜像

DockerHub

1.地址 https://hub.docker.com/ 注册自己的账号

2.确定这个账号可以登录

3.在我们的服务器上提交自己的镜像

[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker login  --help

Usage:	docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker login -u ruizhukai
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

4.登录完毕后就可以提交镜像,就剩一步docker push

# push自己的镜像到服务器上

# push镜像的问题
[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker push ruizhukai/tomcat:2.0
The push refers to repository [docker.io/ruizhukai/tomcat]
An image does not exist locally with the tag: ruizhukai/tomcat
# 解决,增加一个tag

[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker tag 0faea1dfca19 ruizhukai/tomcat:1.0
# docker push 上去即可!自己发布的镜像尽量带上版本号
[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker push ruizhukai/tomcat:1.0
The push refers to repository [docker.io/ruizhukai/tomcat]
f858ba4c4cbc: Pushed 
a7f0f23a00d2: Pushed 
3ec21c6199b9: Pushing [=======>                                           ]  62.48MB/403.7MB
7fe7e9ffcc98: Pushed 
0683de282177: Mounted from library/centos 

发布到阿里云镜像上

1.登录阿里云

2.找到容器镜像服务

3.创建命名空间

在镜像仓库里面新建一个

4.创建容器镜像

Docker网络

理解Docker网络

清空所有的镜像

# docker rm -f $(docker ps -aq)        删除运行中的容器
# docker rmi -f $(docker images -aq)   删除全部镜像

查看网络

[root@iZwz94cw1gup8aldclit1qZ /]# 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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:0e:e0:36 brd ff:ff:ff:ff:ff:ff
    inet 172.18.233.211/20 brd 172.18.239.255 scope global dynamic eth0  # 阿里云内网地址
       valid_lft 310864134sec preferred_lft 310864134sec
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:91:dd:12:c7 brd ff:ff:ff:ff:ff:ff             # docker0地址
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

# 问题docker 是如何处理容器网络访问的?
# [root@iZwz94cw1gup8aldclit1qZ /]# docker run -d -P --name tomcat01 tomcat

# 查看容器的内部网络地址  ip addr  发现容器启动的时候会得到一个 eth0@if367 ip地址,docker分配的
# [root@iZwz94cw1gup8aldclit1qZ /]# 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
366: eth0@if367: <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


# 思考 , linux能不能ping 通容器
[root@iZwz94cw1gup8aldclit1qZ /]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.060 ms

# linux 可以ping 通 docker 容器内部

运行tomcat02

# [root@iZwz94cw1gup8aldclit1qZ /]# docker run -d -P --name tomcat02 tomcat
0c8a2fecd529531c92ffbe14d091823828d58e1e9f05ed69f96a41bf1a807d59
# [root@iZwz94cw1gup8aldclit1qZ /]# 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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:0e:e0:36 brd ff:ff:ff:ff:ff:ff
    inet 172.18.233.211/20 brd 172.18.239.255 scope global dynamic eth0
       valid_lft 310863367sec preferred_lft 310863367sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:91:dd:12:c7 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
367: vethe189624@if366: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 16:2b:5d:d8:35:41 brd ff:ff:ff:ff:ff:ff link-netnsid 0
369: vetha836941@if368: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether fa:ff:8c:d0:93:a3 brd ff:ff:ff:ff:ff:ff link-netnsid 1


# [root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat02 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
368: eth0@if369: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

# 我们发现这个容器带来网卡,都是一对一对的
# evth-pair 就是一堆的虚拟设备接口,他们就是成对出现的,一段连着协议,一段彼此相连
# 正因为这个特性, evth-pair充当一个桥梁

原理

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

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

[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known



# [root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat01 tomcat
c9e51b6f5c164a946fe39601115d89e4692044e6dc0cfa8845051a5000a1e380
# [root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat02 tomcat
67d9ac053fd0b841ac48127238708bcd9b9a5f677588c00a69385f887a09bdec
# [root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
22eabed874351db1066828f0a1b2e26f04f3fb44c74bba3062e7410c10fbff0b
# 通过 --link 就可以连通网络
# [root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.100 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.075 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.077 ms

# 反向可以ping通吗?
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

如果要想访问容器具体的网络信息

[root@iZwz94cw1gup8aldclit1qZ ~]# docker newwork ls
docker: 'newwork' is not a docker command.
See 'docker --help'
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
85f4d9d63b38        bridge              bridge              local
b4bf70c72308        host                host                local
b12914554bcc        none                null                local
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network inspect 85f4d9d63b38

探究:inspect

        "Containers": {
            "22eabed874351db1066828f0a1b2e26f04f3fb44c74bba3062e7410c10fbff0b": {
                "Name": "tomcat03",
                "EndpointID": "a2550318c36526ade484de76ffced2f52a35aee7f0b4250e6c3961f38694af5b",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            },
            "67d9ac053fd0b841ac48127238708bcd9b9a5f677588c00a69385f887a09bdec": {
                "Name": "tomcat02",
                "EndpointID": "c8e0526801518058d9688c9f691ec9c913fd97aaf671195e2b0c83c426cf5067",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "c9e51b6f5c164a946fe39601115d89e4692044e6dc0cfa8845051a5000a1e380": {
                "Name": "tomcat01",
                "EndpointID": "b8a5ffddd521169ece2eb27ece96f370925d1f946876dfc48a3ab122246a456a",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },

自定义网络

查看所有网络

[root@iZwz94cw1gup8aldclit1qZ ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
85f4d9d63b38        bridge              bridge              local
b4bf70c72308        host                host                local
b12914554bcc        none                null                local

bridge:桥接 docker(默认)

host:和宿主机共享网络

none:不配置网络

[root@iZwz94cw1gup8aldclit1qZ ~]# docker rm -f $(docker ps -aq) 清空所有的网络

# 创建tomcat默认是这样指定网络
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P tomcat01 --net brige tomcat

#docker0特点,默认,域名不能访问   --link可以打通连接

# 可以自定义一个网络
# --driver bridge
# --subnet 192.168.0.0/16  192.168.0.2 192.168.255.255
# --gateway 192.168.0.1
#
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet 
bb8036aff34ef2fba3815f8c9ec2041a71cafad5136517bcae57319e451d301a
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
85f4d9d63b38        bridge              bridge              local
b4bf70c72308        host                host                local
bb8036aff34e        mynet               bridge              local
b12914554bcc        none                null                local


查看自己创建的网络

[root@iZwz94cw1gup8aldclit1qZ ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "bb8036aff34ef2fba3815f8c9ec2041a71cafad5136517bcae57319e451d301a",
        "Created": "2020-06-11T09:43:15.975142029+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
0b8455084d24ef5b9671ef001a70b024c6b90d58f4987757d056b4464f8851a2
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
2795089168bead0bf351c0a7c3ef9a3c696d03a1837c77d40c69d4833d6dfe9f
[root@iZwz94cw1gup8aldclit1qZ ~]# docker inspect mynet
[
    {
        "Name": "mynet",
        "Id": "bb8036aff34ef2fba3815f8c9ec2041a71cafad5136517bcae57319e451d301a",
        "Created": "2020-06-11T09:43:15.975142029+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0b8455084d24ef5b9671ef001a70b024c6b90d58f4987757d056b4464f8851a2": {
                "Name": "tomcat-net-01",
                "EndpointID": "4bc1e155dbd756746f089aeffc2accca845f8f9f6906c14e05e747405a24b690",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "2795089168bead0bf351c0a7c3ef9a3c696d03a1837c77d40c69d4833d6dfe9f": {
                "Name": "tomcat-net-02",
                "EndpointID": "4060a7613ae92954d76ad3a8bc6b82e37b1d688a525a2de00bbbe91c05fd3072",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

测试ping连接

# 再次ping网络
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.124 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.068 ms

# 不是用--link也可以ping的通名字了
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.059 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.070 ms

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

好处:

redis:

mysql:

网络连通

[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat01 tomcat
7b9181aa0d39f2ed823db2d1f7cd2bed0cf7a069f9d8c6ac9704d2b63794f901
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat02 tomcat
f983c91ee178d820603545e2554d4263f24193b1aa949cfecef594944a544a4a
[root@iZwz94cw1gup8aldclit1qZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
f983c91ee178        tomcat              "catalina.sh run"   3 seconds ago       Up 2 seconds        0.0.0.0:32778->8080/tcp   tomcat02
7b9181aa0d39        tomcat              "catalina.sh run"   6 seconds ago       Up 6 seconds        0.0.0.0:32777->8080/tcp   tomcat01
2795089168be        tomcat              "catalina.sh run"   16 minutes ago      Up 16 minutes       0.0.0.0:32776->8080/tcp   tomcat-net-02
0b8455084d24        tomcat              "catalina.sh run"   17 minutes ago      Up 17 minutes       0.0.0.0:32775->8080/tcp   tomcat-net-01
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network --help

Usage:	docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.


# 查看怎么使用
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network connect --help

Usage:	docker network connect [OPTIONS] NETWORK CONTAINER

Connect a container to a network

Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., 172.30.100.104)
      --ip6 string              IPv6 address (e.g., 2001:db8::33)
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container

# 测试打通
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network connect mynet tomcat01
[root@iZwz94cw1gup8aldclit1qZ ~]# docker inspect mynet
[
    {
        "Name": "mynet",
        "Id": "bb8036aff34ef2fba3815f8c9ec2041a71cafad5136517bcae57319e451d301a",
        "Created": "2020-06-11T09:43:15.975142029+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "0b8455084d24ef5b9671ef001a70b024c6b90d58f4987757d056b4464f8851a2": {
                "Name": "tomcat-net-01",
                "EndpointID": "4bc1e155dbd756746f089aeffc2accca845f8f9f6906c14e05e747405a24b690",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "2795089168bead0bf351c0a7c3ef9a3c696d03a1837c77d40c69d4833d6dfe9f": {
                "Name": "tomcat-net-02",
                "EndpointID": "4060a7613ae92954d76ad3a8bc6b82e37b1d688a525a2de00bbbe91c05fd3072",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "7b9181aa0d39f2ed823db2d1f7cd2bed0cf7a069f9d8c6ac9704d2b63794f901": {
                "Name": "tomcat01",
                "EndpointID": "c9970b3fd3abdb0631c356fe795b517bd39a29dd6f2c8ec14bbb242d57796f9f",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

# 测试tomcat01能否ping通 tomcat-net-01
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.089 ms

# 02依旧ping不通
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.089 ms

实战Redis

# 1.创建一个redis服务
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network create redis --subnet 172.38.0.0/16

# 2.通过脚本创建六个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 6379${port}:6379 -p 1637${port}:1637 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \

# 3.创建六个redis配置

docker run -p 6371:6379 -p16371: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

docker run -p 6372:6379 -p16372: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 -p 6373:6379 -p16373: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 -p 6374:6379 -p16374: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 -p 6375:6379 -p16375: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 -p 6376:6379 -p16376: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

# 4.进入redis
# docker exec -it redis-1 /bin/sh

# 5.进入data

/data # 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.1
5:6379 172.38.0.16:6379  --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 07b02dc06880ab596c94e00f124ed6ee85f4bf35 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: 3961bedfc0ba9fafc856048182240b6dc82c2c88 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: 749eb4729d1a7c699677bcfd59f2d3fa48a8809e 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: 46583dea294055b779db7f1e53d79bbe2501e418 172.38.0.14:6379
   replicates 749eb4729d1a7c699677bcfd59f2d3fa48a8809e
S: b18057c30f4bcb69ad9c3add993e225d5c8d23fa 172.38.0.15:6379
   replicates 07b02dc06880ab596c94e00f124ed6ee85f4bf35
S: 9220ceed708855941493691cd15c5524389aa2fb 172.38.0.16:6379
   replicates 3961bedfc0ba9fafc856048182240b6dc82c2c88
Can I set the above configuration? (type 'yes' to accept): y
/data # 


# 7 连接
# 加 -c 是集群的意思
#/data # 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:19447
cluster_stats_messages_pong_sent:19363
cluster_stats_messages_sent:38810
cluster_stats_messages_ping_received:19358
cluster_stats_messages_pong_received:19447
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:38810

# 8 查看主机和从机
#127.0.0.1:6379> cluster nodes
46583dea294055b779db7f1e53d79bbe2501e418 172.38.0.14:6379@16379 slave 749eb4729d1a7c699677bcfd59f2d3fa48a8809e 0 1591860270594 4 connected
9220ceed708855941493691cd15c5524389aa2fb 172.38.0.16:6379@16379 slave 3961bedfc0ba9fafc856048182240b6dc82c2c88 0 1591860269000 6 connected
749eb4729d1a7c699677bcfd59f2d3fa48a8809e 172.38.0.13:6379@16379 master - 0 1591860269591 3 connected 10923-16383
3961bedfc0ba9fafc856048182240b6dc82c2c88 172.38.0.12:6379@16379 master - 0 1591860270000 2 connected 5461-10922
b18057c30f4bcb69ad9c3add993e225d5c8d23fa 172.38.0.15:6379@16379 slave 07b02dc06880ab596c94e00f124ed6ee85f4bf35 0 1591860270092 5 connected
07b02dc06880ab596c94e00f124ed6ee85f4bf35 172.38.0.11:6379@16379 myself,master - 0 1591860268000 1 connected 0-5460
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK

# 9 设置键值对
# set a b
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.14:6379  # 可以扩大是放在4号机
OK
# 查看机器运行的状态
# 172.38.0.13:6379> cluster nodes
9220ceed708855941493691cd15c5524389aa2fb 172.38.0.16:6379@16379 slave 3961bedfc0ba9fafc856048182240b6dc82c2c88 0 1591860886546 6 connected
46583dea294055b779db7f1e53d79bbe2501e418 172.38.0.14:6379@16379 master,fail - 1591860650075 1591860647867 7 connected
3961bedfc0ba9fafc856048182240b6dc82c2c88 172.38.0.12:6379@16379 master - 0 1591860885544 2 connected 5461-10922
b18057c30f4bcb69ad9c3add993e225d5c8d23fa 172.38.0.15:6379@16379 slave 07b02dc06880ab596c94e00f124ed6ee85f4bf35 0 1591860885000 5 connected
07b02dc06880ab596c94e00f124ed6ee85f4bf35 172.38.0.11:6379@16379 master - 0 1591860885544 1 connected 0-5460
749eb4729d1a7c699677bcfd59f2d3fa48a8809e 172.38.0.13:6379@16379 myself,master - 0 1591860884000 8 connected 10923-16383

# 把对应的机器停掉,这里是4号机
-> Redirected to slot [15495] located at 172.38.0.14:6379
# docker stop redis-6


# 设置键值对完可能需要退出再进入 
127.0.0.1:6379> set E G
-> Redirected to slot [6241] located at 172.38.0.16:6379
OK

#进入
# /data # redis-cli -c

Docker运行redis

docker run -d --name myredis -p 6379:6379 -v data:/data redis:latest 
    --requirepass "你的密码(数字字母)" --appendonly yes
命令说明:
-p 6379:6379 : 将容器的6379端口映射到主机的6379端口
-v $PWD/data:/data : 将主机中当前目录下的data挂载到容器的/data
redis-server --appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置

docker run -d --name oosredis -p 6379:6379 -v /home/redis/data:/home/redis/data redis:latest --requirepass "rzkruizhukai123." --appendonly yes

Docker运行redis

[root@rzk ~]# docker exec -it 90 redis-cli -- 进入redis
127.0.0.1:6379>

如果有密码需要输入密码才能set值

127.0.0.1:6379> auth rzkruizhukai123.
OK
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> set a 2
OK
127.0.0.1:6379> get a
"2"

SringBoot 微服务打包Docker镜像

1.构架springbook项目

2.打包应用

点击右栏的maven里面有Lifecycle找到packaage点击打包

3.在springboot项目里面编写dockerfile

FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java","-jar","/app.jar"]

上面两部运行完之后,把这两个东西移动到linux的home/idea(idea项目名字随便)

4.构建镜像

#构建一个自己的镜像
# [root@iZwz94cw1gup8aldclit1qZ idea]# docker build  -t rzk .
Sending build context to Docker daemon  16.47MB
Step 1/5 : FROM java:8
 ---> d23bdf5b1b1b
Step 2/5 : COPY *.jar /app.jar
 ---> ded6026c2e68
Step 3/5 : CMD ["--server.port=8080"]
 ---> Running in 88b3b92214ec
Removing intermediate container 88b3b92214ec
 ---> 9126a566d003
Step 4/5 : EXPOSE 8080
 ---> Running in 1a05e78ff468
Removing intermediate container 1a05e78ff468
 ---> 89e88b9ea304
Step 5/5 : ENTRYPOINT ["java","-jar","/app.jar"]
 ---> Running in 8471db1bb9cc
Removing intermediate container 8471db1bb9cc
 ---> cc6206f47451
Successfully built cc6206f47451
Successfully tagged rzk:latest

5.发布运行

docker run -d --restart=always --name oos -v /usr/local/logs:/home/jar-logs -p 8890:8089 oos

docker run -d --restart=always --name wxsever -v /usr/local/logs:/home/jar-logs -p 80:80 wxsever

posted @ 2022-01-14 02:16  Rzk  阅读(1724)  评论(0编辑  收藏  举报