Docker快速入门与使用

学习资料

  1. Docker中文文档
    推荐

  2. Docker Documents
    推荐,原汁原味,更直接

  3. 菜鸟教程-Docker

  4. 为什么Docker镜像大小与仓库中不一致?

  5. docker命令

  6. Docker查看远端仓库中某个应用全部标签的工具

  7. Job for docker.service failed because the control process exited with error code. See
    vim /etc/docker/daemon.json书写不规范,会导致这个错误

  8. nsenter命令简介

  9. docker 在宿主机上根据进程PID查找归属容器ID

  10. docker学习笔记–重基础使用

  11. 使用docker run后状态为Exited (1)
    配置文件编写有问题也会导致这个问题,大概来将容器内mysql运行失败都会导致容器进入这个状态

  12. Docker之Mysql数据持久化
    https://blog.csdn.net/qq_31864653/article/details/90769142

  13. “exec: “docker-entrypoint.sh”: executable file not found in $PATH”.解决方法

一、基础知识

Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

1.1 简单了解

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

1.1.1 Docker的应用场景

1.Web应用的自动化打包和发布
2.自动化测试和持续集成、发布
3.在服务型环境中部署和调整数据库或其它的后台应用。
4.从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

1.1.2 Docker 优点

1.快速、一致的交付应用程序

2.在任何地方开发、部署和运行任何应用

Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。Docker 可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样,尽可能的屏蔽代码层面的差异。Docker 会尽可能的缩短从代码测试到产品部署的时间。

3.在同一硬件上运行更多工作负载

1.1.3 Docker和传统虚拟机的区别

在这里插入图片描述
[翻译]传统虚拟机包含:应用、二进制文件/库和客体操作系统三部分。每一个被虚拟化的应用可能只有几或几十MB,同时需要一些二进制文件和库。但是一个被虚拟化的操作系统却可能需要几十GB。
多个虚拟机之间需要有多个guest os,guest os占用大量的空间。
在这里插入图片描述
[翻译]这个Docker 引擎上的容器仅包含应用和一些其它的依赖文件。Docker 引擎作为一个独立进程在主机操作系统的用户空间(userspace)内运行。每一个容器都可以共享这个Docker 引擎。因此,Docker在具备传统虚拟机资源隔离和资源分配优势的基础上,拥有更高的效率和更好的可移植性。

1.关于hypervisor:虚拟机监视器,是用来建立与执行虚拟机器的软件、固件或硬件。被Hypervisor用来执行一个或多个虚拟机器的电脑称为主体机器(host machine),这些虚拟机器则称为客体机器(guest machine)。hypervisor提供虚拟的作业平台来执行客体操作系统(guest operating systems),负责管理其他客体操作系统的执行阶段;这些客体操作系统,共同分享虚拟化后的硬件资源。

2.Guest OS:运行在Guest Machine上的操作系统

3.Docker Engine 是一个基于虚拟化技术的轻量级并且功能强大的开源容器引擎管理工具。它可以将不同的 work flow 组合起来构建成你的应用。

4.Docker Hub 可以分享和管理你的images镜像的一个 Saas 服务。

1.2 深入了解

1.2.1 Docker架构

三个基本概念:镜像(Mirroring)、容器(Container)、仓库(Repository)

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

镜像(Mirroring):一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。举例:多个文件的集合θ{A1,A2,...,An}\theta\{A_1,A_2,...,A_n\}打包成镜像文件,镜像文件展开后恢复成多个文件的集合θ\theta,前后数据内容完全一致。

容器(Container):容器是镜像的实例

仓库(Repository):可以看成一个代码控制中心,用于保存镜像

在这里插入图片描述
关键名词

名词 说明
Docker镜像 Docker 镜像是用于创建 Docker 容器的模板
Docker 容器 容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端 Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

1.2.2 Docker 镜像

在Docker中,一个只读层被称为镜像。
Docker使用一个统一的文件系统,Docker进程认为整个文件系统是以读写方式挂载的。但是所有的变更都发生在顶层的可写层,而下层的原始的只读镜像文件并未发生变化。
Docker镜像是多层存储结构,镜像中的每一层都是可继承、可复用的。

  1. 父镜像
    每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。通常将下层的那个镜像成为上层镜像的父镜像。

  2. 基础镜像
    无父镜像的镜像被成为基础镜像。

  3. 镜像ID
    所有镜像都是通过一个 64 位十六进制字符串 (内部是一个 256 bit 的值)来标识的。 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的 碰撞机率,所以服务器总是返回长ID。

  4. 获取镜像,使用docker pull <镜像名称:镜像标签>命令从仓库中获取需要的镜像。
    下载过程中会输出获取镜像每一层的信息

sudo docker pull ubuntu:20.10
20.10: Pulling from library/ubuntu
0b4f5d796ad9: Pull complete
59ee7132703b: Pull complete
672e5b34dda8: Pull complete
d3af786f5e76: Pull complete
Digest: sha256:8b55362d424379a123758b70ddc2c5d3fbc3b5815d110be2a43933fa385672a3
Status: Downloaded newer image for ubuntu:20.10
docker.io/library/ubuntu:20.10

若默认的官方仓库下载速度过慢,可以使用docker pull <域名:端口号>/<镜像名称:镜像标签>指定从某个仓库下载镜像
也可以设置加速源或国内源,方法写在下面,可以参照

  1. 使用docker images显示本地已有的镜像
REPOSITORY 仓库名称
TAG 镜像标签
IMAGE ID 镜像ID
CREATED 创建时间
VIRTUAL SIZE 镜像大小

镜像ID唯一标识了镜像
TAG信息用来标记同一个仓库的不同镜像

Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,一些元数据(metadata)还包含以该镜像为基础运行的容器的行为。
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

基本语法:
使用#来注释
FROM指令告诉 Docker 使用哪个镜像作为基础
接着是维护者的信息
RUN开头的指令会在创建中运行,比如安装一个软件包。

FORM指令
指出使用的模板镜像,定制镜像都是在模板镜像的基础上进行。
RUN指令
用于执行后面跟着的命令行命令,有以下两种格式:

  1. shell 格式:
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
  1. exec格式:
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

Dockerfile中每一条指令都创建镜像的一层。所以过多无意义的层会导致镜像膨胀过大。一个镜像不能超过127层,镜像层属性为只读,但镜像实例化为容器时该层可读可写。

解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

-t标记用来添加标签 <镜像名称:镜像标签>
docker tag用于修改镜像标签
docker images列出本地镜像
docker push上传镜像到仓库中
docker save导出镜像文件到本地
docker load载入镜像

查看仓库中某个应用的全部标签

vim /home/tu/dockertags.sh

将以下内容放在dockertags.sh文件中

#!/bin/bash
function usage() {
cat << HELP
 
dockertags  --  list all tags for a Docker image on a remote registry.
 
EXAMPLE: 
    - list all tags for ubuntu:
       dockertags ubuntu
 
    - list all php tags containing apache:
       dockertags php apache
 
HELP
}
 
 
 
if [ $# -lt 1 ]; then
    usage
    exit
fi
 
image="$1"
tags=`wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'`
 
if [ -n "$2" ]; then
    tags=` echo "${tags}" | grep "$2" `
fi
echo "${tags}"

修改权限,运行脚本,得到输出

chmod 755 dockertags.sh
./dockertags.sh ubuntu
latest
10.04
12.04
12.04.5
12.10
13.04
13.10
14.04
14.04.1
14.04.2
14.04.3
14.04.4
14.04.5
14.10
15.04
15.10
16.04
16.10
17.04
17.10
18.04
18.10
19.04
19.10
20.04
20.10
artful
artful-20170511.1
...
artful-20180706
bionic
bionic-20171114
...

bionic-20200526
cosmic
cosmic-20180605
...
cosmic-20190719
devel
disco
disco-20181112
...
disco-20200114
eoan
eoan-20190508
...
eoan-20200608
focal
focal-20191030
...
focal-20200606
groovy
groovy-20200505
groovy-20200609
lucid
precise
precise-20150212
...
precise-20170331
quantal
raring
rolling
saucy
trusty
trusty-20150218.1
...

配置docker 仓库源

vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/","https://docker.mirrors.ustc.edu.cn/","https://hub-mirror.c.163.com","https://registry.docker-cn.com"]
}

加载配置文件
重启docker

systemctl daemon-reload
systemctl restart docker

1.2.3 Docker容器

容器是镜像的的行为

  • 启动容器
    两种情形:一种是基于镜像新建一个容器并启动;
    另外一种是将处于终止状态(stopped)的容器重新启动。

  • 新建并启动
    docker run
    示例1:使用ubuntu:14.04镜像生成一个容器,在容器中执行/bin/echo 'Hello world'

sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world

示例2:使用ubuntu:14.04镜像生成一个容器,在容器中执行/bin/bash,该命令会开启一个bash终端

sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#

其中,-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i则让容器的标准输入保持打开。

利用 docker run来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止
  1. 启动已终止的容器,docker start
    容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 ps 或 top 来查看进程信息。
root@ba267838cc1b:/# ps
  PID TTY          TIME CMD
    1 ?        00:00:00 bash
   11 ?        00:00:00 ps
  1. 守护态运行
    更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d参数来实现。
docker run -d ubuntu:20.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
cbb72f51cf163590376fefe8444cbff7f8f44e38518bbf40fb799dcc2f4b0ff7

容器会返回一个唯一的id,也可以通过docker ps命令来查看容器信息

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
cbb72f51cf16        ubuntu:20.10        "/bin/sh -c 'while t…"   14 seconds ago      Up 12 seconds  

可以使用docker logs命令获取容器的输出信息

docker logs confident_swanson
hello world
hello world
hello world
hello world
. . .
  1. 终止容器,docker stop
    当Docker容器中指定的应用终结时,容器也自动终止。 例如对于上面只启动了一个终端的容器,用户通过 exit 命令或 Ctrl+d 来退出终端时,所创建的容器立刻终止。
docker stop confident_swanson
confident_swanson

终止状态的容器可以使用docker ps -a命令看到。

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
cbb72f51cf16        ubuntu:20.10        "/bin/sh -c 'while t…"   3 minutes ago       Exited (137) 12 seconds ago                       confident_swanson
36230771220f        ubuntu:20.10        "/bin/echo 'hello wo…"   5 minutes ago       Exited (0) 5 minutes ago                          epic_bhaskara
654a3c5ec3d1        bulletinboard:1.0   "docker-entrypoint.s…"   24 hours ago        Exited (0) 13 hours ago                           bb
7fa85404b035        hello-world         "/hello"                 27 hours ago        Exited (0) 27 hours ago  

处于终止状态的容器,可以通过docker start命令来重新启动。

docker start confident_swanson
confident_swanson

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
cbb72f51cf16        ubuntu:20.10        "/bin/sh -c 'while t…"   5 minutes ago       Up 9 seconds                                   confident_swanson
36230771220f        ubuntu:20.10        "/bin/echo 'hello wo…"   7 minutes ago       Exited (0) 7 minutes ago                       epic_bhaskara
654a3c5ec3d1        bulletinboard:1.0   "docker-entrypoint.s…"   24 hours ago        Exited (0) 13 hours ago                        bb
7fa85404b035        hello-world         "/hello"                 27 hours ago        Exited (0) 27 hours ago 

docker restart命令会将一个运行态的容器终止,然后再重新启动。

6.进入容器
在使用 -d参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach命令或 nsenter工具等。
但是使用 attach命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

nsenter工具在 util-linux 包2.23版本后包含。nsenter可以访问另一个进程的名字空间。nsenter要正常工作需要有 root 权限。

# nsenter -V
nsenter,来自 util-linux 2.23.2

为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。

docker inspect --format "{{ .State.Pid }}" <container>

通过这个 PID,就可以连接到这个容器:

nsenter --target $PID --mount --uts --ipc --net --pid

示例

$ sudo docker run -idt ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
a4a2a29f9ba4: Pull complete
127c9761dcba: Pull complete
d13bf203e905: Pull complete
4039240d2e0b: Pull complete
Digest: sha256:35c4a2c15539c6c1e4e5fa4e554dac323ad0107d8eb5c582d6ff386b383b7dce
Status: Downloaded newer image for ubuntu:latest
93bd7a1a1bdf6293519649041fb28d70fcbe493fc70dbe281c6f31fed1499c10
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
93bd7a1a1bdf        ubuntu              "/bin/bash"         48 seconds ago      Up 45 seconds                           fervent_lederberg
$ docker inspect --format "{{ .State.Pid }}" fervent_lederberg
21525
$ sudo nsenter --target 21525 --mount --uts --ipc --net --pid
root@93bd7a1a1bdf:/#

解析:

  1. docker run -idt ubuntu:
    -t选项让docker分配一个伪终端并绑定到标准输入上,-i让容器的标准输入保持打开,-i -t通常同时出现。
    -d以守护态运行容器,即容器在后台运行
  2. docker inspect --format "{{ .State.Pid }}" fervent_lederberg:
    docker inspect输出容器的低级信息,格式是Json
    --format "{{ .State.Pid }}"向输出结果传递参数,只查看Pid信息
    fervent_lederberg容器名,上文通过docker ps命令获取到的。
    3.nsenter参数详解
nsenter [options] [program [arguments]]

options:
-t, --target pid:指定被进入命名空间的目标进程的pid
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
-G, --setgid gid:设置运行程序的gid
-S, --setuid uid:设置运行程序的uid
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录

如果没有给出program,则默认执行$SHELL

使用docker ps命令查看本地的docker 进程

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
654a3c5ec3d1        bulletinboard:1.0   "docker-entrypoint.s…"   10 hours ago        Up 10 hours         0.0.0.0:8000->8080/tcp   bb

使用docker inspect <NAME|ID>查看容器的信息,返回数据格式是json

"docker inspect" requires at least 1 argument.
See 'docker inspect --help'.

Usage:  docker inspect [OPTIONS] NAME|ID [NAME|ID...]

Return low-level information on Docker objects

# docker inspect 654a3c5ec3d1                
[
    {
        "Id": "654a3c5ec3d12af094cb8a685805fa651bcaa2e1c22c1d957807c667aceaf991",
        "Created": "2020-06-25T05:44:32.169640597Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "npm",
            "start"
        ],
        "State": {
            ...
        }
    }
]

docker export导出本地上的某个容器
docker import导入容器快照
docker rm删除一个处于终止状态的容器。如果要删除一个运行中的容器,可以添加-f参数。Docker 会发送 SIGKILL 信号给容器

1.2.4 数据卷Volumes

  1. 数据卷
    数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS(unix file system),可以提供很多有用的特性:
  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,直到没有容器使用

*数据卷的使用,类似于 Linux 下对目录或文件进行 mount。

  1. 创建一个数据卷
    在用 docker run命令的时候,使用-v标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。
    *注意:也可以在 Dockerfile 中使用 VOLUME 来添加一个或者多个新的卷到由该镜像创建的任意容器。

  2. 挂载一个主机目录作为数据卷
    使用 -v标记也可以指定挂载一个本地主机的目录到容器中去。
    Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro指定为只读。

  3. 挂载一个本地主机文件作为数据卷(不推荐!)
    -v标记也可以从主机挂载单个文件到容器中
    *注意:如果直接挂载一个文件,很多文件编辑工具,包括vi或者 sed --in-place,可能会造成文件 inode的改变,从 Docker 1.1 .0起,这会导致报错误信息。所以最简单的办法就直接挂载文件的父目录。

  4. 数据卷容器
    如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
    数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
    首先,创建一个命名的数据卷容器 dbdata:

$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

然后,在其他容器中使用 --volumes-from 来挂载 dbdata 容器中的数据卷。

$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres

还可以使用多个--volumes-from参数来从多个容器挂载多个数据卷。 也可以从其他已经挂载了数据卷的容器来挂载数据卷。

$ sudo docker run -d --name db3 --volumes-from db1 training/postgres

*注意:使用 --volumes-from参数所挂载数据卷的容器自己并不需要保持在运行状态。

如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用docker rm -v命令来指定同时删除关联的容器。 这可以让用户在容器之间升级和移动数据卷。具体的操作将在下一节中进行讲解。

  1. 利用数据卷容器来备份、恢复、迁移数据卷
    可以利用数据卷对其中的数据进行进行备份、恢复和迁移。

  2. 备份
    首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从本地主机挂载当前到容器的 /backup 目录。

$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

容器启动后,使用了 tar 命令来将 dbdata 卷备份为本地的 /backup/backup.tar

8.恢复
如果要恢复数据到一个容器,首先创建一个带有数据卷的容器 dbdata2

$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

然后创建另一个容器,挂载 dbdata2 的容器,并使用 untar解压备份文件到挂载的容器卷中。

$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
/backup/backup.tar

1.2.5 使用网络

  1. 外部访问容器
    容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 P-Pp-p 参数来指定端口映射。
    当使用 P-P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
    -p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

  2. 映射所有接口地址
    使用 hostPort:containerPort格式本地的 5000 端口映射到容器的 5000 端口,可以执行

$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
  1. 映射到指定地址的任意端口
    使用 ip::containerPort绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。
$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py

还可以使用 udp 标记来指定 udp 端口

$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
  1. 查看映射端口配置
    使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址
$ docker port nostalgic_morse 5000
127.0.0.1:49155.

注意:

容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。)
-p 标记可以多次使用来绑定多个端口
例如

$ sudo docker run -d -p 5000:5000  -p 3000:80 training/webapp python app.py
  1. 容器互联
    容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式。
    该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。

  2. 自定义容器命名
    连接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。
    虽然当创建容器的时候,系统默认会分配一个名字。自定义命名容器有2个好处:
    自定义的命名,比较好记,比如一个web应用容器我们可以给它起名叫web
    当要连接其他容器时候,可以作为一个有用的参考点,比如连接web容器到db容器
    使用 --name标记可以为容器自定义命名。

$ sudo docker run -d -P --name web training/webapp python app.py

使用 docker ps来验证设定的命名。

$ sudo docker ps -l
CONTAINER ID  IMAGE                  COMMAND        CREATED       STATUS       PORTS                    NAMES
aed84ee21bde  training/webapp:latest python app.py  12 hours ago  Up 2 seconds 0.0.0.0:49154->5000/tcp  web

也可以使用 docker inspect来查看容器的名字

$ sudo docker inspect -f "{{ .Name }}" aed84ee21bde
/web

注意:容器的名称是唯一的。如果已经命名了一个叫 web 的容器,当你要再次使用 web 这个名称的时候,需要先用docker rm 来删除之前创建的同名容器。
在执行 docker run的时候如果添加 --rm标记,则容器在终止后会立刻删除。注意,--rm-d参数不能同时使用。

  1. 使用 --link参数可以让容器之间安全的进行交互。
    下面先创建一个新的数据库容器。
$ sudo docker run -d --name db training/postgres

删除之前创建的 web 容器

$ docker rm -f web

然后创建一个新的 web 容器,并将它连接到 db 容器

$ sudo docker run -d -P --name web --link db:db training/webapp python app.py

此时,db 容器和 web 容器建立互联关系。

--link参数的格式为 --link name:alias,其中 name是要链接的容器的名称,alias是这个连接的别名。
使用 docker ps来查看容器的连接

$ docker ps
CONTAINER ID  IMAGE                     COMMAND               CREATED             STATUS             PORTS                    NAMES
349169744e49  training/postgres:latest  su postgres -c '/usr  About a minute ago  Up About a minute  5432/tcp                 db, web/db
aed84ee21bde  training/webapp:latest    python app.py         16 hours ago        Up 2 minutes       0.0.0.0:49154->5000/tcp  web

可以看到自定义命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。这表示 web 容器链接到 db 容器,web 容器将被允许访问 db 容器的信息。

Docker 在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上。在启动 db 容器的时候并没有使用 -p 和 -P 标记,从而避免了暴露数据库端口到外部网络上。

Docker 通过 2 种方式为容器公开连接信息:

  • 环境变量
  • 更新 /etc/hosts 文件

使用 env 命令来查看 web 容器的环境变量

$ sudo docker run --rm --name web2 --link db:db training/webapp env
. . .
DB_NAME=/web2/db
DB_PORT=tcp://172.17.0.5:5432
DB_PORT_5000_TCP=tcp://172.17.0.5:5432
DB_PORT_5000_TCP_PROTO=tcp
DB_PORT_5000_TCP_PORT=5432
DB_PORT_5000_TCP_ADDR=172.17.0.5
. . .

其中 DB_ 开头的环境变量是供 web 容器连接 db 容器使用,前缀采用大写的连接别名。

除了环境变量,Docker 还添加 host 信息到父容器的/etc/hosts的文件。下面是父容器 web 的 hosts 文件

$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7  aed84ee21bde
. . .
172.17.0.5  db

这里有 2 个 hosts,第一个是 web 容器,web 容器用 id 作为他的主机名,第二个是 db 容器的 ip 和主机名。 可以在 web 容器中安装 ping 命令来测试跟db容器的连通。

root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
root@aed84ee21bde:/opt/webapp# ping db
PING db (172.17.0.5): 48 data bytes
56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms
56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms

用 ping 来测试db容器,它会解析成 172.17.0.5。 *注意:官方的 ubuntu 镜像默认没有安装 ping,需要自行安装。

用户可以链接多个父容器到子容器,比如可以链接多个 web 到 db 容器上。

二、使用

2.1 VMware Workstation 15 与 Docker兼容问题(Windows)

解决方法:解决VMware Workstation 15 与Device/Credential Guard不兼容的问题

2.2 CentOS 7 手动安装Docker

  1. 存在就删除旧版本docker
sudo yum remove docker \
                   docker-client \
                   docker-client-latest \
                   docker-common \
                   docker-latest \
                   docker-latest-logrotate \
                   docker-logrotate \
                   docker-engine
已加载插件:fastestmirror, langpacks
参数 docker 没有匹配
参数 docker-client 没有匹配
参数 docker-client-latest 没有匹配
参数 docker-common 没有匹配
参数 docker-latest 没有匹配
参数 docker-latest-logrotate 没有匹配
参数 docker-logrotate 没有匹配
参数 docker-engine 没有匹配
不删除任何软件包

  1. 首次安装Docker Engine-Community之前,需要指定Docker仓库。之后可以从仓库安装和更新Docker
    设置仓库,首先安装依赖
sudo yum install -y yum-utils \
   device-mapper-persistent-data \
   lvm2
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.huaweicloud.com
 * centos-sclo-rh: mirror.bit.edu.cn
 * centos-sclo-sclo: mirror.bit.edu.cn
 * epel: mirrors.yun-idc.com
 * extras: mirror.bit.edu.cn
 * updates: mirror.bit.edu.cn
软件包 yum-utils-1.1.31-54.el7_8.noarch 已安装并且是最新版本
软件包 device-mapper-persistent-data-0.8.5-2.el7.x86_64 已安装并且是最新版本
软件包 7:lvm2-2.02.186-7.el7_8.2.x86_64 已安装并且是最新版本
无须任何处理

使用阿里源地址设置稳定的仓库

sudo yum-config-manager \
     --add-repo \
     http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已加载插件:fastestmirror, langpacks
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo

  1. 安装 Docker Engine-Community
    安装最新版本
 sudo yum install docker-ce docker-ce-cli containerd.io
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
...
更新完毕:
  docker-ce.x86_64 3:19.03.12-3.el7    docker-ce-cli.x86_64 1:19.03.12-3.el7

完毕!
  1. 安装指定版本Docker
    首先查看仓库内可用版本有哪些
 yum list docker-ce --showduplicates | sort -r

已加载插件:fastestmirror, langpacks
已安装的软件包
可安装的软件包
 * updates: mirror.bit.edu.cn
Loading mirror speeds from cached hostfile
 * extras: mirror.bit.edu.cn
 * epel: mirrors.yun-idc.com
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            17.03.2.ce-1.el7.centos            docker-ce-stable
docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
 * centos-sclo-sclo: mirror.bit.edu.cn
 * centos-sclo-rh: mirror.bit.edu.cn
 * base: mirrors.huaweicloud.com

通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。

 sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
  1. 启动Docker
sudo systemctl start docker
  1. 运行 hello-world 镜像验证是否正确安装了 Docker Engine-Community 。
sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

  1. 运行docker image ls列出下载到计算机上的镜像
  2. 列出hello-world显示消息后退出的容器(由图像生成)。如果它仍在运行,则不需要以下--all选项

2.3 制作Docker镜像

  1. 通过Git下载一个示例项目
git clone https://github.com/dockersamples/node-bulletin-board
cd node-bulletin-board/bulletin-board-app
  1. 为一个容器定义Dockerfile
    Dockerfile描述了如何为一个容器安装专有的文件系统,同时也可以包含一些元数据(metadata)来描述如何基于此镜像运行一个容器。
    Dockerfile示例
# 使用官方镜像作为父镜像
FROM node:current-slim

# 设置工作目录
WORKDIR /usr/src/app

# 将文件从主机复制到当前位置
COPY package.json .

# 在镜像文件系统中运行该命令
RUN npm install

# 通知Docker容器在运行时监听指定的端口
EXPOSE 8080

# 在容器中运行指定的命令
CMD [ "npm", "start" ]

# 将应用程序的其余源代码从主机复制到镜像文件系统
COPY . .
  1. 使用docker build命令通过Dockerfile文件构建镜像
    首先确保当前路径位于项目执行目录下。
docker build --tag bulletinboard:1.0 .
Sending build context to Docker daemon  45.57kB
Step 1/7 : FROM node:current-slim
current-slim: Pulling from library/node
7d2977b12acb: Pull complete
23e9a36a6e2d: Pull complete
831103f0eed4: Pull complete
f172d5646bed: Pull complete
9f1d0c9b6ec5: Pull complete
Digest: sha256:4f837156a4bc43b6c8af7195dd7dbfc0b46e6f3515f777e2cb53139dc4faee33
Status: Downloaded newer image for node:current-slim
 ---> 0e2e78467169
...
Step 6/7 : CMD [ "npm", "start" ]
 ---> Running in 5fb8e209296e
Removing intermediate container 5fb8e209296e
 ---> 609ae5029141
Step 7/7 : COPY . .
 ---> 2cfe87792e72
Successfully built 2cfe87792e72
Successfully tagged bulletinboard:1.0

Successfully tagged bulletinboard:1.0看到这个说明镜像构建成功

  1. 基于镜像来启动容器
docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0

–publish 要求Docker将主机端口8000上传入的流量转发到容器的端口8080。容器具有自己的专用端口集,因此,如果要从网络访问某个端口,则必须以这种方式将流量转发到该端口。否则,作为默认的安全状态,防火墙规则将阻止所有网络流量到达您的容器。
–detach 要求Docker在后台运行此容器。
–name 指定一个名称,在后续命令中,您可以使用该名称来引用您的容器bb

  1. 删除容器
docker rm --force bb

2.4 在Docker Hub上共享镜像

2.4.1 创建Docker Hub账户

  1. 访问Docker注册页面
  2. 创建Docker ID
  3. 使用docker login登录Docker Hub
docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: 
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

2.4.2 创建Docker Hub仓库并推送镜像到仓库中

  1. Docker Hub仓库界面下搜索或创建仓库
  2. 镜像命名格式必须正确<Your Docker ID>/<Repository Name>:<tag>
    修改镜像名称
docker tag bulletinboard:1.0 <Your Docker ID>/bulletinboard:1.0

  1. 将镜像推送到Docker Hub
docker push <Your Docker ID>/bulletinboard:1.0

2.5 Docker部署自定义mysql

在官方仓库的mysql镜像页面也有较为详细的描述。传送门

  1. 这里采取重新构建镜像的方式,设置监听端口后再重新外挂配置文件,构建时需要两个文件Dockerfile和docker-entrypoint.sh获取地址
  1. 本地新建配置文件/home/mysql_config_volume/my.cnf
    直接外挂配置文件修改端口的方式是不行的,因为镜像在构建时设置的监听端口是3306或33060,外挂的配置文件修改端口为别的会出现错误,mysql无法启动,在XXX路径下确实套接字文件
  1. 在docker hub上搜索mysql,选择版本进行下载docker pull mysql:5.7.30
  2. 拉取镜像到本地docker pull mysql:5.7.30
  3. 运行docker run --name mysqldef -e MYSQL_ROOT_PASSWORD=123456 -p 8060:8060 -d mysql:5.7.30
  4. docker ps查看运行状态和id
  5. 进入docker查看配置文件位置,拉取配置文件到本地
docker cp 95e2bc0c1955:/etc/mysql/my.cnf /home
docker cp 95e2bc0c1955:/etc/mysql/cnf.d /home
docker cp 95e2bc0c1955:/etc/mysql/conf.d /home
docker cp 95e2bc0c1955:/etc/mysql/mysql.cnf /home
docker cp 95e2bc0c1955:/etc/mysql/mysql.conf.d /home

挨个查看后mysql.cnf内有如下内容:

# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
#...
#...
#...
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

说明该文件是引用/etc/mysql/conf.d/ 和 /etc/mysql/mysql.conf.d/打开后查看,发现有[mysql]字段

[mysql]

mysqld.cnf内有如下字段,so,这个就可以作为配置文件

# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation.  The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
#log-error	= /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address	= 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

在复制到本地的mysqld.cnf内加入以下内容:

#[mysqld]下追加
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
port=8060

#新增
[client]
default-character-set=utf8

#新增 
[mysql]
default-character-set=utf8
  1. 根据使用的镜像mysql:5.7.30的DockerFile文件,进行修改后重新构建镜像
    我使用的镜像的dockerfile文件链接:传送门
    修改内容:
EXPOSE 3306 33060    改为    EXPOSE 8060

文件最下方的
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
改为
RUN chmod 777 /usr/local/bin/docker-entrypoint.sh \
    && ln -s /usr/local/bin/docker-entrypoint.sh /
  1. 运行命令docker build --tag tutumysqldef:1.0 .开始构建镜像

如果Get:5 http://deb.debian.org/debian XXX XXX Packages [XXX kB]速度过慢,可以考虑换源
在dockerfile同级路径下创建source.list,在里面添加如下内容

deb https://mirrors.aliyun.com/debian/ jessie main non-free contrib
deb https://mirrors.aliyun.com/debian/ jessie-updates main non-free contrib
deb https://mirrors.aliyun.com/debian/ jessie-backports main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ jessie main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ jessie-updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ jessie-backports main non-free contrib
deb https://mirrors.aliyun.com/debian-security/ jessie/updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian-security/ jessie/updates main non-free contrib

在dockerfile文件下追加mv /etc/apt/sources.list /etc/apt/sources.list.bak \ mv sources.list /etc/apt/这两行代码

FROM debian:buster-slim

# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysql

RUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/* \
    mv /etc/apt/sources.list /etc/apt/sources.list.bak \
    mv sources.list /etc/apt/

重新执行构建命令

ps:构建过程挺费时间的🙃

  1. 在看到Successfully built 1586b8bca605 和 Successfully tagged tutumysqldef:1.0说明构建成功!
Removing intermediate container 888c469c23b3
 ---> 2d1b737ab012
Step 18/18 : CMD ["mysqld"]
 ---> Running in 7405cd981558
Removing intermediate container 7405cd981558
 ---> 1586b8bca605
Successfully built 1586b8bca605
Successfully tagged tutumysqldef:1.0
[root@iZ8vbbex0a45m3rtafksvkZ mysql_def]# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
tutumysqldef              1.0                 1586b8bca605        26 seconds ago      448MB

10.使用命令 docker run -idt -p 8060:8060 --name=tutumysql -e MYSQL_ROOT_PASSWORD=123456 tutumysqldef:1.0先运行测试以下,发现容器正常启动。

docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                    NAMES
6bb22f5bf373        tutumysqldef:1.0           "docker-entrypoint.s…"   7 seconds ago       Up 6 seconds        0.0.0.0:8060->8060/tcp   tutumysql
160cc39672e6        scrapinghub/splash:3.5.0   "python3 /app/bin/sp…"   5 days ago          Up 5 days           0.0.0.0:8050->8050/tcp   reverent_darwin

停止容器,删除容器,外挂配置文件、数据卷、日志卷重新运行

  1. 本地新建数据卷路径/home/mysql_def/mysql_data_volume/
  2. 本地新建日志卷路径/home/mysql_def/mysql_logs/message.log,暂时挂不上,后面再找找方法。
  3. 将配置文件移动到mv /home/mysql.conf.d /home/mysql_def/
  4. 后台运行mysql并挂载配置文件和本地数据卷、日志卷
docker run -idt -p 8060:8060 -v /home/mysql_def/mysql.conf.d/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /home/mysql_def/mysql_data_volume:/var/lib/mysql --name=tutumysql -e MYSQL_ROOT_PASSWORD=123456 tutumysqldef:1.0

-v /home/mysql_def/mysql_logs/message.log:/var/log/mysql/message.log
注意:-it参数是必须的,因为容器中启动mysql后,mysql进程需要一个终端用于交互,-t参数就是在容器中打开一个伪终端,-i参数是打开标准输入并绑定到伪终端。容器中没有为mysql分配终端会导致其进入Exited (1)

  1. 使用docker ps查看mysql是否启动成功
524ae1917431047c04d748d37c47fb20e48d0bb23e43f733afb1537d175bc792
docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                    NAMES
524ae1917431        tutumysqldef:1.0           "docker-entrypoint.s…"   4 seconds ago       Up 3 seconds        0.0.0.0:8060->8060/tcp   tutumysql
  1. 使用docker inspect 524ae1917431查看容器内mysql的信息
"Name": "/tutumysql",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/home/mysql_def/mysql.conf.d/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf",
                "/home/mysql_def/mysql_data_volume:/var/lib/mysql"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "8060/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "8060"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
  1. 进入容器docker exec -it 524ae1917431 /bin/bash,进入mysql cmdmysql -u root -p
    成功进入,查看相关配置信息,符合要求!成功!!!
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.30 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, 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> status;
--------------
mysql  Ver 14.14 Distrib 5.7.30, for Linux (x86_64) using  EditLine wrapper

Connection id:          2
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.7.30 MySQL Community Server (GPL)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/run/mysqld/mysqld.sock
Uptime:                 5 min 49 sec

Threads: 1  Questions: 5  Slow queries: 0  Opens: 105  Flush tables: 1  Open tables: 98  Queries per second avg: 0.014
--------------
mysql> show global variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 8060  |
+---------------+-------+
1 row in set (0.00 sec)

赋予root用户权限

use mysql;

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY '123456' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON . TO ‘root’@’%’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION;
flush privileges;重新加载权限表
GRANT:赋权命令
ALL PRIVILEGES:当前用户的所有权限
ON:介词
*.*:当前用户对所有数据库和表的相应操作权限
TO:介词
‘root’@’%’:权限赋给root用户,所有ip都能连接
IDENTIFIED BY ‘123456’:连接时输入密码,密码为123456
WITH GRANT OPTION:允许级联赋权

参考资料:https://blog.csdn.net/u010953706/article/details/95985946
参考资料:https://blog.csdn.net/coco3600/article/details/100232625

撤销已经赋予用户的权限
revoke 跟 grant 的语法差不多,需要将关键字 “to” 换成 “from” :
grant all on *.* to dba@localhost;
revoke all on *.* from dba@localhost;

使用测试数据验证数据库是否可用

cd /home
git clone [email protected]:datacharmer/test_db.git

#将测试数据复制到容器中
docker cp /home/test_db 524ae1917431:/home/

docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                    NAMES
524ae1917431        tutumysqldef:1.0           "docker-entrypoint.s…"   3 days ago          Up 3 days           0.0.0.0:8060->8060/tcp   tutumysql
160cc39672e6        scrapinghub/splash:3.5.0   "python3 /app/bin/sp…"   8 days ago          Up 8 days           0.0.0.0:8050->8050/tcp   reverent_darwin

#进入容器
docker exec -it 524ae1917431 /bin/bash

#查看文件是否存在
root@524ae1917431:/# cd /home
root@524ae1917431:/home# dir
test_db

#修改文件权限
chmod 755 /home/test_db

#进入mysql
mysql -u root -p

#执行导入命令
source /home/test_db/employees.sql
Query OK, 8 rows affected (0.06 sec)

Query OK, 1 row affected (0.00 sec)

Database changed
+-----------------------------+
| INFO                        |
+-----------------------------+
| CREATING DATABASE STRUCTURE |
+-----------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected, 6 warnings (0.00 sec)
......
......
Query OK, 24919 rows affected (0.17 sec)
Records: 24919  Duplicates: 0  Warnings: 0

Query OK, 7671 rows affected (0.09 sec)
Records: 7671  Duplicates: 0  Warnings: 0

+---------------------+
| data_load_time_diff |
+---------------------+
| 00:00:32            |
+---------------------+
1 row in set (0.00 sec)

数据导入成功

查看本地数据卷如图,符合预期。
在这里插入图片描述
远程连接数据库如图,符合预期
在这里插入图片描述

参考资料:https://www.cnblogs.com/zst062102/p/11132916.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章