美文网首页docker
Docker 安装和容器部署服务

Docker 安装和容器部署服务

作者: 楚江云 | 来源:发表于2020-09-12 20:48 被阅读0次

    1. Docker是什么?

    在互联网时代人们对美好生活的追求驱动下,大量的应用和服务被创建了出来,这些应用和服务通常都部署不同服务器上.一切看上去都是那样的美好

    然而....

    这些应用和服务的开发运维人员表示:"宝宝心里苦"

    情况是在一个IT部门可能技术栈比较丰富,有C/C++的,java的,PHP的,Python的,Golang 的,JS 的等等,为此在不得不配置大量的复杂的不同的环境,另外不同的应用和服务依赖的版本可能不同,又是一个令人脑阔大的问题,另外在业务扩展的时候可能又要购买新的服务器再次部署环境和应用,但是原有的服务器本身的服务负载可能也不高....

    那有没有比较好的解决方法呢?

    1.1 旧的解决方案?

    虚拟机(VM)的出现为上述种问题提供解决方案,虚拟机就是在操作系统(OS)的基础上再模拟运行一个操作系统,运行虚拟机本身需要占用较多的系统资源(CPU,RAM,磁盘空间等),而且VM自身运行起来的速度还很慢,移植性也不是很完善

    1.2 新的解决方案?

    VM 的解决方案面临的问题很多,那么自然出现的更好的解决方案那就是Docker

    • Docker发展出来是基于linux 容器(Linux Containers ,LXC)
    • Docker的出现使容器技术更加普遍化,能让更多的人享受容器技术带来的红利

    Docker的特点:

    • 提供各种开发测试环境,不要大量的部署安装软件,几个命令就可以部署一个完整的运行环境
    • 更高效的资源利用,运行起来一个容器本身依赖的资源就很少,在同一主机上可以运行多个容器,容器之间是相互隔离的
    • 更便捷的迁移和扩展,Docker几乎能运行在所有平台上,容器化的应用可以实现很方便的扩展
    • 管理方便

    1.3 Docker容器 VS 虚拟机技术

    Docker-vs-VM.png

    运行容器运行的情况

    Docker结构.png

    虚拟机运行情况

    VM结构.png
    • 虚拟机是可以说是将硬件资源划分为虚拟资源,并且让这些虚拟资源看起来和真是的物力资源一样,然后Hypervisor将这些资源打包进一个叫做虚拟机的软件结构中,我们再在虚拟机中安装系统和应用
    • 容器可以理解为操作系统虚拟化,在操作系统上容器引擎获取系统资源,将系统资源分割成相互隔离的结构的资源结构便是单个的容器

    2. 如何安装?

    2.1 安装步骤

    安装Docker的操作系统是 CentOS7

    2.1.1 移除旧的Docker版本

    PS : 如果压根没有安装过docker这步不需要执行

    # 方法1 (非root用户需要提权)
    # PS : 本身是root用户在执行命令的,不要带上sudo
    [root@host1 ~]# yum remove docker \
    >                   docker-client \
    >                   docker-client-latest \
    >                   docker-common \
    >                   docker-latest \
    >                   docker-latest-logrotate \
    >                   docker-logrotate \
    >                   docker-engine
    Loaded plugins: fastestmirror
    No Match for argument: docker
    No Match for argument: docker-client
    No Match for argument: docker-client-latest
    No Match for argument: docker-common
    No Match for argument: docker-latest
    No Match for argument: docker-latest-logrotate
    No Match for argument: docker-logrotate
    No Match for argument: docker-engine
    No Packages marked for removal
    
    2.1.2 安装依赖包
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    
    2.1.3 设置yum源
    [root@host1 ~]# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    Loaded plugins: fastestmirror
    adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
    grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
    repo saved to /etc/yum.repos.d/docker-ce.repo
    
    2.1.4 查看可用版本
    # 这一步不是必须的,如果你想安装指定的docker版本可以通过该步骤查看可用版本
    # 罗列当前docker能用的所以版本
    [root@host1 ~]# yum list docker-ce --showduplicates | sort -r
     * webtatic: uk.repo.webtatic.com
     * updates: mirror.bit.edu.cn
    Loading mirror speeds from cached hostfile
    Loaded plugins: fastestmirror
     * extras: mirrors.aliyun.com
     * epel: ftp.iij.ad.jp
    docker-ce.x86_64            3:19.03.9-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.8-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.7-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.6-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.5-3.el7                     docker-ce-stable
    docker-ce.x86_64            3:19.03.4-3.el7                     docker-ce-stable
    ....
    
    2.1.5 安装docker
    sudo yum install docker-ce docker-ce-cli containerd.io
    # 或者执行(效果是一样的)
    sudo yum install docker-ce
    # 安装完成之后启动docker
    systemctl start docker
    # 查看docker是否安装成功
    [root@host1 ~]# docker version
    Client: Docker Engine - Community
     Version:           19.03.12
     API version:       1.40
     Go version:        go1.13.10
     Git commit:        48a66213fe
     Built:             Mon Jun 22 15:46:54 2020
     OS/Arch:           linux/amd64
     Experimental:      false
    
    Server: Docker Engine - Community
     Engine:
      Version:          19.03.12
      API version:      1.40 (minimum version 1.12)
      Go version:       go1.13.10
      Git commit:       48a66213fe
      Built:            Mon Jun 22 15:45:28 2020
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          1.2.13
      GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
     runc:
      Version:          1.0.0-rc10
      GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
     docker-init:
      Version:          0.18.0
      GitCommit:        fec3683
    
    # 出现如上信息就表示安装成功了(分别打印的是docker客户端和服务端的基础信息)
    
    2.1.6 启动docker
    # 加入开机启动
    systemctl enable docker
    # docker 默认只能通过root权限执行,通过将用户添加到docker用户组可以避免(直接root用户操作可以无视),执行之后重新登录
    sudo usermod -aG docker $USER
    
    2.1.7 配置docker的源

    配置docker源是为了更快的速度拉取镜像,docker默认使用的国外的镜像(相对国内而言)

    #创建或者打开 /etc/docker/daemon.json 文件
    #国内可用的镜像有很多我们简单罗列几个
    # Azure中国   https://dockerhub.azk8s.cn
    # 中科大      https://docker.mirrors.ustc.edu.cn
    # 七牛云      https://reg-mirror.qiniu.com
    # 网易云      https://hub-mirror.c.163.com
    # 腾讯云      https://mirror.ccs.tencentyun.com 
    # 任意选取一个国内镜像即可
    vi /etc/docker/daemon.json
    
    {
        "registry-mirrors": [
            "https://registry.docker-cn.com"
        ]
    }
    # 编辑完 daemon.json 文件之后退出保存
    # 然后重启docker服务使之生效
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    2.1.8 安装docker-compose

    docker-compose

    Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,您可以从您的配置中创建并启动所有的服务

    # 下载docker-composer二进制文件
    [root@host1 ~]# curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   651  100   651    0     0    233      0  0:00:02  0:00:02 --:--:--   233
    100 16.3M  100 16.3M    0     0   120k      0  0:02:19  0:02:19 --:--:-- 98550
    # 赋予二进制文件可执行权限
    [root@host1 ~]# chmod +x /usr/local/bin/docker-compose
    # 创建软链接,使docker-composer称为一个可执行的命令
    [root@host1 ~]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    # 验证
    [root@host1 ~]# docker-compose --version
    docker-compose version 1.25.4, build 8d51620a
    

    3. docker常用命令

    3.0 Docker帮助命令

    # 打印docker版本信息
    docker version 
    # 打印docker的概览信息
    docker info
    # 打印docker帮助信息
    docker help
    docker --help
    # 打印docker命令帮助信息
    docker 命令 --help
    
    

    3.1 镜像常用命令

    Docker仓库的类似github的作用,Docker仓库是用来存放Docker镜像的地方

    镜像是docker一个核心概念 ,镜像image 是一个二进制文件,镜像可以通过层层叠加其他的镜像和一些设置形成新的镜像.docker中的镜像是生成容器的模板,通过一个镜像可以创建多个同类型服务的容器实例

    # 搜索镜像
    docker search [OPTIONS] TERM
    # 拉取镜像
    docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    # 列出拉取的所有镜像
    docker images [OPTIONS] [REPOSITORY[:TAG]]
    docker image ls [OPTIONS] [REPOSITORY[:TAG]]
    docker image list
    # 删除一个或者多个镜像 
    # 注意:当镜像有关联容器(处于Up或者Exited)时,不能直接删除 
    docker image rm [OPTIONS] IMAGE [IMAGE...] 
    # 删除一个或者多个镜像 
    docker rmi [OPTIONS] IMAGE [IMAGE...]
    # 显示镜像的详细信息
    docker image inspect [OPTIONS] IMAGE [IMAGE...]
    

    3.2 容器常用命令

    Docker容器我们在感官上可以认为它就是一个sandbox , 用来运行和隔离提供的服务

    Docker容器是根据Docker镜像创建的具体实例.

    # 启动一个新容器
    docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
    # 列出所有运行的容器
    docker container ls [OPTIONS]
    docker ps [OPTIONS]
    # 连接到一个运行的容器中 (进入运行的容器中)
    docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]
    # example 
    docker container exec -it 容器ID(容器名) /bin/bash #进入容器中 
    # 停止一个或者多个容器
    docker container stop [OPTIONS] CONTAINER [CONTAINER...]
    docker kill 容器id
    docker stop 容器id
    # 将一个停止的容器启动
    docker container start [OPTIONS] CONTAINER [CONTAINER...]
    docker start 容器id 
    # 重启一个容器
    docker restart 容器id 
    # 删除停止的容器(先停止后才能删除)
    docker container rm [OPTIONS] CONTAINER [CONTAINER...]
    docker rm [OPTIONS] CONTAINER [CONTAINER...]
    # 显示容器的配置信息和运行信息
    docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
    # 更新容器的配置
    docker update [OPTIONS] CONTAINER [CONTAINER...]
    # example :
    docker update --restart=always 容器名(或者容器id) # 将该容器设置为自动启动
    # 查看容器的端口映射
    docker container port CONTAINER [PRIVATE_PORT[/PROTO]]
    docker port CONTAINER [PRIVATE_PORT[/PROTO]]
    # 查看容器日志
    docker logs [OPTIONS]  容器id
    # 容器与主机之间的数据拷贝
    #---从容器拷贝到主机
    # docker cp 容器id:容器源文件目录 主机路径
    docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|
    #---从主机拷贝到容器
    # docker cp 主机目录 容器id:容器源文件目录
    docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
    # 查看容器的运行统计状态
    docker stats 容器名或者容器id
    

    3.3 卷常用命令

    1. 每个Docker容器都有自己的非持久化存储。非持久化存储自动创建,从属于容器,生命周期与容器相同。这意味着删除容器也会删除全部非持久化数据
    2. 如果希望自己的容器数据保留下来,则需要将数据存储在卷上。卷与容器是解耦的,从而可以独立地创建并管理卷,并且卷并未与任意容器生命周期绑定。最终效果即用户可以删除一个关联了卷的容器,但是卷并不会被删除。
    # docker中和卷 volume 相关的命令
    docker volume --help
    Usage:  docker volume COMMAND
    Manage volumes
    Commands:
      create      Create a volume # 创建新的卷
      inspect     Display detailed information on one or more volumes # 查看卷详情
      ls          List volumes # 列出当前docker主机上的所有卷
      prune       Remove all unused local volumes # 删除未使用的卷
      rm          Remove one or more volumes # 删除指定卷
    # 关于docker volume 命令 更详细的命令
    Run 'docker volume COMMAND --help' for more information on a command.
    # DOcker的挂载方式如下
        ## 匿名挂载
    -v 容器内路径
        ## 具名挂载
    -v 卷名:容器内路径
        ## 指定路径挂载
    -v /docker主机路径:容器内路径
    # -v 容器内路径:ro(rw)读写权限
    ## ro readonly 只读
    ## rw readwrite 读写
    # example 
    ## 具名挂载只读
    docker run --name nginx2 -p 8081:80 -v nginx2:/usr/share/nginx/html/:ro -d nginx
    ## 具名挂载读写都行
    docker run --name nginx2 -p 8081:80 -v nginx2:/usr/share/nginx/html/:rw -d nginx
    ## 查看卷
    docker volume ls
    DRIVER              VOLUME NAME
    local               myvol
    local               nginx2
    ## 查看卷详情
    docker volume inspect nginx2
    [
        {
            "CreatedAt": "2020-09-17T11:57:50+08:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/nginx2/_data",
            "Name": "nginx2",
            "Options": null,
            "Scope": "local"
        }
    ]
    
    

    3.4 网络常用命令

    docker network --help
    Usage:  docker network COMMAND
    Manage networks
    Commands:
      connect     Connect a container to a network ## 将容器连接到网络
      create      Create a network ## 创建网络
      disconnect  Disconnect a container from a network ## 断开容器与网络的连接
      inspect     Display detailed information on one or more networks ## 查看一个网络详情
      ls          List networks ## 列出所有网络
      prune       Remove all unused networks ## 删除所有未使用的网络
      rm          Remove one or more networks ## 删除网络
    Run 'docker network COMMAND --help' for more information on a command.
    
    # 创建一个新的网络
    ## 创建的网络名叫做 test_net
    docker network create --driver bridge --subnet 172.20.0.0/16 --gateway 172.20.0.1 test_net
    # 查看网络列表
    docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    3c1b5202843a        bridge              bridge              local
    26a80adf64ad        host                host                local
    c714112f5843        none                null                local
    2b1e8ef33117        test_net            bridge              local
    # 查看网络详情
    docker network inspect test_net
    [
        {
            "Name": "test_net",
            "Id": "2b1e8ef33117e9fb9e86279c99081790f9dfa405a88c22376355ba8bc6101472",
            "Created": "2020-09-17T15:27:54.957418896+08:00",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "172.20.0.0/16",
                        "Gateway": "172.20.0.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": {},
            "Options": {},
            "Labels": {}
        }
    ]
    # 新启动两个容器加入自定义的网络
    ## --net 指定容器加入的网络 默认是 bridge网络
    docker run --name nginx1-net -d -p 8082:80 --net test_net 镜像id或者镜像名
    docker run --name nginx2-net -d -p 8083:80 --net test_net 镜像id或者镜像名
    # 查看容器
    docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    3eee870e50b4        7e4d58f0e5f3        "/docker-entrypoint.…"   37 minutes ago      Up 37 minutes       0.0.0.0:8083->80/tcp   nginx2-net
    7a89c38a70bc        7e4d58f0e5f3        "/docker-entrypoint.…"   38 minutes ago      Up 38 minutes       0.0.0.0:8082->80/tcp   nginx1-net
    0d0e4eb839b9        7e4d58f0e5f3        "/docker-entrypoint.…"   About an hour ago   Up About an hour    0.0.0.0:8081->80/tcp   nginx2
    4b544dc29cf3        nginx               "/docker-entrypoint.…"   4 days ago          Up 4 hours          0.0.0.0:8080->80/tcp   nginx1
    
    ## 自定义网络中容器可以相互 ping 通
    docker exec nginx1-net ping nginx2-net
    PING nginx2-net (172.20.0.3) 56(84) bytes of data.
    64 bytes from nginx2-net.test_net (172.20.0.3): icmp_seq=1 ttl=64 time=0.068 ms
    64 bytes from nginx2-net.test_net (172.20.0.3): icmp_seq=2 ttl=64 time=0.112 ms
    64 bytes from nginx2-net.test_net (172.20.0.3): icmp_seq=3 ttl=64 time=0.138 ms
    64 bytes from nginx2-net.test_net (172.20.0.3): icmp_seq=4 ttl=64 time=0.091 ms
    64 bytes from nginx2-net.test_net (172.20.0.3): icmp_seq=5 ttl=64 time=0.104 ms
    ## 在默认的网络中两个容器无法相互访问
    docker exec nginx1 ping nginx2
    ping: unknown host
    

    4. Docker容器部署服务

    4.1 容器部署Nginx

    # 拉取nginx镜像,不指定版本时,默认是latest(最新版)
    docker pull nginx
    # docker启动一个nginx服务
    docker run -p 8080:80 --name nginx1 \
    -v /data/wwwlog:/var/log/nginx \
    -v /data/wwwroot/:/usr/share/nginx/html/ \
    -v /var/local/nginx:/etc/nginx \
    -d nginx
    # 参数解释
    -p 8080:80 # 指定端口映射 ip:主机端口:容器端口 
    --name nginx1 #给容器起别名,便于区分
    -v /data/wwwwlog:/var/log/nginx # 卷挂载 宿主机目录:容器内部路径
    -d # 后台运行该容器
    

    4.2 容器部署Mysql

    4.2.1 mysql5.7
    # pull mysql镜像 (指定的mysql5.7的镜像)
    docker pull mysql:5.7.28
    # 启动容器
    docker run -p 3306:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.28
    # 参数解释
    -e MYSQL_ROOT_PASSWORD=123456 #容器的环境配置,此处是配置mysql的root密码
    # mysql容器内连接测试
    docker exec -it mysql1 /bin/bash
    # 进入mysql容器内部
    root@2d33a806f8d4:/# mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 4
    Server version: 5.7.28 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> 
    mysql> 
    mysql> 
    mysql> select version();
    +-----------+
    | version() |
    +-----------+
    | 5.7.28    |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> 
    mysql> exit
    Bye
    #====================================
    # mysql外部链接测试(可以是数据库链接工具)或者是mysql客户端
    # 在客户机器上执行如下命令 (windows10 PowerShell)
    PS C:\Users>mysql -h 192.168.30.44 -P 3306 -u root -p
    Enter password: ******
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 5
    Server version: 5.7.28 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> select version();
    +-----------+
    | version() |
    +-----------+
    | 5.7.28    |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> exit;
    Bye
    
    
    4.2.2 mysql8
    # pull mysql最新的镜像(latest)
    docker pull mysql
    #启动一个容器 (端口映射了3307)
    docker run -p 3307:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
    # 配置
    # 容器内链接测试
    docker exec -it mysql2 /bin/bash
    root@1a5fadeb2de7:/# mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 9
    Server version: 8.0.17 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> select version();
    +-----------+
    | version() |
    +-----------+
    | 8.0.17    |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> exit
    Bye
    root@1a5fadeb2de7:/# exit
    exit
    # 其他客户端连接mysql容器
    # 还是在window PowerShell测试
    PS C:\Users> mysql -h 192.168.30.44 -P 3307 -u root -p
    Enter password: ******
    ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: 找不到指定的模块。
    # 主要原因是mysql8采用新的加密模式,导致客户端连接失败
    # 解决方法如下
    # 进入mysql容器内
    [root@host5 local]# docker exec -it mysql2 /bin/bash
    root@1c2a3fbedd11:/# mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 8.0.17 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> 
    # 退出容器
    #====================================
    # 继续在客户端测试mysql8连接
    PS C:\Users> mysql -h 192.168.30.44 -P 3307 -u root -p
    Enter password: ******
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 10
    Server version: 8.0.17 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> select version();
    +-----------+
    | version() |
    +-----------+
    | 8.0.17    |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> exit
    Bye
    PS C:\Users>
    
    4.2.3 mysql挂载目录
    # pull mysql镜像 (指定的mysql5.7的镜像)
    docker pull mysql:5.7.28
    # 启动容器 分别挂载配置,日志,数据卷
    docker run -p 3308:3306 --name mysql3 \
    -v /usr/local/docker-data/mysql/conf/:/etc/mysql/conf.d \
    -v /usr/local/docker-data/mysql/logs/:/var/log/mysql \
    -v /usr/local/docker-data/mysql/data/:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -d mysql:5.7.28
    # 需要挂载那些目录根据自己的需求决定
    # PS 如果挂载了mysql的配置文件目录那么需要在docker主机的挂载容器配置文件目录中添加配置文件
    
    4.2.4 mysql远程登录问题
    1. mysql容器允许远程连接权限 ?

      # 进入容器
      docker exec -it 容器名或者容器id /bin/bash
      # 在mysql容器内登陆mysql
      mysql - u root -p
      MySQL> grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
      Query OK, 0 rows affected, 1 warning (0.05 sec)
      
      MySQL> flush privileges;
      Query OK, 0 rows affected (0.05 sec)
      
      MySQL> 
      
    1. mysql8镜像的容器远程连接认证问题?ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: 找不到指定的模块。

      # 进入容器
      docker exec -it 容器名或者容器id /bin/bash
      # 在mysql容器内登陆mysql
      mysql - u root -p
      # 命令解析: 修改任意ip通过root用户登陆的加密规则为 mysql_native_password 
      MySQL> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
      Query OK, 0 rows affected, 1 warning (0.05 sec)
      
      MySQL> flush privileges;
      Query OK, 0 rows affected (0.05 sec)
      
      MySQL> 
      
    2. mysql 创建账户分配权限?

      mysql 数据权限分配语句

      1. 创建账户语句

        CREATE USER 'username'@'host' IDENTIFIED BY 'password';
        
      1. 授权语句

        GRANT privileges ON databaseName.tableName TO 'username'@'host'
        参数说明 : 
        privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL
        databasename.tablename : 允许操作的数据库及表,如果是所有库,就用 *.* 标识
                                如果是允许对库中的所有表都可以操作,就用 databaseName.*
        example1:
        GRANT all ON *.* TO 'zhangsan'@'%' # 允许操作所有库
        example2:
        GRANT select,insert ON crm_core.user TO 'zhangsan'@'%' # 允许对crm_core的user表执行查找和添加操作
        
      1. 修改账户密码语句

        SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');
        
      1. 删除账户语句

        DROP USER 'username'@'host';
        
      # 进入容器
      docker exec -it 容器名或者容器id /bin/bash
      # 在mysql容器内登陆mysql
      mysql - u root -p
      # 新建一个zhangsan的账户设置密码是123456
      mysql> CREATE USER 'zhangsan'@'%' IDENTIFIED BY '123456';
      Query OK, 0 rows affected (0.00 sec)
      # 授权
      # 赋予zhangsan对数据cdr_core所有权限
      mysql> grant all on cdr_core.* to 'zhangsan'@'%';
      Query OK, 0 rows affected (0.00 sec)
      mysql> exit
      Bye
      root@7a497f5b280e:/# exit
      exit
      # 客户端测试权限分配
      PS C:\> mysql -h 192.168.30.44 -P 3308 -u zhangsan -p
      Enter password: ******
      Welcome to the MySQL monitor.  Commands end with ; or \g.
      Your MySQL connection id is 11
      Server version: 5.7.28 MySQL Community Server (GPL)
      
      Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
      
      Oracle is a registered trademark of Oracle Corporation and/or its
      affiliates. Other names may be trademarks of their respective
      owners.
      
      Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
      
      mysql> show databases;
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | cdr_core           |
      +--------------------+
      2 rows in set (0.00 sec)
      
      mysql>
      

    4.3 容器部署RabbitMQ

    # 拉取rabbitMQ 镜像
    docker pull rabbitmq:3.8.2-management-alpine
    # 查看镜像
    docker images |grep rabbitmq
    rabbitmq              3.8.2-management-alpine   31821c907973        8 months ago        141MB
    # 简单启动RabbitMQ 
    # 简单启动一个rabbitmq容器后,通过ip:端口访问 RabbitMQ的UI管理界面,默认账户密码是guest
    docker run --name rabbitmq1 -d -p 5672:5672 -p 15672:15672 31821c907973
    # 启动RabbitMQ,挂载数据卷,并设置密码
    docker run -d --name rabbitmq2 -p 5673:5672 -p 15673:15672 -v /usr/local/docker-data/rabbitmq/data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 31821c907973
    #====================================
    # 测试在浏览器中输入ip:15673 就可以看到RabbitMQ的登陆界面
    
    rabbitmq1.png rabbitmq2.png

    4.4 容器部署Redis

    # pull redis镜像
    docker pull redis
    # 查看镜像
    docker images |grep redis
    redis                 latest                    dcf9ec9265e0        9 months ago        98.2MB
    # 简单启动一个redis容器
    docker run -d --name redis1 -p 6379:6379 dcf9ec9265e0
    # 启动一个redis容器并设置密码为123456
    # --requirepass 设置redis密码
    docker run -d --name redis2 -p 6380:6379 dcf9ec9265e0 --requirepass '123456'
    
    # 启动一个挂载数据盘的redis容器
    # --appendonly yes 开启redis持久化
    docker run -d --name redis3 -p 6381:6379 -v /usr/local/docker-data/redis/data:/data dcf9ec9265e0 --requirepass '123456' --appendonly yes
    #====================================
    # docker部署redis容器的服务器ip是 192.168.30.44
    # redis客户端连接测试redis容器
    # 测试环境 windows10 (PowerShell)
    # 测试软件 redis-cli.exe
    PS C:\Program Files\Redis> .\redis-cli.exe -h 192.168.30.44 -p 6379
    192.168.30.44:6379>
    192.168.30.44:6379> set name redis1
    OK
    # 测试需要密码连接的redis
    PS C:\Program Files\Redis> .\redis-cli.exe -h 192.168.30.44 -p 6380
    192.168.30.44:6380> keys *
    (error) NOAUTH Authentication required.
    192.168.30.44:6380> auth 123456
    OK
    192.168.30.44:6380> set name redis2
    OK
    192.168.30.44:6380> get name
    "redis2"
    
    # redis桌面客户端工具也可测试,如:Another Redis Desktop Manager,RedisDesktopManager 等
    

    4.5 Docker管理工具Portainer

    Portainer是一个轻量级的管理UI,它允许你轻松地管理你的Docker主机或群集群。Portainer的部署和使用一样简单。它由一个可以在任何Docker引擎上运行的容器组成(支持Linux的Docker和Windows的Docker)。Portainer允许你管理你的Docker栈,容器,图像,卷,网络和更多!它与独立Docker引擎和Docker Swarm兼容。

    # pull portainer镜像
    docker pull portainer/portainer
    docker images|grep portainer
    portainer/portainer   latest                    62771b0b9b09        7 weeks ago         79.1MB
    # 启动一个 prtainer容器 
    docker run -d --name prtainer1 -p 9000:9000 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/local/docker-data/portainer/data:/data \
    portainer/portainer
    
    4.5.1 Portainer 首页
    20200919175644.png
    4.5.2 Docker主机终端
    20200919175719.png
    4.5.3 Docker管理仪表盘
    20200919175803.png
    4.5.4 容器管理界面
    20200919175833.png

    5. docker开启远程访问

    docker主机开启远程访问之后可以通过docker提供的API对docker进行管理和操作,当然也存在一些风险

    # 查看需要修改的docker配置文件
    [root@host4 /]# cat /usr/lib/systemd/system/docker.service |grep ExecStart
    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    # 编辑docker配置文件
    # 添加 -H tcp://0.0.0.0:2375 内容即可
    [root@host4 /]# vim /usr/lib/systemd/system/docker.service
    # 添加完之后退出保存,查看修改后的配置文件
    [root@host4 /]# cat /usr/lib/systemd/system/docker.service |grep ExecStart
    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
    # 重载服务配置
    [root@host4 /]# systemctl daemon-reload
    # 重启docker
    [root@host4 /]# systemctl restart docker
    # docker 主机开放端口
    [root@host4 /]# firewall-cmd --zone=public --add-port=2375/tcp --permanent
    success
    [root@host4 /]# firewall-cmd --reload
    success
    [root@host4 /]# firewall-cmd --zone=public --query-port=2375/tcp
    yes
    # 测试docker远程api是能访问
    # 也可通过浏览器访问
    # 查询容器
    [root@host4 /]# curl http://192.168.30.61:2375/containers/json
    [{"Id":"4b544dc29cf38d0f869f3e8a787e24166598c616a0905064de324b208c65aaae","Names":["/nginx1"],"Image":"nginx","ImageID":"sha256:7e4d58f0e5f3b60077e9a5d96b4bef9393000a99f3b6816e3d","Command":"/docker-entrypoint.sh nginx -g 'daemon off;'","Created":1599901428,"Ports":[{"IP":"0.0.0.0","PrivatePort":80,"PublicPort":8p"}],"Labels":{"maintainer":"NGINX Docker Maintainers <docker-maint@nginx.com>"},"State":"running","Status":"Up 3 minutes","HostConfig":{"NetworkMode":"defauettings":{"Networks":{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"7f6400360ea17bcfd3038fbaf7300fe65ac577f52707c9bdbd03732bef947427",c3751a10e8f9dc5d78ce461e0e7b87a5610a91054160d449539886518aa47a3b","Gateway":"172.17.0.1","IPAddress":"172.17.0.2","IPPrefixLen":16,"IPv6Gateway":"","GlobalIP"GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02","DriverOpts":null}}},"Mounts":[{"Type":"bind","Source":"/data/wwwroot","Destination":"/usr/share/ngi":"","RW":true,"Propagation":"rprivate"},{"Type":"bind","Source":"/data/wwwlogs","Destination":"/var/log/nginx","Mode":"","RW":true,"Propagation":"rprivate"}
    # 查询镜像
    [root@host4 /]# curl http://192.168.30.61:2375/images/json
    [{"Containers":-1,"Created":1599741190,"Id":"sha256:7e4d58f0e5f3b60077e9a5d96b4be1b974b5a484f54f9393000a99f3b6816e3d","Labels":{"maintainer":"NGINX Docker Maker-maint@nginx.com>"},"ParentId":"","RepoDigests":["nginx@sha256:9a1f8ed9e2273e8b3bbcd2e200024adac624c2e5c9b1d420988809f5c0c41a5e"],"RepoTags":["nginx:latese":-1,"Size":132640291,"VirtualSize":132640291}]
    

    参考文档

    - [1] Linux系统安装Docker
    - [2] DockerHub
    - [3] portainer
    - [4] Docker API 文档

    相关文章

      网友评论

        本文标题:Docker 安装和容器部署服务

        本文链接:https://www.haomeiwen.com/subject/hpqgektx.html