Docker 安装和容器部署服务

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 文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271