docker入门

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

  1. 安装Docker
  2. 使用Docker

安装

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的入门使用