Docker最简教程
本文旨在让你用最短的时间弄懂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最简教程的更多相关文章
- Hexo+Github博客最简教程-Dockerfile自动搭建
闲谈 拿出你的气质,打开你的电脑,借你半小时搭建好属于你的hexo博客,小生用dockerfile自动帮你搭建好:你只需要在你的mac或linux或windows上提前把docker安装好,如何安装不 ...
- Asky极简教程:零基础1小时学编程,已更新前8节
Asky极简架构 开源Asky极简架构.超轻量级.高并发.水平扩展.微服务架构 <Asky极简教程:零基础1小时学编程>开源教程 零基础入门,从零开始全程演示,如何开发一个大型互联网系统, ...
- Docker最全教程之使用Tencent Hub来完成CI(九)
使用Tencent Hub来完成CI 关于Tencent Hub Tencent Hub是腾讯出品的DevOps服务.主要提供多存储格式的版本管理,支持Docker Image.Binary.Helm ...
- Docker最全教程——从理论到实战(八)
在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...
- Docker最全教程——从理论到实战(七)
在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...
- Docker最全教程——从理论到实战(六)
托管到腾讯云容器服务 托管到腾讯云容器服务,我们的公众号“magiccodes”已经发布了相关的录屏教程,大家可以结合本篇教程一起查阅. 自建还是托管? 在开始之前,我们先来讨论一个问题——是自建 ...
- Docker最全教程——从理论到实战(五)
往期内容链接 Docker最全教程——从理论到实战(一) Docker最全教程——从理论到实战(二) Docker最全教程——从理论到实战(三) Docker最全教程——从理论到实战(四) 本篇教程持 ...
- Typora极简教程
Typora极简教程 ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML 文档.” ...
- CentOS安装使用.netcore极简教程(免费提供学习服务器)
本文目标是指引从未使用过Linux的.Neter,如何在CentOS7上安装.Net Core环境,以及部署.Net Core应用. 仅针对CentOS,其它Linux系统类似,命令环节稍加调整: 需 ...
随机推荐
- P5315 头像上传
--------------------------------------- 模拟中的模拟 --------------------------------------- FOR---MIKU -- ...
- anaconda的python版本与本地python版本不同时的问题
在用anaconda,尤其是win下的时候,本地的python版本可能和虚拟环境中需要的python版本不同,而在虚拟环境中使用pip3安装包的时候,仍会出现版本是本地的python版本的情况,虽然并 ...
- PythonStudy——生成器
# 生成器:自定义的迭代器对象 # -- 就是用函数语法来声明生成器,用yield关键字取代return关键字来返回值,参数没有多少变化 # 总结:有yield关键字的函数,函数名() 不是调用函数, ...
- PythonStudy——装饰器 Decorator
def outer(func): def inner(): print("新增功能1") func() print("新增功能2") return inner ...
- LVS详细介绍以及遇到的坑
LVS详细介绍以及遇到的坑 一,概述 本文介绍了我搭建LVS集群的步骤,并且在使用LVS(Linux Virtual Server)过程中遇到的问题和坑, 二,LVS简单介绍 大家都知道,LVS中文意 ...
- C# partial 关健字说明
参考:http://blog.csdn.net/niemeiquan/article/details/7801803 1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个 ...
- win 8.1 Your PC needs to be repaired修复过程
一.问题情况描述: 下班时,执行关闭系统命令,但硬盘灯一直亮着,因急着下班,所以直接长按电源键,装包回家... 到家后一段时间,启动电脑,但电脑蓝屏,提示“Your PC needs to be re ...
- [ZZ] 如何在多版本anaconda python环境下转换spyder
https://www.zhihu.com/people/alexwhu/answers 使用anaconda的话,可以参考以下步骤: 1.打开anaconda navigator,选择左侧的环境菜单 ...
- Azure CosmosDB (13) CosmosDB数据建模
<Windows Azure Platform 系列文章目录> 我们在使用NoSQL的时候,如Azure Cosmos DB,可以非常快速的查询非结构化,或半结构化的数据.我们需要花一些时 ...
- Nodejs+MQTT
客户端 https://github.com/mqttjs/MQTT.js 服务端 https://github.com/mcollina/mosca ionci3 使用mqtt.js Brosw ...