zoukankan      html  css  js  c++  java
  • [心得]docker学习笔记

    1. docker是什么???

    (1) docker是一台类似虚拟机的功能, 内部由一个个镜像组成, 镜像里可以运行容器, 而这个容器可以是任何东西, 比如mysql, 比如tomcat等等, 它的目的是将任何东西抽象出来, 放入镜像的容器中运行, 它不管你到底做了啥, 它只管把你装进容器中, 运行
    (2) docker是一个cs架构
    (3) 客户端docker自己构建容器, 通过网络连接到远程的docker的守护进程或者连接到本地的docker守护进行
    (4) docker存在一个注册中心 Register, 这个注册中心存在共有和私有的方法, 用户可以将自己创建的镜像(容器)上传到注册中心, 这样别人也可以使用该用户的注册环境


    2. 为什么使用docker? (docker有什么优点)

    docker的优点有四个:
        1)  上手快
    用户只需要几分钟,就可以把自己的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改”的境界。
        2) 职责和逻辑分类
    不用关系开发者环境和测试环境还有线上环境不同而出现bug的原因
        3) 快速高效的开发声明周期
    使用docker的话, 它是跨平台的, 只要在一个平台做好, 其他平台都可以一键使用, 做到项目的 开发, 测试, 上线 都是一个配置
        4) 鼓励使用面向服务的架构
    docker鼓励使用者在一个容器中开启一个微服务

    3. 怎么用docker?

    (0) 启动docker

    systemctl start docker

    (1) 镜像的增删改查

    1) 查看已经安装的docker镜像

    [root@bogon docker]# docker images
    REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
    mysql                     latest              d435eee2caa5        16 hours ago        456MB
    gogs/gogs                 latest              521c911bafda        15 months ago       94.2MB
    grafana/grafana           latest              17a5ba3b1216        15 months ago       245MB
    centos/mysql-57-centos7   latest              2e4ddfafaa6f        15 months ago       445MB
    rancher/server            latest              38d4a75fa8f9        15 months ago       1.08GB
    centos                    7                   5182e96772bf        15 months ago       200MB
    redis                     latest              4e8db158f18d        15 months ago       83.4MB
    tomcat                    7-jre7              fa2c33156fb9        16 months ago       357MB
    nginx                     latest              c82521676580        16 months ago       109MB
    registry                  latest              b2b03e9146e1        16 months ago       33.3MB
    google/cadvisor           latest              75f88e3ec333        23 months ago       62.2MB
    tutum/influxdb            latest              c061e5808198        3 years ago         290MB

    • REPOSITORY:镜像名称
    • TAG:镜像标签
    • IMAGE ID:镜像ID
    • CREATED:镜像的创建日期(不是获取该镜像的日期)
    • SIZE:镜像大小
    • 这些镜像都是存储在Docker宿主机的/var/lib/docker目录下

    2) 查找网络上的docker镜像

    [root@bogon docker]# docker search centOS
    NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
    centos                             The official build of CentOS.                   5688                [OK]                
    ansible/centos7-ansible            Ansible on Centos7                              125                                     [OK]
    jdeathe/centos-ssh                 OpenSSH / Supervisor / EPEL/IUS/SCL Repos - …   114                                     [OK]
    consol/centos-xfce-vnc             Centos container with "headless" VNC session…   100                                     [OK]
    centos/mysql-57-centos7            MySQL 5.7 SQL database server                   64                                      
    imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              57                                      [OK]
    

    • NAME:仓库名称
    • DESCRIPTION:镜像描述
    • STARS:用户评价,反应一个镜像的受欢迎程度
    • OFFICIAL:是否官方
    • AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的


    3) 获得镜像

    [root@bogon docker]# docker pull indigo/centos-maven
    Using default tag: latest
    latest: Pulling from indigo/centos-maven

    4) 删除镜像

    按镜像ID删除镜像

    docker rmi 镜像ID

    删除所有镜像

    docker rmi `docker images -q`

    (2) 容器的增删改查

    查看正在运行的容器

    [root@bogon docker]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
    bb30bc08bd70        mysql               "docker-entrypoint.s…"   16 minutes ago      Up 11 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   docker_mysql
    

    查看所有创建好的容器

    [root@bogon docker]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
    bb30bc08bd70        mysql               "docker-entrypoint.s…"   19 minutes ago      Up 13 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   docker_mysql
    

    查看停止的容器

    [root@bogon docker]# docker ps -f status=exited
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    

    查看最后一次运行的容器

    [root@bogon docker]# docker ps -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
    bb30bc08bd70        mysql               "docker-entrypoint.s…"   21 minutes ago      Up 16 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   docker_mysql
    

    查看容器的ip

    我们可以通过以下命令查看容器运行的各种数据

    docker inspect 容器名称(容器ID) 
    

    也可以直接执行下面的命令直接输出IP地址

    docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)

    创建容器

    ①创建容器命令:docker run

    • -i:表示运行容器
    • -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
    • --name :为创建的容器命名。
    • -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
    • -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
    • -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

    (1)交互式方式创建容器

    docker run -it --name=容器名称 镜像名称:标签 /bin/bash
    

    这时我们通过ps命令查看,发现可以看到启动的容器,状态为启动状态

    退出当前容器

    exit
    

    (2)守护式方式创建容器:

    docker run -di --name=容器名称 镜像名称:标签

    登录守护式容器方式:

    docker exec -it 容器名称 (或者容器ID)  /bin/bash

    docker run的端口和文件映射方式

    使用端口和文件映射方式配置nginx的配置文件映射到我们主机中(也就是我们主机中的配置文件将被加载到 docker 的容器中)
    以下我们以配置nginx为例: 
    执行下面这段代码前需要首先创建
    上面这几个文件和文件夹, 有些配置可以使用 docker cp 容器名字:目录+空格+本地目录(主机目录), 例如下面: 
    docker cp nginx:/etc/nginx/nginx.conf nginx.conf
    docker cp nginx:/etc/nginx/conf.d/default.conf default.conf
    我们需要copy上面的两个文件到我们主机上(docker中的nginx容器是虚拟机, 我们的centOS是真实的主机)
    然后我们开始创建目录映射关联
    下面是完整命令
    docker run -p 8080:80 --name nginx -v /opt/nginx/static:/usr/share/nginx/html -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginx/conf.d:/etc/nginx/conf.d -v /opt/nginx/log:/var/log/nginx -v /opt/nginx/ssl:/ssl -di nginx
    做完上面的步骤之后, 我们的配置文件不需要修改了
    比如:
    上面这个目录已经被我们映射为本地目录/opt/nginx/log, 所以nginx对上面目录的所有修改都会被映射成本地目录的修改
    这也是上面完整命令为什么需要映射这么多的目录的原因了
    下面是nginx有配置文件中的目录
    下面是docker目录映射的目录, 一一对应了
    docker run -p 8080:80 --name nginx
    -v /opt/nginx/static:/usr/share/nginx/html
    -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
    -v /opt/nginx/conf.d:/etc/nginx/conf.d
    -v /opt/nginx/log:/var/log/nginx
    -v /opt/nginx/ssl:/ssl
    -di nginx

    如果我们需要类似zookeeper那样的连接到server, 一般情况我们都是直接./zkCli.sh 直接启动客户端但是如果zookeeper在docker中运行的话则需要使用
    docker exec -it zookeeper_0 zkCli.sh
    上面这句话进入方法中
    或者我们可以使用
    docker exec -it zookeeper_0
    进入到我们zookeeper容器的虚拟机中, 然后找到zookeeper的bin目录, 找到zkCli.sh进行执行

    关闭容器

    docker stop 容器名称(或者容器ID)

    启动容器

    docker start 容器名称(或者容器ID)

    删除指定的容器

    docker rm 容器名称(容器ID)

    docker查看容器启动失败日志

    docker logs 容器名称(容器ID)

    (3)应用部署

    MySQL部署

    (1)拉取mysql镜像

    docker pull centos/mysql-57-centos7

    (2)创建容器

    docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

    -p 代表端口映射,格式为  宿主机映射端口:容器运行端口

    -e 代表添加环境变量  MYSQL_ROOT_PASSWORD 是root用户的登陆密码

    (3)远程登录mysql

    连接宿主机的IP ,指定端口为33306

    tomcat部署

    (1)拉取镜像

    docker pull tomcat:7-jre7

    (2)创建容器

    创建容器  -p表示地址映射

    docker run -di --name=mytomcat -p 9000:8080 
    -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7

    Nginx部署

    (1)拉取镜像

    docker pull nginx

    (2)创建Nginx容器

    docker run -di --name=mynginx -p 80:80 nginx

    Redis部署

    (1)拉取镜像

    docker pull redis

    (2)创建容器

    docker run -di --name=myredis -p 6379:6379 redis

    (4) 迁移和备份

    1) 保存
    ①容器保存成镜像
    [root@bogon ~]# docker commit docker_mysql
    sha256:0228934f2164ee17ec6eda85f525f3628a842b0ba3ea8e85a2a3e4f440e17550
    ②镜像备份
    google/cadvisor           latest              eb1210707573        12 months ago       69.6MB
    [root@bogon ~]# docker save -o google_cadvisor.tar google/cadvisor:latest
    ③镜像的恢复
    [root@bogon ~]# docker load -i google_cadvisor.tar 
    cd7100a72410: Loading layer [==================================================>]  4.403MB/4.403MB
    9ea477e6d99e: Loading layer [==================================================>]  33.09MB/33.09MB
    66b3c2e84199: Loading layer [==================================================>]  32.88MB/32.88MB
    Loaded image: google/cadvisor:latest

    (5) Dockerfile -- 这个跟MakeFile很像

    (1) 是什么?

     一个存放参数和命令的脚本, 用于创建镜像的脚本

    (2) 为什么使用它?

    1) 为开发团队提供一个相同的环境
    2) 测试人员可以通过开发团队的dockerfile脚本完成一个完全相同的环境
    3) 运维人员在部署时, 可以实现无缝衔接

    (3) 怎么用?

    1) 常用命令

    • FROM image_name:tag     定义了使用哪个基础镜像启动构建流程
    • MAINTAINER user_name     声明镜像的创建者
    • ENV key value     设置环境变量 (可以写多条)
    • RUN command     是Dockerfile的核心部分(可以写多条)
    • ADD source_dir/file dest_dir/file     将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
    • COPY source_dir/file dest_dir/file 和ADD     相似,但是如果有压缩文件并不能解压
    • WORKDIR path_dir      设置工作目录

    2) 使用步骤

    ① 创建目录
    mkdir -p /usr/local/dockerjdk11
    ②将jdk11包上传到 /usr/local/dockerjdk11
    ③创建Dockerfile
    #依赖镜像名称和ID
    FROM centos:7
    #指定镜像创建者信息
    MAINTAINER BANGIAO
    #切换工作目录
    WORKDIR /usr
    RUN mkdir  /usr/local/java
    #ADD 是相对路径jar,把java添加到容器中
    ADD jdk-11.0.5_linux-x64_bin.tar.gz /usr/local/java/
    
    #配置java环境变量
    ENV JAVA_HOME /usr/local/java/jdk-11.0.5
    ENV JRE_HOME $JAVA_HOME/jre
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
    ENV PATH $JAVA_HOME/bin:$PATH
    ④执行创建的dockerfile
    在创建Dokerfile的目录下面使用这个命令
    docker build -t java11:11 .

    Docker私有仓库

    私有仓库搭建与配置

    (1)拉取私有仓库镜像(此步省略)

    docker pull registry

    (2)启动私有仓库容器

    docker run -di --name=registry -p 5000:5000 registry

    (3)打开浏览器 输入地址http://192.168.184.141:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空

    (4)修改daemon.json

    vi /etc/docker/daemon.json

    添加以下内容,保存退出。

    {"insecure-registries":["192.168.184.141:5000"]} 

    此步用于让 docker信任私有仓库地址

    (5)重启docker 服务

    systemctl restart docker

    镜像上传至私有仓库

    (1)标记此镜像为私有仓库的镜像

    docker tag jdk1.8 192.168.184.141:5000/jdk1.8

    (2)再次启动私服容器

    docker start registry

    (3)上传标记的镜像

    docker push 192.168.184.141:5000/jdk1.8

    (6) Docker Compose

    1) 是什么?

    用于定义和运行多个容器的应用程序的工具, 使用YML文件来配置应用程序需要的所有容器环境

    2) 使用docker compose搭建zookpeer集群

    ①安装docker compose 
    $ sudo curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    
    $ sudo chmod +x /usr/local/bin/docker-compose
    安装版本
    docker-compose -version

    或者使用 pip 安装
    ②创建docker-compose文件

    这里我就在 /opt 目录下新建了一个 zookeeper 目录(你也可以自定义存储目录),如下图:


    在当前目录(/opt/zookeeper/)创建一个名为 docker-compose.yml 的文件, 其内容如下:


    version: '2'
    services:
        zoo1:
            image: zookeeper
            restart: always
            container_name: zoo1
            ports:
                - "2181:2181"
            environment:
                ZOO_MY_ID: 1
                ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
    
        zoo2:
            image: zookeeper
            restart: always
            container_name: zoo2
            ports:
                - "2182:2181"
            environment:
                ZOO_MY_ID: 2
                ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
    
        zoo3:
            image: zookeeper
            restart: always
            container_name: zoo3
            ports:
                - "2183:2181"
            environment:
                ZOO_MY_ID: 3
                ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
    

    这个配置文件会告诉 Docker 分别运行三个 zookeeper 镜像, 并分别将本地的 2181, 2182, 2183 端口绑定到对应的容器的2181端口上(每个zookeeper容器的默认端口都是2181,这句话意思也就是说,将宿主机的2181、2182、2183这3个端口号,分别映射到3个zookeeper容器的2181端口)。


    ZOO_MY_ID 和 ZOO_SERVERS 是搭建 ZK 集群需要设置的两个环境变量,其中 ZOO_MY_ID 表示 ZK 服务的 id,它是1-255 之间的整数,必须在集群中唯一;ZOO_SERVERS 是ZK 集群的主机列表。

    3) 运行 docker-compose

    接着我们在 docker-compose.yml 所在的目录(/opt/zookeeper/ )下运行:

    COMPOSE_PROJECT_NAME=zk_cluster docker-compose up

    即可启动 ZK 集群了。

    注意:这种方式非后台运行,当执行 Ctrl + C 组合键的时候,所有的ZK容器都会停止运行。


    4) 以后台方式运行docker-compose

    COMPOSE_PROJECT_NAME=zk_cluster docker-compose up -d

    很简单,只要在最后面加上“-d”即可。

    运行效果如下图:

    可以看到,是以后台方式运行的ZK容器集群。


    5) 查看启动的ZK集群

    执行上述命令成功后,接着新开启一个终端,然后在新终端界面中,首先进入 /opt/zookeeper/ 目录,在该目录下运行以下命令可以查看启动的 ZK 容器:

    COMPOSE_PROJECT_NAME=zk_cluster docker-compose ps

    如下图:


    你也可以通过 docker ps 命令查看启动的ZK容器列表,如下图:

    很明显的看到,启动了3个ZK容器,每个容器对应着宿主机的不同的端口号。


    6) 测试连接ZK集群

    查看ZK集群的信息,有多种方法。这里我们就使用最普通的进入容器内部来查看ZK节点的信息以及它的模式。


    通过上面的图,可以看到3个ZK容器的ID信息。


    这里我们先进入zoo1这个容器,查看ZK的信息,执行以下命令:

    docker exec -it 49 zkServer.sh status

    其中“49”指的是zoo1容器的ID。

    运行结果如下图:

    可以看到,Mode的值为“follower”,指的是从节点,并非主节点。


    以此类推,查看 zoo2 这个ZK容器的信息

    当前ZK容器节点为主节点


    查看 zoo3 这个ZK容器的信息

    当前ZK容器节点为从节点


    经过以上的查看,可以清晰的看到,其中一个ZK容器是一个主节点leader,另外2个都是从节点follower。



    到此,在Docker中搭建zookeeper的集群环境已经讲解完了。






    问题总汇:
    (1) docker MySQL 连接出现 Authentication plugin 'caching_sha2_password' cannot be loaded
    原因: 

    我在使用navicat 进行MySQL管理是出现了。2059 - authentication plugin 'caching_sha2_password' -navicat连接异常。这个错误。

    这个错误的原因是由于MySQL8.0之后的加密规则为caching_sha2_password.而在此之前的加密规则为mysql_native_password。

    可以将加密规则改成mysql_native_password来。

    解决方案:
    1.进入mysql容器
    docker exec -it mysql2 /bin/bash
    2.进入mysql
    mysql -uroot -pmima
    3.修改密码
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';




















  • 相关阅读:
    VBA的程序终止、退出语句块、分支及错误处理(End, exit, on error go to in VBA
    关于session中的cookie提取
    Python爬虫 —— 知乎之selenium模拟登陆获取cookies+requests.Session()访问+session序列化-转
    tar 解压命令出现如下错误
    操作系统 ----- 段错误(核心转储)
    c++游戏入门基础
    数据结构算法
    point(指针)
    《淘宝网》质量属性简析
    《架构漫谈》读后感
  • 原文地址:https://www.cnblogs.com/bangiao/p/12557144.html
Copyright © 2011-2022 走看看