Docker入门


Docker从入门到放弃

Docker 概述

docker docs

Docker为什么会出现

Docker思想来自于集装箱

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

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

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

Docker的历史

2010年,成立dotCloud公司

刚开始做paaa的云计算服务,LXC有关的容器技术

他们将自己的容器化技术命名为Docker

2013年

开放源代码使得Docker技术进一步发展,越来越的使用者发现了Docker的优点,几乎每月都会更新一个版本

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

优势:轻量级虚拟化

vm : linux centos原生镜像(一个电脑)  隔离:需要开启多个虚拟机
Docker : 隔离 镜像(最核心的环境4M+jdk+mysql)  十分的小巧

Docker是基于Go语言开发的

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

Docker能干什么

之前的虚拟化技术

在这里插入图片描述

虚拟机技术缺点:

  • 资源占用十分多
  • 冗余步骤多
  • 启动很慢

容器化技术

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

在这里插入图片描述

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

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

DevOps(开发/运维)

满足应用的更快速交付和部署

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

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

更便捷的升级和扩缩容

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

更简单的系统运维

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

更高效的计算资源利用

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

Docker安装

Docker的基本架构模型

在这里插入图片描述

镜像(image):

Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,Tomcat镜像==>run==>tomcat01容器(提供服务器)

容器(container)

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

日东,停止,删除,基本命令

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

仓库(repository)

Docker Hub 是国外库

阿里云等都有容器服务器(配置镜像加速)

安装Docker

环境准备

  • Centos 7
  • 使用远程软件远程操作

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

环境查看

# 系统信息
  [root@hyu ~]# 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"
  # 内核版本
  [root@hyu ~]# uname -r
  3.10.0-1062.18.1.el7.x86_64

安装步骤,可去官方文档查看https://docs.docker.com/

  #1.卸载旧版本
  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.设置镜像的仓库
  
  yum-config-manager \
      --add-repo \
      https://download.docker.com/linux/centos/docker-ce.repo
      
  #默认是从国外的,不推荐
  #推荐使用国内的
  
  yum-config-manager \
      --add-repo \
      https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      
  #更新yum软件包索引
  
  yum makecache fast
  
  #4.安装docker相关的 docker-ce 社区版 而ee是企业版
  
  yum install docker-ce docker-ce-cli containerd.io
  
  #5、启动docker
  
  systemctl start docker
  
  #开机自启
  
  systemctl enable docker
  
  #6. 使用docker version查看是否安装成功
  
  docker version
  
  #7. 测试
  
  docker run hello-world
  

 
 
 
 
 #可不做操作
 
 #加入root组
[root@sqx111 etc]# groupadd docker
[root@sqx111 etc]# usermod -aG docker $USER、
#重启docker
[root@sqx111 etc]# systemctl restart docker




了解:卸载docker

  #1. 卸载依赖
  yum remove docker-ce docker-ce-cli containerd.io
  #2. 删除资源
  rm -rf /var/lib/docker
  # /var/lib/docker 是docker的默认工作路径!

阿里云镜像加速

1、登录阿里云找到容器服务

img

2、找到镜像加速器

img

3、配置使用

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

docker run image 命令 流程图

在这里插入图片描述

底层原理

Docker是怎么工作的?

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

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

为什么Docker比Vm快
1、docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
2、docker利用的是宿主机的内核,而不需要Guest OS。

GuestOS: VM(虚拟机)里的的系统(OS);
HostOS:物理机里的系统(OS);
在这里插入图片描述

因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。从而避免引导、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了这个复杂的过程,因此新建一个docker容器只需要几秒钟。

Docker的常用命令

帮助命令

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

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

https://hub.docker.com/

镜像命令

查看镜像

docker images             # 查看所有本地主机上的镜像 可以使用docker image ls代替
#解释
PEPOSITORY	镜像的仓库源
TAG			镜像的标签
IMAGE ID	镜像的ID
CREATED		镜像的创建时间
SIZE 		镜像的大小

#可选项
-all    -a 			显示所有信息
-q		-quiet		只显示镜像ID

搜索镜像

docker search             # 搜索镜像

[root@sqx ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10743     [OK]       
mariadb                           MariaDB Server is a high performing open sou…   4046      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   790                  [OK]
percona                           Percona Server is a fork of the MySQL relati…   532       [OK]       
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   87                   
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   81           

#解释
DESCRIPTION		#描述

#可选项

--filter=STARS=4046		#例:搜索出的镜像STARS大于4046

[root@sqx ~]# docker search mysql --filter=STARS=4046
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   10743     [OK]       
mariadb   MariaDB Server is a high performing open sou…   4046      [OK] 

拉取镜像 — 在虚拟机上运行docker拉取镜像时,如果是net网络模式,可使用DHCP自动分配地址模式,即可解决无法拉取报错

docker pull 镜像名		#如果不写[:tag],默认下载最新版


docker pull 镜像名[:tag]    # 下载镜像 docker image pull

#指定版本下载
docker pull mysql:5.7		#期中5.7是mysql版本,可在docker官网中搜索mysql可显示支持版本

删除镜像

#删除单个
docker rmi -f 镜像ID  	  		  # 删除指定的镜像 docker image rm -f 镜像ID   强制删除

#删除多个
docker rmi -f 镜像ID 镜像ID   		#删除多个镜像

#删除全部
docker rmi -f $(docker images -aq) # 删除全部的镜像,递归删除


#解释
rmi其中的i为image的缩写
-f		#删除所有

容器命令

新建容器并启动

docker run 镜像id         # 新建容器并启动

docker run [可选参数] image | docker container run [可选参数] image 


#参数说明
--name="Name"         容器名字 tomcat01 tomcat02 用来区分容器
--net				  网络配置
-d                    后台方式运行
-it                   使用交互方式运行,进入容器,查看内容
-v					  挂载
-e					  集群
-p                    指定容器的端口 -p 8080(宿主机):8080(容器)
        -p ip:主机端口:容器端口		#主机端口映射到容器端口
        -p 主机端口:容器端口(常用)	
        -p 容器端口
        容器端口
        
--privileged=true		授权
        
#随机指定        
-P(大写)                 随机指定端口

#---启动---进入
docker run -it 容器

#京东豆实例(使用镜像新建容器--启动--地址--日志--端口号)
docker run -dit --name jingdong -v /volume1/docker/jd_scripts/config:/jd/config -v /volume1/docker/jd_scripts/logs:/jd/log -p 5678:5678 --restart always 镜像地址




docker pull 镜像地址

查看容器状态


docker ps                 # 列出所有运行的容器 docker container list

#docker ps命令 #列出当前正在运行的容器

  -a, --all           	   #带出历史运行的容器
  -n=数量, --last int  	  #显示最近创建的几个容器
  -q, --quiet           	#只显示容器的编号  (CONTAINER ID)
  
#实例
docker ps -aq			#显示所有容器的ID
  
docker ps -a -n=2		#显示最近创建的两个容器
  
docker inspect name/容器ID	#查看镜像详细信息,包括制作者、适应架构、各层的数字摘要等。
  
#返回Docker对象的底层信息
#-f,   --format string   使用给定的Go模板格式化输出
#-s,  --size         如果类型是container,则显示总文件大小
#  --type string      返回指定类型的JSON

删除容器

docker rm                			# 容器id 删除指定容器(不能删除运行的容器,没有添加-f参数)
docker rm -f $(docker ps -qa)		#强制全部删除所有容器
docker rm -a -q|xargs docker rm		#删除所有容器
容器状态管理
docker start 容器id         #启动容器

docker restart 容器id    	 #重启容器

docker stop 容器id         #停止当前正在运行的容器

docker kill 容器id         #强制停止当前容器

exit						#容器直接退出

ctrl+P+Q 					#容器不停止退出

其他常用命令

后台启动命令

# 命令 docker run -d 镜像名
docker run -d centos

#解释
-d 		后台运行
#此时使用docker ps查看容器时发现容器消失了
#注意点:docker 容器使用后台使用,必须要有一个前台进程,docker发现没有应用,就会自动停止

查看日志

docker logs --help
Options:
      --details        Show extra details provided to logs 
*  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
*      --tail string    Number of lines to show from the end of the logs (default "all")
*  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
      
      
docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #练习模拟日志      

#显示日志
	
-tf       						#显示日志信息(一直更新)
--tail number 					#需要显示日志条数


docker logs -t --tail 行数 容器id 	#查看多少行日志


docker logs -ft 容器id 			#全部显示,跟着日志


-c							#循环执行后面的脚本,没有-c会自动关闭容器

查看容器进程命令

docker top 容器ID
[root@sqx ~]# docker top jingdong
UID                 PID                 PPID                C                   STIME               TTY   
root                2951                6026                0                   12:47               ?     
root                3965                2951                0                   12:52               ?     
root                3966                2951                0                   12:52               ?     
root                4894                5973                0                   Apr12               ?    
root                5166                6026                0                   Apr11               ?     
root                5500                5166                0                   Apr11               ?     

查看镜像的元数据

# 命令
docker inspect 容器id
[root@sqx ~]# docker inspect jingdong
[
    {
        "Id": "811d671d0025d111f1132a7e1067a95ca94aec9f96b8afd60f450c2a2ee26331",
        "Created": "2021-03-10T08:44:21.64480457Z",
        "Path": "docker-entrypoint.sh",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 5996,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-04-06T02:12:56.309528123Z",
            "FinishedAt": "2021-04-06T01:21:46.208283205Z"
        },
        "Image": "sha256:9a23fb41457fafcb62eb9763d84e5cada039898d1bf849f69aebb5bec692728d",
        "ResolvConfPath": "/www/server/docker/containers/811d671d0025d111f1132a7e1067a95ca94aec9f96b8afd60f450c2a2ee26331/resolv.conf",
        "HostnamePath": "/www/server/docker/containers/811d671d0025d111f1132a7e1067a95ca94aec9f96b8afd60f450c2a2ee26331/hostname",
        "HostsPath": "/www/server/docker/containers/811d671d0025d111f1132a7e1067a95ca94aec9f96b8afd60f450c2a2ee26331/hosts",
        "LogPath": "/www/server/docker/containers/811d671d0025d111f1132a7e1067a95ca94aec9f96b8afd60f450c2a2ee26331/811d671d0025d111f1132a7e1067a95ca94aec9f96b8afd60f450c2a2ee26331-json.log",
        "Name": "/jingdong",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": [
            "964c60d985d3f4bb49970b6cedfaefdc1af91b7ddadaf848f009687d46b5e046",
            "a9887a3cec4e41d4a833d4b4b21d5849c9b13c99f133bc00a46991d42d5e8886",
            "621c24ff9edd1fd056bc35949bab71c758b59095f55d72c8f33aa7da869c1e37"
        ],
        "HostConfig": {
            "Binds": [
                "/volume1/docker/jd_scripts/config:/jd/config",
                "/volume1/docker/jd_scripts/logs:/jd/log"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "5678/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "5678"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "always",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/www/server/docker/overlay2/0dc9d2026abde544c3b253f16e4967eb8325abe1ecd6ac9b07e1c3c876076fee-init/diff:/www/server/docker/overlay2/82051cf1526e1fba8018ea100c869f2f1f1c301c9795042b87614020d482c6ba/diff:/www/server/docker/overlay2/a5348d0e32d62b25f16397d57b323d44e90cc13fb2b4132f3e04ea729bc8c6ff/diff:/www/server/docker/overlay2/8bed411955d57a5a2cd6b631fe2c3ee12551758e73c3a4208c0a1fd23768bbc8/diff:/www/server/docker/overlay2/4cab1367c9b373fb29446a9fe32f6a8bb5958bc303a9240266bdc292351c0700/diff:/www/server/docker/overlay2/1a707ae6a8ef46aa16f663609d3ce042050c35d963921ba5f38ef7d310bdda9f/diff:/www/server/docker/overlay2/438d8f17e4198be5815839e6bc657e491751b3c89f7717a411ca06d259afa301/diff",
                "MergedDir": "/www/server/docker/overlay2/0dc9d2026abde544c3b253f16e4967eb8325abe1ecd6ac9b07e1c3c876076fee/merged",
                "UpperDir": "/www/server/docker/overlay2/0dc9d2026abde544c3b253f16e4967eb8325abe1ecd6ac9b07e1c3c876076fee/diff",
                "WorkDir": "/www/server/docker/overlay2/0dc9d2026abde544c3b253f16e4967eb8325abe1ecd6ac9b07e1c3c876076fee/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/volume1/docker/jd_scripts/config",
                "Destination": "/jd/config",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/volume1/docker/jd_scripts/logs",
                "Destination": "/jd/log",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {
            "Hostname": "811d671d0025",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "5678/tcp": {}
            },
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NODE_VERSION=14.16.0",
                "YARN_VERSION=1.22.5",
                "LANG=zh_CN.UTF-8",
                "SHELL=/bin/bash",
                "PS1=\\u@\\h:\\w $ ",
                "JD_DIR=/jd",
                "ENABLE_HANGUP=true",
                "ENABLE_WEB_PANEL=true"
            ],
            "Cmd": null,
            "Image": "shuye72/jd-base:gitee",
            "Volumes": null,
            "WorkingDir": "/jd",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "bf4027976aeaf55ae5f937ceecce2998aa9f0f09f9f19a840d9364b2e9f913e7",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "5678/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "5678"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/bf4027976aea",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "ce20eee21f259a75b953bd6ec28fd53eeca782f0f7ff920e94383a23465831ba",
            "Gateway": "172.18.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.18.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:12:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "d0e12b340469a553893fc8e5840165b6c52e5989c179e10327f114cc33a69845",
                    "EndpointID": "ce20eee21f259a75b953bd6ec28fd53eeca782f0f7ff920e94383a23465831ba",
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:12:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

进入当前正在运行的容器

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

# 命令 
docker exec -it 容器id bashshell
#测试
docker ps    # 查看
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
55321bcae33d        centos              "/bin/sh -c 'while t…"   10 minutes ago      Up 10 minutes                           bold_bell
a7215824a4db        centos              "/bin/sh -c 'while t…"   13 minutes ago      Up 13 minutes                           zen_kepler
55a31b3f8613        centos              "/bin/bash"              15 minutes ago      Up 15 minutes                           lucid_clarke
# 方式一
docker exec -it 55321bcae33d /bin/bash        # 进入


# 方式二
docker attach 容器id
#测试
docker attach 55321bcae33d 
正在执行当前的代码...


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


从容器内拷贝到主机上

docker cp 容器id:容器内路径   主机的目的路径
#进入docker容器内部
docker exec -it  55321bcae33d /bin/bash 
[root@55321bcae33d /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr



#新建一个文件
[root@55321bcae33d /]# echo "hello" > java.java
[root@55321bcae33d /]# cat java.java 
hellos
[root@55321bcae33d /]# exit
exit
docker cp 55321bcae33d:/java.java /    #拷贝
cd /              
ls  #可以看见java.java存在

命令汇总

在这里插入图片描述

attach      Attach local standard input, output, and error streams to a running container
  																	#当前shell下attach连接指定运行的镜像
build       Build an image from a Dockerfile 						# 通过Dockerfile定制镜像
commit      Create a new image from a container changes 			#提交当前容器为新的镜像
cp          Copy files/folders between a container and the local filesystem #拷贝文件
create      Create a new container 									#创建一个新的容器
diff        Inspect changes to files or directories on a containers filesystem #查看docker容器的变化
events      Get real time events from the server					 # 从服务获取容器实时时间
exec        Run a command in a running container					 # 在运行中的容器上运行命令
export      Export a containers filesystem as a tar archive #导出容器文件系统作为一个tar归档文件[对应import]
history     Show the history of an image 							# 展示一个镜像形成历史
images      List images 											#列出系统当前的镜像
import      Import the contents from a tarball to create a filesystem image #从tar包中导入内容创建一个文件系统镜像
info        Display system-wide information 						# 显示全系统信息
inspect     Return low-level information on Docker objects 			#查看容器详细信息
kill        Kill one or more running containers 					# kill指定docker容器
load        Load an image from a tar archive or STDIN 			#从一个tar包或标准输入中加载一个镜像[对应save]
login       Log in to a Docker registry 							#注册或登录一个源服务器
logout      Log out from a Docker registry							#从当前docker registry
logs        Fetch the logs of a container							#输出房钱容器日志信息
pause       Pause all processes within one or more containers		#暂停容器
port        List port mappings or a specific mapping for the container#查看映射端口对应的容器的内部源端口
ps          List containers											#列出容器列表
pull        Pull an image or a repository from a registry			#从docker镜像源服务器拉取指定镜像
push        Push an image or a repository to a registry				#推送指定镜像或者源服务器到docker源服务器
rename      Rename a container										#更改容器名
restart     Restart one or more containers							#重启运行的容器
rm          Remove one or more containers							#移除一个或者多个容器
rmi         Remove one or more images#移除一个或者多个镜像(无容器使用该镜像才可删除,否则需删除相关容器或-f强制删除)
run         Run a command in a new container						#创建一个新的容器并运行一个命令
save        Save one or more images to a tar archive				#保存一个镜像为一个tar包【对应load】
search      Search the Docker Hub for images						#搜索镜像
start       Start one or more stopped containers					#启动容器
stats       Display a live stream of container(s) resource usage statistics#
stop        Stop one or more running containers						#停止容器
tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE	#给源中镜像添加标签
top         Display the running processes of a container			#查看容器中运行的进程信息
unpause     Unpause all processes within one or more container		#取消暂停镜像
update      Update configuration of one or more containers			#更新一个或多个容器的配置
version     Show the Docker version information						#查看docker版本号
wait        Block until one or more containers stop, then print their exit codes#截取容器停止时的退出状态值

可视化

  • portainer
docker run -d -p 8088:9000 \
> --restart=always -v /var/run/dockerr.sock:/var/run/docker.sock --privileged=true portainer/portainer
[root@sqx111 ~]# docker run -d -p 8088:9000 \
> --restart=always -v /var/run/dockerr.sock:/var/run/docker.sock --privileged=true portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
94cfa856b2b1: Pull complete 
49d59ee0881a: Pull complete 
a2300fd28637: Pull complete 
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
WARNING: IPv4 forwarding is disabled. Networking will not work.
d2ede080c4ada528e718c8e28793330dcbc2a38ea7ae14d7ad566676331684cb
[root@sqx111 ~]# 

  • Rancher(CI/CD)

什么是portainer?

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

Docker部署nginx

搜索镜像

#docker search nginx
[root@sqx111 ~]# docker search nginx
NAME                               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                              Official build of Nginx.                        14741     [OK]       
jwilder/nginx-proxy                Automated Nginx reverse proxy for docker con…   2013                 [OK]
richarvey/nginx-php-fpm            Container running Nginx + PHP-FPM capable of…   813                  [OK]
jc21/nginx-proxy-manager           Docker container for managing Nginx proxy ho…   179                  
linuxserver/nginx                  An Nginx container, brought to you by LinuxS…   142                  
tiangolo/nginx-rtmp                Docker image with Nginx using the nginx-rtmp…   122                  [OK]
jlesage/nginx-proxy-manager        Docker container for Nginx Proxy Manager        105                  [OK]

dockerhub搜索nginx

拉取镜像

[root@sqx111 ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
Digest: sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412
Status: Image is up to date for nginx:latest
docker.io/library/nginx:latest

生成容器

#检验镜像

[root@sqx111 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    62d49f9bab67   6 days ago   133MB
[root@sqx111 ~]# docker run -dit --name nginx -p 3344:80 nginx
WARNING: IPv4 forwarding is disabled. Networking will not work.
2fd8568a31f7006bdbed35c016a88f4282eba5e4804112967c1dd0bb2e0e7384



#解释
#--name		容器名
#-p			端口映射    宿主机端口:容器内端口

检验

[root@sqx111 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
2fd8568a31f7   nginx     "/docker-entrypoint.…"   23 seconds ago   Up 18 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx
[root@sqx111 ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

如需外网访问,需放行3344端口

在这里插入图片描述

容器内

[root@sqx111 ~]# docker exec -it nginx /bin/bash
root@2fd8568a31f7:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@2fd8568a31f7:/# 

#解释
#so文件在/usr/lib/nginx
#nginx配置文件在/etc/nginx
#html文件在/usr/share/nginx

Docker部署Tomcat

#官方用于测试命令
[root@sqx111 ~]# docker run -it --rm tomcat:9.0
#测试完成直接删除

正常流程

#下载
[root@sqx111 ~]# docker pull tomcat
Using default tag: latest
#docker images

#启动运行

[root@sqx111 ~]# docker run -d -p 3355:8080 --name tomcat tomcat
WARNING: IPv4 forwarding is disabled. Networking will not work.
7c17326ca7f821789c64e9578e315c309bc31f2d9a761cd3544550ffc5bb9fe4

#测试访问

[root@sqx111 ~]# curl localhost:3355
#或
#外网访问测试
#提示404

#进入容器

[root@sqx111 ~]# docker exec -it tomcat /bin/bash
root@7c17326ca7f8:/usr/local/tomcat# whereis tomcat
tomcat: /usr/local/tomcat
root@7c17326ca7f8:/usr/local/tomcat# ls
BUILDING.txt	 README.md	conf		temp
CONTRIBUTING.md  RELEASE-NOTES	lib		webapps
LICENSE		 RUNNING.txt	logs		webapps.dist
NOTICE		 bin		native-jni-lib	work

#发现问题
#1、linux 命令少  

root@7c17326ca7f8:/usr/local/tomcat# ll
bash: ll: command not found
root@7c17326ca7f8:/usr/local/tomcat# ls -al
total 148
drwxr-xr-x. 11 root root  4096 Apr 11 03:31 .
drwxr-xr-x. 12 root root  4096 Apr 11 03:25 ..
-rw-r--r--.  1 root root 18984 Mar 30 10:29 BUILDING.txt
-rw-r--r--.  1 root root  5587 Mar 30 10:29 CONTRIBUTING.md
-rw-r--r--.  1 root root 57092 Mar 30 10:29 LICENSE
-rw-r--r--.  1 root root  2333 Mar 30 10:29 NOTICE
-rw-r--r--.  1 root root  3257 Mar 30 10:29 README.md
-rw-r--r--.  1 root root  6898 Mar 30 10:29 RELEASE-NOTES
-rw-r--r--.  1 root root 16507 Mar 30 10:29 RUNNING.txt
drwxr-xr-x.  2 root root  4096 Apr 11 03:31 bin
drwxr-xr-x.  3 root root  4096 Apr 20 02:25 conf
drwxr-xr-x.  2 root root  4096 Apr 11 03:31 lib
drwxrwxrwx.  2 root root  4096 Apr 20 02:25 logs
drwxr-xr-x.  2 root root  4096 Apr 11 03:31 native-jni-lib
drwxrwxrwx.  2 root root    30 Apr 11 03:31 temp
drwxr-xr-x.  2 root root     6 Apr 11 03:31 webapps
drwxr-xr-x.  7 root root    81 Mar 30 10:29 webapps.dist
drwxrwxrwx.  2 root root     6 Mar 30 10:29 work
root@7c17326ca7f8:/usr/local/tomcat# 
#2、没有webapps 阿里云镜像原因,默认为最小镜像,不必要的都已被剔除,保证最小化运行环境
root@7c17326ca7f8:/usr/local/tomcat/webapps# ls
root@7c17326ca7f8:/usr/local/tomcat/webapps# 

#发现文件都在webapps.dist里面
root@7c17326ca7f8:/usr/local/tomcat# cd webapps.dist/
root@7c17326ca7f8:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager
root@7c17326ca7f8:/usr/local/tomcat/webapps.dist# cd ..
root@7c17326ca7f8:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@7c17326ca7f8:/usr/local/tomcat# 


#解释
# -r		由于webapps.dist目录里文件多所以要使用递归复制

ES(elasticsearch)+kibana

#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     #查看CPU存活状态

curl localhost:9200			#检测是否安装成功

#增加内存限制     -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

#此时内存占用就会小很多

在这里插入图片描述

#检验
[root@sqx111 ~]# curl localhost:9200
{
  "name" : "9cff00958b7f",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "-9kQADztTnKJJPXzSud9CQ",
  "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"
}
[root@sqx111 ~]# 

kibana连接ES

在这里插入图片描述

Docker镜像加载原理

UnionFS(联合文件系统)

下载时分层就符合这个原理

Docker镜像讲解

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容、包括代码、运行时、库、环境变量和配置文件。

所有的应用,直接打包docker镜像,就可以直接跑起来!

如何得到镜像

  • 从远程仓库下载
  • 复制
  • 自己制作一个镜像DockerFile

Docker镜像加载原理

UnionFS(联合文件系统)

UnionFs(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层一层的叠加,同事可以将不同的目录挂载到通哟个虚拟文件系统下(unite several directories into a single vritual filesystem),Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性😋:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理

docker镜像实际上由一层一层的文件系统租车仓,这种层级的文件系统UnionFS。

bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加速器和内核。当boot加载完成之后整个内个就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

image-20210421093950174
#解释
#kernel			核心
#BootLoader		引导程序

对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以,因为底层直接用host的kernel,自己只需要提供rootfs就可以了,由此可见对于不同的Linux发行商,bootfs基本上是一直的,rootfs会有差别,因此不同的发行版可以公用bootfs。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GPdRPhOG-1634784766938)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210421094852500.png)]

分层理解

分层的镜像

在这里插入图片描述

分层下载

最大的好处莫过于资源共享,多个镜像都从相同的base构建而来,那么宿主机只需要在磁盘上保留一份base镜像,同时内存也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。

查看镜像分层方式可以通过docker image inspect命令

[root@sqx111 ~]# docker image inspect nginx:latest
[
    {
        //....
            "Type": "layers",
            "Layers": [
                "sha256:7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d",
                "sha256:4dc529e519c4390939b1616595683c89465782bb7d9fc7b90b30cc1e95bc723a",
                "sha256:23c959acc3d0eb744031aef67adf6ceb5120a19c8869727d588f7d9dabd75b09",
                "sha256:15aac1be5f02f2188ab40430b28a5f79be1bcb805db315bbe4d70f70aeabaa36",
                "sha256:974e9faf62f1a3c3210e3904420ffec1dc351b756ac33024f2dd2683bf44c370",
                "sha256:64ee8c6d0de0cfd019841b29c8cb18f4ab38e4687f7784866b840d5b2c31c8b9"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

特点

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

这一层就是我们通常说的容器层
在这里插入图片描述

如何提交自己的镜像

commit镜像

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

docker commit -m "提交的描述信息" -a "作者" 容器ID 目标镜像名:[TAG] 

#[TAG]		版本

测试

之前拉取的Tomcat镜像生成容器后发现webapps目录下没有文件,现在做出修改后使用commit命令提交为新容器


[root@sqx111 ~]# docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED        STATUS                      PORTS     NAMES
7c17326ca7f8   tomcat                "catalina.sh run"        24 hours ago   Exited (143) 20 hours ago             tomcat
[root@sqx111 ~]# docker start tomcat 
tomcat
[root@sqx111 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED        STATUS         PORTS                                       NAMES
7c17326ca7f8   tomcat    "catalina.sh run"   24 hours ago   Up 4 seconds   0.0.0.0:3355->8080/tcp, :::3355->8080/tcp   tomcat
[root@sqx111 ~]# docker exec -it tomcat /bin/bash
root@7c17326ca7f8:/usr/local/tomcat# cd webapps
root@7c17326ca7f8:/usr/local/tomcat/webapps# ls
root@7c17326ca7f8:/usr/local/tomcat/webapps# 

#发现文件都在webapps.dist里面
root@7c17326ca7f8:/usr/local/tomcat# cd webapps.dist/
root@7c17326ca7f8:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager
root@7c17326ca7f8:/usr/local/tomcat/webapps.dist# cd ..
root@7c17326ca7f8:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@7c17326ca7f8:/usr/local/tomcat# cd webapps
root@7c17326ca7f8:/usr/local/tomcat/webapps#ls
ROOT  docs  examples  host-manager  manager

root@7c17326ca7f8:/usr/local/tomcat/webapps# exit
exit

[root@sqx111 ~]#  docker commit -m="add webapps app" -a="sqx" 7c17326ca7f8 tomcat01:1.0
sha256:8f60433007b0305b8cef5166b8672f5e32ed058c6ddfc983b415019a09eb3fd7
[root@sqx111 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED        STATUS         PORTS                                       NAMES
7c17326ca7f8   tomcat    "catalina.sh run"   24 hours ago   Up 2 minutes   0.0.0.0:3355->8080/tcp, :::3355->8080/tcp   tomcat
[root@sqx111 ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
tomcat01              1.0       8f60433007b0   10 seconds ago   672MB
tomcat                latest    bd431ca8553c   9 days ago       667MB
[root@sqx111 ~]# 




[root@sqx111 ~]# curl localhost:3355

访问正常

如果想保存当前容器的状态,就可以通过commit来提交,获得一个新镜像(快照)

容器数据卷

什么是容器数据卷

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

数据如果都在容器中,删除容器,数据就会丢失

需求:数据可以持久化、MySQL数据可以存储在本地

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

卷技术,也就是目录的挂载。

将我们的容器内的目录,挂载到Linux

在这里插入图片描述

目的:容器的持久化和同步操作,容器间数据共享

使用数据卷

1、直接使用命令来挂载

docker run -it -p 主机端口:容器内目录 -v /

查看底层信息

docekr inspect 容器ID

找到Mounts即为挂载地址

  • Source 宿主机内/目标地址
  • Destination docker容器内的地址

测试

#docker run -it -p 宿主机端口:容器端口 --name 容器名字 -v 容器地址:宿主机地址(目的地址) 镜像


[root@sqx111 ~]# docker run -it -p 3355:8080 --name tomcat -v /home/tomcatshuju:/usr/local/tomcat/webapps tomcat
WARNING: IPv4 forwarding is disabled. Networking will not work.
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/openjdk-11
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usruli.jar
Using CATALINA_OPTS:   
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.ls=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.utilava.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/MED.....


[root@sqx111 ~]# docker start tomcat
tomcat
[root@sqx111 tomcatshuju]# docker inspect tomcat

.......
  },
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/tomcatshuju",					#宿主机地址
                "Destination": "/usr/local/tomcat/webapps",		#容器地址
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
......
#出现挂载地址,说明挂载成功
[root@sqx111 ~]# docker exec -it tomcat /bin/bash
root@33eecd239d4b:/usr/local/tomcat# ls
BUILDING.txt	 NOTICE		RUNNING.txt  lib	     te
CONTRIBUTING.md  README.md	bin	     logs	     we
LICENSE		 RELEASE-NOTES	conf	     native-jni-lib  we
root@33eecd239d4b:/usr/local/tomcat# cd webapps
root@33eecd239d4b:/usr/local/tomcat/webapps# ls
root@33eecd239d4b:/usr/local/tomcat/webapps# cd ..
root@33eecd239d4b:/usr/local/tomcat# cp -r webapps.dist/* webap
root@33eecd239d4b:/usr/local/tomcat# cd webapps
root@33eecd239d4b:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager


[root@sqx111 home]# cd tomcatshuju/
[root@sqx111 tomcatshuju]# ls
[root@sqx111 tomcatshuju]# ls
docs  examples  host-manager  manager  ROOT
[root@sqx111 tomcatshuju]# 

继续测试

  • 停止容器
  • 宿主机上修改文件
  • 启动容器
  • 容器内的数据依旧是同步的

优势

  • 文件只需要在宿主机进行修改,不必进去容器,即可自动同步

实战:安装mysql

MySQL数据持久化问题

#获取镜像
#docker pull mysql:5.7

#运行容器,需要做数据挂载!
#安装启动mysql,注意需要配置密码!

#官方
#docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

-d		后台运行
-p		端口映射
-v		挂载卷
-e		环境配置
--name	容器名字


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


#验证

[root@sqx111 data]# docker inspect mysqlcs

.....
 },
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/mysql/data",
                "Destination": "/var/lib/mysql",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },


.....

[root@sqx111 ~]# cd /home
[root@sqx111 home]# ls
mysql  sqx  tomcatshuju
[root@sqx111 home]# cd mysql/
[root@sqx111 mysql]# ls
conf  data
[root@sqx111 mysql]# cd data/
[root@sqx111 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@sqx111 data]# 



#完成之后,可以在本地使用sqlyog测试
#使用sqlyog连接3310端口,创建数据库,发现宿主机/home/mysql/data目录下也生成刚才创建的数据库


#此时即使删除容器,宿主机的数据库也不会丢失,这就实现了容器数据持久化功能

匿名和具名挂载

#匿名挂载
-v 容器路径
docker run -d -P -v /etc/nginx --name nginx nginx
docker voluem ls		#查看容器地址
#这里发现显示地址都是乱码,即匿名挂载,没有给宿主机设置名称
#使用docker inspect nginx可查看挂载的具体位置




#具名挂载
docker run -d -P -v jumingnginx:/etc/nginx --name nginx01 nginx
docker volume ls
#此时发现,出现卷名为jumingnginx的卷
docker inspect nginx01			#查看容器挂载目录

docker挂载时所有的卷,在未指定位置时,会默认存放在

/var/lib/docker/volumes

我们通常使用具名挂载,可以方便找到我们的卷

#如何确定使用的挂载方式

-v 容器内路径		#匿名挂载
-v 卷名:容器内路径		#具名挂载
-v 宿主机路径:容器内路径	#指定路径挂载


拓展

#通过 -v 卷名:容器内路径:ro/rw       改变读写权限

ro	readonly		#只读:只能通过宿主机来操作,容器内部无法操作
rw  readwrite		#读写


初识DockerFile(构建镜像)

CockerFile就是用来构建docker镜像的构建文件,命令脚本!(手工打造镜像)

通过这个脚本生成镜像,镜像分层,脚本就是一个一个的命令

#创建一个dockerfile文件,名字可以随意,建议dockerfile
#dockerfile1内容----指令大写

FROM centos

VOLUME ["volume01","volume02"]

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

#这里的每条命令都是镜像的一层

# docker build -f /地址/dockerfile -t sqx/centos:版本号 .

-f		指定dockerfile文件地址
-t		名字:TAG(版本号可加可不加,不加默认最新版本--latest)
.		当前目录下

#这里创建/home/docker-test/volume
#vim dockerfile1添加脚本

docker build -f /home/docekr-test-volume/dockerfile01 -t ceshi-centos .


测试

docker run -it --name ceshi-centos ceshi-centos /bin/bash




#进入容器发现volume01和volume02两个目录

#这是脚本中自动生成的生成-----并且匿名挂载

在这里插入图片描述

查看卷挂载路径

docker inspect ceshi-centos


#显示挂载地址

使用场景非常多,通常会构建自己的镜像

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

数据卷容器(容器备份)

多个mysql同步数据/共享(备份)

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


[root@sqx111 home]# docker run --name mysql02 -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --volumes-from mysql01 mysql:5.7


#此时可以实现容器的数据同步

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

​ 但是一旦持久化到本地,及时删除所有容器卷,本地数据也不会删除

存在问题:数据卷容器的可不可以端口相同?????????????????????????????????

DockerFile

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

构建步骤:

  • 编写一个dockerfile文件
  • docker build 构建成为一个镜像
  • docker run 运行镜像
  • docker push 发布镜像(DockerHub、阿里云镜像仓库)

进入dockerhub,看官方怎么做

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

Dockerfile构建过程

基础知识

  • 每个保留关键字(指令)必须是大写字母
  • 执行从上到下顺序执行
  • #表示注释
  • 每一个指令都会提交一个新的镜像层,并提交

在这里插入图片描述

dockerfile面向开发,发布项目做镜像就要编写dockerfile文件,

docker镜像逐渐成为企业交付的标准

步骤:开发、部署、运维

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

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

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

DockerFile指令

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

在这里插入图片描述

实战测试

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

#编写dockerfile配置文件

[root@sqx111 dockerfile]# vim mydockerfile
[root@sqx111 dockerfile]# cat mydockerfile 
FROM centos
MAINTAINER sqx<562066852@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH					#/bin/bash进入容器时所处于的目录

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

EXPOSE 80

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


#构建镜像

docker build -f dockerfile所在位置 -t 镜像名字:[TAG] 保存地址

#最后的保存地址一定不要忘记

[root@sqx111 dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .

...
...
...
...
...
Successfully built d3cab43d7eaa
Successfully tagged mycentos:0.1

#测试
[root@sqx111 dockerfile]# docker run -it --name mycentos mycentos:0.1
[root@e53fdfa722bf local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src
[root@e53fdfa722bf local]# pwd
/usr/local
[root@e53fdfa722bf local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

最原始的centos镜像,没有net-tools、没有vim命令,现在命令都可执行

发现进入容器所处默认的目录为/usr/loacl,之前默认为根目录

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

[root@sqx111 dockerfile]# docker history mycentos:0.1 
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
d3cab43d7eaa   10 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
5b6a5580f534   10 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
f3c2e67eb3aa   10 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
951137e8ca5d   10 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
376d8b35b34b   10 minutes ago   /bin/sh -c yum -y install net-tools             14.3MB    
833b88504f5f   10 minutes ago   /bin/sh -c yum -y install vim                   58MB      
0775b8488f7a   11 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
f0d12e7190b9   11 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
6a4f9d8f0384   11 minutes ago   /bin/sh -c #(nop)  MAINTAINER sqx<562066852@…   0B        
300e315adb2f   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:bd7a2aed6ede423b7…   209MB     
[root@sqx111 dockerfile]# 

DockerFile中CMD和ENTRYPOINT区别

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

测试:

#CMD 
[root@sqx111 dockerfile]# vim dockerfile-cmd-text


FROM centos

CMD ["ls","-a" ]


[root@sqx111 dockerfile]# docker build -f dockerfile-cmd-text -t cmd-test .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : CMD ["ls","-a" ]
 ---> Running in 7e066e6c0a7e
Removing intermediate container 7e066e6c0a7e
 ---> 2b55b16e0cb8
Successfully built 2b55b16e0cb8
Successfully tagged cmd-test:latest

[root@sqx111 dockerfile]# docker run cmd-test -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
[root@sqx111 dockerfile]# docker run cmd-test ls -al
total 32
drwxr-xr-x.  17 root root 4096 Apr 23 06:03 .
drwxr-xr-x.  17 root root 4096 Apr 23 06:03 ..
-rwxr-xr-x.   1 root root    0 Apr 23 06:03 .dockerenv
lrwxrwxrwx.   1 root root    7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x.   5 root root  340 Apr 23 06:03 dev
drwxr-xr-x.  52 root root 4096 Apr 23 06:03 etc
drwxr-xr-x.   2 root root    6 Nov  3 15:22 home
lrwxrwxrwx.   1 root root    7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Nov  3 15:22 lib64 -> usr/lib64
drwx------.   2 root root    6 Dec  4 17:37 lost+found
drwxr-xr-x.   2 root root    6 Nov  3 15:22 media
drwxr-xr-x.   2 root root    6 Nov  3 15:22 mnt
drwxr-xr-x.   2 root root    6 Nov  3 15:22 opt
dr-xr-xr-x. 265 root root    0 Apr 23 06:03 proc
dr-xr-x---.   2 root root 4096 Dec  4 17:37 root
drwxr-xr-x.  11 root root 4096 Dec  4 17:37 run
lrwxrwxrwx.   1 root root    8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Nov  3 15:22 srv
dr-xr-xr-x.  13 root root    0 Apr 23 04:42 sys
drwxrwxrwt.   7 root root 4096 Dec  4 17:37 tmp
drwxr-xr-x.  12 root root 4096 Dec  4 17:37 usr
drwxr-xr-x.  20 root root 4096 Dec  4 17:37 var
[root@sqx111 dockerfile]#





[root@sqx111 dockerfile]# vim dockerfile-entrypoint-test

FROM centos

ENTRYPOINT ["ls","-a"]
  
[root@sqx111 dockerfile]# docker build -f dockerfile-entrypoint-test -t entrypoint .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in 065ca094510a
Removing intermediate container 065ca094510a
 ---> 102624161812
Successfully built 102624161812
Successfully tagged entrypoint:latest
[root@sqx111 dockerfile]# docker run entrypoint -l
total 32
drwxr-xr-x.  17 root root 4096 Apr 23 06:07 .
drwxr-xr-x.  17 root root 4096 Apr 23 06:07 ..
-rwxr-xr-x.   1 root root    0 Apr 23 06:07 .dockerenv
lrwxrwxrwx.   1 root root    7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x.   5 root root  340 Apr 23 06:07 dev
drwxr-xr-x.  52 root root 4096 Apr 23 06:07 etc
drwxr-xr-x.   2 root root    6 Nov  3 15:22 home
lrwxrwxrwx.   1 root root    7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Nov  3 15:22 lib64 -> usr/lib64
drwx------.   2 root root    6 Dec  4 17:37 lost+found
drwxr-xr-x.   2 root root    6 Nov  3 15:22 media
drwxr-xr-x.   2 root root    6 Nov  3 15:22 mnt
drwxr-xr-x.   2 root root    6 Nov  3 15:22 opt
dr-xr-xr-x. 265 root root    0 Apr 23 06:07 proc
dr-xr-x---.   2 root root 4096 Dec  4 17:37 root
drwxr-xr-x.  11 root root 4096 Dec  4 17:37 run
lrwxrwxrwx.   1 root root    8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Nov  3 15:22 srv
dr-xr-xr-x.  13 root root    0 Apr 23 04:42 sys
drwxrwxrwt.   7 root root 4096 Dec  4 17:37 tmp
drwxr-xr-x.  12 root root 4096 Dec  4 17:37 usr
drwxr-xr-x.  20 root root 4096 Dec  4 17:37 var
[root@sqx111 dockerfile]# 

实战Tomcat镜像

1、准备镜像文件Tomcat压缩包,jdk的压缩包

[root@sqx111 home]# cd tomcat
[root@sqx111 tomcat]# ls
apache-tomcat-9.0.24-windows-x64.zip  jdk-7u79-linux-x64.tar.gz
[root@sqx111 tomcat]# ll
总用量 162472
-rw-r--r--. 1 root root  12856789 423 16:44 apache-tomcat-9.0.24-windows-x64.zip
-rw-r--r--. 1 root root 153512879 423 16:44 jdk-7u79-linux-x64.tar.gz
[root@sqx111 tomcat]# 

2、编写dockerfile文件------官方命名为Dockerfile,build会自动寻找这个文件,如果名字为Dockerfile,则不需要-f指定了

#Dockerfile配置文件

 
  1 FROM centos
  2 
  3 MAINTAINER sqx<562066852@qq.com>
  4 
  5 COPY readme.txt /usr/local/readme.txt
  6 
  7 ADD jdk-8u291-linux-x64.tar.gz /usr/local/
  8 ADD apache-tomcat-9.0.45.tar.gz /usr/local/
  9 
 10 RUN yum -y install vim
 11 
 12 ENV MYPATH /usr/local
 13 WORKDIR $MYPATH
 14 
 15 ENV JAVA_HOME /usr/local/jdk1.8.0_291
 16 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME:/lib/tools.jar
 17 ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.45
 18 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.45
 19 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
 20 
 21 
 22 EXPOSE 8080
 23 
 24 CMD /usr/local/apache-tomcat-9.0.45/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.45/bin/logs/catalina.out
 
 
 
 docker build -t diytomcat .
 
 
 [root@sqx111 tomcat]# docker build -t diytomcat .
Sending build context to Docker daemon  272.2MB
Step 1/15 : FROM centos
 ---> 300e315adb2f
Step 2/15 : MAINTAINER sqx<562066852@qq.com>
 ---> Using cache
 ---> 6a4f9d8f0384
Step 3/15 : COPY readme.txt /usr/local/readme.txt
 ---> ed00cfa36ab8
Step 4/15 : ADD jdk-8u291-linux-x64.tar.gz /usr/local/
 ---> d679e71c6c8a
Step 5/15 : ADD apache-tomcat-9.0.45.tar.gz /usr/local/
 ---> 9d98a38b0a40
Step 6/15 : RUN yum -y install vim
 ---> Running in 144a3f1ec07e
CentOS Linux 8 - AppStream                      4.5 MB/s | 6.3 MB     00:01    
CentOS Linux 8 - BaseOS                         2.0 MB/s | 2.3 MB     00:01    
CentOS Linux 8 - Extras                          17 kB/s | 9.6 kB     00:00    
Dependencies resolved.
================================================================================
 Package             Arch        Version                   Repository      Size
================================================================================

...
...
...
Successfully built 6c1f4d497af7
Successfully tagged diytomcat:latest




[root@sqx111 tomcat]# docker run -it --name diytomcat -p 9090:8080 -v /home/tomcatbeifen:/usr/local/apache-tomcat-9.0.45/webapps/test -v /home/toncatlogs:/usr/local/apache-tomcat-9.0.45/logs diytomcat 
[root@6e4375a5ade4 local]# ls
apache-tomcat-9.0.45  bin  etc	games  include	jdk1.8.0_291  lib  lib64  libexec  readme.txt  sbin  share  src
 #此时如果访问访问失败,报(56)错可能是run命令结尾添加了/bin/bash
 #解决方法,把/bin/bash去掉

Docker全流程小结

在这里插入图片描述

#生成tar包

[root@sqx111 home]# docker save --help

Usage:  docker save [OPTIONS] IMAGE [IMAGE...]

Save one or more images to a tar archive (streamed to STDOUT by default)

Options:
  -o, --output string   Write to a file, instead of STDOUT			#目录
[root@sqx111 home]# 

Docker网络(容器编排

理解Docker网络

首先清空所有资源环境

docker rm -f $(docker ps -aq)#强制删除所有容器


docker rmi -f $(docker images -aq)#强制删除所有镜像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FJwM2vzb-1634784766968)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210426125335686.png)]

三个网络

docker是如何处理容器网络访问的?

[root@sqx111 ~]# docker run -it -P --name tomcat01 tomcat
Unable to find image 'tomcat:latest' locally
latest: Pulling from library/tomcat
bd8f6a7501cc: Pull complete 

[root@sqx111 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
tomcat       latest    c0e850d7b9bb   3 days ago   667MB

#查看容器网络状态
[root@sqx111 ~]# docker start tomcat01 
tomcat01
[root@sqx111 ~]# 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
16: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@sqx111 ~]# 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.247 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.051 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.068 ms
^Z
[3]+  已停止               ping 172.17.0.2
[root@sqx111 ~]# 
#此时主机可以ping通docker

宿主机[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UYotyYVR-1634784766969)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210426142758038.png)]

容器内部

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nlW0zjQh-1634784766971)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210426142826721.png)]

原理

1、如上图所示,我们启动docker容器,docker会给容器分配一个ip,我们只要安装了docker,宿主机就会多一个网卡docker0桥接模式,所使用的技术就是veth-pair技术,

2、新建tomcat02,发现结论–网卡成对增加

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VNH6mhlf-1634784766972)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210426144025150.png)]

veth-pair:一对的虚拟设备接口,都是成对出现,一端连着协议,一端彼此相连,可充当桥梁,连接各种虚拟网络设备

OpenStack,Docker容器之间的连接,OVS的连接都是使用veth -pair技术

3、测试下容器内部是否互通

[root@sqx111 ~]# docker exec -it tomcat02 /bin/bash
root@f759ef90802f:/usr/local/tomcat# 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.240 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.089 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.175 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.079 ms
^Z
[1]+  Stopped                 ping 172.17.0.2
root@f759ef90802f:/usr/local/tomca

网络模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zaJTMHtY-1634784766974)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210426144630861.png)]

结论:

1、tomcat01和tomcat02共用一个“路由器”,docker0 。所有不使用 --net 参数指定网络的情况下,都是使用docker0路由,docker会给我们的容器分配默认可用ip

2、docker网络使用的是Linux桥接,宿主机中的容器网桥:docker0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BKkWxseI-1634784766977)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210426145423661.png)]

3、docker网络接口都是虚拟的,优势:转发效率高,删除容器,对应网桥自行消失。

–link

重点:

高可用:编写一个微服务,database url:ip ,项目不用重启,数据库ip换掉了,用名字来进行访问容器。

[root@sqx111 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                         NAMES
f759ef90802f   tomcat    "catalina.sh run"   26 minutes ago   Up 9 seconds    0.0.0.0:49157->8080/tcp, :::49157->8080/tcp   tomcat02
b75155152046   tomcat    "catalina.sh run"   47 minutes ago   Up 44 minutes   0.0.0.0:49155->8080/tcp, :::49155->8080/tcp   tomcat01
[root@sqx111 ~]# docker exec -it tomcat01 ping tomcat02
ping: tomcat02: Name or service not known
[root@sqx111 ~]# 

此时无法ping通

link相当于添加host文件里的地址

实操

#在VMware虚拟机中,使用net模式固定ip连接网络后,需要在虚拟机内更改DHCP自动获取模式
#否则link不通

[root@sqx111 ~]# docker run -it -P --name tomcat03 --link tomcat02 tomcat
WARNING: IPv4 forwarding is disabled. Networking will not work.
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/openjdk-11
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
...
...
...
[root@sqx111 ~]# 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.277 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.052 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.053 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.052 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=5 ttl=64 time=0.052 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=6 ttl=64 time=0.061 ms
^Z64 bytes from tomcat02 (172.17.0.3): icmp_seq=7 ttl=64 time=0.062 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=8 ttl=64 time=0.054 ms
--- tomcat02 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 11ms
rtt min/avg/max/mdev = 0.052/0.082/0.277/0.074 ms
[root@sqx111 ~]# 
#成功


#查看tomcat03容器的hosts文件
[root@sqx111 ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
"172.17.0.3	tomcat02 f759ef90802f"        #此处为link自动增加的hosts映射
172.17.0.4	f96a4c9ef5fe

#尝试使用tomcat02   ping   tomcat03

[root@sqx111 ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Temporary failure in name resolution

#不通,检查发现hosts文件没有像tomcat03那样的映射配置

[root@sqx111 ~]# docker exec -it tomcat02 cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.3	f759ef90802f
[root@sqx111 ~]# 

#查看某一容器的网络配置
docker network ls
docker network inspect 网卡信息



docker0出现问题,不支持容器名连接访问

自定义网络

查看所有的docker网络

[root@sqx111 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f7285957e979   bridge    bridge    local
06d548b90454   host      host      local
390307e9a4b6   none      null      local
[root@sqx111 ~]# 

网络模式

  • bridge:桥接(docker默认,如docker0,自己创建时也是使用bridge模式)
  • none:不配置网络
  • host:和宿主机共享网络
  • container:容器网络连通(局限性)

测试

#之前我们使用直接启动命令"docker run -it --name 容器名 镜像名"生成镜像时,相当于"docker run -it --name 容器名 --net bridge 镜像名"			--net bridge 就是docker0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NLtxidLG-1634784766978)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210427162845731.png)]

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

#我们可以自定一个网络
#规范:
docker network creare --driver bridge --subnet 子网(192.168.0.0/16)--gateway 网关(192.168.0.1)网桥名称

**实操:**自定义网络

#--driver bridge		#默认桥接
#--subnet 192.168.0.0/16	#子网地址
#--gateway 192.168.0.1		#网关





[root@sqx111 ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
8224f0202d67d2a28b45cfa6933015675edfe9fcbbb834f04b7db0cd093466f7
[root@sqx111 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f7285957e979   bridge    bridge    local
06d548b90454   host      host      local
8224f0202d67   mynet     bridge    local
390307e9a4b6   none      null      local
[root@sqx111 ~]# 




#查看
[root@sqx111 ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "8224f0202d67d2a28b45cfa6933015675edfe9fcbbb834f04b7db0cd093466f7",
        "Created": "2021-04-27T16:43:01.674642851+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@sqx111 ~]# 
#默认bridge网桥默认不能ping容器名,而自建的网桥可以

#验证:使用新建的网桥新建容器

[root@sqx111 ~]# docker run -it -P --name tomcat-mynet-01 --net mynet tomcat

[root@sqx111 ~]# docker run -it -P --name tomcat-mynet-02 --net mynet tomcat

[root@sqx111 ~]# docker start tomcat-mynet-01 tomcat-mynet-02
tomcat-mynet-01
tomcat-mynet-02

#此时没通过--link添加hosts映射

[root@sqx111 ~]# docker exec -it tomcat-mynet-01 ping tomcat-mynet-02
PING tomcat-mynet-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-mynet-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.112 ms
64 bytes from tomcat-mynet-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.060 ms
64 bytes from tomcat-mynet-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.057 ms
64 bytes from tomcat-mynet-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.108 ms
^C
--- tomcat-mynet-02 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 0.057/0.084/0.112/0.026 ms
[root@sqx111 ~]# 

#不使用--link也可以ping通

自定义的网络,自动维护好了对应的关系

好处:

  • Redis不同的集群使用不同的网络
  • mysql不同集群使用不同的网络,保证集群是安全和健康的

网络连通

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v2mOtZVM-1634784766979)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210427171424063.png)]

[root@sqx111 ~]# docker network connect mynet tomcat01
[root@sqx111 ~]# docker network inspect mynet
...
...
...
"Containers": {
            "0b4f3f93fb8f420806dcbeeb8f25c14b272a9a7e806f24d49ac807d9c0f57d50": {
                "Name": "tomcat-mynet-02",
                "EndpointID": "4c8ba6697cd4cc4b0a452b1e3cf0dde25fc8fdaec28a6c5eab9e9fb26f1cb2da",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "3515aa36c78aab9537026bd0678890cac9b4f17257aec8f1762f885af3451d66": {
                "Name": "tomcat-mynet-01",
                "EndpointID": "b128cd425e15399d8216ac0d2cea29afa5b6ed1e783e5e115473db23539a9fc6",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "b75155152046247fec96117b9b7f3c9b245086eed4a119cbe9698084c41e126f": {
                "Name": "tomcat01",
                "EndpointID": "5bdf8a368606d5b02f9fbdd5f9658bffa373e2a058827dc6218ea3f9d0a46060",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
            }
        },
...
...
...
#发现tomcat01容器加入到mynet网桥中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eqjgr5LY-1634784766981)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210427171941018.png)]

tomcat01容器加入到mynet网桥中

一个容器两个ip

[root@sqx111 ~]# docker inspect tomcat01

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FBb7U4h6-1634784766983)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210427172407985.png)]

tomcat01的打通,不影响tomcat02

结论:要使用跨网络操作,就需要使用 docker network connect 网桥 容器名

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
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

68.0.3): icmp_seq=4 ttl=64 time=0.108 ms
^C
— tomcat-mynet-02 ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 0.057/0.084/0.112/0.026 ms
[root@sqx111 ~]#

#不使用–link也可以ping通


自定义的网络,自动维护好了对应的关系



**好处:**

- Redis不同的集群使用不同的网络
- mysql不同集群使用不同的网络,保证集群是安全和健康的



## 网络连通

[外链图片转存中...(img-v2mOtZVM-1634784766979)]



```shell
[root@sqx111 ~]# docker network connect mynet tomcat01
[root@sqx111 ~]# docker network inspect mynet
...
...
...
"Containers": {
            "0b4f3f93fb8f420806dcbeeb8f25c14b272a9a7e806f24d49ac807d9c0f57d50": {
                "Name": "tomcat-mynet-02",
                "EndpointID": "4c8ba6697cd4cc4b0a452b1e3cf0dde25fc8fdaec28a6c5eab9e9fb26f1cb2da",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "3515aa36c78aab9537026bd0678890cac9b4f17257aec8f1762f885af3451d66": {
                "Name": "tomcat-mynet-01",
                "EndpointID": "b128cd425e15399d8216ac0d2cea29afa5b6ed1e783e5e115473db23539a9fc6",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "b75155152046247fec96117b9b7f3c9b245086eed4a119cbe9698084c41e126f": {
                "Name": "tomcat01",
                "EndpointID": "5bdf8a368606d5b02f9fbdd5f9658bffa373e2a058827dc6218ea3f9d0a46060",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
            }
        },
...
...
...
#发现tomcat01容器加入到mynet网桥中

tomcat01容器加入到mynet网桥中

一个容器两个ip

[root@sqx111 ~]# docker inspect tomcat01

[外链图片转存中…(img-FBb7U4h6-1634784766983)]

tomcat01的打通,不影响tomcat02

结论:要使用跨网络操作,就需要使用 docker network connect 网桥 容器名

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值