• Docker使用


    Docker笔记

    Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socker从客户端访问!Docker Server接收到Docker-Client的指令,就会执行这个指令!

    启动一个容器,Docker的运行流程如下图:

    安装和配置环境

    查看是否安装

    docker version

    首先卸载旧Docker

    yum remove docker 
                      docker-client 
                      docker-client-latest 
                      docker-common 
                      docker-latest 
                      docker-latest-logrotate 
                      docker-logrotate 
                      docker-engine
    #安装运行所要的环境  
    yum install -y yum-utils
    
    # 设置阿里云的Docker镜像仓库
    yum-config-manager 
        --add-repo 
        https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    #更新yum包索引
    yum makecache fast
    
    #安装docker  docker-ce 是社区版,docker-ee 企业版
    yum install docker-ce docker-ce-cli containerd.io
    
    #启动
    systemctl start docker
    # 查看当前版本号,是否启动成功
    docker version
    # 设置开机自启动
    systemctl enable docker
    #---------------------------------------------------------------------------------------
    # 卸载是使用 1. 卸载依赖
    yum remove docker-ce docker-ce-cli containerd.io
    # 2. 删除资源  . /var/lib/docker是docker的默认工作路径
    rm -rf /var/lib/docker
    

    配置阿里云加速镜像

    去阿里云控制台申请你自己的加速地址

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

    Docker的镜像运行流程

    命令

    镜像命令

    查看容器中所有的镜像

    docker images
    
    docker version          		#查看docker的版本信息
    docker info             		#查看docker的系统信息,包括镜像和容器的数量
    docker 命令 --help       		   #帮助命令(可查看可选的参数)
    docker COMMAND --help
    
    

    实例:

    [root@iZuf67yyeeujf4lnsuggp8Z docker]# docker images
    REPOSITORY   TAG       IMAGE ID   CREATED        SIZE
    镜像的仓库源   镜像的标签  镜像的id    镜像的创建时间   镜像的大小
    

    搜索镜像

    docker search mysql

    [root@iZuf67yyeeujf4lnsuggp8Z docker]# docker search mysql
    NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    mysql                             MySQL is a widely used, open-source relation…   11473     [OK]       
    mariadb                           MariaDB Server is a high performing open sou…   4356      [OK]       
    mysql/mysql-server                Optimized MySQL Server Docker images. Create…   848                  [OK]
    percona                           Percona Server is a fork of the MySQL relati…   557       [OK]       
    phpmyadmin                        phpMyAdmin - A web interface for MySQL and M…   332       [OK]       
    centos/mysql-57-centos7           MySQL 5.7 SQL database server                   91     
    mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   88     
    centos/mysql-80-centos7           MySQL 8.0 SQL database server          
    

    下载镜像

    docker pull mysql:版本号

    如果不加版本号,默认下载最新版本的镜像

    docker search mysql --filter=STARS=3000   # 容器搜索,并进行字段过滤,例如过滤STARS大于3000的数据
    
    #----------------------------------------------------------------------------------------
    
    [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql
    Using default tag: latest            #如果不指定版本号默认就是latest
    latest: Pulling from library/mysql
    6ec7b7d162b2: Pull complete          #分层下载,docker image的核心-联合文件系统
    fedd960d3481: Pull complete
    7ab947313861: Pull complete
    64f92f19e638: Pull complete
    3e80b17bff96: Pull complete
    014e976799f9: Pull complete
    59ae84fee1b3: Pull complete
    ffe10de703ea: Pull complete
    657af6d90c83: Pull complete
    98bfb480322c: Pull complete
    6aa3859c4789: Pull complete
    1ed875d851ef: Pull complete
    Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名
    Status: Downloaded newer image for mysql:latest
    docker.io/library/mysql:latest  #下载来源的真实地址  #docker pull mysql等价于docker pull docker.io/library/mysql:latest
    
    

    删除镜像

    docker rmi -f 镜像id

    #1.删除指定的镜像id
    [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  镜像id
    #2.删除多个镜像id
    [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  镜像id 镜像id 镜像id
    #3.删除全部的镜像id    docker images -aq这个命令是查看所有已经存在的镜像
    [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f  $(docker images -aq)
    

    容器命令

    启动容器

    docker run [可选择参数] image

    #参数说明
    --name="名字"           指定容器名字
    -d                     后台方式运行,注意如果
    -it                    使用交互方式运行,进入容器查看内容
    -p                     指定容器的端口
    (
    -p ip:主机端口:容器端口  配置主机端口映射到容器端口
    -p 主机端口:容器端口
    -p 容器端口
    )
    -P                     随机指定端口(大写的P)
    
    #例如:在docker中启动一个centOS镜像并进入使用终端
    [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it centos /bin/bash
    [root@bd1b8900c547 /]# ls      
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    
    #exit 停止并退出容器(后台方式运行则仅退出)
    #Ctrl+P+Q  不停止容器退出
    [root@bd1b8900c547 /]# exit
    exit
    [root@iZwz99sm8v95sckz8bd2c4Z ~]#
    

    查看启动中的容器

    docker ps

    注意:常见的坑:docker容器使用后台运行时,就必须要有一个前台进程,docker发现没有应用在使用时就会自动停止

    nginx容器启动后发现没有提供服务就会立刻停止,就是因为nginx中没有进程运行

    #docker ps 
         # 列出当前正在运行的容器
    -a   # 列出所有容器的运行记录
    -n=? # 显示最近创建的n个容器
    -q   # 只显示容器的编号
    
    [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    [root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps -a		#查看最近启动过的容器
    CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
    bca129320bb5   centos         "/bin/bash"   4 minutes ago   Exited (0) 3 minutes ago             optimistic_shtern
    bd1b8900c547   centos         "/bin/bash"   6 minutes ago   Exited (0) 5 minutes ago             cool_tesla
    cf6adbf1b506   bf756fb1ae65   "/hello"      5 hours ago     Exited (0) 5 hours ago               optimistic_darwin
    

    删除容器

    docker rm 容器的ID

    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           #强制停止当前容器
    

    常用命令

    查看docker日志

    docker logs -tf 容器的ID

    #参数说明
    -f  #跟踪日志输出
    -n  #从日志末尾显示的行数(默认为“all”)
    -t [数量]  #显示最新数量的日志
    
    #实例:
    #我们现在先启动一个centos容器,并编写sh脚本每隔5秒在控制台输出,为什么一直输出请查看启动容器的注意实现
    [root@iZuf67yyeeujf4lnsuggp8Z docker]# docker run -d centos /bin/bash -c "while true;do echo new docker;sleep 5;done"
    1b1fddb565f0515df8a15a306aaa779596b209b63593a2225f907ad3aab8ae42
    
    [root@iZuf67yyeeujf4lnsuggp8Z docker]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
    1b1fddb565f0   centos    "/bin/bash -c 'while…"   3 seconds ago   Up 3 seconds             laughing_brown
    [root@iZuf67yyeeujf4lnsuggp8Z docker]# docker logs -f 1b1fddb565f0
    new docker
    new docker
    new docker
    new docker
    new docker
    new docker
    
    
    

    查看所有docker运行中的进程

    docker top 容器的ID

    [root@iZuf67yyeeujf4lnsuggp8Z docker]# docker ps
    CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
    279416f5f6c4   centos    "/bin/bash"   About a minute ago   Up About a minute             blissful_keldysh
    [root@iZuf67yyeeujf4lnsuggp8Z docker]# docker top 279416f5f6c4
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                16992               16973               0                   16:16               pts/0               00:00:00            /bin/bash
    
    

    查看容器的原启动数据

    docker inspect 容器的ID

    这个命令可以查看当前容器启动时的一下详情信息,例如容器ID,容器启动的类型(这个容器数据什么镜像)等

    进入当前正在运行的容器

    方式一:docker exec -it 容器的ID /bin/bash

    # 进入容器后开启一个新的终端,可以在里面操作
    [root@iZuf67yyeeujf4lnsuggp8Z docker]# docker exec -it 279416f5f6c4 /bin/bash
    [root@279416f5f6c4 /]# ls
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    
    

    方式二:docker attach 容器ID

    # 进入容器正在执行的终端,不会启动新的进程,如果当前控制台在输出数据将会显示输出的数据
    [root@iZuf67yyeeujf4lnsuggp8Z docker]# docker attach 279416f5f6c4
    [root@279416f5f6c4 /]# 
    

    退出容器但是继续运行容器:Ctrl+p+q

    将docker中的文件拷贝到主机

    docker cp 容器ID:容器中文件的路径 主机的文件路径

    #进入容器
    [root@iZuf67yyeeujf4lnsuggp8Z docker]# docker attach 279416f5f6c4
    #进入容器创建文件
    [root@279416f5f6c4 /]# ls     
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@279416f5f6c4 /]# cd var/
    [root@279416f5f6c4 var]# vi new.txt
    [root@279416f5f6c4 var]# exit
    exit
    #可以直接退出,退出后容器因为没有运行进程会关闭,但是只要容器还在数据就在,可以直接拷贝文件到主机
    [root@iZuf67yyeeujf4lnsuggp8Z docker]# docker ps -a
    CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                     PORTS     NAMES
    279416f5f6c4   centos    "/bin/bash"   12 minutes ago   Exited (0) 6 seconds ago             blissful_keldysh
    [root@iZuf67yyeeujf4lnsuggp8Z docker]# docker cp 279416f5f6c4:/var/new.txt /home/
    [root@iZuf67yyeeujf4lnsuggp8Z docker]# cd /home/
    [root@iZuf67yyeeujf4lnsuggp8Z home]# ls
    new.txt
    [root@iZuf67yyeeujf4lnsuggp8Z home]# cat new.txt 
    11111111111111111111111111111111111111111111111
    
    

    应用部署

    nginx

    #下载nginx
    [root@iZuf67yyeeujf4lnsuggp8Z /]# docker pull nginx
    Using default tag: latest
    latest: Pulling from library/nginx
    a330b6cecb98: Already exists 
    e0ad2c0621bc: Pull complete 
    9e56c3e0e6b7: Pull complete 
    09f31c94adc6: Pull complete 
    32b26e9cdb83: Pull complete 
    20ab512bbb07: Pull complete 
    Digest: sha256:1311187059bc3e9f16c0700b054a787743f63a4cb62815d2164f653e517bcaa2
    Status: Downloaded newer image for nginx:latest
    docker.io/library/nginx:latest
    [root@iZuf67yyeeujf4lnsuggp8Z /]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    centos       latest    5d0da3dc9764   12 days ago   231MB
    nginx        latest    ad4c705f24d3   2 weeks ago   133MB
    mysql        latest    0716d6ebcc1a   3 weeks ago   514MB
    #启动nginx,并把docker中nginx端口映射到主机的3344端口,可以访问主句的3344端口进行访问nginx
    [root@iZuf67yyeeujf4lnsuggp8Z /]# docker run -d --name nginx01 -p 3344:80 nginx
    f68678a3c7efb83baa6b3087c5f4946bf43ce67fe4de7d98d8f6f9ad8add8f72
    [root@iZuf67yyeeujf4lnsuggp8Z /]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
    f68678a3c7ef   nginx     "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
    #进行访问
    [root@iZuf67yyeeujf4lnsuggp8Z /]# curl 127.0.0.1:3344
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body {  35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    
    

    elasticsearch

    #因为elasticsearch运行内存过大,所以在启动的时候需要限制JVM的内存
    # -e 修改环境变脸
    #elasticsearch自带有个环境变量是ES_JAVA_OPTS,在里面修改对应JVM参数
    [root@iZuf67yyeeujf4lnsuggp8Z /]# docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx512m" elasticsearch
    05de17ecf3dafec4b20c92f0c0c5a6c65bf854e4d1cfda7dbeaeb144820c9b2e
    [root@iZuf67yyeeujf4lnsuggp8Z /]# docker ps
    CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS                                                                                  NAMES
    05de17ecf3da   elasticsearch   "/docker-entrypoint.…"   6 seconds ago    Up 6 seconds    0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp   elasticsearch01
    f68678a3c7ef   nginx           "/docker-entrypoint.…"   37 minutes ago   Up 37 minutes   0.0.0.0:3344->80/tcp, :::3344->80/tcp                                                  nginx01
    
    

    mysql

    #启动命令 因为如果容器进行了删除,那么在容器中的数据就会被删除,所以使用数据持久化将数据放到实体机中存放
    # -d	后台运行
    # -v	卷挂载(数据持久化)
    # -p	指定实体机端口映射
    # -e	环境配置(此时配置数据库的密码)
    # --name	指定容器的名字
    [root@iZuf67yyeeujf4lnsuggp8Z ~]# 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 mysql03 mysql
    f0f879b1a0102648752873ebcb1412930b13128c14cb40a642589d58a29d73e7
    [root@iZuf67yyeeujf4lnsuggp8Z ~]# docker ps -a
    CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS                     PORTS                                                  NAMES
    f0f879b1a010   mysql           "docker-entrypoint.s…"   5 seconds ago   Up 4 seconds               0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql03
    e68c555396ea   tomcat          "catalina.sh run"        5 hours ago     Up 4 hours                 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              tocmat01
    05de17ecf3da   elasticsearch   "/docker-entrypoint.…"   8 days ago      Exited (137) 5 hours ago                                                          elasticsearch01
    f68678a3c7ef   nginx           "/docker-entrypoint.…"   8 days ago      Up 8 days                  0.0.0.0:3344->80/tcp, :::3344->80/tcp                  nginx01
    279416f5f6c4   centos          "/bin/bash"              8 days ago      Exited (0) 8 days ago                                                             blissful_keldysh
    [root@iZuf67yyeeujf4lnsuggp8Z ~]# cd /home/
    # 容器的数据被映射到实体机的mysql文件夹中
    [root@iZuf67yyeeujf4lnsuggp8Z home]# ls
    mysql  new.txt
    

    数据卷

    具名&匿名挂载数据

    docker volume ls 查看docker的所有使用卷情况

    [root@iZuf67yyeeujf4lnsuggp8Z _data]# docker volume ls
    #这些都是docker中挂载在实体机中的所有卷
    DRIVER    VOLUME NAME
    local     6f7e2d7b26ea531931cc810981096243fd67552d65876e6100fec25572d98408
    local     43cf97e83c3be606f045e4a2ad79dddb92573a05e1dcfcbfeca1abf6e16d3783
    local     815f02cffc8fa0f1b61f067fa98d735639b3e30e42d49d82e2b285eb7b965325
    local     dd357634fbe791e688753cf66d06f076bc44fb870fd4fadd67daffb6accee6ea
    local     e103e80d81c76ce50e50203b72c711ec4d279f4021fdd2e6b01336ebdb1133d7
    

    docker -v 宿主机路径:容器内路径 指定路径挂载

    -v 数据卷名:容器内路径 具名挂载

    -v 容器内路径 匿名指定目录挂载

    共享数据卷

    docker run -d -p --name [自定义镜像名] --volumes-from [已经存在的容器名称] [镜像名称]

    数据卷的生命周期一直持续到没有容器使用为止,如果数据持久化到本地时,本地数据不会删除

    # 先启动一个容器作为父类
    [root@iZuf67yyeeujf4lnsuggp8Z mysql]# docker run -d -p 3307:3306 --name mysql04 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
    1381b5bd5768a57ea3f4773604cbfab7574c77f617dd896c32a6c8c85ff425a7
    # 新启动一个容器,使用--volumes-from 指定它的父类进行共享父类的数据
    [root@iZuf67yyeeujf4lnsuggp8Z mysql]# docker run -d -p 3308:3306 --name mysql05 -e MYSQL_ROOT_PASSWORD=123456 --volumes-from mysql04 mysql:latest
    6d7f6552887c1aab2982814d745d4763721f882e5c7f19cf48d3ab5fbc9223b8
    

    DockerFile

    docker build -f [脚本文件] -t [镜像名称]:[自定义版本号] . (注意这个点一定要有)

    dockerFile用来构建docker镜像的构建文件

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

    #DockerFile 文件内容:
    #FROM centos
    
    #VOLUME ["volum01","voulum02"]
    
    #CMD echo "---end---"
    
    #CMD /bin/bash
    
    # build 编译创建对应的镜像  DockerFile 中编写要执行的脚本
    [root@iZuf67yyeeujf4lnsuggp8Z docker-file]# docker build -f /home/docker-file/DockerFile -t zyy/centos:1.0 .
    Sending build context to Docker daemon  2.048kB
    Step 1/4 : FROM centos
     ---> 5d0da3dc9764
    Step 2/4 : VOLUME ["volum01","voulum02"]
     ---> Running in 5bc63e3b33f6
    Removing intermediate container 5bc63e3b33f6
     ---> ef7703caa64e
    Step 3/4 : CMD echo "---end---"
     ---> Running in d0df9a64d055
    Removing intermediate container d0df9a64d055
     ---> 1e6f05005845
    Step 4/4 : CMD /bin/bash
     ---> Running in cde027b53fa4
    Removing intermediate container cde027b53fa4
     ---> 782d85a6d6d1
    Successfully built 782d85a6d6d1
    Successfully tagged zyy/centos:1.0
    # zyy/centos 是自定义创建的镜像
    [root@iZuf67yyeeujf4lnsuggp8Z docker-file]# docker images
    REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
    zyy/centos      1.0       782d85a6d6d1   6 seconds ago   231MB
    tomcat01        1.0       c846f5be14e6   5 days ago      684MB
    tomcat          latest    c662ee449a7e   12 days ago     680MB
    centos          latest    5d0da3dc9764   3 weeks ago     231MB
    nginx           latest    ad4c705f24d3   4 weeks ago     133MB
    mysql           latest    0716d6ebcc1a   5 weeks ago     514MB
    elasticsearch   latest    5acf0e8da90b   3 years ago     486MB
    #启动对应的容器,命令行启动以后可以看到volume01和voulume02,这两个被匿名挂载在实体机的对应文件下
    [root@iZuf67yyeeujf4lnsuggp8Z docker-file]# docker run -it 782d85a6d6d1 /bin/bash
    [root@76d06b9a0096 /]# ls
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volum01  voulum02
    

    指令

    FROM					#基础镜像,一切从这里开始构建
    MAINTAINER					#镜像是谁写的,姓名+邮箱
    RUN						#镜像构建的时候需要运行的命令
    ADD						#和COPY功能相似,但是会解压文件
    WORKDIR					#镜像的工作目录
    VOLUME					#挂载的目录
    EXPOSE 					#暴露端口配置
    CMD						#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
    ENTRYPOINT				#指定这个容器启动的时候要运行的命令,可以追加命令
    ONBUILD					#当构建一个被继承的DockerFIle 这个时候就会运行 ONBUILD指令,触发指令
    COPY					#类型ADD,将我们的文件拷贝到镜像中
    ENV						#构建的时候设置环境变量(只是当前脚本程序的变量)
    
    #创建dockerfile脚本文件,内容
    FROM centos			#使用什么基础镜像
    
    MAINTAINER zyy<wyzyy163mail@163.com>		#镜像作者信息
    	
    ENV VARIABLE /usr/local				#创建一个环境变量,相当于Java程序的变量
    
    WORKDIR $VARIABLE					#使用环境变量,WORKDIR指定进入容器以后的工作目录
    
    CMD "----start----"				#CMD执行命令  此时输出
    
    RUN yum -y install vim			#执行命令  下载vim
    RUN yum -y install net-tools	#执行命令  下载net-tools
    
    EXPOSE 80						#指定对外暴露的端口
    
    CMD "-----end------"			#输出
    CMD /bin/bash					#使用的命令行
    
    
    [root@iZuf67yyeeujf4lnsuggp8Z docker-file]# docker build -f mydockerFile -t zyycentos01 .
    #-----等待-----
    [root@iZuf67yyeeujf4lnsuggp8Z docker-file]# docker images
    REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
    zyycentos01     latest    f01eb19de938   12 seconds ago   336MB		#刚刚创建的
    zyy/centos      1.0       782d85a6d6d1   3 hours ago      231MB
    tomcat01        1.0       c846f5be14e6   6 days ago       684MB
    tomcat          latest    c662ee449a7e   12 days ago      680MB
    centos          latest    5d0da3dc9764   3 weeks ago      231MB
    nginx           latest    ad4c705f24d3   4 weeks ago      133MB
    mysql           latest    0716d6ebcc1a   5 weeks ago      514MB
    elasticsearch   latest    5acf0e8da90b   3 years ago      486MB
    #运行
    [root@iZuf67yyeeujf4lnsuggp8Z docker-file]# docker run -it zyycentos01
    #可以看到我们进入容器的默认工作目录是 /usr/local
    [root@bc0281fa62a1 local]# pwd
    /usr/local
    #可以看到已经有了网络命令(脚本中下载的net-toole)
    [root@bc0281fa62a1 local]# ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.0.6  netmask 255.255.0.0  broadcast 172.17.255.255
            ether 02:42:ac:11:00:06  txqueuelen 0  (Ethernet)
            RX packets 8  bytes 656 (656.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    

    docker网络

    docker network ls 查看docker下所有的网络情况

    docker network inspect [网络的ID] 查看对应网络的配置

    查看网络

    docker中所有的网络都是虚拟的,只要容器删除对应的网络桥接一对就没了

    docker中使用的都是桥接模式,使用的是evth-pair技术

    [root@iZuf67yyeeujf4lnsuggp8Z home]# 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
        inet6 ::1/128 scope host 
           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:29:c2:df brd ff:ff:ff:ff:ff:ff
        inet 172.19.145.20/20 brd 172.19.159.255 scope global dynamic eth0
           valid_lft 313874776sec preferred_lft 313874776sec
        inet6 fe80::216:3eff:fe29:c2df/64 scope link 
           valid_lft forever preferred_lft forever
    #这里就是docker的网络
    3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 02:42:59:d1:6e:c9 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
        inet6 fe80::42:59ff:fed1:6ec9/64 scope link 
           valid_lft forever preferred_lft forever
    #这里是容器使用的网络,docker每启动一个容器都会分配一个网络地址
    23: veth76bafde@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
        link/ether c2:10:6a:dc:92:25 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet6 fe80::c010:6aff:fedc:9225/64 scope link 
           valid_lft forever preferred_lft forever
    35: veth0056592@if34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
        link/ether ce:5a:91:e3:47:7f brd ff:ff:ff:ff:ff:ff link-netnsid 1
        inet6 fe80::cc5a:91ff:fee3:477f/64 scope link 
           valid_lft forever preferred_lft forever
    37: veth71c02ee@if36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
        link/ether 22:df:90:13:d2:18 brd ff:ff:ff:ff:ff:ff link-netnsid 2
        inet6 fe80::20df:90ff:fe13:d218/64 scope link 
           valid_lft forever preferred_lft forever
    41: vethffb825c@if40: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
        link/ether 5a:fd:83:0f:6c:43 brd ff:ff:ff:ff:ff:ff link-netnsid 3
        inet6 fe80::58fd:83ff:fe0f:6c43/64 scope link 
           valid_lft forever preferred_lft forever
    #我们发现这个容器带来的网卡都是一对的
    #evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一个连着协议,一个彼此相连
    #evth-pair充当一个桥梁,连接着各种虚拟网络设备,我们的wifi使用的就是这种技术
    

    如果我们有一个tomcat02和tomcat03,他们使用的都是同一个路由网关,就是上面代码的docker0

    所有的容器不指定网路的情况下都是使用的docker0的路由,docker会给我们分配一个默认的可用ip

    --link命令

    docker容器中的每个容器可以ping同实体机,但是不能互相ping通,可以使用--link命令打通

    docker run -d -P --name centos02--link [要连接的容器名字或者ID] centos

    #我们先创建一个centos01,然后让centos02打通01的网络,
    [root@iZuf67yyeeujf4lnsuggp8Z home]# docker run -d -P --name centos02 --link centos01 centos
    b8b70984086ba7378ebc121609112f159e10483723d45ed9b244c076e82c5b17
    #此时可以看到centos02可以ping到centos01的网络
    [root@iZuf67yyeeujf4lnsuggp8Z home]# docker exec -it centos02 ping centos01
    PING centos01 (172.17.0.2) 56(84) bytes of data.
    64 bytes from centos01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.079 ms
    64 bytes from centos01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.054 ms
    #但是centos01不能ping通centos02的网络
    [root@iZuf67yyeeujf4lnsuggp8Z home]# docker exec -it centos01 ping centos02
    ping: centos02: Name or service not known
    #原因:在hosts文件中我们可以正常的手动代理某个域名到对应的IP中 
    #     刚才--link中就在centos02中配置了对应数据,但是centos01中并没有配置
    [root@iZuf67yyeeujf4lnsuggp8Z home]# docker exec -it centos02 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	centos01 3596532c96eb			#这里的配置
    172.17.0.3	0d8f86b398b7
    
    

    自定义网络

    [root@iZuf67yyeeujf4lnsuggp8Z home]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    4e461c467a25   bridge    bridge    local
    139f104f4502   host      host      local
    fe899a97a590   none      null      local
    #网络模式
    #	bridge:桥接模式 (docker默认)
    
    #	none:不配置网络
    
    #	host:和宿主机共享网络
    
    #	containe:容器网络连接
    

    使用自定义网络可以补充--link中的缺点

    docker network create -d [网络模式] --subnet [设置子网的数据] --gateway [设置网关地址] [自定义网络名]

    #--subnet		设置子网的数量 192.168.0.0/16 = 255*255   192.168.0.0/24 = 255
    #--gateway		网关地址
    [root@iZuf67yyeeujf4lnsuggp8Z home]# docker network create -d bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
    364ea9c24df9f8a1b1dde0bb9832242a3546fbb98ece03b347301cf458b47d80
    [root@iZuf67yyeeujf4lnsuggp8Z home]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    4e461c467a25   bridge    bridge    local
    139f104f4502   host      host      local
    364ea9c24df9   mynet     bridge    local			#这个就是我们自定义的网络
    fe899a97a590   none      null      local
    #我们在mynet网络路由下创建两个centos然后互相ping,就可以ping通了
    [root@iZuf67yyeeujf4lnsuggp8Z home]# docker exec -it centos04 ping centos04
    PING centos04 (192.168.0.3) 56(84) bytes of data.
    64 bytes from 1bb9617f0d3f (192.168.0.3): icmp_seq=1 ttl=64 time=0.026 ms
    64 bytes from 1bb9617f0d3f (192.168.0.3): icmp_seq=2 ttl=64 time=0.044 ms
    

    优点:

    • 使用这种网路时,可以不用使用 --link 就可以互通

    • 这种网络可以通过设置subnet 的值进行网络隔离,例如redis集群保证网络是安全的

      但是这是两个网关路由下隔离

    connect路由互联

    docker network connect [网络路由名称] [要打通的另一个路由中的容器ID]

    #我们看到没有打通之前的
    [root@iZuf67yyeeujf4lnsuggp8Z home]# docker exec -it centos04 ping centos02
    ping: centos02: Name or service not known
    #开始打通
    [root@iZuf67yyeeujf4lnsuggp8Z home]# docker network connect mynet centos02
    #打通以后在测试ping就可以了
    [root@iZuf67yyeeujf4lnsuggp8Z home]# docker exec -it centos04 ping centos02
    PING centos02 (192.168.0.4) 56(84) bytes of data.
    64 bytes from centos02.mynet (192.168.0.4): icmp_seq=1 ttl=64 time=0.065 ms
    64 bytes from centos02.mynet (192.168.0.4): icmp_seq=2 ttl=64 time=0.067 ms
    64 bytes from centos02.mynet (192.168.0.4): icmp_seq=3 ttl=64 time=0.074 ms
    
  • 相关阅读:
    mysql表结构转hive表结构,字段映射脚本
    kafka 相关命令 偏移重置
    Specified key was too long; max key length is 767 bytes
    java IO 流关系图谱
    jvm 性能监控与linux常用命令
    jupiter的@TempDir 等不生效
    mysql 深度分页
    jedis的ShardedJedisPool链接池的扩容问题
    拜读《三国》看懂男人
    linux 性能优化
  • 原文地址:https://www.cnblogs.com/baroque/p/15440967.html
Copyright © 2020-2023  润新知