手把手体验 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 ?

    下次再说

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值