Docker的详细使用

一、Docker概述

1. Docker为什么会出现?
  • 一款产品:开发-上线两套环境!应用环境,应用配置。
  • 开发-运维。问题:我在我的电脑上可以运行!版本更新,导致服务不可用!对于运维来说,考验就十分大?环境配置是十分的麻烦,每一个机器都要部署环境(集群 RedisESHadoop)!费时费力。发布个项目(jr+( Redis MySQL jdk ES)),项目能不能都带上环境安装打包!之前在服努器配置—个应用的环境 Redis MySQL jdk ES Hadoop,配置超麻烦了,不能够跨平台。Windows,最后发布到 Linux
  • 传统:开发jar,运维来做。
  • 现在:开发打包部署上线,一套流程做完。
  • java-apk-发布(应用商店)-张三使用apk–安装即可用。
    -java-jar(环境)-…打包项目带上环境(镜像)-(Dσcker仓库:商店)-…下载我们发布的镜像…-直接运行即。
  • Docker的思想就来自于集装箱!
  • JRE-多个应用(端口冲突)–原来都是交叉的!
  • 隔离: Docker核心思想!打包装箱!每个箱子是互相隔离的。
  • Docker通过隔离机制,可以将服务器利用到极致!

二、Docker安装

1. Docker的基本组成

在这里插入图片描述

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

环境准备

1、需要会一点点的 Linux的基础
2、 Centos7
3、我们使用 Shel连接远程服务器进行操作!

环境查看

## 查看系统内核是 3.10 以上的
[root@iz2ze0j4s19xhxuqg75l0zz ~]# uname -r
3.10.0-1127.el7.x86_64
[root@iz2ze0j4s19xhxuqg75l0zz ~]#  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.需要的安装包
sudo yum install -y yum-utils
## 3.设置镜像仓库
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
## 更新软件包索引
yum makecache fast
## 4.安装docker相关的 docker-ce社区版 ee企业版
sudo yum install docker-ce docker-ce-cli containerd.io
## 5.启动docker
systemctl start docker
## 6.使用docker version查看docker是否安装成功


在这里插入图片描述

## 7. hello-world
docker run hello-world

在这里插入图片描述

##8.查看镜像
docker images
##1.卸载docker
sudo yum remove docker-ce docker-ce-cli containerd.io
##2.删除资源
sudo rm -rf /var/lib/docker
3. 配置阿里云镜像加速器
针对Docker客户端版本大于 1.10.0 的用户

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://m5c73hcp.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
4. docker run hello-world 命令的执行流程

在这里插入图片描述

5. 底层原理

Docker是什么工作的?
Docker是一个 Client- Server结构的系统, Docker的守护进程运行在主机上。通过 Socket从客户端访问。
Dockerserver接收到 Docker- Client的指令,就会执行这个命令!
在这里插入图片描述
Docker为什么比VM快?
1、 Docker有着比虚拟机更少的抽象层。
2、 Docker利用的是宿主机的内核,vm需要是Guest os

在这里插入图片描述
所以说,新建一个容器的时候, docker不需要想虚拟机一样重新加载一个操作系统內核,避免引导。虚拟机是加载 Guest os,分钟级别的,而 docker是利用宿主机的操作系统吗,省略了这个复杂的过程,秒级!
在这里插入图片描述

三、Docker的常用命令

1. 帮助命令
# 显示docker的版本信息
docker version  
# 显示docker的系统信息,包括镜像和容器的数量
docker info
# 帮助命令
docker --help
2. 镜像命令
  • docker images 查看所有本地的主机上的镜像

    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker images
    REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
    mysql                     latest              e1d7dc9731da        2 months ago        544MB
    # 解释
    REPOSITORY 镜像仓库源仓库
    TAG        镜像的标签   
    IMAGE ID   镜像id
    CREATED	   镜像创建时间
    SIZE 镜像大小
    # 可选项
    -a, --all             显示所有镜像(默认隐藏中间镜像)
    -q, --quiet           只显示镜像的id            
    
  • docker search 搜索镜像

    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker search mysql
    NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
    mysql                             MySQL is a widely used, open-source relation…   10156               [OK]                
    mariadb                           MariaDB is a community-developed fork of MyS…   3738                [OK]
    # 可选项,通过搜索来过滤
    --filter=STARS=3000
    
  • docker pull下载镜像

    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker pull mysql
    Using default tag: latest  # 如果不写tag ,默认就是latest
    latest: Pulling from library/mysql
    bb79b6b2107f: Pull complete 	# 分层下载,docker image的核心 联合文件系统
    49e22f6fb9f7: Pull complete 
    842b1255668c: Pull complete 
    9f48d1f43000: Pull complete 
    c693f0615bce: Pull complete 
    8a621b9dbed2: Pull complete 
    0807d32aef13: Pull complete 
    a56aca0feb17: Pull complete 
    de9d45fd0f07: Pull complete 
    1d68a49161cc: Pull complete 
    d16d318b774e: Pull complete 
    49e112c55976: Pull complete 
    Digest: sha256:8c17271df53ee3b843d6e16d46cff13f22c9c04d6982eb15a9a47bd5c9ac7e2d #签名
    Status: Downloaded newer image for mysql:latest
    docker.io/library/mysql:latest #真实地址
    # 等价于它
    docker pull mysql
    docker pull docker.io/library/mysql:latest
    # 指定版本下载
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker pull mysql:5.7
    5.7: Pulling from library/mysql
    bb79b6b2107f: Already exists 
    49e22f6fb9f7: Already exists 
    842b1255668c: Already exists 
    9f48d1f43000: Already exists 
    c693f0615bce: Already exists 
    8a621b9dbed2: Already exists 
    0807d32aef13: Already exists 
    f15d42f48bd9: Pull complete 
    098ceecc0c8d: Pull complete 
    b6fead9737bc: Pull complete 
    351d223d3d76: Pull complete 
    Digest: sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef
    Status: Downloaded newer image for mysql:5.7
    docker.io/library/mysql:5.7
    
    
  • docker rmi 删除镜像

    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker rmi -f 镜像id #删除指定镜像
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker rmi -f 镜像id 镜像id 镜像id #删除多个镜像
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker rmi -f $(docker images -aq) #删除全部镜像
    
3. 容器命令

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

docker pull centos
  • 新建容器并启动

    docker run [可选参数] image
    # 参数 说明
    --name="Name" 容器名字 tomcat01 tomcat02,用来区分容器
    -d 			  后台方式运行
    -it			  使用交互方式运行,进入容器查看内容
    -p			  指定容器的端口 -p 8080:8080
    -P			  随机指定端口
    
    #测试,启动并进入容器
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -it centos /bin/bash
    [root@c9c4bb01f7dc /]#
    [root@c9c4bb01f7dc /]# ls	#查看容器内的centos,基础版本,很多命令都不完善
    bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
    dev  home  lib64  media       opt  root  sbin  sys  usr
    
    #从容器退出主机
    exit
    
  • 列出所有的运行容器

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

    exit 		#直接容器停止并退出
    Ctrl + P +Q #容器不停止退出
    
  • 删除容器

    docker rm 容器id					#删除指定的容器,不能删除正在运行的容器,如果要强制删除,rm -f
    docker rm -f $(docker ps -aq)	#删除所有容器
    docker ps -a -q|xargs docker rm #删除所有容器(没有运行的)
    
  • 启动和停止容器的操作

    docker start 容器id			#启动容器
    docker restart 容器id		#重启容器
    docker stop 容器id			#停止当前正在运行的容器
    docker kill 容器id			#强制停止当前容器
    
4. 其他常用命令
  • 后台启动命令

    docker run -d 镜像名
    [root@iz2ze0j4s19xhxuqg75l0zz /]# docker run -d centos
    
    #问题 docker ps,发现 centos停止了
    #常见的坑: docker容器使用后台运行,就必须要有要一个前台进程, docker发现没有应用,就会自动停止
    #ngInx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
    
  • 查看日志

    docker logs -f -t --tail 容器,没有日志
    #自己编写一段shell脚本(测试未成功)
    [root@iz2ze0j4s19xhxuqg75l0zz /]# docker run -d centos /bin/bash -c “while true;do echo canying;sleep 1;done”
    #显示日志
    -tf 			#显示日志
    --tail number	#要显示日志的条数
    [root@iz2ze0j4s19xhxuqg75l0zz /]# docker logs -tf --tail 10 dce7b86171bf
    
  • 查看容器中进程信息

    docker top 容器id
    [root@iz2ze0j4s19xhxuqg75l0zz /]# docker top d43224512238
    UID     PID     PPID     C       STIME      TTY      TIME            CMD
    root    19810   19794    0       16:26      ?        00:00:00         /bin/bash
    
    
  • 查看镜像的元数据

    docker inspect	容器id
    [root@iz2ze0j4s19xhxuqg75l0zz /]# docker inspect d43224512238
    [
        {
            "Id": "d43224512238bf10a19bb33de20f00c8fcf23b4cae442f9461cd716bcdd69e7a",
            "Created": "2020-11-12T08:26:47.279424514Z",
            "Path": "/bin/bash",
            "Args": [],
    
    
  • 进入当前正在运行的容器

    # 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
    
    # 命令
    docker exec -it 容器id bashShell
    # 测试
    [root@iz2ze0j4s19xhxuqg75l0zz /]# docker exec -it d43224512238 /bin/bash
    [root@d43224512238 /]# ps -ef
    UID        PID  PPID  C STIME TTY          TIME CMD
    root         1     0  0 08:26 pts/0    00:00:00 /bin/bash
    root        14     0  0 08:43 pts/1    00:00:00 /bin/bash
    root        27    14  0 08:43 pts/1    00:00:00 ps -ef
    
    
    # 方式二
    docker attach 容器id
    # 测试 
    [root@iz2ze0j4s19xhxuqg75l0zz /]# docker attach d43224512238
    [root@d43224512238 /]# 
    正在执行当前代码...
    
    #docker exec  			#进入容器后开启一个新的终端,可以在里面操作(常用)
    #docker attach 			#进入容器正在执行的终端,不会启动新的进程
    
  • 从容器内拷贝文件到主机上

    docker cp 容器id:容器内路径 目的主机路径
    

四、Docker安装软件

1. 安装nginx
  • 搜索镜像

    docker search nginx
    
  • 下载镜像

    docker pull nginx
    
  • 运行测试

    [root@iz2ze0j4s19xhxuqg75l0zz /]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              c39a868aad02        6 days ago          133MB
    centos              latest              0d120b6ccaa8        3 months ago        215MB
    # -d 后台运行
    # --name 宿主机端口,容器内端口
    [root@iz2ze0j4s19xhxuqg75l0zz /]# docker run -d --name nginx -p 80:80 nginx
    f73ed2fc8142bcf30467c996c9c862875c871adcaf046c959e21ddb3617fa3be
    # 拷贝配置文件
    [root@iz2vc3otfvqqqhbzad3955z nginx]# docker container cp nginx:/etc/nginx /home/docker/nginx/conf
    [root@iz2vc3otfvqqqhbzad3955z conf]# docker run -p 80:80 --name nginx -v /home/docker/nginx/html:/usr/share/nginx/html -v /home/docker/nginx/logs:/var/log/nginx  -v /home/docker/nginx/conf:/etc/nginx  -d nginx
    [root@iz2ze0j4s19xhxuqg75l0zz /]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    f73ed2fc8142        nginx               "/docker-entrypoint.…"   6 seconds ago       Up 4 seconds        0.0.0.0:3344->80/tcp   nginx01
    [root@iz2ze0j4s19xhxuqg75l0zz /]# curl localhost:3344
    
    #进入容器
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it nginx01 /bin/bash
    root@f73ed2fc8142:/# whereis nginx
    nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
    root@f73ed2fc8142:/# cd /etc/nginx
    root@f73ed2fc8142:/etc/nginx# ls
    conf.d		koi-utf  mime.types  nginx.conf   uwsgi_params
    fastcgi_params	koi-win  modules     scgi_params  win-utf
    root@f73ed2fc8142:/etc/nginx#
    
2. 安装tomcat

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

  • 搜索镜像

    docker pull tomcat
    
  • 启动运行

    docker run -d -p 3355:8080 --name tomcat01 tomcat
    #进入容器
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat01 /bin/bash
    
    #发现问题:1、linux命令少了,2、没有 webapps。阿里云镜像的原因。默认是最小的镜像,所有不必要的都剔除掉
    #保证最小可运行的环境
    cp -r webapps.dist/* webapps
    
3. 安装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
#启动了1nux就卡住了 docker stats查看cpu的状态
#测试一下es是否安装成功
[root@iz2ze0j4s19xhxuqg75l0zz ~]# curl localhost:9200
{
  "name" : "472f848cee04",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "7KmVkbIuSuKG5duEPgMJoQ",
  "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"
}

#查看docker status
CONTAINER ID       NAME          CPU %    MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O           PIDS
472f848cee04   elasticsearch     0.90%    1.233GiB / 1.795GiB   68.69%    0B / 0B     8GB / 729kB         41

#赶紧关闭,增加內存的限制,修改配置文件-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
4.可视化
  • portainer(先用这个)

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

    docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
    #测试
    ip:8088
    #注册账号
    #选择本地的
    

-RancherCICD再用)

5. 安装mysql
  • 拉取镜像

    [root@iz2ze0j4s19xhxuqg75l0zz ceshi]# docker pull mysql:5.7
    5.7: Pulling from library/mysql
    bb79b6b2107f: Already exists 
    49e22f6fb9f7: Pull complete 
    842b1255668c: Pull complete 
    9f48d1f43000: Pull complete 
    c693f0615bce: Pull complete 
    8a621b9dbed2: Pull complete 
    0807d32aef13: Pull complete 
    f15d42f48bd9: Pull complete 
    098ceecc0c8d: Pull complete 
    b6fead9737bc: Pull complete 
    351d223d3d76: Pull complete 
    Digest: sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef
    Status: Downloaded newer image for mysql:5.7
    docker.io/library/mysql:5.7
    
  • 启动mysql容器

    #启动1
    [root@iz2ze0j4s19xhxuqg75l0zz docker]# docker run -d -p 3306:3306 -v /home/docker/mysql/conf:/etc/mysql/conf.d -v /home/docker/mysql/data:/var/lib/mysql -v /home/docker/mysql/log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql5.7 mysql:5.7
    
    [root@iz2ze0j4s19xhxuqg75l0zz docker]# docker ps
    CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                            NAMES
    732dc406a9d1        mysql:5.7             "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp                mysql5.7
    # 修改密码
    [root@iz2ze0j4s19xhxuqg75l0zz docker] docker exec -it mysql5.7 /bin/bash
    root@f3ca96a5e58b:/# apt-get update
    root@f3ca96a5e58b:/# apt-get install vim
    root@f3ca96a5e58b:/# vim /etc/mysql/conf.d/docker.cnf
    [mysqld]
      skip-host-cache
      skip-name-resolve
      skip-grant-tables
    root@f3ca96a5e58b:/# exit
    [root@iz2vc3otfvqqqhbzad3955z docker]# docker restart mysql5.7
    [root@iz2ze0j4s19xhxuqg75l0zz docker] docker exec -it mysql5.7 /bin/bash
    root@f3ca96a5e58b:/# mysql -u root -p
    mysql> use mysql;
    mysql> alter user 'root'@'%' identified by 'rootcy';
    mysql> flush privileges ; #修改报错就先刷新
    # 创建一个reader:123456帐号并修改权限,使得任何ip都能访问
    mysql> grant all privileges on *.* to 'reader' @'%' identified by '123456';
    
  • 测试连接
    在这里插入图片描述

6. 安装Jenkins
  • 拉取镜像

    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker pull jenkinsci/blueocean
    Using default tag: latest
    latest: Pulling from jenkinsci/blueocean
    188c0c94c7c5: Pull complete 
    79f2a9d4c8d6: Pull complete 
    98c562aa3ff3: Pull complete 
    f67b3d34ad5c: Pull complete 
    4f2607535ffc: Pull complete 
    0e660fe97dd8: Pull complete 
    24fe2782b74b: Pull complete 
    bad8c347493f: Pull complete 
    89399c8e1d4e: Pull complete 
    352fadc8df25: Pull complete 
    5865538a56b5: Pull complete 
    39d3c552887f: Pull complete 
    9e1a8f4807da: Pull complete 
    12329fdac281: Pull complete 
    07f6145bf8ac: Pull complete 
    bf8028cdd9b7: Pull complete 
    Digest: sha256:4106c049e29b17163a74400c4cae9bdf12222dbcdabe8b3399af016a351bfb8f
    Status: Downloaded newer image for jenkinsci/blueocean:latest
    docker.io/jenkinsci/blueocean:latest
    
  • 启动容器

    #/var/run/docker.sock    /usr/bin/docker 容器内绑定docker命令
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -u root -d --name jenkins -p 8080:8080 -p 50000:50000  -v /usr/tool/jenkins/jenkins-data:/var/jenkins_home  -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker jenkins
    01c0daf4553a83a3428c78044adb32c4a38540a88fb17725bb5d087e7fc46c3e
    
7. docker安装nacos
  • 拉取镜像

    root@iz2ze0j4s19xhxuqg75l0zz ~]# docker pull nacos/nacos-server
    
  • 启动容器

    root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
    
    spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
    db.user=root
    db.password=root
    
8. docker安装redis
  • 拉取镜像:

    docker pull redis
    
  • 启动redis

    [root@iz2vc3otfvqqqhbzad3955z ~]# docker run -p 6379:6379 --name redis  -v /home/docker/redis/data:/data -d redis redis-server --appendonly yes
    
  • 连接redis客户端:

    [root@iz2vc3otfvqqqhbzad3955z data]# docker exec -it redis redis-cli
    
9. docker安装RabbitMQ
  • 拉取镜像:

    [root@iz2vc3otfvqqqhbzad3955z ~]# docker pull rabbitmq
    
  • 启动RabbitMQ服务:

    [root@iz2vc3otfvqqqhbzad3955z ~]# docker run -p 5672:5672 -p 15672:15672 --name rabbitmq -d rabbitmq
    
  • 进入容器并开启管理功能:

    [root@iz2vc3otfvqqqhbzad3955z /]# docker exec -it rabbitmq /bin/bash
    root@91dbcd73f681:/# rabbitmq-plugins enable rabbitmq_management
    
  • 开启防火墙:

    [root@iz2vc3otfvqqqhbzad3955z /]# firewall-cmd --zone=public --add-port=15672/tcp --permanent
    [root@iz2vc3otfvqqqhbzad3955z /]# firewall-cmd --reload
    
10. docker安装Elasticsearch
  • 拉取镜像:

    [root@iz2vc3otfvqqqhbzad3955z /]# docker pull elasticsearch:7.6.2
    
  • 修改虚拟内存区域大小,否则会因为过小而无法启动:

    [root@iz2vc3otfvqqqhbzad3955z /]# sysctl -w vm.max_map_count=262144
    
  • 启动Elasticsearch服务:

    [root@iz2vc3otfvqqqhbzad3955z /]# docker run -p 9200:9200 -p 9300:9300 --name elasticsearch -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx256m"  -e "cluster.name=elasticsearch" -v /home/docker/elasticsearch/plugins:/usr/share/elasticsearch/plugins -v /home/docker/elasticsearch/data:/usr/share/elasticsearch/data -d elasticsearch:7.6.2
    # 启动时会发现/usr/share/elasticsearch/data目录没有访问权限,只需要修改
    chmod 777 /home/docker/elasticsearch/data/
    
  • 安装中文分词器IKAnalyzer,并重新启动:

    [root@iz2vc3otfvqqqhbzad3955z /]# docker exec -it elasticsearch /bin/bash
    [root@6b10c8975b4c elasticsearch]# elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
    
  • 访问会返回版本信息:http://192.168.3.101:9200:
    在这里插入图片描述

11. docler安装Logstash
  • 拉取镜像:

    [root@iz2vc3otfvqqqhbzad3955z /]# docker pull logstash:7.6.2
    
  • 创建/home/docker/logstash目录,并创建文件logstash.conf

    [root@iz2vc3otfvqqqhbzad3955z /]# mkdir /home/docker/logstash
    [root@iz2vc3otfvqqqhbzad3955z logstash]# vim logstash.conf
    input {
      tcp {
        mode => "server"
        host => "0.0.0.0"
        port => 4560
        codec => json_lines
        type => "debug"
      }
      tcp {
        mode => "server"
        host => "0.0.0.0"
        port => 4561
        codec => json_lines
        type => "error"
      }
      tcp {
        mode => "server"
        host => "0.0.0.0"
        port => 4562
        codec => json_lines
        type => "business"
      }
      tcp {
        mode => "server"
        host => "0.0.0.0"
        port => 4563
        codec => json_lines
        type => "record"
      }
    }
    filter{
      if [type] == "record" {
        mutate {
          remove_field => "port"
          remove_field => "host"
          remove_field => "@version"
        }
        json {
          source => "message"
          remove_field => ["message"]
        }
      }
    }
    output {
      elasticsearch {
        hosts => "localhost:9200"
        index => "mall-%{type}-%{+YYYY.MM.dd}"
      }
    }
    
  • 启动Logstash

    [root@iz2vc3otfvqqqhbzad3955z logstash]# docker run --name logstash -p 4560:4560 -p 4561:4561 -p 4562:4562 -p 4563:4563 --link elasticsearch:es -v /home/docker/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf -d logstash:7.6.2
    
  • 进入容器内部,安装json_lines插件:

    logstash-plugin install logstash-codec-json_lines
    
12. docker安装Kibana
  • 拉取镜像:

    [root@iz2vc3otfvqqqhbzad3955z /]# docker pull kibana:7.6.2
    
  • 启动Kibana服务:

    [root@iz2vc3otfvqqqhbzad3955z /]# docker run --name kibana -p 5601:5601 --link elasticsearch:elasticsearch -e "elasticsearch.hosts=http://47.18.23.96:9200" -d kibana:7.6.2
    [root@iz2vc3otfvqqqhbzad3955z /]# docker run --name kibana -p 5601:5601 --link elasticsearch:elasticsearch  -d kibana:7.6.2
    # kibana启动踩坑:Error: resource_already_exists_exception
    # 访问以下两个请求(两个请求要有内容)
    http://localhost:9200/_cat/indices 
    http://localhost:9200/_cat/aliases
    # 终端访问
    curl -X DELETE http://localhost:9200/.kibana*
    # 重启kibana
    
  • 开启防火墙:

    [root@iz2vc3otfvqqqhbzad3955z /]# firewall-cmd --zone=public --add-port=5601/tcp --permanent
    [root@iz2vc3otfvqqqhbzad3955z /]# firewall-cmd --reload
    
  • 访问地址进行测试:http://192.168.3.101:5601

13. docker 安装MongoDB
  • 拉取镜像:

    [root@iz2vc3otfvqqqhbzad3955z /]# docker pull mongo
    
  • 启动MongoDB:

    [root@iz2vc3otfvqqqhbzad3955z ~]# docker run -p 27017:27017 --name mongo -v /home/docker/mongo/db:/data/db -d mongo
    
14. docker 安装 zookeeper
  • 拉取镜像

    [root@iz2vc3otfvqqqhbzad3955z ~]# docker pull zookeeper
    
    
  • 启动zookeeper

    [root@iz2vc3otfvqqqhbzad3955z ~]# docker run -d --name zookeeper -p 2181:2181 zookeeper
    
15. docker 安装 kafka
  • 拉取镜像

    [root@iz2vc3otfvqqqhbzad3955z ~]# docker pull wurstmeister/kafka
    
  • 启动kafka

    [root@iz2vc3otfvqqqhbzad3955z ~]# docker run -d --name kafka --publish 9092:9092 --link zookeeper --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 --env KAFKA_ADVERTISED_HOST_NAME=47.108.223.96 --env KAFKA_ADVERTISED_PORT=9092 --volume /home/docker/kafka/localtime:/etc/localtime wurstmeister/kafka:latest
    
  • 进入容器

    [root@iz2vc3otfvqqqhbzad3955z ~]# docker exec -it kafka /bin/bash
    
  • 进入kafka软件目录

    bash-5.1# cd /opt/kafka_2.13-2.7.0
    
  • 测试

    # 创建一个topic 名为test01
    bash-5.1# bin/kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic test01
    # 查看我们的topic列表
    bash-5.1# bin/kafka-topics.sh --list --zookeeper zookeeper:2181
    test01
    # 运行一个生产者去发送消息
    bash-5.1# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test01
    # 消费消息
    bash-5.1# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test01 --from-beginning
    123
    

五、Docker镜像

1. 镜像是什么

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

如何得到一个镜像:

  • 从远程仓库下载
  • 朋友拷贝
  • 自己制作一个镜像DockerFile
2. Docker镜像加载原理

UnionFS(联合文件系统)

UnionFS(联合文件系统): Union文件系统( UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的加,同时可以将不同目录挂载到同一个虚拟文件系统下 (unite several directories into a single virtual filesystem)。 Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统 UnionFs
boots(boot file system)主要包含 bootloadrkernelbootloader主要是引导加载kernelLinux刚启动时会加载 bootfs文件系统,在 Docker镜像的最底层是 bootfs。这一层与我们典型的 Linux/Unⅸ系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs转交给内核,此时系统也会卸载 bootfs
rootfs(root file system),在 bootfs之上。包含的就是典型Lnux系统中的/dev/proc/bin/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如 UbuntuCentos等等。
在这里插入图片描述
平时我们安装进虚拟机的 Centos都是好几个G,为什么 Docker这里才200M

[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
tomcat                9.0                 2703bbe9e9d4        3 days ago          648MB
centos                latest              0d120b6ccaa8        3 months ago        215MB

对于一个精简的OSrootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Hostkernel,自己只需要提供 rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别,因此不同的发行版可以公用bootfs
虚拟机是分钟级别,容器是秒级!

3. commit 镜像
docker commit 提交容器成为一个新的副本
#命令和git类似
docker commit -m="提交描述信息" -a="作者" 容器id 镜像名:[TAG]

#测试
#1、启动一个默认的tomcat
#2、默认的 tomcat是没有 webapps应用,镜像的原因,官方的镜像默认webapps下面是没有文件的
#3、我自己拷贝进去了基本的文件
#4、将我们操作过的容器通过 commit提交为一个镜像!我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像
docker commit -a="canying" -m="add webapps app" 65754bc4526b tomcat02:1.0
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker commit -a="canying" -m="add webapps app" 65754bc4526b tomcat02:1.0
sha256:4fdf997677ae08ce17591755a1122a8ffeba10031ee360f171f4f234c35b5c7c
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
tomcat02              1.0                 4fdf997677ae        10 seconds ago      653MB
tomcat                9.0                 2703bbe9e9d4        3 days ago          648MB

六、容器数据卷

1. 容器数据卷

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

2. 使用数据卷

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

docker run -it -v 主机目录:容器目录
#测试
[root@iz2ze0j4s19xhxuqg75l0zz home]# docker run -it -v /home/ceshi:/home centos /bin/bash
#启动起来通过 docker inspect 容器id
[root@iz2ze0j4s19xhxuqg75l0zz home]# docker inspect 6f2fc79145d1
"Mounts": [
            {
                "Type": "bind",
                "Source": "/home/ceshi",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
3. 具名和匿名挂载
#匿名挂载
-v 容器内镜像
[root@iz2ze0j4s19xhxuqg75l0zz docker]# docker run -d --name nginx02 -P -v /etc/nginx nginx
#查看所有volume情况
[root@iz2ze0j4s19xhxuqg75l0zz docker]# docker volume ls
DRIVER              VOLUME NAME
local               c129e61311c81fac871cd37b697ec438b8b0157b756579697590d11ca7be06cf
local               d4cf95f6016660f504cef5cb4845c746f22712e6bd72ace3c3b9039d1d203886
local               e87e7ead2bb8c9a04ad473cd4dfbf72c47d44c53a03e03015ab8955bb21958e4
local               eb7ada05768e696c45681a5073a50630ea8544395bc2f824354c400365ca3f39
local               eb8a248b5e30f4310949e315a29eec433088bce35e89438c5d5ab088ff79b8c1

#具名挂载
[root@iz2ze0j4s19xhxuqg75l0zz docker]# docker run -d --name nginx03 -P -v juming-nginx:/etc/nginx nginx
6f69e62559e2ab874a8c99c58f8fbd0b370aed84cc21e0944bf711ed49b04903
[root@iz2ze0j4s19xhxuqg75l0zz docker]# docker volume ls
DRIVER              VOLUME NAME
local               c129e61311c81fac871cd37b697ec438b8b0157b756579697590d11ca7be06cf
local               d4cf95f6016660f504cef5cb4845c746f22712e6bd72ace3c3b9039d1d203886
local               e87e7ead2bb8c9a04ad473cd4dfbf72c47d44c53a03e03015ab8955bb21958e4
local               eb7ada05768e696c45681a5073a50630ea8544395bc2f824354c400365ca3f39
local               eb8a248b5e30f4310949e315a29eec433088bce35e89438c5d5ab088ff79b8c1
local               juming-nginx

#通过-v 卷名:容器内路径
[root@iz2ze0j4s19xhxuqg75l0zz docker]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2020-11-16T15:11:55+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/xxx/_data
#我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的具名挂载

拓展:

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

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

七、DockerFile

1. DockerFile介绍

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

  • 编写一个 dockerfile文件。
  • docker build 构建成为一个镜像。
  • docker run运行镜像。
  • docker push发布镜像( Dockerhub、阿里云镜像仓库) 。
2. DockerFile的构件过程

基础知识:

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

在这里插入图片描述
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写 dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为企业交付的标准,必须要掌握!
步骤:开发,部署,运维…缺一不可!

  • DockerFile:构建文件,定义了一切的步骤,源代码。
  • DockerImages:通过 Dockerfile构建生成的镜像,最终发布和运行的产品。
  • Docker容器:容器就是镜像运行起来提供服务器
3. DockerFile 指令
FROM 		#基础镜镜像,一切从这里开始构建
MAINTAINER	#镜像是谁写的,姓名+邮箱
RUN			#镜像构建的时候需要运行的命令
ADD			#步骤: tomcat镜像,这个 tomcat压缩包!添加内容
WORKDIR 	#镜像的工作目录
VOLUME		#挂载的目录
EXPOSE		#映射端口配置
CMD			#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT	#指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD		#当构建一个被继承 Dockerfile这个时候就会运行 ONBUTLD的指令。触发指令。
COPY		#类似ADD,将我们文件拷贝到镜像中
ENV			#构建的时候设置环境变量

在这里插入图片描述

4. 实战测试

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

创建一个自己的centos

# 1.编写dockerfile文件
[root@iz2ze0j4s19xhxuqg75l0zz dockerfile]# cat dockerfile-mycentos 
FROM centos
MAINTAINER canying<248919076@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 80

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

#2.通过这个文件构件镜像
#命令:docker build -f dockerfile文件路径 -t 镜像名:[tag]
[root@iz2ze0j4s19xhxuqg75l0zz dockerfile]# docker build -f dockerfile-mycentos -t mycentos:0.1 .
Sending build context to Docker daemon  2.048kB
Step 1/10 : FROM centos
 ---> 0d120b6ccaa8
...
...
Step 10/10 : CMD /bin/bash
 ---> Running in fab3e45b924e
Removing intermediate container fab3e45b924e
 ---> 265de36195c1
Successfully built 265de36195c1
Successfully tagged mycentos:0.1

#3.测试运行

5. 实战:Tomcat镜像
  • 准备镜像文件tomcat压缩包,jdk的压缩包。

    #下载tomcat压缩包
     wget  https://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.39/bin/apache-tomcat-9.0.39.tar.gz
     #下载jdk压缩包(wget下载的不能解压)
     wget http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz
     [root@iz2ze0j4s19xhxuqg75l0zz tomcat]# ll
    total 11028
    -rw-r--r-- 1 root root 11282879 Oct  6 22:33 apache-tomcat-9.0.39.tar.gz
    -rw-r--r-- 1 root root     5307 Mar 21  2012 jdk-8u141-linux-x64.tar.gz
    
  • 编写dockerfile文件

    FROM centos
    MAINTAINER canying<248919076@qq.com>
    
    COPY readme.txt /usr/local/readme.txt
    
    ADD jdk-8u171-linux-x64.tar.gz /usr/local
    ADD apache-tomcat-9.0.39.tar.gz /usr/local
    
    RUN yum -y install vim
    
    ENV MYPATH /usr/local
    
    WORKDIR $MYPATH
    
    ENV JAVA_HOME /usr/local/jdk1.8.0_171
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.39
    ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.39
    ENV PATH $PATH:$JAVA_HOME/bin;$CATALINA_HOME/lib:$CATALINA_HOME/bin
    
    EXPOSE 8080
    
    CMD /usr/local/apache-tomcat-9.0.39/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.39/bin/logs/catalina.out
    
  • 构建镜像

    [root@iz2ze0j4s19xhxuqg75l0zz tomcat]# docker build -t diytomcat .
    [root@iz2ze0j4s19xhxuqg75l0zz tomcat]# docker images
    REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
    diytomcat             latest              e9aa6b0127b6        3 minutes ago       675MB
    
    
  • 启动容器

  • 访问测试

  • 发布项目

6. 发布镜像

DockerHub

  • 地址 注册自己的账号。

  • 确定账号可以登录。

  • 在服务器上提交自己的镜像。

    [root@iz2ze0j4s19xhxuqg75l0zz tomcat]# 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@iz2ze0j4s19xhxuqg75l0zz ~]# docker login -u canying66
    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
    
  • 登录完毕,提交镜像。docker pull

    #push镜像名需要登录DockerHub账号
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker pull diytomcat
    Using default tag: latest
    Error response from daemon: pull access denied for diytomcat, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker push canying/tomcat:1.0
    The push refers to repository [docker.io/canying/tomcat]
    fe2971b3c6ea: Preparing 
    05061b32954d: Preparing 
    634c8fa3488f: Preparing 
    799363d05cfc: Preparing 
    291f6e44771a: Preparing 
    denied: requested access to the resource is denied
    
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker tag e9aa6b0127b6 canying66/tomcat:1.0
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker push canying66/tomcat:1.0
    The push refers to repository [docker.io/canying66/tomcat]
    Get https://registry-1.docker.io/v2/: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker push canying66/tomcat:1.0
    The push refers to repository [docker.io/canying66/tomcat]
    fe2971b3c6ea: Pushed 
    05061b32954d: Pushed 
    634c8fa3488f: Pushed 
    799363d05cfc: Pushed
    291f6e44771a: Pushed 
    1.0: digest: sha256:a6879060e9a5fe080ba5b0e9077ad510949bc9ecab23ff4edcf381020865249f size: 1373
    

阿里云镜像服务

  • 登录阿里云。

  • 找到容器镜像服务。

  • 创建命名空间。
    在这里插入图片描述

  • 创建容器镜像。
    在这里插入图片描述

  • 浏览镜像。

  • 发布镜像参考官方文档。

7.小结

在这里插入图片描述

八、Docker网络

1. 理解Docker0

清空所有环境。

测试

[root@iz2ze0j4s19xhxuqg75l0zz ~]# 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:16:f8:c4 brd ff:ff:ff:ff:ff:ff
    inet 172.24.5.85/18 brd 172.24.63.255 scope global dynamic eth0
       valid_lft 314647934sec preferred_lft 314647934sec
#docker0地址
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:d0:2a:82:3f brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

三个网络

#问题:docker是如何处理容器网络访问的?
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -d -p 3355:8080 --name tomcat01 tomcat
#查看容器的内部网络地址 ip addr, 发现容器启动的时候会得到一个eth0@if183 ip地址, docker分配的!
[root@iz2ze0j4s19xhxuqg75l0zz ~]# 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
182: eth0@if183: <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
       
#思考。1iunx能不能ping通容器内部!
[root@iz2ze0j4s19xhxuqg75l0zz ~]# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.053 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.067 ms
64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.078 ms

#1inux可以ping通 docker容器内部

原理

  • 我们每启动—个 docker容器, docker就会给 docker容器分配一个ip,我们只要安装了 docker,就会有一个网卡 docker0桥接模式,使用的技术是evth-pair技术!再次测试 ip addr

    [root@iz2ze0j4s19xhxuqg75l0zz ~]# ip addr
    183: veth8497c2d@if182: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
        link/ether 06:ef:9a:b5:3a:fb brd ff:ff:ff:ff:ff:ff link-netnsid 1
    
  • 再启动一个容器测试,发现又多了一对网卡。

    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -d -P --name tomcat02 tomcat
    b78428ff8ab84523f2325c2f19ebd306a69c8d9d0e3f2446f2ab50ef10924417
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# ip addr
    183: veth8497c2d@if182: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
        link/ether 06:ef:9a:b5:3a:fb brd ff:ff:ff:ff:ff:ff link-netnsid 1
    215: veth07a6102@if214: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
        link/ether 3e:fd:c8:20:a7:7e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    
    #我们发现这个容器带来网卡,都是一对对的
    #evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段连着协 一段彼此相连
    #正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的
    #OpenStack, Docker容器之间的连接,OVS的连接,都是使用evth-pair技术
    
  • 测试一下tomcat01tomcat02之间是否可ping通。

    [root@iz2ze0j4s19xhxuqg75l0zz ~]# 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
    182: eth0@if183: <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
    [root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat02 ping 172.17.0.3
    PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
    64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.110 ms
    64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.071 ms
    64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.066 ms
    64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.071 ms
    
  • 网络模型图:
    在这里插入图片描述
    结论: tomcat01tomcat02是公用的一个路由器 docker0,所有的容器不指定网络的情况下,都是 docker0路由的, docker会给我们的容器分配一个默认的可用ip

    小结

    Docker使用的是Linux的桥接,宿主机中是一个 Dokcer容器的网桥 docker0
    在这里插入图片描述
    Docker中的所有的网络接囗都是虚拟的。虛拟的转发效率高!(内网传递文件)
    只要容器删除,对应网桥一对就没了!

2. --link

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

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

#如何可以解决呢
#通过--link 可以解决网络连通问题
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
d9fa7828fe1e51117176135dd8e0cb27e4a5515b46113f001fe77f7e621ce033
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.2): icmp_seq=1 ttl=64 time=0.108 ms
64 bytes from tomcat02 (172.17.0.2): icmp_seq=2 ttl=64 time=0.069 ms
64 bytes from tomcat02 (172.17.0.2): icmp_seq=3 ttl=64 time=0.070 ms
64 bytes from tomcat02 (172.17.0.2): icmp_seq=4 ttl=64 time=0.080 ms

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

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

#查看 hosts配置,在这里原理发现
[root@iz2ze0j4s19xhxuqg75l0zz ~]# 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.2	tomcat02 b78428ff8ab8
172.17.0.4	d9fa7828fe1e
3. 自定义网络

查看所有的Docker网络

[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8b4881cb0337        bridge              bridge              local
8ad55277a98b        host                host                local
fcc90d1fa3ca        none                null                local

网络模式:

  • 桥接: docker(默认,自己创建也使用 bridge模式)。
  • none:不配置网络。
  • host:和宿主机共享网络。
  • container:容器网络连通!(用的少!局限很大)。

测试:

#我们直接启动的命令 --net bridge,而这个就是我们的 docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat

# docker0特点:默认,域名不能访间,--1ink可以打通连接! 	
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
c98a1f1c17003e0886e7f12a11e3aea0a9420ac002381b2a93c517fb48c769ba
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8b4881cb0337        bridge              bridge              local
8ad55277a98b        host                host                local
c98a1f1c1700        mynet               bridge              local
fcc90d1fa3ca        none                null                local

#查看自己创建网络
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "c98a1f1c17003e0886e7f12a11e3aea0a9420ac002381b2a93c517fb48c769ba",
        "Created": "2020-11-18T10:43:21.366495797+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@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
0b094f2b4d16eb573dbefa8efd243fdfbd17cef0151ffcc1b97fbc6669b3d8be
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
881da4f42d7159e50598d1e1e39cd9371dc97a6d1236eef6ab59914c6b22cc70
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network inspect mynet
[
    {
        "Containers": {
            "0b094f2b4d16eb573dbefa8efd243fdfbd17cef0151ffcc1b97fbc6669b3d8be": {
                "Name": "tomcat-net-01",
                "EndpointID": "bcdf8cf8407208aa86566e446c9fb0b19bf9ab23a7d1f2cfc04c6a7ddea5a7a6",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "881da4f42d7159e50598d1e1e39cd9371dc97a6d1236eef6ab59914c6b22cc70": {
                "Name": "tomcat-net-02",
                "EndpointID": "566ab7b488794d3ca8aec59a0699719d7e4706c721a52e31d87c7a2d0914805f",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

#再次测试ping连接
[root@iz2ze0j4s19xhxuqg75l0zz ~]# 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.114 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.067 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.075 ms
64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.069 ms
#现在不使用--link也可以ping名字了!
[root@iz2ze0j4s19xhxuqg75l0zz ~]# 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.050 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.075 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.067 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.076 ms

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

  • redis-不同的集群使用不同的网络,保证集群是安全和健康的。
  • mysql-不同的集群使用不同的网络,保证集群是安全和健康的。
4. 网络连通
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network --help
Usage:	docker network COMMAND
Manage networks
Commands:
  connect     Connect a container to a network  #将容器连接到网络

#测试tomcat01 - mynet
#连通之后就是将 tomcat01放到了 mynet网络下
#一个容器两个ip地址!
#阿里云服务:公网ip,私网ip
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network connect mynet tomcat01
[root@iz2ze0j4s19xhxuqg75l0zz ~]# docker network inspect mynet
[
    {
        "Containers": {
            "0b094f2b4d16eb573dbefa8efd243fdfbd17cef0151ffcc1b97fbc6669b3d8be": {
                "Name": "tomcat-net-01",
                "EndpointID": "bcdf8cf8407208aa86566e446c9fb0b19bf9ab23a7d1f2cfc04c6a7ddea5a7a6",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "881da4f42d7159e50598d1e1e39cd9371dc97a6d1236eef6ab59914c6b22cc70": {
                "Name": "tomcat-net-02",
                "EndpointID": "566ab7b488794d3ca8aec59a0699719d7e4706c721a52e31d87c7a2d0914805f",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "c836f6338a6e48005981053fcf3b517e94a4c9ef607228a5e08d0cb05cc86d56": {
                "Name": "tomcat01",
                "EndpointID": "a837fda5baf5a212d4c926de3a844cd5a02a692f6b94ceb52f4e61885424a177",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

#01连通
[root@iz2ze0j4s19xhxuqg75l0zz ~]#  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.075 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.084 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.072 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.082 ms

#02还是不通
[root@iz2ze0j4s19xhxuqg75l0zz ~]#  docker exec -it tomcat02  ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
4. 实战部署redis集群
5. Springboot微服务应用打包Docker镜像
  • 构架 springboot项目
  • 打包应用
  • 编写 dockerfile
  • 构建镜像
  • 发布运行!

九、Docker Compose

9.1 Docker Compose的安装与卸载
9.1.1 安装条件

Docker Compose是依赖于Docker引擎的,所以在安装Docker Compose之前要确保机器上已经安装了Docker

9.1.2 安装Compose
  • 使用curl命令从GitHubCompose仓库拉取Docker Compose:

    $ sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    
  • 更改Docker Compose的可执行文件权限:

    $ sudo chmod +x /usr/local/bin/docker-compose
    $ docker-compose --version
    
  • Compose的卸载操作:

    $ sudo rm /usr/local/bin/docker-compose
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值