Docker学习笔记

Docker概述

Docker的历史

2010年,几个搞IT的年轻人,就在美国成立了一家公司 dotCloud

主营业务就是做pass的云计算服务,LIX有关的容器技术。

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

Docker刚诞生的时候并没有引发行业的关注,赚不到钱,公司面临倒闭。

所以他们没办法就将自己的容器化技术进行开源。

2013年,Docker开源。

开源后Docker被越来越多的人发现了docker的优点~所以就火了, 社区非常活跃,基本上每个月都会更新一个版本。

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

Docker为什么这么火? 因为它十分的轻巧,。

在容器化技术出来之前,我们都是使用的是虚拟化技术。

虚拟机:在Window中装一个Vmware,通过这个软件我们可以虚拟出来一台或者多台电脑,但是很笨重。就Vmware文件就有19G大小。

容器:十分轻巧,启动快,大小只有几十m而已。

虚拟机和Docker都属于虚拟化技术。

聊聊Docker

Docker是基于Go语言开发的。

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

文档地址:https://docs.docker.com/ Docker文档是非常详细的。

仓库地址:https://hub.docker.com/

Docker能做什么?

之前的虚拟机技术

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

虚拟机技术的缺点:

  1. 资源占用十分多。
  2. 冗余步骤多,开机慢
  3. 启动很慢。

容器化技术

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

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

比较Docker和传统虚拟机的不同

  • 传统的虚拟机是模拟出一套硬件,运行一个完整的系统,然后在这个系统安装和运行环境,。
  • 容器中的应用直接运行在宿主机中,容器自己是没有内核的,也没有虚拟硬件,所以就很轻便。
  • 每个容器之间互相隔离,每个容器都有自己的环境系统,互不影响。

DevOps (开发 运维)

应用更加快速的 交付和部署。

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

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

更便捷的升级和扩缩容!

使用了Docker之后,我们部署应用就跟搭积木一样。很简单。

项目打包成一个镜像,如果需要横向扩展,只需要把镜像放在要扩展的服务器上就可以了,它本身自带它的运行环境。

更简单的系统运维

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

更高效的资源利用

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

Docker安装

Docker的基本组成

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

镜像:(image)

  • Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,通过这个镜像可以创建多个容器。

容器:(container)

  • Docker利用容器技术,独立运行一个或者多个应用,是通过镜像创建的。
  • 启动、停止、删除 等 一些基本的命令
  • 目前就可以把这个容器理解为是一个简易的Linux系统。

仓库:(reps)

  • 仓库就是存放镜像的地方,
  • 仓库分为共有仓库和私有仓库!
  • 官方Docker hub 阿里云
  • 国内需要配置镜像加速。

安装Docker

环境准备

  1. 需要会Linux基础
  2. CentOS 7系统。
  3. 使用Xshell链接远程服务器操作。

环境查看

#系统内核是3.10以上的
[root@mysite-fengchao ~]# uname -r
3.10.0-1127.19.1.el7.x86_64
#系统版本
[root@mysite-fengchao etc]# cat 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、卸载旧版本
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 \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
	
#更新软件包的索引
yum makecache fast

#4、安装docker相关的依赖  docker-ce 社区版   ee是企业版的。
yum install docker-ce docker-ce-cli containerd.io

#5、启动docker
systemctl start docker

#6、安装成功,查看docker版本
docker version

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

#7、hello-world
docker run hello-world

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

#8、查看hello-world 镜像
[root@mysite-fengchao ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   13 months ago   13.3kB

#9、卸载Docker
 
 #卸载依赖
 yum remove docker-ce docker-ce-cli containerd.io
 #删除docker的运行环境
rm -rf /var/lib/docker

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

阿里云镜像加速

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

2、找到镜像加速器

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

3、配置使用

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

回顾运行原理

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

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

底层原理

Docker是怎么工作的?

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

Docker Server接收到Client的指令,运行这个命令

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

Docker为什么比VM要快?

  1. Docker有比虚拟机更少的抽象层。

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

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

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

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

Docker的常用命令

帮助命令

docker version #查看docker版本信息
docker info    #查看docker系统信息,包括镜像和容器的数量
docker --help # 万能命令

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

镜像命令

docker images #查看所有本地的主机镜像
######################################
[root@mysite-fengchao ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   13 months ago   13.3kB

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

# 可选项
  -a, --all             列出所有的镜像

  -q, --quiet          	只显示镜像的ID

docker search 搜索命令

[root@mysite-fengchao ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10428     [OK]   

# 可选项
  -f, --filter filter   #通过过条件过滤
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output
#示例  搜索mysql 收藏数 大于3000的mysql
[root@mysite-fengchao ~]# docker search mysql --filter=stars=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   10428     [OK]       
mariadb   MariaDB is a community-developed fork of MyS…   3870      [OK]

docker pull 下载镜像

#下载镜像 docker pull 镜像名:tag 版本
[root@mysite-fengchao ~]# docker pull mysql
Using default tag: latest #如果不写tag 默认下载的就是最新版本的。
latest: Pulling from library/mysql
a076a628af6f: Pull complete # 分层下载,docker images 的核心
f6c208f3f991: Pull complete 
88a9455a9165: Pull complete 
406c9b8427c6: Pull complete 
7c88599c0b25: Pull complete 
25b5c6debdaf: Pull complete 
43a5816f1617: Pull complete 
1a8c919e89bf: Pull complete 
9f3cf4bd1a07: Pull complete 
80539cea118d: Pull complete 
201b3cad54ce: Pull complete 
944ba37e1c06: Pull complete 
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址

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

#下载指定版本镜像
[root@mysite-fengchao ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Already exists 
f6c208f3f991: Already exists 
88a9455a9165: Already exists 
406c9b8427c6: Already exists 
7c88599c0b25: Already exists 
25b5c6debdaf: Already exists 
43a5816f1617: Already exists 
1831ac1245f4: Pull complete 
37677b8c1f79: Pull complete 
27e4ac3b0f6e: Pull complete 
7227baa8c445: Pull complete 
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

删除镜像

#删除指定的容器
[root@mysite-fengchao ~]# docker rmi a70d36bc331a
#删除多个容器
[root@mysite-fengchao ~]# docker rmi 容器id 容器id
#删除全部的容器
[root@mysite-fengchao ~]# docker rmi -f $(docker images -aq)

容器命令

说明:有了镜像,才能创建容器,下载一个CentOS来学习

[root@mysite-fengchao ~]# docker pull centos

新建容器,并启动

[root@mysite-fengchao ~]# docker run

#参数说明
--name="name"  #容器名字
-d 				#后台方式运行
-it 			#使用交互方式,进入容器查看内容
-p 				#指定容器端口:例如: -p 8080:8080
	-p ip:主机端口:容器端口
	-p 主机端口:容器端口(常用)
	-p 容器端口
	容器端口
-P				#随机指定端口

#测试
#启动并进入容器
[root@mysite-fengchao ~]# docker run -it centos /bin/bash
[root@9278efb8cd08 /]# 

#查看容器内的CentOS 
[root@9278efb8cd08 /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr


#从容器中退回主机
[root@9278efb8cd08 /]# exit
exit



列出所有运行的容器

#docker ps 命令
	#显示正在运行的容器
-a  #列出正在运行的容器以及运行过的容器
-n=?  #显示最近创建过的容器
-p  #只显示容器的编号

[root@mysite-fengchao ~]# docker ps  #列出所有正在运行的容器
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@mysite-fengchao ~]# docker ps -a  #列出所有之前运行过的容器
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                          PORTS     NAMES
9278efb8cd08   centos         "/bin/bash"   2 minutes ago   Exited (0) About a minute ago             sleepy_chatelet
5697745c81e0   bf756fb1ae65   "/hello"      6 hours ago     Exited (0) 6 hours ago                    charming_hertz
[root@mysite

退出容器

exit #容器停止,并退出
Ctrl+P+Q  #不停止容器,退出

[root@mysite-fengchao ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@mysite-fengchao ~]# docker run -it centos /bin/bash
[root@3d11beaee7e3 /]# [root@mysite-fengchao ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
3d11beaee7e3   centos    "/bin/bash"   12 seconds ago   Up 11 seconds             charming_williamson

删除容器

docker rm 容器id  				#删除指定容器

docker rm -f $(docker ps -aq) 	 #找到所有容器并根据容器id递归删除

#不能删除正在运行的容器,如果要强制删除 rm -f
docker ps -a-q|xargs docker rm   #删除所有的容器

启动和停止容器的操作

docker start 容器id    #启动容器
docker restart 容器id  #重启容器
docker stop 容器id     #停止当前容器
docker kill 容器id     #强制停止当前容器

常用的其他命令

后台启动容器

#命令 docker run -d 镜像名
docker run -d centos
#问题,直接这样启动,是后台启动容器,docker后台启动容器,就必须有个前台进程,docker发现没有应用就会自动停止,


#这样启动就不会有问题的。
docker run it centos /bin/bash

查看日志命令

docker logs -tf --tail +容器id

#显示日志
-tf           #显示日志
--tail number #显示日志条数,显示全部则不用写
[root@mysite-fengchao /]# dokcer logs -ft --tail 754a28d76d05

查看容器中的进程信息

#命令   docker top 754a28d76d05

[root@mysite-fengchao /]# docker top 754a28d76d05
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                2180                2161                0                   09:24               pts/0               00:00:00            /bin/bash
[root@mysite-fengchao /]# 

查看镜像元数据(重点)

  #  docker inspect  容器id
  
  -f, --format string   Format the output using the given Go template
  -s, --size            Display total file sizes if the type is container
      --type string     Return JSON for specified type
      
      
      
[root@mysite-fengchao /]# docker inspect 1c5a48178f35
[
    {
        "Id": "1c5a48178f35ef8aa2474811100eae9dcb19099f1a3e1155fdebb0bb85812e5c",
        "Created": "2021-01-30T01:32:45.797850244Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "/bin/bash"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 3043,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-01-30T01:32:46.161400858Z",

     

进入当前正在运行的容器(重点)

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

#第一种方式:docker exec -it 754a28d76d05 /bin/bash
[root@mysite-fengchao /]# docker exec -it 754a28d76d05 /bin/bash
[root@754a28d76d05 /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@754a28d76d05 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 01:24 pts/0    00:00:00 /bin/bash
root        15     0  0 02:02 pts/1    00:00:00 /bin/bash
root        30    15  0 02:03 pts/1    00:00:00 ps -ef

# 第二种方式: docker attach 754a28d76d05

两种方式的区别:

docker exec : 进入容器后,开启一个新的终端,可以在里面操作(常用)

dicker attach: 进入容器正在执行的终端,不会启动新的进程。

容器内拷贝文件到主机

# docker cp 容器id:目录/文件 要拷贝的主机地址 

# 创建一个文件: 
[root@bff9b82509e6 home]# touch test.java


#查看容器
[root@mysite-fengchao home]# docker ps -a
CONTAINER ID   IMAGE          COMMAND               
bff9b82509e6   centos         "/bin/bash"       

#复制容器中的文件到主机
[root@mysite-fengchao home]# docker cp bff9b82509e6:/home/test.java /home
[root@mysite-fengchao home]# ls
feng  fengchao  fengstudy.txt  test.java


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

常用命令小结

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

总结:

管理命令:
  container   管理容器
  image       管理镜像
  network     管理网络
  node        管理Swarm节点
  plugin      管理插件
  secret      管理Docker secrets
  service     管理服务
  stack       管理Docker stacks
  swarm       管理Swarm集群
  system      查看系统信息
  volume      管理卷
  
  如:docker container ls 显示所有容器
  
普通命令:
    
  attach     进入一个运行的容器
  build      从一个DockerFile构建镜像
  commit     从容器创建一个镜像
  cp          从容器和主机文件系统之间拷贝文件 
  create      创建一个容器
  diff        检查容器文件系统上的更改
  events      从服务器获取实时事件
  exec        在正在运行的容器中运行命令
  export      将容器的文件系统导出为tar存档
  history     显示镜像的历史记录
  images      查看镜像列表
  import      从归档文件中创建镜像
  info        显示系统范围的信息
  inspect     返回Docker对象的低级信息
  kill        kill运行中的容器
  load        从存档或者STDIN加载镜像
  login       登陆docker镜像仓库
  logout      退出docker镜像仓库
  logs        获取一个容器的日志
  pause       暂停一个或多个容器中的所有进程
  port        查看端口映射或容器的特定映射列表
  ps          查看容器列表
  pull        从镜像仓库拉取镜像
  push        将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
  rename      重命名容器
  restart     重启容器
  rm          删除容器
  rmi         删除镜像
  run         创建一个新的容器并运行一个命令
  save        将指定镜像保存成 tar 归档文件
  search      从Docker Hub搜索镜像
  start       启动容器
  stats       实时显示容器资源使用情况的统计信息
  stop       停止容器
  tag         标记本地镜像,将其归入某一仓库
  top         展示一个容器中运行的进程
  unpause     恢复容器中所有的进程
  update      更新容器配置
  version    显示Docker的版本信息
  wait        阻塞直到容器停止,然后打印退出代码

docker启动出错

执行docker ps命令,出现

“Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?”

错误

此时已确定Docker本身已经安装正常。

问题原因是因为docker服务没有启动,所以在相应的/var/run/ 路径下找不到docker的进程。

执行 service docker start 命令,启动docker服务,返回

此时进程启动成功,再执行docker ps,问题解决

安装练习

Docker安装Nginx

#1、搜索镜像,docker search 建议去官网搜索,可以看到帮助文档
#2、下载镜像,docker pull 
#3、运行测试

[root@mysite-fengchao ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
Digest: sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
Status: Image is up to date for nginx:latest
docker.io/library/nginx:latest


#4、启动容器

-d     # 后台启动
-p     #宿主机端口:容器端口 
--name #给容器命名,不写则默认
[root@mysite-fengchao ~]# docker run -d -p 3344:80 nginx
d4e5886314246c96fd87952edd372615ed8afe680418f2f48522d232b8e8c5ad

#进入容器

[root@mysite-fengchao ~]# docker exec -it d4e588631424 /bin/bash
root@d4e588631424:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@d4e588631424:/# cd /etc/nginx
root@d4e588631424:/etc/nginx# ls
conf.d		koi-utf  mime.types  nginx.conf   uwsgi_params
fastcgi_params	koi-win  modules     scgi_params  win-utf
root@d4e588631424:/etc/nginx# cat nginx.conf

端口暴露的概念

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

Docker安装Tomcat

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

#我们之前都是后台启动的,停止容器后,-a还能看到容器,docker run -it -rm 一般用来测试,用完即删除。

[root@mysite-fengchao ~]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/nginx
Digest: sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
Status: Image is up to date for nginx:latest
docker.io/library/nginx:latest


#4、启动容器

-d     # 后台启动
-p     #宿主机端口:容器端口 
--name #给容器命名,不写则默认
[root@mysite-fengchao ~]# docker run -d -p 3355:8080 tomcat
151920e4b8df356aae17293f178a0d064ca1f4de7317e29810a5325ca3da9312

#进入容器

[root@mysite-fengchao ~]# docker exec -it 151920e4b8df /bin/bash
root@151920e4b8df:/usr/local/tomcat# ls
BUILDING.txt	 LICENSE  README.md	 RUNNING.txt  conf  logs	    temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin	      lib   native-jni-lib  webapps  work
root@151920e4b8df:/usr/local/tomcat# exit
exit
[root@mysite-fengchao ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED         STATUS         PORTS                    NAMES
151920e4b8df   tomcat    "catalina.sh run"   3 minutes ago   Up 3 minutes   0.0.0.0:3355->8080/tcp   reverent_kalam
[root@mysite-fengchao ~]#

部署es+kibana

#es的问题
#es 暴露的端口很多
#es 十分的耗内存
#es 的数据需要放在安全目录中,挂载。


#启动并下载 elasticsearch 

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

#启动Linux就卡住了,

dokcer stats #查看cpu的状态

#es是十分消耗资源的,1.x个G 

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

#运行el后,特别消耗资源,我们可以通过限制内存大小来,通过-e  命令 环境配置修改
-e ES_JAVA_OPTS="-Xms64m -Xms512m"

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

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

使用kibana链接es

思考容器之间如何连接??

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

可视化面板安装

Docker镜像详解

镜像是什么?

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

之后我们所有的应用,可以直接打包成docker镜像,就可以直接跑起来了

如何得到镜像?

  • 从远程仓库下载
  • 朋友拷贝
  • 自己制作

Docker镜像加载原理

UniosFS(文件联合系统)

下载文件的时候看到的一层一层就是这个!

UniosFS:Unios文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次次的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Unios文件系统是Docker镜像的基础,镜像可以通过分层来继承,基于基础镜像,可以制作各个具体的镜像。

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

Docker镜像加载原理

docker 的镜像实际是一层一层的文件系统组成,这种层级的文件系统UniosFS.

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

rootfs 在bootfs之上,包含的就是典型的Linux系统中的,/dev /proc /bin /etc 等标准文件目录,rootfs就是各个不同操作系统的发行版,如 Ubuntu,centos等等。

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

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

所以说 虚拟机启动是分钟级别的,容器是秒级的。因为当你启动宿主机时,内核就加载好了,容器直接使用的时宿主机的容器。

分层理解

分层的镜像

我们可以下载一个镜像,观察日志输出,可以看到是分层下载的。

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

特点

  • docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。
  • 这一层通常说的是容器层,容器之下都叫镜像层。

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

如果提交自己的镜像?

Commit镜像

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

#命名和git类似!!
docker commit -m="提交的描述信息" -a="作者信息" 容器id  目标镜像名

实战测试

#1、启动一个默认的tomcat
	
#2、发现默认的tomcat没有 webapps应用,官方的镜像原因,默认webapps下是没有文件的。

#3、我们自己从webapps.dist文件中拷贝过去基本的文件

#4、将我们操作过的容器通过commit提交为一个镜像,我们之后使用我们自己提交的镜像就可以的。

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

如果你想要保存当前容器的状态,就可以通过commit提交,获得镜像,就要比我们学习jvm的时候,快照。

容器数据卷

什么是容器数据卷?

docker理念回顾:

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

容器中保存的数据,如果容器删除,那么数据也就删除了, 需求:数据可以持久化

容器之间可以有数据共享技术,Docker容器中产生的数据,同步到本地,也就是挂载技术

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

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

总结:容器的持久化和同步操作,容器间也可以数据共享的!

使用数据卷

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

docker run -it -v 主机目录:容器内目录

#测试
docker run -it -v /home/ceshi:/home centos /bin/bash
#启动之后,可以使用 docker inspect 
docker inspect centos

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

测试文件同步

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

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

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

实战:部署Mysql

Mysql的数据持久化问题

#获得镜像:
[root@mysite-fengchao ~]# docker pull mysql:5.7


#官方启动mysql示例:$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#runmysql需要配置mysql密码
#启动容器.
#############################
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 命名


docker run -d -p 3306:3306 \
-v /home/mysql/conf:/etc/mysql/conf.d \
-v /home/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql01 \
mysql:5.7

假设我们的容器被删除了,发现我们本地的数据卷还在。这就实现了容器数据持久化功能

具名匿名挂载:

#匿名挂载
docker run -d -P --name ngnix -v /etc/nginx nginx


#查看所有卷的情况 docker volume ls
[root@mysite-fengchao /]# docker volume ls
DRIVER    VOLUME NAME
local     0e43c3e970868081a744b95cefbf8c5af0522f9d9f45e0a960b482aaf85f3f89
local     5c0b54c8c36896b0bdf26fe0d548a39a148be72e0dbfd83e056d38aa677c9f2c
local     615f3b9255d92e8516ebe06e1dd95f24c3207af93bc912989871d76c322e84d1
local     5536a2cd321cdb626e64e80325fec3e88dd4ecf27f6329267f88de95910ce9ca
local     fd6652ae12abfd3f93c4a8b70ee8e7aa54645c6fd4f812b12607c0394eb21fbe
#我们在-v的时候只写了 容器内的路径,没有写主机内的路径。所以叫匿名挂载


#具名挂载    通过 -v 卷名:容器内路径
[root@mysite-fengchao /]# docker run -d -P --name nginx02 -v juming:/etc/nginx nginx
#查看卷的情况,是有名字的!
[root@mysite-fengchao /]# docker volume ls
DRIVER    VOLUME NAME
local     0e43c3e970868081a744b95cefbf8c5af0522f9d9f45e0a960b482aaf85f3f89
local     5c0b54c8c36896b0bdf26fe0d548a39a148be72e0dbfd83e056d38aa677c9f2c
local     615f3b9255d92e8516ebe06e1dd95f24c3207af93bc912989871d76c322e84d1
local     5536a2cd321cdb626e64e80325fec3e88dd4ecf27f6329267f88de95910ce9ca
local     fd6652ae12abfd3f93c4a8b70ee8e7aa54645c6fd4f812b12607c0394eb21fbe
local     juming

#查看卷的路径
[root@mysite-fengchao /]# docker volume inspect juming
[
    {
        "CreatedAt": "2021-02-02T14:50:53+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming/_data",
        "Name": "juming",
        "Options": null,
        "Scope": "local"
    }
]

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

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

工作中大多数使用的都是具名挂载的方式,可以方便的找到卷!

如果确定是具名还是匿名挂载还是指定路径挂载?

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

拓展:

# 通过-v 容器内路径:ro/rw 改变读写权限。
ro  readonly   #只读
rw  readwrite  #可读可写

#一旦设置了这个容器权限,容器对我们挂载出来的内容就有限定了。
docker run -d -P --name nginx02 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming:/etc/nginx:rw nginx

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

初识DockerFile

dockerfile 就是用来构建docker镜像的构建文件,其实就是一段命令脚本

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

#创建一个dockerfile文件,名字可以随意,推荐使用 DockerFile

FROM centos 
VOLUME["volume01","volume02"]
CMD echo "------------end-----------"
CMD /bin/bash

#每行命令都是镜像的一层!!

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

数据容器卷

多个mysql同步数据

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

测试一下

#启动三个容器,通过我们刚才自己写的镜像来启动


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

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

应用场景:

  • 实现多个mysql 数据共享。
  • redis数据共享。

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

结论:

  • 容器之间配置信息的传递,数据卷的生命周期是没有容器使用为止!
  • 一旦数据卷容器 持久化到了本地,这个时候,本地的数据不会删除。

DockerFile

DockerFile介绍

docakerfile核心就是用来构建镜像的文件,就是命令参数脚本

构建步骤:

  1. 编写dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像,。
  4. docker push 发布镜像。(DockerHub aliyun)

查看下官方是怎么做的?

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

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

DockerFile构建过程

基础知识:

  1. 每个指令,都必须是大写字母
  2. 指令是从上到下顺序执行的。
  3. #表示注释
  4. 每个指令都会创建提交一个新的镜像层,并提交。

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

DockerFile是面向开发的,以后要发布项目,就需要编写dockerfile文件,这个文件比较简单。

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

步骤:开发、部署、项目运维

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

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

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

DockerFile的指令

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

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

实战测试 CentOS

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

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

创建一个自己的 CentOS

#编写DockerFile文件

FROM centos
MAINTAINER fengchao<602950602@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

#构建
[root@mysite-fengchao dockerfile]# ls
mydocker-centos
[root@mysite-fengchao dockerfile]# docker build -f mydocker-centos -t mycentos:0.1 .


#测试运行


原生的CentOS

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

自己写的

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

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

#查看当前镜像的变更记录。
[root@mysite-fengchao ~]# docker history 6b803d57dddc
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
6b803d57dddc   17 hours ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
dc4dcb17cc12   17 hours ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
e8208fb0f5fe   17 hours ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
e70369a84007   17 hours ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
d2845e83b202   17 hours ago   /bin/sh -c yum -y install net-tools             23.3MB    
b35e95bcfadf   17 hours ago   /bin/sh -c yum -y install vim                   58.1MB    
5da2ac0d7629   17 hours ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B        
5c2103216af2   17 hours ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B        
3f6578d5300f   17 hours ago   /bin/sh -c #(nop)  MAINTAINER fengchao<60295…   0B        
300e315adb2f   8 weeks ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      8 weeks ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      8 weeks ago    /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB

CMD和ENTRYPOINT的区别

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

测试CMD

#查找dockerfile文件位置
[root@mysite-fengchao /]# find / -name dockerfile
#创建一个dockerfile文件
[root@mysite-fengchao dockerfile]# vim dockerfile-cmd-test

FROM centos
CMD ["ls","-a"]
#构建镜像  
-f   #要构建的dockerfile文件名称
-t   #构建的镜像名称
#注意,最后一定要加个  ”.“
[root@mysite-fengchao dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .

#测试运行  发现添加的  ls -a  生效了,容器启动后,自动执行了该命令

[root@mysite-fengchao dockerfile]# docker run 87a9a2d1a4cc -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

#cmd把原有的centos命令  -l  替换成了 ls -a  所以-l就不是命令了。

测试ENTRYPOINT

#查找dockerfile文件位置
[root@mysite-fengchao /]# find / -name dockerfile
#创建一个dockerfile文件
[root@mysite-fengchao dockerfile]# vim dockerfile-entrypoint-test

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


[root@mysite-fengchao dockerfile]# docker run fb0e352c5f9e -l
total 56
drwxr-xr-x  1 root root 4096 Feb  3 03:05 .
drwxr-xr-x  1 root root 4096 Feb  3 03:05 ..
-rwxr-xr-x  1 root root    0 Feb  3 03:05 .dockerenv
lrwxrwxrwx  1 root root    7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x  5 root root  340 Feb  3 03:05 dev
drwxr-xr-x  1 root root 4096 Feb  3 03:05 etc
drwxr-xr-x  2 root root 4096 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 4096 Dec  4 17:37 lost+found
drwxr-xr-x  2 root root 4096 Nov  3 15:22 media
drwxr-xr-x  2 root root 4096 Nov  3 15:22 mnt
drwxr-xr-x  2 root root 4096 Nov  3 15:22 opt
dr-xr-xr-x 89 root root    0 Feb  3 03:05 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 4096 Nov  3 15:22 srv
dr-xr-xr-x 13 root root    0 Feb  3 02:35 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
#entrypoint可以追加命令,所以 -l 和 ls -a 都可以使用。

实战:Tomcat镜像

1、准备好镜像,tomcat压缩包,jdk压缩包

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

2、编写DockerFile文件,官方命令 DockerFile build的时候会自动找这个文件 就不用-f指定了。

#编写DockerFile文件
FROM centos
MAINTAINER fengchao<99999@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u271-linux-x64.rpm /usr/local/
ADD apache-tomcat-9.0.41.tar.gz /usr/local/
 
RUN yum -y install vim
 
ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSR 8080
  
CMD /usr/local/apache-tomcat-9.0.41/startup.sh && tail -F /url/local//usr/local/apache-tomcat-9.0.41/bin/logs/catalina.out
#构建镜像
docker build -f DockerFile -t diytomcat .

#启动diy的镜像
docker run -it -p 9090:8080 --name fctomcat2 -v /home/fengchao/build/tomcat/test:/usr/local/apache-tomcat-9.0.41/webapps/test -v /home/fengchao/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.41/logs diytomcat /bin/bash

#查看宿主机目录是否挂载成功
[root@mysite-fengchao tomcat]# ls
test  tomcatlogs
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
         id="WebApp_ID" version="3.0">
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello fenchao</title>
</head>
<body>
<%
    System.out.println("----------my test web logs")
    %>
</body> 
</html> 

Docker网络

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

理解网络

清空所有环境

查看本地IP

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

docker是如何控制网络访问的?

docker run -d -P --name tomcat01 tomcat


#查看容器的内部网络地址 ip addr  容器启动的时候会得到一个 eth0@if15  ip地址,是docker分配的。
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
14: eth0@if15: <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


#尝试 从主机内能否ping通,tomcat容器。答案是可以的。
[root@mysite-fengchao ~]# 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.086 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.061 ms

原理

  1. 我们每启动一个docker容器,docker就会给docker容器,分配一个ip
  2. 只要电脑上安装了docker,就会有一个网卡docker0,桥接模式。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9LyJrFwG-1618477225735)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210204114026397.png)]
  • 我们发现这个容器带来的网卡,都是一对 一对的。

  • evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一端彼此相连。

  • 正因为有这个特性,evth-pair 可以充当桥梁,连接各种虚拟网络设备。

测试下 两个容器是否可以ping通?

容器和容器之间是可以ping通的。

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

结论:

  • tomcat01和tomcat02公用的是同一个路由器。docker0
  • 所有的容器不指定网络的情况下,都是默认使用docker0路由的。

Docker使用的 是Linux的桥接,宿主机中是一个docker的桥接

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

Docker中的所有网络接口都是虚拟的,虚拟的转发效率高。(内网传递文件)

只要容器删除,对应的网桥,就没了。

应用场景

编写了一个微服务,项目不重启,数据库ip换掉了,之前通过ip访问就失效了,希望可以通过名字来访问。

–Link

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

#目前直接通过名字是ping不通的。怎么去解决这个问题呢???

#  可以通过 --link 命令  来让 tomcat02和tomcat03 连接上。
[root@mysite-fengchao ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat

#这样tomcat02和tomcat03通过名字ping通了。
[root@mysite-fengchao ~]# 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.134 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.075 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.104 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.078 ms

#正向的连接可以ping通,反向的则不行。
[root@mysite-fengchao ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

为什么正向可以,反向不行呢?

#查看 hosts配置。

[root@mysite-fengchao ~]# 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
#这个显示了,tomcat容器中,直接把tomcat02的ip绑定了。
172.17.0.3	tomcat02 a21677e9250d
172.17.0.4	36fe5e554afd

#而tomcat02中则没有tomcat03的ip。
[root@mysite-fengchao ~]# 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	a21677e9250d

本质探究:–link 是在hosts配置文件中,加上了其他容器的ip地址。

真实开发中已经不建议使用–link了。

需要自定义网络。

docker0的问题:

  1. 不支持容器名访问。

自定义网络

查看本机docker网络

[root@mysite-fengchao ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
5f7b4583f4f6   bridge    bridge    local
1f89e4be960a   host      host      local
fdd157e86781   none      null      local

bridge : 桥接,docker

none : 不配置网络

host : 主机模式,和宿主机共享网络。

container: 容器互联,用的少,局限性很大。

#启动一个容器,默认自带,--net bridge tomcat   启动起来就是 dicker0。
docker run -d -P --name tomcat01 --net bridge tomcat

#docekr0的特点,默认的,域名不能相互连接, --link可以打通。

#自定义网络
--driver bridge            #桥接模式   默认的
--subnet 192.168.0.0/16	   #子网
--gateway 192.168.0.1		#网关
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynetwork

[root@mysite-fengchao ~]# docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
5f7b4583f4f6   bridge      bridge    local
1f89e4be960a   host        host      local
40b565886850   mynetwork   bridge    local
fdd157e86781   none        null      local

#查看我们自己网络的信息
[root@mysite-fengchao ~]# docker inspect mynetwork
[
    {
        "Name": "mynetwork",
        "Id": "40b5658868503e042e0cddaa16002f3fa5691664deb867cbf36227a9242a9ba1",
        "Created": "2021-02-04T15:18:06.743467888+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@mysite-fengchao ~]# docker run -d -P --name tomcat-mynet --network mynetwork tomcat
6bb68eb3a614999f59e3cf41e216de4fc65db3d63520ed82dec6367801c54404

#查看网络的配置信息。
[root@mysite-fengchao ~]# docker network inspect mynetwork
[
    {
        "Name": "mynetwork",
        "Id": "40b5658868503e042e0cddaa16002f3fa5691664deb867cbf36227a9242a9ba1",
        "Created": "2021-02-04T15:18:06.743467888+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": {
            "6bb68eb3a614999f59e3cf41e216de4fc65db3d63520ed82dec6367801c54404": {
                "Name": "tomcat-mynet",
                "EndpointID": "3118289a8496a7182712d274ddb764a568bbbac56bb33ce1d9463d72834f254e",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "8c63fcf4a0565c314cb1067dc6ed8a7f76d7e5892e01ed8be364a76e1d75c4af": {
                "Name": "tomcat-mynet01",
                "EndpointID": "777b08129ddd5feac823d1790651ad34c908c25f01ee403331031140d267d5c1",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
# 再来测试,两个容器是否能ping通?
[root@mysite-fengchao ~]# docker exec 8c63fcf4a056 ping tomcat-mynet
PING tomcat-mynet (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-mynet.mynetwork (192.168.0.2): icmp_seq=1 ttl=64 time=0.095 ms
64 bytes from tomcat-mynet.mynetwork (192.168.0.2): icmp_seq=2 ttl=64 time=0.123 ms
64 bytes from tomcat-mynet.mynetwork (192.168.0.2): icmp_seq=3 ttl=64 time=0.126 ms
64 bytes from tomcat-mynet.mynetwork (192.168.0.2): icmp_seq=4 ttl=64 time=0.095 ms

结论:

我们自定义的网络,都已经维护好了对应的关系,推荐平时我们自定义实现网络。

好处:

  • redis----不同的集群使用不同的网络。保证集群是健康和安全的
  • mysql----不同的集群使用不同的网络。保证集群是健康和安全的

网络联通

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

把一个容器与一个网络联通。

# docker network connect 容器 网络  先容器后网络,顺序不能错。
root@mysite-fengchao ~]# docker network connect tomcat01 mynetwork
Error response from daemon: No such container: mynetwork
[root@mysite-fengchao ~]# docker network connect mynetwork tomcat01
[root@mysite-fengchao ~]# docker network connect tomcat01 mynetwork
Error response from daemon: No such container: mynetwork
[root@mysite-fengchao ~]# 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.mynetwork (192.168.0.2): icmp_seq=1 ttl=64 time=0.088 ms
64 bytes from tomcat-net-01.mynetwork (192.168.0.2): icmp_seq=2 ttl=64 time=0.083 ms
64 bytes from tomcat-net-01.mynetwork (192.168.0.2): icmp_seq=3 ttl=64 time=0.085 ms

然后再执行 ‘docker network inspect mynetwork’ 会发现,直接把tomcat01容器的网段加在了 我们自己定义里面。

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

实战:Redis集群部署

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

shell脚本

#创建网卡
docker network create redis --subnet 172.38.0.0/16

#通过脚本创建六个redis配置
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.167.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done


#启动
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 redisnet --ip 192.167.0.11 redis:5.0.5 redis.server /etc/redis/redis.conf

docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redisnet --ip 192.167.0.12 redis redis.server /etc/redis/redis.conf

docker run -p 6373:6379 -it -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redisnet --ip 192.167.0.13 redis redis.server /etc/redis/redis.conf

docker run -p 6374:6379 -it -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redisnet --ip 192.167.0.14 redis redis.server /etc/redis/redis.conf

这里写自定义目录标题

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值