1. docker概述

1.1 简介

Docker是基于Go语言实现的云开源项目。

Docker的主要目标是:Build, Ship and Run Any App, Anywhere,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP及其运行环境能做到一次镜像,处处运行

Linux容器技术的出现就解决了这样一个问题,而Docker就是再它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

docker理念:解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

1.2 传统虚拟机和容器

1.传统虚拟机(virtual machine):

传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(如VirtualBox、VMware等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。

缺点:资源占用多、冗余步骤多、启动慢。

2.Linux容器(Linux Container,简称LXC):

Linux容器是与系统其他部分分隔开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一的运行。

3.两者对比

特性 Docker容器 虚拟机(VM)
操作系统 与宿主机共享OS 宿主机OS上运行虚拟机OS
存储大小 镜像小,便于存储与传输 镜像庞大(vmdk、vdi等)
运行性能 几乎无额外性能损失 操作系统额外的CPU、内存消耗
移植性 轻便、灵活,适用于Linux 笨重,与虚拟化技术耦合度高
硬件亲和性 面向软件开发者 面向硬件运维者
部署速度 快速,秒级 较慢,10s以上

1.3 Docker运行速度快的原因

  • Docker有比虚拟机更少的抽象层:

    • 由于Docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上docker有明显优势。
  • Docker利用的是宿主机的内核,而不需要加载操作系统OS内核:

    • 当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较耗时耗资源的过程。当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而Docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。
  • Docker容器的本质就是一个进程。

1.4 Docker软件

Docker并非一个通用的容器工具,它依赖于已经存在并运行的Linux内核环境。在Windows上安装Docker时需要依赖WLS,即Windows下的Linux子系统。

Docker实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的Linux主机。

Docker的基本组成部分(三要素):

  • 镜像(image):就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建多个容器。

  • 容器(container):Docker利用容器独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。

  • 仓库(repository):是集中存放镜像文件的场所。

1.5 Docker架构

Docker是一个 C/S(Client-Server) 结构的系统,后端是一个松耦合架构,众多模块各司其职。

Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从容器接收命令并管理运行在主机上的容器。

Docker运行的基本流程为:

  • 用户是使用Docker Client 与 Docker Daemon 建立通信,并发送请求给后者

  • Docker Daemon 作为 Docker 架构的主体部分,首先提供 Docker Server 的功能使其可以接收 Docker Client 的请求

  • Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式存在

  • Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph Driver 将下载镜像以 Graph 的形式存储

  • 当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境

  • 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Exec driver 来完成

  • Libcontainer 是一项独立的容器管理包,Network driver 以及 Exec driver 都是通过 Libcontainer 来实现具体对容器进行的操作

2. 安装docker

2.1 linux系统

1.安装gcc:yum -y install gcc

2.安装g++:yum -y install gcc-c++

3.# yum-util提供yum-config-manager功能:yum install -y yum-utils

4.配置docker的资源库(阿里云镜像地址):

1
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

5.更新yum软件包索引(可选):yum makecache fast

6.安装Docker引擎:yum install docker-ce docker-ce-cli containerd.io

7.启动docker:systemctl start docker

  • 通过ps -ef | grep docker查看启动的docker

  • 此时查看docker版本,可以看到Server: Docker Engine(Docker引擎)版本号:docker version

8.测试:docker run hello-world

其它命令:

使用yum删除docker引擎 :yum remove docker-ce docker-ce-cli containerd.io

删除镜像、容器、卷、自定义配置等文件 :

1
2
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

2.2 配置加速器

daemon.json中写入内容,终端执行如下命令:

1
2
3
4
5
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://u7fgx15j.mirror.aliyuncs.com"]
}
EOF

然后刷新配置、重启docker即可:

1
2
systemctl daemon-reload
systemctl restart docker

注意:但是发现这样配置加速器后,当执行docker run hello-world时,依然会拉取不成功,出现以下问题:

解决方案1(推荐):

1.在/etc/docker/daemon.json文件中改写为以下内容:

1
2
3
4
5
6
7
8
9
10
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}

2.然后刷新配置、重启docker

1
2
systemctl daemon-reload
systemctl restart docker

3.检查registry mirror刚刚配置的加速地址是否成功,执行docker info

当最下面能看到如下内容,表示配置成功:

4.执行docker run hello-world就可以发现成功了

run的作用:开始时,Docker在本机中寻找该镜像,如果本机有该镜像,就以该镜像为模板生产容器实例运行;如果本机没有该镜像,就去Docker Hub上查找该镜像,Hub如果能找到,就下载该镜像到本地,以该镜像为模板生产容器实例运行;如果Hub不能找到,就返回失败错误,查不到该镜像。

解决方案2:由于目前国内的许多镜像都被停用了,所以想要拉取镜像,得用一些不常规的方法,如下所示:

先在/etc/docker/daemon.json里面添加如下内容:

1
2
3
4
5
{
"registry-mirrors": [
"https://register.liberx.info"
]
}

重新启动docker后,如果想要docker search,在终端执行是不管用的,得在网址https://register.liberx.info/提供的页面里输入相应的镜像查看,该页面所提供的镜像版本都可以在linux终端通过docker pull;来拉取获得。

3 .Docker常用命令

3.1 帮助启动类命令

1.启动docker:systemctl start docker

2.停止docker:systemctl stop docker

3.重启docker:systemctl restart docker

4.查看docker状态:systemctl status docker

5.开机自启动:systemctl enable docker

6.查看docker概要信息:docker info

7.查看docker总体帮助文档:docker --help

8.查看docker命令帮助文档:docker 具体命令 --help

3.2 镜像命令

1.列出本地主机上的镜像:docker images

REPOSITORY:表示镜像的仓库源

TAG:镜像的标签版本号

IMAGE ID:镜像ID

CREATED:镜像创建时间

SIZE:镜像大小

同一仓库源可以有多个TAG版本,代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG来定义不同的镜像。如果不指定一个镜像的版本标签。例如只使用ubuntu,docker将默认使用ubuntu:latest镜像

OPTIONS说明:

  • -a:列出本地所有的镜像(含历史映像层)
  • -q:只显示镜像ID

2.查镜像:docker search 某个xxx镜像名字

含义:通过相应的镜像加速器去Hub(远程仓库)上面去查找有无需要的镜像

属性解释:

参数 说明
NAME 镜像名称
DESCRIPTION 镜像说明
STARS 点赞数量
OFFICIAL 是否是官方的
AUTOMATED 是否是自动构建的

OPTIONS说明:

  • –limit:只列出N个镜像,默认是25个
  • docker search –limit 5 redis:表示只列出5个redis镜像

3.拉取镜像:docker pull 某个xxx镜像名字

  • pull镜像名字的时候,如果没有加对应的版本号,就默认下载最新的版本:latest,如docker pull redis:6.0.8是下载redis的6.0.8版本

4.查看镜像/容器/数据卷所占的空间:docker system df

5.删除镜像:docker rmi 某个xxx镜像名字ID

  • 有些情况下,因为某种原因,不能直接删除对应的镜像,这时就需要通过docker rmi -f 镜像名字ID强制删除

  • 如果需要删除多个镜像,后面进行追加即可,如果需要删除全部镜像,可以通过docker rmi -f $(docker images -qa)实现

面试题:谈谈docker虚悬镜像是什么?

仓库名、标签都是的镜像,就俗称虚悬镜像dangling image。这种镜像建议删除,没什么用,有时候docker构建的时候,会出现一些问题。

3.3 容器命令

有镜像才能创建容器,这是根本前提。镜像是模板,容器是实例

1.新建+启动容器 ——->启动交互式容器(前台命令行)

指令:docker run [OPTIONS] image [COMMAND] [ARG…]

OPTIONS说明(常用):有些是一个减号,有些是两个减号

  • –name=”容器新名字”:为容器指定一个名称(没有取的话,系统会随机取一个名字);

  • -d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行);

  • -i:以交互模式运行容器,通常与-t同时使用;

  • -t:为容器重新分配一个伪输入终端,通过与-i同时使用。也即启动交互式容器(前台有伪终端,等待交互)

  • -P:随机端口映射,大写P

  • -p:指定端口映射,小写p

如:docker run -it ubuntu /bin/bash

  • ubuntu:ubuntu镜像
  • /bin/bash:放在镜像名后的是命令,这里希望有个交互式Shell,因此用的是/bin/bash
  • 退出终端,直接输入exit

2.列出当前所有正在运行的容器

指令:docker ps [OPTIONS]

OPTIONS说明:

  • -a:列出当前所有正在运行的容器+历史上运行过的
  • -l:显示最近创建的容器
  • -n 数字:显示最近(数字)个创建的容器
  • -q:静默模式,只显示容器编号

例子:再通过ubuntu镜像创建一个容器实例,然后查看

1
2
docker run -it --name=myu1 ubuntu bash
docker ps

结果如下:

3.退出容器

  • exit:run进行容器,exit退出,容器停止
  • ctrl+p+q:run进去容器,ctrl+p+q退出,容器不停止

4.启动已停止运行的容器:docker start 容器ID或者容器名

5.重启容器:docker restart 容器ID或者容器名

6.停止容器:docker stop 容器ID或者容器名

7.强制停止容器:docker kill 容器ID或者容器名

8.删除已停止的容器:docker rm 容器ID

  • 加-f可以强制删除活着的容器

  • 一次性删除多个容器实例:

    • docker rm -f $(docker ps -a -q)
    • docker ps -a -q | xargs docker rm

9.启动守护式容器(后台服务器)

在大部分的场景下,我们希望docker的服务是在后台运行的,这样就可以通过-d指定容器的后台运行模式。

问题:使用镜像ubuntu:latest以后台模式启动一个容器,终端执行docker run -d ubuntu后,用docker ps -a进行查看,会发现容器已经退出。所以非常重要的一点是,docker容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行top、tail),就是会自动退出的。所以有些镜像-d是不可以的,doekcr机制必须要用-it。

对应像mysql和redis等应用,使用前台交互式启动docker run -it redis:6.0.8是不怎么合理的,因为不小心关掉窗口或ctrl+c都容易导致服务停止,容易误伤。所以以后台守护式启动更加合理。

10.查看容器的日志:docker logs 容器ID

11.查看容器内运行的进程:docker top 容器ID

12.查看容器内部细节:docker inspect 容器ID

13.进入正在运行的容器并以命令行交互

  • docker exec -it 容器ID bin/bash
  • docker attach 容器ID

应用:当是通过ctrl+p+q退出的容器,但其容器还在运行,或者像进入一些通过后台守护式启动的容器,可以通过上面两种方法重新进入容器。

两者之间的区别:

  • attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出后,会导致容器停止
  • exec是在容器中打开新的终端,并且可以启动新的进程,用exec退出后,不会导致容器停止(建议使用)

14.从容器内拷贝文件到主机上:docker cp 容器ID:容器内路径 目的主机路径

例子:将容器ID为ddb1ae909a66容器里面目录文件/tmp/a.txt拷贝到主机的/test目录下:

1
docker cp ddb1ae909a66:/tmp/a.txt /test

15.导入和导出容器

  • export导出容器的内容留作为一个tar归档文件
    • 指令:docker export 容器ID > 文件名.tar
  • import从tar包中的内容创建一个新的文件系统再导入为镜像
    • 指令:cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

4. Docker镜像

镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好行程一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

只有通过这个镜像文件才能生成Docker容器实例。

4.1 联合文件系统

联合文件系统(UnionFS):Union文件系统,是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行集成,基于基础镜像可以制作具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

4.2 Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就叫联合文件系统。

bootfs(boot file system)主要包含 bootloader 和 kernel,bootloader主要是引导加载 kernel,Linux刚启动时会加载bootfs文件系统。在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已经由 bootfs 转交给内核,此时系统也会卸载 bootfs。

rootfs(root file system,在bootfs之上,包含的就是典型Linux系统中的 /dev/proc/bin/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu、CentOS等。

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接使用Host的Kernel,自己只需要提供rootfs就可以。所以,对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,不同的发行版可以共用bootfs。

Docker镜像要采用这种分层结构的原因:镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。

比如说有多个镜像都从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像;同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

4.3 容器层

Docker镜像层都是只读的,容器层是可写的

当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

所有对容器的改动,即添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

4.4 Docker镜像commit操作

docker commit提交容器副本使之成为一个新的镜像

  • docker commit -m=”提交的描述信息” -a=”作者” 容器ID 要创建的目标镜像名:[标签名]

案例:演示ubuntu安装vim

  1. 从Hub上下载ubuntu镜像到本地并成功运行,原始的默认ubuntu镜像是不带着vim命令的

    • 下载镜像:docker pull ubuntu
    • 运行:docker run -it ubuntu /bin/bash
  2. 外网连通的情况下,安装vim

    • 先更新包管理工具:apt-get update
    • 然后安装需要的vim:apt-get install vim
  3. 安装完成后,commit一个新镜像(与之前镜像不一样的)

    • docker commit -m="vim cmd add ok" -a="lxx" 734e289931b0 lxxmake/myubuntu:1.0

    • 查看本地镜像:docker images

  4. 启动新镜像后,可以使用vim编辑

    • docker run -it lxxmake/myubuntu:1.0 /bin/bash

总结:Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。新镜像是从base镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

4.5 本地镜像发布到阿里云

1.进入阿里云官网,先点击左上角的列表,点击容器里面的容器镜像服务。

2.在弹出的如下页面,先完成个人实例的创建

3.点击创建命名空间,随便取一个名字即可

4.为刚刚创建的命名空间创建一个镜像仓库

5.填写完相关信息,进入下一步,选择本地仓库。

6.完成以上操作后,就会有该界面了,点击管理进入仓库管理

7.点击管理后,就会进入该页面,这里有从我们本地将镜像推送到阿里云的步骤,也有从阿里云拉取镜像会本地的方法。

下面是我在linux系统上操作的情况:首先是将本地自己写的镜像拉取到阿里云(操作1、操作2、操作3),然后删除本地的这个镜像(操作4),在确保本地没有该镜像后,再从阿里云上拉取回刚刚推送的镜像(操作5)。

4.6 本地镜像发布到私有库

官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。

操作步骤:省略

5. 容器卷

容器卷有点类似于Redis里面的rdb和aof文件,将docker容器内的数据保存进宿主机的磁盘中,以达到数据的持久化和敏感重要数据的备份(通过映射目录实现)。

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

作用:众所周知,将运用与运行的环境打包镜像,run后形成容器实例运行,但是我们是希望数据能够持久化的。Docker容器产生的数据,如果不进行备份,那么当容器实例删除后,容器内的数据自然也就没有了。为了能够保存数据在docker中,所以就需要使用卷了。

特点:

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接实时生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

1.运行一个带有容器卷存储功能的容器实例:docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

案例1:宿主和容器之间映射添加容器卷

首先是通过带有容器卷存储功能的方式进入容器,这里指明了本地的映射目录是/docker/host_data,容器里面对应的映射目录是/docker/docker_data。

下面是完成映射绑定之后,对应的容器端,在这容器里面的映射目录下创建的文件,会同步到本地映射目录下。

下面是本地映射目录端,在这里面创建的文件,也会同步映射到容器对应的映射目录下。

注意:当把容器停掉之后,在本地映射目录下继续添加、修改文件等操作,都还是会同步到容器对应的映射目录下。

2.读写规则映射添加说明

上面的操作是默认支持读写规则的,但有些情况下,只是像将本地的内容映射到容器,而不想容器能进行修改,即容器自己只能读取不能写,就需要通过ro来进行指明。

指令:docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

3.卷的继承和共享

指令:通过--volumes-from 父类名来完成

案例2:以ubuntu镜像为例,实现继承操作

容器1先完成和宿主机的映射:docker run -it –privileged=true -v /tmp/host_data:/tmp/docker_data –name=u1 ubuntu

容器2继承容器1的卷规则:docker run -it –privileged=true –volumes-from u1 –name=u2 ubuntu

需要了解的是,在完成上面两个指令后,之前容器u1和宿主机映射目录的文件,在容器u2中也具备了,u2在继承下来的映射目录下进行添加或修改文件等操作也会同步到u1和宿主机中。

6. docker常规软件安装

总体步骤:

  1. 搜索镜像

  2. 拉取镜像

  3. 查看镜像

  4. 启动镜像(服务端口映射)

  5. 停止容器

  6. 移除容器

6.1 tomcat安装

1.在docker hub官网https://hub.docker.com/上面查找tomcat镜像,如果有对应的镜像,才能拉取下载到本地。

2.从docker hub上拉取tomcat镜像到本地:docker pull tomcat

3.查看是否有拉取到的tomcat:docker images

4.使用tomcat镜像创建容器实例(运行镜像)

  • 指令:docker run -it -p 8080:8080 tomcat
    • -p:小写,主机端口:docker容器端口
    • -P:大写,随机分配端口
    • -i:交互
    • -t:终端
    • -d:后台

5.访问猫主页

  • 问题:当进入tomcat后,在虚拟机的火狐上通过localhost:8080访问时,不会弹出一只猫的页面,这是不正常的。
  • 原因:这是因为在新版的tomcat中做了改变,在通过docker exec -it 9aada4d3af80 /bin/bash进入tomcat后,它的webapps目录下的内容为空。真正有内容的已经被改为了webapps.dist文件夹
  • 解决方法:
    • 通过rm -r webapps删除该文件夹
    • 通过mv webapps.dist webapps将文件夹webapps.dist重新命名为webapps
    • 这样就完成了,在虚拟机上搜索localhost:8080就可以看到了一只猫的页面了

补充:所有的docker容器实例其本质而言均是一个迷你版的、精简版的内核版的linux

6.免费改版说明

可以通过下载非最新版来避免上面一系列的繁琐操作,运行后直接通过localhost:8080访问得到一只猫的页面了

  • 下载镜像:docker pull billygoo/tomcat8-jdk8
  • 后台运行:docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

6.2 安装mysql

1.在docker hub上面查找mysql镜像

2.从docker hub上拉取mysql镜像到本地标签为5.7(这里以5.7版本为例)

  • 下载拉取:docker pull mysql:5.7

3.使用mysql15.7镜像创建容器(运行镜像)

  • 指令:docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    • 注意:当linux服务器上本身装了mysql,且是启动的,所以在使用docker之前,端口3306就已经被占用了,所以在执行该命令之前,需要先将linux系统本身的mysql停掉

4.进入容器中的mysql

  • 进入装有mysql容器:docker exec -it 555d7763267c /bin/bash
  • 进入mysql:mysql -uroot -p
  • 输入密码123456,进入后所有操作和在linux上操作mysql一模一样
  • 查看使用的字符集:SHOW VARIABLES LIKE 'character%'; —–>发现使用的基本上都不是utf-8

5.完善

  • 问题:1.插入中文数据会出现报错乱码;2删除容器后,里面的mysql数据全没了

  • 解决方法:对容器里面mysql的日志、数据和配置进行挂载,即挂载3个容器卷。

    • 执行指令:docker run -d -p 3306:3306 –privileged=true -v /database/mysql/log:/var/log/mysql -v /database/mysql/ldata:/var/lib/mysql -v /database/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 –name mysql1 mysql:5.7

    • 在主机的/database/mysql/conf/文件夹下新建my.cnf,添加内容:

      1
      2
      3
      4
      5
      [client]
      default_character_set=utf8
      [mysqld]
      collation_server = utf8_general_ci
      character_set_server = utf8
    • 重新启动mysql容器实例,再重新进入:docker restart mysql1 —–>注意:mysql1是之前创建时取的容器名字