title: Docker教程
Build,Ship & Run anywhere
Origin
早在十多年前国内外的一些大厂就开始投入研发和使用容器技术,比如Google,对他们来说,使用容器能够充分利用计算资源节省硬件成本,而这几年,真正把容器技术发扬光大的是Docker。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
Docker的slogan“Build,Ship & Run anywhere”定位非常清晰,Docker的出现打破了传统运维模式里从打包到部署的过程中环境、语言、平台不一致的乱象,将这一整套开发运维模式标准化了,从而真正帮助企业实践了DevOps和微服务化。
但是,国内的大型企业面临技术转型的的时候,历史包袱太沉重,对Docker的接受和部署非常缓慢。同样地,多数的中小型企业也并未把Docker作为生产环境上部署和管理服务的标配,而选择继续使用传统的运维方案。
造成这种现象的原因是什么呢?可能原因之一是企业从业人员对Docker的学习认知并不够。之二是目前市面上Docker的容器编排系统很多,常见的就有K8s、Mesos、Swarm、Rancher、Newben,编排系统的学习和认知成本也进一步提升了企业应用Docker的难度
本文作者同大家一起开始步入docker的镜像世界,一步一步,深入docker,从入门到精通,从使用到理解掌握
quick-start
- 安装Docker
- 使用Docker
安装
- mac平台
- RedHat系Linux平台
- win10平台
Mac
Docker基本安装
mac安装了homebrew的话
直接brew cask install docker(我的没有成功,就去官网下载了)
官网下载需要登录帐号 下载的是ce版本
安装完后
启动终端后,通过命令可以是否安装成功
docker info
以及查看docker版本
docker --version
Docker中配置国内镜像
在正常情况下,docker有一个默认连接的国外官方镜像,在国外的网友访问该官方镜像自然不成问题,但是国内毕竟不是国外,由于国情不同,中国的网络访问国外官方镜像网速一向很慢,而且往往还会遭遇断网的窘境,所以说我们要想正常使用docker的镜像,那么我们就不得不配置相应的国内镜像。
Docker可以配置的国内镜像有很多可供选择,比如说:阿里云,网易蜂巢,DaoCloud,Docker中国区官方镜像等,这些都是可以提供给大家随意选择的不错的镜像仓库。
在任务栏点击
Docker for mac 应用图标(右上方) -> Perferences... -> Daemon -> Registry mirrors
在列表中填写加速器地址即可。用的是网易的http://hub-mirror.c.163.com 修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。
RedHat
Docker基本安装
使用yum包管理工具安装
yum install -y docker
启动docker服务
systemctl start docker
查看是否安装成功
docker --version
Docker中配置国内镜像
使用vi修改 /etc/docker/daemon.json 文件
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
配置完之后执行下面的命令,以使docker的配置文件生效
systemctl daemon-reload
systemctl restart docker
docker info可以查看到修改过的配置
Registry Mirrors:
http://hub-mirror.c.163.com
Win10
Docker基本安装
Docker中配置国内镜像
使用
构建基本环境
安装成功之后,打开终端
确定你想要的操作系统,如果是centos
docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 4773 [OK]
复制这个名字centos
docker seach会在dockerhub,dockerhub(dockerhub类似于github,github大部分用于提交同步代码,dockerhub用于镜像同步与存储)中寻找name和docker search str的这个str相接近的字符串
镜像:这里可以理解为一个压缩包,这有助于理解
然后我们将这个远程库中的镜像下拉到本地,在前期,你可以将镜像理解为一个压缩包,这里,就是centos系统的压缩包
docker pull centos
即可获取到最新的centos版本的镜像
如果需要指明版本
docker pull centos:版本号
即可获取到相应版本
docker image ls
命令简化:docker images
查看可以使用的所有image的列表
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5182e96772bf 8 weeks ago 200MB
可以看到我们刚刚pull下来的镜像
TAG表示的版本号,latest表示是最新版,IMAGE ID唯一确定这个镜像,以后都是用这个序列号表示这个镜像
CREATED表示这个镜像是什么时候被创建出来的
SIZE表示这个镜像的大小
接下来我们需要'解压'这个镜像
docker run -it --name mycentos centos /bin/bash
解释:
Docker run 命令用来创建一个新的容器并运行,相当于 docker create和docker start的组合。
用 docker run --help可以显示命令的使用说明。
-i, --interactive Keep STDIN open even if not attached(如果没有打开交互界面,则打开)
-t, --tty=false 分配tty设备,该可以支持终端登录,默认为false
带着-it参数会打开一个命令行窗口,退出这个窗口就相当于是'关机',不过还可以通过docker start的方式'开机',这也就是docker的前台运行方式,后台运行之后会提到
既然我们要解压这个镜像,就一定得知道这个镜像('压缩包')是谁,centos参数就可以唯一的确定这个'压缩包',可以唯一标识的只有name:tag或者id,如果像这样只写了name,没有注明tag,一律表示最新版latest,而这里我们正好是latest
--name mycentos --name参数后跟我们解压后的东西的名字mycentos是名字,这样mycentos就能唯一的确定这个解压后的东西,实际上我们之前说了,'压缩包'里压缩的就是一个centos操作系统,所以解压后的东西就是一个centos操作系统
/bin/bash
这是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器就会退出。
这个就表示启动容器后启动bash。
好的,介绍完了,让我们实际操作试试看
再次确认我们上一步push下来的image
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5182e96772bf 2 months ago 200MB
docker run -it --name mycentos centos /bin/bash
如果运行成功,就会变成这样
zyfselton@MacBook-Pro-6:docker run -it --name mycentos centos /bin/bash
[root@9f733e598d67 /]#
这就表示我们已经成功的创建并启动和进入了这个centos操作系统
9f733e598d67这个比我们给这个系统起得名字更能唯一标识,但是不容易记忆,需要每次自己查看
保存自己的环境
然后我们新建一个文件夹
mkdir myapp
cd myapp
mkdir work1
这里的新建文件夹是简单工作,主要是表示我们在这个系统里面做了一些事,我们需要测试我们做的这个事(这里是新建文件夹)能不能被保存到'压缩包'中去,当然你可以在里面安装环境,写笔记,运行程序等等,但是某些需要暴露端口给外部使用的这种服务的安装,后面会详细介绍
然后我们关闭这个窗口,或者输入exit也可以退出这个窗口
也就相当于关闭了刚才的操作系统
那我们的修改,或者说是工作内容会被清除吗
doker ps
会显示所有正在运行的os(Operation System操作系统)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
发现没有
docker ps -a
会显示所有os(不管有没有在启动着)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f733e598d67 centos "/bin/bash" 9 minutes ago Exited (0) 2 minutes ago
发现这个id 9f733e598d67和我们之前启动os的id一样,恩,也算是确认过眼神了
这个时候我们要启动它
输入docker start后接 CONTAINER ID就会启动那个os
docker start 9f733e598d67
此时docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f733e598d67 centos "/bin/bash" 45 minutes ago Up 30 minutes mycentos
就会发现我们的系统启动了
可是我们还没有进入到这个系统
进入系统
docker exec -it 9f733e598d67 /bin/bash
[root@9f733e598d67 /]#
这里的-it和/bin/bash和之前docker run的那个代表的意思类似
cd myapp
cd work1
进入容器后的目录为workdir,默认workdir为自己的home(~)下,我们创建的时候在home下,所以地址是没有问题的
发现我们之前的工作内容都在
这个时候即便exit或者关闭窗口,之后再次进入安装docker环境的机器(就是宿主机,比如我的就是mac环境)的窗口时,我们docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f733e598d67 centos "/bin/bash" 4 hours ago Up About an hour mycentos
然后我们可以将这个带有工作内容的os'压缩'成镜像,这样相当于有了一个压缩包,每次我们解压这个压缩包都会的到一个相应内容的os
docker commit 9f733e598d67 selton/mycentos:1
记得这儿的selton/mycentos:1可以标识这个由9f733e598d67压缩包解压后得到的完整的os
/之前的selton一定要是你的用户名,就是你去docker官网注册的帐号的用户名,没有注册一定要注册一个,不然之后我们无法将压缩包像git提交代码到仓库一样提交我们的压缩包到我们的库
docker image ls就会发现一个新的压缩包
REPOSITORY TAG IMAGE ID CREATED SIZE
selton/mycentos 1 81bc6c9c1684 5 seconds ago 200MB
关闭掉刚才的容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f733e598d67 centos "/bin/bash" 4 hours ago Up About an hour mycentos
docker stop 9f733e598d67
将新的压缩包解压,看看里面有没有我们的工作内容
docker run -it --name mycentos2 selton/mycentos:1 /bin/bash
--name后面的mycentos2是我们解压后的os的名字,selton/mycentos:1的selton/mycentos是name,1是tag,表示的是具体的某个压缩包
cd myapp
cd work1
发现工作内容都在,至此,我们就明白了docker的主要作用
那么,我们的压缩包是在本地机器上的(这里是mac),但是开发环境和测试环境一定是不一样的,我们如何做到将我们的压缩包让开发环境获取,这就和代码一样,记得我们起初是怎么获得centos的吗
没错,回头看你会发现这个命令docker pull,这和git pull不光长得像,作用也是类似的,用于从远程库中获取到我们的压缩包,不过git中需要先建立本地库和特定远程库的关系,但是我们的docker的镜像库的远程库只有一个,就是dockerhub库
将自己的环境提交到远程
官方下载docker是需要帐号的,此时我们已经有了帐号,如果没有,请前往官网注册一个帐号
docker login
会提示让输入用户名:selton
然后就是输入密码
登录需要大概十秒的时间
之后会显示Login Succeeded
如果需要退出,docker logout
Removing login credentials for https://index.docker.io/v1/
如果你和我一样使用了统一密码管理工具,请记得粘贴使用窗口上的编辑->paste,而不是cv
登录成功之后推送我们的镜像到自己的库中
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myos/mycentos 1 81bc6c9c1684 19 hours ago 200MB
查看到了我们制作的镜像('压缩包')
登录docker官网就可以看到多了一个你提交的这个镜像(''压缩包'')
也就是现在只要有一台机器安装了docker,就可以得到这个镜像('压缩包'),里面除了一个现成的os还有我们可能安装部署完的环境
同步远程库环境到本地
先尝试一下本地下载远程的我们提交的镜像
先删除掉本地的
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
selton/mycentos 1 e732a1e5c865 About an hour ago 200MB
docker rmi e732a1e5c865
显示
Untagged: selton/mycentos:1
Untagged: selton/mycentos@sha256:8d264bbac07545d8933dcbab286bf343a52bf5a63426b5c4b9d944f4b9acc558
Deleted: sha256:e732a1e5c8652bbb8a48e2ffed6dee7c52df5dfc74f19b0c433b01f2a814417d
Deleted: sha256:3f45206b758eae4a3864432e0e0fda23991d3956a779d4831c1f95dcb4d7191b
docker images查看,ok
docker pull selton/mycentos:1
就在下载了
同步远程库环境到linux上(开发,测试,生产)
我用的是一台阿里云的云服务器,1核2g内存,40g硬盘,centos7
安装docker
yum install -y docker
ok
启动docker服务
systemctl start docker
docker --version
由于我们刚刚的库就和git的库道理一样,是公开的
无须登录
docker pull selton/mycentos:1
docker images可以查看到
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/selton/mycentos 1 e732a1e5c865 6 hours ago 200 MB
之后就和之前的操作一样了
我们再次重复一下以加深印象
现将这个image('压缩包')解压
docker run -it --name mycentos e732a1e5c865 /bin/bash
ok,成功进入这个解压出来的container(os)中
cd myapp
cd work1
ok,至此完成docker的入门使用