本文旨在让你用最短的时间弄懂Docker命令操作,什么虚拟化都太泛泛了,不讲大道理,实践出真知,让你从此的日常开发和工作中在面对Docker时不再茫然失措而是得心应手。本文也不谈安装,我实在认为作为程序员,要是我在这里教你如何安装Docker,既是在浪费你的时间也是在浪费我的时间,请参考Docker安装

Docker Hub是Docker官方维护的一个公共仓库,其中已经包括了数量超过15 000 的镜像,开发者可以注册自己的账号,并自定义自己的镜像进行存储,需要的时候可以直接拿来用,同时也能够分享,有点类似于Github,如想注册可移步 Docker Hub,注册与否不影响接下来的操作。

实践出真知

我认为只要你不是专门研究这个的,那么你只需学会如何使用Docker的一些基本命令,使自己的日常开发和工作不受阻碍,弄清Docker和容器之间的区别,为什么现在很多企业流行Docker,这个东西解决了啥问题,有啥优势就够了。关于Docker是什么有何优势,这里挑了一个简洁的博客链接

接下来从零开始,首先从docker hub仓库上拉取centos镜像,带你走进docker日常命令,学会这些命令,足以应对你的日常开发和工作中关于docker的问题。

search: 从docker hub仓库搜索带centos的所有镜像。

$docker seach centos

images: 查看本地所有镜像,pull前左侧REPOSITORY栏无centos。REPOSITORY表示镜像被归入到本地的仓库,比如icoty1/lamp:v1.0.0表示本地icoty1仓库下有一个镜像名为lamp,其TAG(版本)为v1.0.0,每个镜像有一个IMAGE ID唯一标识该镜像,SIZE为镜像大小。

$docker images

pull: 从docker hub远程仓库把centos镜像拉到本地,pull后再次执行images,会发现centos已经被拉到本地。

$docker pull centos 

ps: 只列出正在运行的容器。

$docker ps

ps -a: 列出所有容器, 每一个容器有一个CONTAINER ID唯一标识该容器;IMAGE表示该容器是基于哪个镜像生成的,COMMAND是容器启动时执行的命令,可以传入也可以不传入;STATUS是容器当前的状态,Exit是已停止,Up是正在运行。

$docker ps -a

run: 从镜像衍生一个新的容器并运行;-d后台模式运行容器,-i交互模式运行容器;-p把主机80关口映射到容器的80端口,因为容器具有封闭性,容器外部不能直接访问容器内部的端口,通过映射后,主机80端口收到数据后会转发到容器内部的80端口,不过在容器内是可以直接访问容器外的主机的;-v把主机的/Users/yangyu/ide/LeetCode/目录映射到容器的/LeetCode/,容器内若无/LeetCode/目录会自动创建,用于实现主机和容器之间的目录共享,在两个目录下操作文件是对等的;centos:latest是镜像名称,可以换成IMAGE ID,二者等价;/bin/bash是容器启动时执行的命令,还可以带参数,这个不懂的可以搜索下。执行docker run后再次执行ps命令,能够看到运行中的容器多了一个。

$docker run -d -ti -p : -v /Users/yangyu/ide/LeetCode/:/LeetCode/ centos:latest /bin/bash 

cp: 拷贝主机/Users/yangyu/ide/LeetCode/Database/目录到容器eaf43b370eb7根目录。

$docker cp /Users/yangyu/ide/LeetCode/Database/ eaf43b370eb7:/

exec: 执行该命令进入容器eaf43b370eb7内,进入容器后在容器内/LeetCode/目录下新建readme.py2,在主机/Users/yangyu/ide/LeetCode/目录下能够看到该文件。

$docker exec -it eaf43b370eb7 /bin/bash
$cp /LeetCode/readme.py /LeetCode/readme.py2

cp: 从容器eaf43b370eb7根目录下拷贝目录/Database到主机的/Users/yangyu/ide/LeetCode/Database/目录下。

$docker cp eaf43b370eb7:/Database/ /Users/yangyu/ide/LeetCode/Database/

stop/restart: 停止容器eaf43b370eb7然后查看其状态变为Exited;然后通过restart命令重启,容器又处于运行态。

$docker stop eaf43b370eb7
$docker restart eaf43b370eb7

tag: 把centos镜像归入icoty1仓库下名称为centos,TAG为7,TAG随你定。

$docker tag centos icoty1/centos:

commit: 最初pull下来的centos镜像是最简版本,里面没有安装mysql vim等;最初pull下来后基于其运行一个容器,你在容器内部可以安装你需要的环境,比如mysql,apache,nginx,hexo博客等,安装好后通过commit命令把容器提交为一个新的镜像,以后凡是从这个新的镜像运行的容器都带有你安装的内容。-m是提交说明;-p是执行commit命令时暂停该容器;eaf43b370eb7是容器ID。

$docker commit -m "提交我的自定义镜像,centos7内安装mysql,版本号v1.0.0" -p eaf43b370eb7 icoty1/centos7-mysql:v1.0.0

save: 把镜像03cb190015bf打包成主机目录/Users/yangyu/ide/LeetCode/下的centos7-mysql.tar,然后你可以通过U盘拷贝到其他机器上,在其他机器上通过load命令可以把centos7-mysql.tar加载成一个镜像。

$docker save 03cb190015bf > /Users/yangyu/ide/LeetCode/centos7-mysql.tar

load: 把centos7-mysql.tar加载为镜像,因为这个包是从我主机上的镜像03cb190015bf打出来的,所以执行load的时候直接返回镜像03cb190015bf,如果在其他机器上执行会生成一个新的镜像ID。

$docker load < /Users/yangyu/ide/LeetCode/centos7-mysql.tar 

push: 把本地icoty1仓库下TAG为v1.0.0的镜像icoty1/centos7-mysql推到远程仓库docker hub上的icoty1仓库下保存,执行push前需要在本地icoty1已经登陆。push成功之后,其他人就可以通过pull命令拉取你的镜像使用了,相当于git clone操作。

$docker push icoty1/centos7-mysql:v1.0.0
$docker pull icoty1/centos7-mysql:v1.0.0

rm: 删除容器eaf43b370eb7,运行中的容器无法删除。

$docker rm eaf43b370eb7

rmi: 删除镜像03cb190015bf,在这之前必须删除由该镜像衍生出来的所有容器删除,否则会删除失败,执行该命令后通过images发现镜像已经没有了。

$docker rmi 03cb190015bf

build: 如下以我搭建hexo博客的Dockerfile举例说明。

# 基础镜像,icoty1/ubuntu-hexo-blog:latest在本地仓库必须已经存在
FROM icoty1/ubuntu-hexo-blog:latest # 维护人员信息,可写可不写
MAINTAINER icoty1 "https://icoty.github.io" # 暴露容器的4000端口,这样主机就可以映射端口到4000了
EXPOSE /*自动安装所需环境,可替换成安装mysql vim等你需要的命令
*hexo部分插件安装,使支持rss,图片,字数统计等功能
*/
RUN npm install -g hexo-cli \
&& npm install hexo-server --save \
&& hexo init blog && cd /blog \
&& npm install \
&& npm install hexo-deployer-git --save \
&& npm install hexo-migrator-rss --save \
&& npm install hexo-asset-image --save \
&& npm install hexo-wordcount --save \
&& npm install hexo-generator-sitemap --save \
&& npm install hexo-generator-baidu-sitemap --save \
&& npm install hexo-helper-live2d --save \
&& git clone https://github.com/litten/hexo-theme-yilia.git themes/yilia \
&& sed "s/theme: landscape/theme: yilia/g" -i /blog/_config.yml
$ docker build -t icoty1/ubuntu-hexo . # icoty1/ubuntu-hexo是新的镜像的名字
$ docker images # build后会多出icoty1/ubuntu-hexo镜像

镜像与容器

为了便于理解,你可以把镜像理解成一个初始模版A,通过这个模板A你可以复制出模板B、模板C等,模板B和模板C在这里就相当于容器,突然某一天你发现模板A现有的内容已经不能满足你的需求了(比如模板A没有安装Mysql,而你需要安装Mysql),这时你就只能自定义新的模板(相当于自定义新的符合你的要求的镜像),而自定义方式则可以从模板B或模板C中安装Mysql,安装成功之后,通过docker commit命令将模板B或模板C提交成一个新的初始模板A1(也就是新的镜像),以后所有从模板A1运行的容器就都有Mysql了,然后你就有模板A和模板A1了(就是两个镜像)。

建议

实际操作部分,对各个命令有疑问的,相信我,直接执行一遍才是解决你心中疑虑的不二之法,如果你的命令参数不正确,顶多就是报错和执行不成功,不会让你的主机崩溃,最坏也就不过重新执行一遍,IT这个职业,其本身就是一个不断试错、犯错和总结经验的过程,如果你学到了,请我喝奶茶吧,小生会一直奋斗在原创的路上。

参考文献

[1] Docker命令大全

[2] Docker中文社区

Docker最简教程的更多相关文章

  1. Hexo+Github博客最简教程-Dockerfile自动搭建

    闲谈 拿出你的气质,打开你的电脑,借你半小时搭建好属于你的hexo博客,小生用dockerfile自动帮你搭建好:你只需要在你的mac或linux或windows上提前把docker安装好,如何安装不 ...

  2. Asky极简教程:零基础1小时学编程,已更新前8节

    Asky极简架构 开源Asky极简架构.超轻量级.高并发.水平扩展.微服务架构 <Asky极简教程:零基础1小时学编程>开源教程 零基础入门,从零开始全程演示,如何开发一个大型互联网系统, ...

  3. Docker最全教程之使用Tencent Hub来完成CI(九)

    使用Tencent Hub来完成CI 关于Tencent Hub Tencent Hub是腾讯出品的DevOps服务.主要提供多存储格式的版本管理,支持Docker Image.Binary.Helm ...

  4. Docker最全教程——从理论到实战(八)

    在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...

  5. Docker最全教程——从理论到实战(七)

    在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...

  6. Docker最全教程——从理论到实战(六)

    托管到腾讯云容器服务 托管到腾讯云容器服务,我们的公众号“magiccodes”已经发布了相关的录屏教程,大家可以结合本篇教程一起查阅.   自建还是托管? 在开始之前,我们先来讨论一个问题——是自建 ...

  7. Docker最全教程——从理论到实战(五)

    往期内容链接 Docker最全教程——从理论到实战(一) Docker最全教程——从理论到实战(二) Docker最全教程——从理论到实战(三) Docker最全教程——从理论到实战(四) 本篇教程持 ...

  8. Typora极简教程

    Typora极简教程 ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML 文档.” ...

  9. CentOS安装使用.netcore极简教程(免费提供学习服务器)

    本文目标是指引从未使用过Linux的.Neter,如何在CentOS7上安装.Net Core环境,以及部署.Net Core应用. 仅针对CentOS,其它Linux系统类似,命令环节稍加调整: 需 ...

随机推荐

  1. C语言中的一维数组

    一.一维数组的定义和引用 (1)一维数组的定义 类型说明符表示数组中的元素类型 数组标识符该数组型变量的名称,命名规则与变量名一致 常量表达式定义了数组中存放的数据元素的个数. (2)一维数组的引用 ...

  2. [USACO07OPEN]便宜的回文Cheapest Palindrome

    字串S长M,由N个小写字母构成.欲通过增删字母将其变为回文串,增删特定字母花费不同,求最小花费.        题目描述见上            显然 这是一道区间DP 从两头DP,枚举长度啥的很套 ...

  3. explain和profiling分析查询SQL时间

    mysql可以通过profiling命令查看到执行查询SQL消耗的时间. 默认情况下,mysql是关闭profiling的,命令: select @@profiling; +------------- ...

  4. CF999E Reachability from the Capital来自首都的可达性

    题目大意: 有n个节点m条边,边都是单向的,请你添加最少的边使得起点s到其他与其他每一个点之间都能互相到达 这题一看就是一个缩点啊 其实对于原有的m条边相连的一些点,如果之前他们已经形成了强连通分量( ...

  5. MySQL 表字段操作

    MySQL 表字段操作 一.增加表字段 1)mysql> alter table 二.删除表字段 三.修改表字段

  6. windows知识点2

    最近在使用win10系统的过程中,无法获取dns报错,上不了网.经过一番折腾,最终在用下面的方法,解决了问题.第二步很关键.完成步一下步骤重启电脑应该就可以上网了.12第一步:使用 ipconfig ...

  7. java8_api_正则表达式

    正则表达式    什么是正则表达式    使用String类中的replaceAll方法    使用Pattern类编译正则表达式    使用Matcher类匹配正则表达式 什么是正则表达式      ...

  8. HBASE基础知识总结

    HBASE基础知识总结 一,概要说明 文章首先回顾HBase 的数据模型和数据层级结构,对数据的每个层级的作用和架构进行了详细阐述:随后介绍了数据写入和读取的详细流程.先把架构图和流程图来坐镇. 架构 ...

  9. Java高级特性 第15节 解析XML文档(3) - JDOM和DOM4J技术

    一.JDOM解析 特征: 1.仅使用具体类,而不使用接口. 2.API大量使用了Collections类. Jdom由6个包构成: Element类表示XML文档的元素 org.jdom: 解析xml ...

  10. centos7 安装php gd库

    yum install php-gd vi /etc/php.ini 添加: extension=/usr/lib64/php/modules/gd.so