容器化部署初阶篇-docker之mysql安装

前言

很多年前就听说过docker,并且在自己的工作历程中,也不断地在尝试想将它使用起来,但是一直没有机会好好地研究一下,docker在现在的应用场景中用得越来越多,在各大社区论坛也难免会看到docker的身影,所以其实学习docker不管对于程序员还是运维人员都是非常不错的一个技术栈存储,希望这篇文章能给在读这篇文章的你带来一些工作上的帮助

很长时间没有写文章了,一直都是在有道云上做自己的笔记,没有把学习的东西变成文章发布出来,最近项目刚忙完,加上最近又在研究docker,心血来潮,写下此篇文章,用来记录一下自己的docker学历历程。


docker简介

我们来说一下什么是docker
在这里插入图片描述
我先来认识一下docker的图标,喏,就是上面这个玩意儿
在这里插入图片描述
不过最近docker的图标换了,更加精简了。(小声哔哔:虽然简约风简约不简单,但是感觉原来图标好看些)

我们再来看一下官方的介绍
在这里插入图片描述

Docker是Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源。
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。
Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。
总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

那么究竟什么是docker呢,看图标可以知道,一个个的集装箱。但是意味着什么呢。
相信做开发的人都用过虚拟机,virtualbox或者vmware,但是不管是virtualbox或者vmware是不是用起来都太过于重量级了?一个镜像几个G,启动起来后加载镜像还要做各种配置,例如配置redis、java环境、php环境等

那么这个时候,就有人想,有没有一种技术,能够管理这些配置好这些环境的镜像、例如java环境、redis环境、php环境等,并且镜像只有几百兆甚至几百兆的技术呢。甚至再夸张点,配置更加简单,一个命令就能启动一个镜像,一次能启动N个镜像,但是只占用几百兆,1-2个G的内存,低CPU消耗,而且还要有一个镜像管理中心,我自己配置了一个环境的镜像,可以上传上去,谁都可以来使用我的镜像。随着这些需求的诞生,随之诞生解决这些问题的技术就是docker!

其实docker还不止解决这些问题,对于运维人员来说,每次拿到新的服务器,都要去配置各种环境问题,非常头痛,而docker的镜像技术可以很好地帮助运维人员解决这些配置的麻烦。

甚至docker还能干嘛呢,比如我要部署一个项目,要做负载均衡,那么我就需要在N台机器上配置这个项目所需要的环境以及将项目启动起来。众所周知,重复繁琐的工作,不仅仅增加了工作量,还大大增加了出错的机率。如果我用了docker,那么我只需要配置一次,将环境打包成镜像,之后在每台机器上运行我配置的镜像就可以了,非常方便。


docker技术介绍

docker中主要有三个概念,分别是镜像容器仓库
仓库:主要是用来存储镜像的一个地方,就像是maven仓库一样,分为官方和私有的,自己可自己的公司部署私有仓库,自己则可以制作镜像发布到仓库中。
镜像:image,可以把它理解成操作系统的一个快照/照片,举个栗子,你有一个苹果,你用手机对苹果拍了个照,然后你将照片发给你的朋友,他/她拿到照片后,就可以直接把照片还原成一个一模一样的苹果,这个照片发给任何人,复制多少份,都可以被还原成一个一模一样的苹果,是不是有点哆啦A梦的感觉。
容器:container,拿到快照后,快照要运行成一个系统/虚拟机,运行后的程序就是容器。如果继续用上面的比喻的话,镜像是那张照片,那么容器就是最后变成的苹果,只要有这张照片,就可以用它来源源不断的变出苹果来。

docker版本介绍

Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。
社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等。
社区版按照stable和edge两种方式发布,每个季度更新stable版本,如17.06,17.09;每个月份更新edge版本,如17.09,17.10。

案例讲解

上面简单介绍了一些概念性的东西,那么接下来我们将用一个实战演戏来具体讲解docker的用法

  1. docker的安装

mac和windows的安装
首先进入docker的官网,点击download
在这里插入图片描述
点击后进入以下页面,在下图中就有mac和windows的下载链接,点击下载即可
在这里插入图片描述
下载后进行安装,这一步就省略了,直接下一步下一步就行了,没什么好说的。
安装好之后,在命令行中输入docker显示以下图中的内容表示安装成功
在这里插入图片描述
接下来我们就可以在命令行中开始docker的使用了

  1. 使用docker来安装一个Mysql

(1) 搜索镜像
首先我们本地的docker是空的,我们需要一个mysql(苹果)的镜像(照片)来变出一个mysql的程序(苹果)来,那么,首先我们就需要去或者这个镜像(照片),那么我们先去搜索一下,有没有这个照片
搜索命令

docker search <imageName>

例如使用命令docker search msyql就可以去仓库里面寻找有没有msyql的镜像(照片),
在这里插入图片描述
介绍一下搜索结果,name代表的是镜像的名字,description是对这个镜像的描述,stars代表这个镜像的受欢迎程度,stars越多代表这个镜像越??,official代表这个镜像是否是该应用官方提供的,automated代表这个是否是自动化生成的一个镜像。


(2) 拉取镜像
我们直接去拿星数最高的那个镜像
命令:

docker pull [options] <imagesName>[:tag]

例如使用docker pull mysql就可以将mysql的镜像(照片)拉取到本地

然后我们在本地查看这个镜像
命令:

docker images

这个命令可以查看本地所有的镜像(照片)
在这里插入图片描述
(3) 启动容器
现在我们已经拿到了镜像(照片),那么我么怎么将这个镜像(照片),变成一个容器(苹果)呢
命令:

docker run -it --name <name>  -p port1:port -d <ImageName>[:tag]

例如:

docker run -it --name localMysql -p 3307:3306 -d -e MYSQL_ROOT_PASSWORD=123456 mysql

参数讲解:
-t: 在容器内指定一个伪终端
-i: 允许对容器内的标准输入STDIN进行交互
–name: 生成启动的容器名字
-d: 后台运行,日志不显示在当前终端
-e: 配置环境参数,上面则是配置镜像中的Msyql的root密码
-p: 端口映射 3307:宿主机器端口,也就是你的电脑 。3306:容器端口 (大小记忆法)
imageName: 镜像的名字,也就是上面docker images得到的第一个参数的值
tag:镜像的版本,一个镜像可以有多个版本,默认不填值就是lastest最后的版本

(4) 查看容器
其实容器就是一个启动好的Linux虚拟机,那么我们怎么查看已经启动好的这些虚拟机呢
命令:
docker ps :查看正在启动的容器
docker ps -1:查看所有的容器,启动+停止状态的都显示
在这里插入图片描述
如上图,有两个已经停止工作的容器,docker ps只能查到正在工作的容器,所以没有显示,docker ps -a可以看到所有的容器,所以可以看到

(5)连接mysql
装有mysql的linux虚拟机已经装上了,那么接下来我们就需要去连接这个mysql了
首先启动的时候有一个-p参数,我们将虚拟机容器中的3306端口,映射到我们电脑上的3307端口中,也就是说,我们访问我们自己电脑上的3307端口,就相当于去访问了容器中的3306端口。

那么我们来尝试一下连接mysql
命令:

mysql -u root -P 3307 -h 127.0.0.1 -p

为什么要指定3307端口呢,因为我们上面说了,我们本机的3307端口直接映射到虚拟机容器中的3306端口,连接3307端口就相当于连接了虚拟机中的3306端口

但是,运行上面命令,或者使用mysql客户端工具,发现都无法连接,这是为什么呢
此时我们就需要进入容器中查找问题
既然容器是一个虚拟机,那么我们肯定可以连接上虚拟机,用命令行操作的吧?
来,试试

(6) 进入容器
每一个运行的容器其实就是一个linux虚拟机,那么我们怎么进去用命令行操作呢,直接远程连接?
docker有更方便的方法进入虚拟机

docker exec -it <containerID> /bin/bash

-it:其实和上面一样
containerID是什么呢
我们使用docker ps -a 查看
在这里插入图片描述
发现了吗,那里就是容器的id -> containerID

我们运行命令

docker exec -it 994fc255712b /bin/bash


发现我们此时已经进入到容器中了
我们在容器中连接mysql试试
在这里插入图片描述
发现居然可以连接?

(7) 解决问题
我发现连接后,mysql的版本是8.0.17,百度后
1、首先在容器中通过查看MySQL的的用户信息
在这里插入图片描述
可以看到host字段均为localhost,意思是只允许本地IP访问
执行 update mysql.user set host = '%' where user = 'root';设置允许被任意IP地址访问
或者grant all privileges on *.* to 'root'@'%' identified by '123456';

2、第二个原因是MySql 8.0版本修改了默认的加密规则,用Navicat连接会报错,解决办法为执行如下语句

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

3、最后执行FLUSH PRIVILEGES;刷新权限
在这里插入图片描述
再次查询发现host已经变成%,表示已经OK

(8) 再次连接
此时执行命令exit退出容器
mysql -u root -P 3307 -h 127.0.0.1 -p再次尝试连接,发现已经可以连接了,搞定,此时一个mysql的容器就启动起来了。

docker命令介绍

上面我们已经通过一个案例,简单了解了一下docker,那么下面我列出一些常用的docker命令,这些命令的详解将会在docker的中阶篇中进行讲解

镜像相关

1.查找想要的镜像
docker search [options]镜像名称
[options]:
※ -s num :可以查找多少星以上的镜像
※ --automated:默认false,显示automated build 镜像
※ --no-trunk :默认false ,不以截断方式查找镜像
2.获取想要的镜像
docker pull [options]镜像名称[: tags]
[options]: 默认
※ -a :下载所有该tags的镜像
[: tags]: 默认
※ 忽略tags下载最新版本的镜像
3.查看本地已经下载的镜像

docker images

4.如何将镜像推送到镜像仓库

docker push <imageID/ImageName>: tags

5.删除镜像
docker rmi <image ID>删除一个或者多个镜像
docker rmi <name:tag>

6.创建镜像
创建镜像一般有两种方式:
(1) 从已经创建的容器中更新镜像,并且提交这个镜像

docker commit -m="mysql update image" -a="shynin" 34b9b46155ff mysql:updated

-a: 指定镜像作者
-m:提交的描述信息
34b9b46155ff: 提交的容器id
mysql:镜像的名字
updated: 镜像的tag
(2) 使用Dockerfile指令来创建镜像
a.创建一个文件名为Dockerfile,并写入以下文件

FROM: 镜像名字:tag
MAINTAINER:作者名字
RUN:镜像在docker build时在容器内执行的命令
EXPOSE:容器暴露的端口(主要用于docker run 时 -P使用,没有的话-P没有作用)
CMD:镜像在docker run 时候执行的命令
b.docker build -t shynin/centos:6.7 .
docker build -t [:tag] .
-t:镜像的名字
. :当前目录下寻找Dockerfile制作镜像

7.设置镜像标签
docker tag ImageId name:tag
例如:docker tag 3d1cfb1be69f shynin/mysql:8.1

容器相关

1.查看容器
docker ps:查看正在运行的容器
docker ps -a: 查看所有的容器,包含已经停止的

上图表示宿主机的3307端口映射到容器的3306端口(大小记忆法)

2.查看容器端口

docker port <containerID/containerName>

3.查看容器内的应用程序日志,类似于tail -f

docker logs -f <containerID>

4.查看容器内的容器进程

docker top <containerID/containerName>

5.查看容器内的docker底层信息,会返回一个json来查看docker的状态信息

docker inspect <containerID/containerName>

6.重启、停止、启动一个容器

docker restart/stop/start <containerID/containerName>

7.删除容器,必须是停止状态,否则报错

docker rm <containerID/containerName>

8.启动一个镜像,生成容器

docker run -it --name <name> -p 3307:3306 -d <ImageName>[:tag] [执行命令]

-t: 在容器内指定一个伪终端
-i: 允许对容器内的标准输入STDIN进行交互
–name: 生成启动的容器名字
-d: 后台运行,日志不显示在当前终端
-p: 端口映射 3307:宿主机器端口 3306:容器端口 (大小记忆法)
-P: 容器内端口随机映射到宿主机49000~49900端口
–rm: 退出时容器内数据进行清除
–volumes-from <containerID/containerName>: 启动后与其他容器共享磁盘目录
-v: 挂在宿主机的磁盘到容器中去
例如:sudo docker run --rm-i -t -v /home/root:/data:rw ubuntu:14.04 /bin/bash
将本机的/home/root,挂载到镜像中的/data目录 :rw表示镜像拥有read和write权限
ImageName: 镜像的名字
[tag]: 可选,镜像的tag,默认为lastest
[执行命令]: 容器启动时执行的命令,
例如: /bin/sh -c “while true; do echo hello world; sleep 1; done”
或者: java -jar xxx.jar
或者: echo ‘hello world’

9.进入容器

docker exec -it <containerID> /bin/bash

例子:
docker run -it <ImageName> : 直接进入镜像,看到的是镜像的日志输出
docker run -it <ImageName> /bin/bash: 进入镜像,进行bash操作,但是exit退出后,容器停止。可重新启动容器

10.copy容器中的文件到宿主机

docker cp <containerName>:/var/lib/mysql /var/own/mysqldata

拷贝容器中/var/lib/mysql 文件夹下的文件到宿主机中的/var/own/msyqldata文件夹下面

总结

此次使用使用docker做了一个最简单的安装mysql案例,但是对于一些docker的中阶语法用法,例如如何挂载宿主机的磁盘到容器中,如何停止、重启容器,如何使用页面点点点的形式来控制容器、镜像等都还没讲到

那么这些中阶的内容,将会在(可能有的)容器化部署中阶篇中讲到。

谢谢您的阅读,程序永无止境,愿每一个程序员(工程师)都能热爱自己的职业,不忘初心。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值