Docker入门教程

Stella981
• 阅读 679

一、Docker是啥

Docker是什么?官方的解释是:轻量级的操作系统虚拟化解决方案
看概念还是比较抽象,直接看个例子吧:我要在centos上安装一个软件,例如redis或者mysql。以前的做法:1、下载tar;2、解压;3、修改配置文件;4、启动。有了Docker之后呢,一个命令:docker run --name redis -p 6379:6379 -d redis:3.2完成了软件安装和启动。当然,要自定义redis的配置,就需要稍微复杂点了。
对比起来看,Docker确实让运维工作效率提升了好几倍!
想象一下你要安装一个比较复杂的套件,套件中需要用到mysql、redis、go语言环境、邮件服务器,还需要修改linux主机的系统配置,还要创建特定的新用户,My god,你只是想简单体验一下这个套件的服务,现在你开始望而却步了,因为太复杂,万一配置错误污染了主机环境,那可得不偿失。
如果有魔法,可以一行命令就启动这个套件,而且是在独立的容器中运行他,那么所有的问题都不是问题了。Docker就是这个魔法!

二、Hello World

这是一个非常简单的示例:启动mysql服务,并在外部访问他

1、安装

Docker Engine改为Docker CE(社区版)了,安装教程:点击
直接使用阿里云的加速功能。

2、启动mysql

在主机上输入命令:docker run --name mysql -e MYSQL_ROOT_PASSWORD=Aa123456 -d mysql:5.7
mysql就被安装,并且启动了。root的密码为Aa123456,开放的端口是3306。
用数据库管理工具进行连接,就可以直接访问数据库了。

三、Hello World解析

第一次看世界,发现好新奇啊。不懂世界的运行规则,不明白为啥叶子上有水珠,不明白阳光为何是七彩的!
不用着急,答案就在寻找中。
上面的Hello World可以很好的让你体会到Docker的神奇之处,不论多么复杂的软件,docker都能一行命令就搞定。
下面来分析一下上面启动mysql的那行命令:docker run --name mysql -e MYSQL_ROOT_PASSWORD=Aa123456 -d mysql:5.7 ,不过为了更好的展示docker的各个方面,我们把上面的命令进行扩展,变成:docker run --name mysql -e MYSQL_ROOT_PASSWORD=Aa123456 -v /home/work/config:/etc/mysql/conf.d -p 3306:3306 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 。 放心,这个命令和简易命令的效果是一样的,不过多了几个其他配置项,我们把命令分解来看。

1、docker run

这个命令简单解释:用来运行一个docker镜像,运行起来的镜像称为容器。
有同学问:那么啥是镜像,啥又是容器呢?
所谓镜像,就是操作系统的一个底片或叫副本。例如你装windows系统的时候,一般会用到光盘(得多古老)或者ios镜像,有了底片,我们把他们复制到对应的机器上,把windows系统写入到硬盘,这就是传说中的装系统了(给女生装了很多系统之后,总会有一两个挽留你的)。
容器又是啥类?容器是铁,容器是缸,容器是不朽的铁窗!咳咳,注意自己是官方讲解员。容器呢,就是一个隔离的运行环境,当你把镜像复制过来,然后启动了操作系统,传统的操作系统直接运行在硬件上,而从docker仓库而来的操作系统就需要运行在容器中。
纳尼,这是为啥?
这是因为操作系统中嵌套了一个操作系统,里面的操作系统就叫做容器了。

2、 --name mysql

这个命令是设置了容器的名称,叫做mysql。当你启动了容器之后,可以使用docker ps来查看正在运行的容器,最后一列就是容器名称啦!

3、-e MYSQL_ROOT_PASSWORD=Aa123456

设置了容器中的环境变量。
这里设立了一个叫MYSQL_ROOT_PASSWORD的环境变量,在容器中mysql server会用到这个变量,并把这个变量的值设置为root的初始密码。

4、-v /home/work/config:/etc/mysql/conf.d

设置了数据卷映射。
这个概念第一次接触显得有点复杂。可以想一个大概场景,容器启动后,里面是一个独立的操作系统、独立的文件系统,如果我需要把宿主机(宿主机?就是你的Linux主机啦)的一部分数据和容器进行共享,要怎么做呢?
例如我现在在宿主机有/home/work/config/mysql.conf文件,这个文件就是我自定义的mysql配置文件,我需要容器中的mysql启动的时候读取的是这个配置文件,这时候就要用到-v来做映射。
v就是volumn的缩写!

5、-p 3306:3306

设置了端口的映射。
跟上面一样,容器是独立的,内部肯定监听了很多端口,但如果没有配置,这些端口是不能被外部访问的。
这时候,需要把容器中的某个特定端口映射到宿主机,这样的话,外部访问宿主机,其实呢,访问的是容器中的程序!

6、-d

以守护进程来运行。
d就是daemon,也就是容器启动后会一直保持运行状态,而不会立马退出。

7、mysql:5.7

这个是镜像名。
冒号前面是基础镜像名,冒号后面是镜像版本。
有趣的问题来啦,虽然知道了镜像名,那这个镜像是从哪里来的呢?当你运行容器的时候,会先看到一段下载的流程,聪明的你可能猜出来了,镜像从远程仓库而来,类似于Java中的Maven,Node中的npm,centos中的yum。
这个远程仓库最著名的就是官方的docker hub,而在国内,用的最多的应该是阿里的docker镜像服务。

8、--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

容器中的启动程序要用到的参数。 当容器启动的时候,一般会有一个默认的执行程序或者是脚本,那么这一行就是给默认执行程序或脚本用到的。

9、查看容器

容器启动完成后,可以用docker ps来查看运行中的容器,用docker stop来停止容器,用docker ps -a可以看到已停止的容器,用docker rm 可以移除容器。

小结

这只是个入门教程,如果感兴趣的话,可以再研究一下:数据卷、网络、dockerfile、docker-compose等知识。推荐书籍:《第一本Docker书》

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这