大白话Docker入门(一) 原

原文出处: https://yq.aliyun.com/articles/63035?utm_campaign=wenzhang&utm_medium=article&utm_source=QQ-qun&utm_content=m_7538

随着docker现在越来越热门,自己也对docker的好奇心也越来越重,终于忍不住利用了一些时间把docker学习一遍。目前的资料不少,但是由于docker的发展较快,每个团队对docker的关注点也并不相同,大部分的文章还是不够完整和易懂,所以希望有这样一篇文章能让大家通过简单的阅读来客观全面的认识一下docker。

(提前申明一下,文章内容不会涉及较深入的使用,主要为了阐述docker的概念和入门的使用。并且我也是docker的初学者,并没有过丰富的使用经验,所以内容若有不妥,请大家指正,希望能在日后不断的完善。)

先简单认识一下Docker吧

Docker由下面几样东西组成,先简单认识一下吧

  • Docker Client : Docker提供给用户的客户端。Docker Client提供给用户一个终端,用户输入Docker提供的命令来管理本地或者远程的服务器。
  • Docker Daemon : Docker服务的守护进程。每台服务器(物理机或虚机)上只要安装了Docker的环境基本上就跑了一个后台程序Docker Daemon,Docker Daemon会接收Docker Client发过来的指令,并对服务器的进行具体操作。
  • Docker Images : 俗称Docker的镜像,这个可难懂了。你暂时可以认为这个就像我们要给电脑装系统用的系统CD盘,里面有操作系统的程序,并且还有一些CD盘在系统的基础上安装了必要的软件,做成的一张 “只读” 的CD。
  • Docker Registry : 这个可认为是Docker Images的仓库,就像git的仓库一样,用来管理Docker镜像的,提供了Docker镜像的上传、下载和浏览等功能,并且提供安全的账号管理可以管理只有自己可见的私人image。就像git的仓库一样,docker也提供了官方的Registry,叫做Dock Hub(http://hub.Docker.com)
  • Docker Container : 俗称Docker的容器,这个是最关键的东西了。Docker Container是真正跑项目程序、消耗机器资源、提供服务的地方,Docker Container通过Docker Images启动,在Docker Images的基础上运行你需要的代码。 你可以认为Docker Container提供了系统硬件环境,然后使用了Docker Images这些制作好的系统盘,再加上你的项目代码,跑起来就可以提供服务了。 听到这里,可能你会觉得是不是有点像一个VM利用保存的备份或者快照跑起来环境一样,其实是挺像的,但是实际上是有本质的区别,后面我会细说。

Docker是怎么玩的?

一下接触这么多东西肯定有一点点晕了吧,没关系,我们把这些串起来走一遍就会好了。

  1. 首先你得安装一下docker的环境,这个我在这里就不说了,针对你的系统看一下docker的官网( http://www.docker.com/products/docker ) 吧。
  2. 安装好后,我们在terminal中就有了docker的命令了,这个命令就是Docker Client啦。所有的操作都是通过docker命令完成的。比如: docker version 
ruideMacBook-Pro:~ ruihuang$ docker version
Client:
 Version:      1.12.1
 API version:  1.24
 Go version:   go1.7.1
 Git commit:   6f9534c
 Built:        Thu Sep  8 10:31:18 2016
 OS/Arch:      darwin/amd64
Server:
 Version:      1.12.1
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   23cf638
 Built:        Thu Aug 18 17:52:38 2016
 OS/Arch:      linux/amd64
  1. 查看一下我们拥有了哪些images吧,命令: docker images 
ruideMacBook-Pro:~ ruihuang$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED
job1                latest              de714ebe3a54        29 hours ago
ubuntu              latest              f753707788c5        3 weeks ago
busybox             latest              e02e811dd08f        4 weeks ago

可以看到我们拥有3个images,其中ubuntu大家都知道,busybox是一个linux下的大工具箱,它集成压缩了 Linux 的许多工具和命令,而job1则是我自己基于busybox创建的一个image,可以通过busybox的工具进行一些命令的执行,比如 echo 'hello world'。

  1. 再查看一下我们有哪些Docker Container吧,命令: docker ps 
ruideMacBook-Pro:~ ruihuang$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED
2c08ddb62c77        ubuntu              "/bin/bash"         28 hours ago
5aa853bdb033        ubuntu              "/bin/bash"         28 hours ago

这里看到的都是正在运行的Container,如果要查看所有的Container就使用 docker ps -a 

  1. 下面我们从Docker hub的Registry下载一个Image,命令: docker pull image-name 
ruideMacBook-Pro:~ ruihuang$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest

再看一下现在images,命令: docker images 

ruideMacBook-Pro:~ ruihuang$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED
job1                latest              de714ebe3a54        30 hours ago
ubuntu              latest              f753707788c5        3 weeks ago
busybox             latest              e02e811dd08f        4 weeks ago
hello-world         latest              c54a2cc56cbb        4 months ago

我们看到刚才我们从docker hub上面下载了一个docker官方已经制作好的叫做hello-world的image,下载完成后,就在本地可以查看到这个image了。

  1. 我们把hello-world的image,放到一个docker container里面让他跑起来吧。命令  docker run image-name 
ruideMacBook-Pro:~ ruihuang$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

这个image运行后很简单,就是打印了这段话。告诉了我们,我们已经成功的让docker daemon从docker hub上拉了一个"hello-world"的image,并且通过这个image创建了一个container,并且通过daemon将输出的内容传回了docker client,也就是我们现在看到的这段话。

  1. 我们最后再看一下是否真的创建了docker container,命令 docker ps -a 
ruideMacBook-Pro:~ ruihuang$ docker ps -a
CONTAINER ID  IMAGE        COMMAND    CREATED            STATUS
3d9b24449cb3  hello-world  "/hello"  9 minutes ago     Exited (0) 9 minutes ago
c08ddb62c77    ubuntu  "/bin/bash"  28 hours ago       Up 28 hours

首先看到,确实已经创建了docker container了,可见 docker run  的命令实际上是create 和 start的结合命令,基于hello-world的image创建并启动了container。container启动后执行了打印的程序,打印完上面我们看到的那句话,程序执行完成,container也跟着关闭了。从STATUS可以看出,在9分钟前hello-world的这个container已经exited了。

思考一下

  • 这里我们可以想象一下,这个hello-world里面到底有什么?前面我也说了,其实一个image就是一个系统盘加上你的代码,所以对于这个hello-world的image,我想里面就是一个busybox这样的命令工具箱和一个打印文本(echo ....)的个sh文件,当image加载后执行了这个sh文件这么简单。
  • 那么再思考一下,如果要我去创建这个image,我也可以拿一个ubuntu的image,并且安装了jre,再写一个class,main方法里面打印这段文本,最后build成这一个image,上传到docker hub。是不是也是一个hello-world-for-java的image呢。其它人下载后也可以一样的打印出预期的结果。

小结

好了通过这个简单的演示,希望大家已经初步认识了docker是怎么运作的。下面我们再来聊docker的概念和他可以为我们带来什么吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

crnn docker/nvidia-docker 安装

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

2811
来自专栏糊一笑

小白学Docker之Swarm

承接上篇文章:小白学Docker之基础篇,自学网站来源于https://docs.docker.com/get-started 系列文章: 小白学Docker之...

42811
来自专栏Laoqi's Linux运维专列

Kubernetes 1.8.6 集群部署–部署Web UI界面(七)

5867
来自专栏技术翻译

在K8s群集中构建容器映像

了解如何从Kubernetes集群内的Dockerfile构建容器映像源,并将映像推送到IBM Cloud Container Registry; 所有这一切都...

2241
来自专栏LuckQI

容器Docker学习系列五~命令学习history,save, import

随着我们几篇文章Docker的命令学习,关于Docker本地镜像管理的命令学习已经接近尾声。今天我们就学习下本地镜像管理的最后三个命令history,save,...

1271
来自专栏iOSDevLog

Docker Cheat Sheet

“使用Docker,开发人员可以使用任何工具链以任何语言构建任何应用程序。”Dockerized“应用程序完全可移植,可以在任何地方运行 - 同事的OS X和W...

1352
来自专栏技术翻译

使用Kubernetes和Docker将Spring Boot和MongoDB作为容器部署

对于本教程,您将拥有一个Dockerized示例spring-boot应用程序,该应用程序与MongoDB通信以获取GET / POST REST API并部署...

2170
来自专栏运维

k8s1.5.3集群测试之部署PODS实例

http://jerrymin.blog.51cto.com/3002256/1898243

1192
来自专栏乐沙弥的世界

再说 Oracle RAC services

        应用程序工作负载在Oracle 10g中可以被定为services,也称之为服务,能够在单实例中使用,也能够在RAC中单独使用和管理。因此整个数...

1194
来自专栏Laoqi's Linux运维专列

Ansible自动化编译安装Nginx服务

2275

扫码关注云+社区