手把手带你体验 Docker HelloWorld

课程目标

[ ]  Mac Pro 上如何安装Docker

[ ]  概念:Docker 引擎,宿主机,镜像(Image),容器(Container)

[ ]  在 Docker 上如何运行 Nginx

[ ]  容器的管理:查看,进入,stop, start, restart, kill, 删除

[ ] 怎么发布自己的一个 Docker Image ?

提醒:急速阅读,请直接看第六节“总结(简版操作)”,详细阅读请按序。


一、 Mac 上安装Docker


   关于mac下安装docker,搜索下会有一大堆,你只需了解4点:

   (1)最早最早Docker不能在mac下运行,只能在Linux运行;

   (2)过了不久,得安装 boot2docker 就能在mac下跑docker;

   (3)再过了不久,来了个更简单易用的 Docker Toolbox 就能在mac下跑docker;

   (4)到了现在,大概是2016年3月(记不清具体时间了),有了 Docker for mac 这种“三点两不点”这样傻瓜式的安装包。

图1:  Docker for mac 傻瓜式的安装包

于是你需要做的是:

   (1)历史的就让它成为历史,不要碰了。

   (2)下载个 Docker for mac , 尽管它是beta。但是,官方下载特别慢!请去网盘 https://pan.baidu.com/s/1i47ylkp   (无需提取密码,100来兆)

   (3)能不能命令行? brew install docker ?  截止发稿不能,安装出来的结果跟“docker for mac”的东西不一样多。

提醒:

如果你的系统里之前安装过 virtualbox ,而且版本不够高,docker for mac 会提示你必须“彻底删除”,或者升级,才能安装 docker for mac. 


二、概念:Docker 引擎,宿主机,镜像(Image),容器(Container)


       安装好了 docker for mac, 你的mac机器叫宿主机,运行着的那个带界面的docker for mac 叫 Docker 引擎,也有命令行。比如:

$ docker images

就是查看本地已经下载了多少镜像(Image)。什么是镜像(Image)和容器(Container)呢?

docker与“镜像”的关系,可以不严格但便于类比的理解为Linux的yum和软件包(或者Mac的brew和软件包,或者Maven的jar包)。

于是你可以联想到:

$ docker images                显示本地已下载的镜像,类比 brew list;

$ docker inspect $image   显示镜像的详细信息,类比 brew info $some_app

$ docker search $image    搜索某个镜像,比如 nginx。 类比 brew search nginx

$ docker pull $image        下载某个镜像,类比 brew install nginx

$ docker push $image      上传某个镜像。

问题来了,你可能发现,你运行 docker images 时,啥也没有,因为你没装。你再发现 docker search nginx的时候,半天没结果!!!

因为默认管理这些镜像的仓库(称为 Docker Hub 或者 Docker registry 或者 Docker repository)在国外。

那么国内有镜像(Mirrors)站点吗?

有的,地址: http://aad0405c.m.daocloud.io

打开 Docker for mac -> preference -> advanced ,如图添加 Registry mirrors 。

另外,如果你上外网需要走代理服务器,请设置代理服务器,否则HTTP Proxy不必设置。


图2:设置Docker Registry mirrorsApp

设置完后,你执行搜索一下 nginx的镜像,会显示很多,排第一的是 daocloud.io 官方制作的。

$ docker search nginx

NAME                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

nginx                     Official build of Nginx.                        4489      [OK]

jwilder/nginx-proxy       Automated Nginx reverse proxy for docker c...   848                  [OK]

……  此处省略很多行


接着,下载它,注意在前面添加 daocloud.io 前缀。

$ docker pull daocloud.io/nginx

……

下载完成后,查看一下:

$ docker images

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE

daocloud.io/nginx    latest              067c8da9d5ab        11 days ago         181.5 MB

截止现在,了解了什么叫Image,但是什么是容器(Container)呢? 我们运行一下刚才下载的nginx image就知道了。


三、在 Docker 上运行 Nginx


运行nginx很简单,只需要 docker run daocloud.io/nginx

当然我们也可以更复杂一点,加点参数,比如:

$ docker run --name helloworld -d -p 8080:80 daocloud.io/nginx

4871c4b47f830a73fa8133f125e63d4a5871dac3a887567d5eb54ea7f8d8ac6c

接着,

$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES

4871c4b47f83        daocloud.io/nginx   "nginx -g 'daemon off"   2 minutes ago       Up 2 minutes        443/tcp, 0.0.0.0:8080->80/tcp   hello world

命令docker ps 显示的是正在运行的Container列表,里面出现了刚才运行的nginx。于是可以把“容器(Container)”理解为镜像(Image)的一次运行。

这个概念可以类比为“进程”与“程序”的关系。不信,你再看:

$ docker run --name helloworld2 -d -p 9090:80 daocloud.io/nginx

c1d93fbaa49ed16ce7da4cc90cbeba7f1279c15cf849dc5682d84985d3be3c3a

$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES

c1d93fbaa49e        daocloud.io/nginx   "nginx -g 'daemon off"   19 seconds ago      Up 18 seconds       443/tcp, 0.0.0.0:9090->80/tcp   helloworld2

4871c4b47f83        daocloud.io/nginx   "nginx -g 'daemon off"   7 minutes ago       Up 7 minutes        443/tcp, 0.0.0.0:8080->80/tcp   helloworld

出现了第2个Container,Command都是nginx -g ,名字一个叫helloworld,另一个叫helloworld2.

如何访问它们呢?

$ curl http://localhost:8080

会显示 “Welcome to nginx!” 的页面。

$ curl http://localhost:9090

结果一样,只是访问了另外一个容器罢了。

你或许很着急希望知道:

(1)docker run的那些参数是什么意思?

(2)怎么看nginx的日志呢?

以第一个命令:$ docker run --name helloworld -d -p 8080:80 daocloud.io/nginx 来说,”—name” 是给容器起了一个名字;-d 表示容器运行在后台,如果前台,用-i表示交互式;-p 8080:80 表示端口映射,将宿主机的8080端口转发到容器内的80端口;daocloud.io/nginx 表示刚才下载的镜像(Image)。

看日志? 用命令,docker logs $container_id  或者 docker logs $container_name

➜  ~ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES

c1d93fbaa49e        daocloud.io/nginx   "nginx -g 'daemon off"   8 minutes ago       Up 8 minutes        443/tcp, 0.0.0.0:9090->80/tcp   helloworld2

4871c4b47f83        daocloud.io/nginx   "nginx -g 'daemon off"   15 minutes ago      Up 15 minutes       443/tcp, 0.0.0.0:8080->80/tcp   helloworld

➜  ~ docker logs 4871c4b47f83

172.17.0.1 - - [02/Nov/2016:13:04:16 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" "-"

172.17.0.1 - - [02/Nov/2016:13:05:02 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" "-"

➜  ~ docker logs helloworld

172.17.0.1 - - [02/Nov/2016:13:04:16 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" "-"

172.17.0.1 - - [02/Nov/2016:13:05:02 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" “-"


四、容器的管理:查看,进入,stop, start, restart, kill, 删除

查看宿主机运行着多少个容器,刚才已经用到过 docker ps 命令。

进入容器内,用 docker attach helloworld命令。

$ docker attach helloworld

发现什么动静都没有? 如果我们用curl 再访问以下nginx 8080口子,进入容器的状态下会出现一条日志:

$ docker attach helloworld

172.17.0.1 - - [02/Nov/2016:13:18:25 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.37.1" “-"

如果我们要查看容器内运行了哪些进程呢? 用 docker top $container  命令:

$ docker top helloworld

PID                 USER                TIME                COMMAND

1889                root                0:00                nginx: master process nginx -g daemon off;

1905                104                 0:00                nginx: worker process

停掉一个容器,可以用stop或kill,区别是stop是优雅关闭,可以做一些收尾工作,kill是强制关闭。

➜  ~ docker stop helloworld

helloworld

➜  ~ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES

c1d93fbaa49e        daocloud.io/nginx   "nginx -g 'daemon off"   20 minutes ago      Up 20 minutes       443/tcp, 0.0.0.0:9090->80/tcp   helloworld2

docker ps 显示的是正在运行的容器,如果要显示所有容器(包括停止运行的),需要docker ps -a 参数。

~ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                           NAMES

c1d93fbaa49e        daocloud.io/nginx   "nginx -g 'daemon off"   23 minutes ago      Up 23 minutes              443/tcp, 0.0.0.0:9090->80/tcp   helloworld2

4871c4b47f83        daocloud.io/nginx   "nginx -g 'daemon off"   30 minutes ago      Exited (0) 3 minutes ago                                   hello world

如何再次启动helloworld这个容器呢? 直接 docker start helloworld,并不需要像最开始那样docker run了。

docker restart 和  kill 自行试试看。如果我们彻底不要hello world这个容器呢?用docker rm $container命令(执行的前提是容器先停止,或者-f强行删除一个正在运行的容器)。

➜  ~ docker rm helloworld

helloworld

➜  ~ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES

c1d93fbaa49e        daocloud.io/nginx   "nginx -g 'daemon off"   26 minutes ago      Up 26 minutes       443/tcp, 0.0.0.0:9090->80/tcp   helloworld2

名字叫”helloworld”的容器再也不存在了。


五、发布自己的一个 Docker Image

时间不早了,下次再说吧~~

剧透下实验内容,下载一个centos的镜像,然后运行起来,进入这个容器,在容器内,就跟我们平时进入的centos操作系统没啥区别。

不过这个简单的centos容器里面,什么工具都没有,比如常用的nc命令呀,curl命令呀,都没有。我们会进入容器,在容器内手动安装nc命令(当然也可以类似Linux的Bash一样弄个脚本,这脚本叫Dockerfile )。

接着我们会想,我们不希望后来者这么麻烦,需要手动安装nc命令,能做到吗?

可以。我们把安装了nc命令的centos容器,保存为一个镜像,然后起个名字叫centos-with-nc,并发布到docker 仓库,

后来者就可以下载并运行centos-with-nc这个镜像了。他们进入容器时,就能直接用nc命令了。


六、总结(简版操作)


[x]  Mac Pro 上如何安装Docker

下载docker for mac:      https://pan.baidu.com/s/1i47ylkp

[ ]  概念:Docker 引擎,宿主机,镜像(Image),容器(Container)

     $ docker run --name helloworld -d -p 8080:80 daocloud.io/nginx

     $ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES

4871c4b47f83        daocloud.io/nginx   "nginx -g 'daemon off"   2 minutes ago       Up 2 minutes        443/tcp, 0.0.0.0:8080->80/tcp   hello world

mac 机器叫宿主机,docker命令工具集叫docker引擎,docker run 的daocloud.io/nginx 叫镜像,docker ps列表显示的叫容器。

[ ]  在 Docker 上如何运行 Nginx

   $ docker run --name helloworld -d -p 8080:80 daocloud.io/nginx

[ ]  容器的管理:查看,进入,stop, start, restart, kill, 删除

   查看:docker ps  或 docker ps -a

   进入: docker attach $container

   docker start/stop/kill/restart/rm  $container 等

[ ] 怎么发布自己的一个 Docker Image ?

    下次再说

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容