Docker入门学习三之运行Docker镜像和容器

一、第一个Docker镜像和容器——HelloWorld

      1.学习几条命令

  • docker pull [OPTION] NAME[:TAG] :表示从Docker的远程仓库拉取一个镜像到本地,NAME是必填内容,即我们所要拉取的镜像的名称,[:TAG]是可选的,如果不填,则默认会加上[:LA],表示镜像的最新版本,如果填了就会制定镜像的具体版本,所以[:TAG]就是版本的意思。
  • docker imags [OPTION] [REPOSITORY[:TAG] ] :表示查看本地都有哪些镜像,也可以用来验证pull是否成功,[REPOSITORY[:TAG] ]这个可以用来指定镜像的名称和版本,特别是当本地镜像比较多的时候,会用的比较多。
  • docker run [OPTION] IMAGE[:TAG] [COMMAND][ARG...] :IMAGE表示要运行的镜像名称,[:TAG]表示镜像的版本,[COMMAND]表示镜像运行起来之后要执行什么命令,[ARG...]表示要执行的命令所依赖的参数, [OPTION] 表示运行起来的一些选项,非常多且复杂。
  • docker ps 可以查看当前机器运行的容器
  • docker exec [OPTION] CONTAINER[:TAG] [COMMAND][ARG...] :表示进入一个运行中的容器的内部(比如查看日志,系统是否正常,调试镜像是否正常),CONTAINER容器名称或容器ID,[:TAG]容器版本,[COMMAND]要的命令在容器中运行,常用的[OPTION]有-i :保证我们的输入有效在没有attached的时候,-t :分配一个伪终端,以便输入内容。

      2.案例:我们从远程pull一个hello-word镜像

      (1)拉取镜像,可以看到不加[:TAG] 会默认拉取最新的

docker pull hello-word
Using default tag: latest
latest: Pulling from library/hello-world

5b0f327be733: Pull complete
Digest: sha256:175735360662078abd70dacb73c5518d5b3ae7c1ed069d22def5da57c3e917d6
Status: Downloaded newer image for hello-world:latest

      (2)查看本地镜像,REPOSITORY镜像名字,TAG镜像版本,IMAGE ID 64位字符串(这里只显示了12位,被截取了),唯一标识镜像,CREATED最后修改时间,SIZE镜像大小。

C:\WINDOWS\system32>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              05a3bd381fc2        7 weeks ago         1.84kB

      注意:镜像的名称为什么是hello-world,这个是可以到远程镜像仓库中心可以查询到的,而pull时只提供镜像的名称,而没有仓库地址信息,则默认到Docker的镜像仓库中心http://hub.docker.com获取镜像。

      (3)运行hello-world镜像,如果成功的显示如下,表示成功运行,且你的Docker安装是没有问题的。

C:\WINDOWS\system32>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              05a3bd381fc2        7 weeks ago         1.84kB

C:\WINDOWS\system32>docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

为了生成下面的消息,Docker花费了以下步骤:
To generate this message, Docker took the following steps:
 1. Docker 客户端连接了daemon
 1. The Docker client contacted the Docker daemon.

 2. Docker daemon 从Docker仓库拉取了hello-world镜像
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.

 3. Docker daemon 从这个镜像中创建了一个容器,这个容器运行了一个可执行文件,可执行文件可以产生你当前看到的输出
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.

 4. Docker daemon 把输出变成输出流给到Docker客户端,Docker客户端将它发送到了你的终端
 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://cloud.docker.com/

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

      3.图解Docker从拉取镜像到运行镜像整个流程:

     

  • 首先左边是我们本机的Docker客户端,中间是本机由Docker daemon管理的容器和镜像,最右边则是Docker的远程仓库;
  • docker pull命令,经由客户端发起请求,告知Docker daemon要拉取哪个镜像,Docker daemon则会先在本地查找镜像是否存在,如果存在并且就是所要拉取的版本就不会做任何的操作,如果不存在,下一步它就会到Docker的远程仓库中查找我们要拉取镜像的名字,如果找到了就会从Docker远程仓库下载到我们本地;
  • docker run命令,经由客户端发起请Docker daemon,Docker daemon接收到请求会先检查本机镜像是否存在,如果不存在就会执行一个docker pull命令(先从远程Docker仓库将镜像下载回来),然后将镜像经过一定的方式运行起来,变成Docker的容器。

二、Docker运行Nginx镜像

      1.Nginx镜像

  • 持久运行的容器
  • 前台挂起 & 后台运行,最好使用后台运行
  • 进入容器内部

      2.运行Nginx镜像步骤

      (1)前往网易蜂巢镜像中心https://c.163.com/hub#/m/home/查找Nginx镜像,需要登录!然后搜索Nginx,可以看到如下,有两个Nginx镜像,一个是library/nginx,一个是public/nginx,通过图标也可以区别,第一个也就是带有鲸鱼图标的是从Docker官网的镜像仓库同步过来的,和Dokcer的是一摸一样的,我们使用Docker的镜像,我们点开它,然后复制下载地址http://docker pull hub.c.163.com/library/nginx:latest

     

      

 

      (2)然后到终端上将它pull下来,再查看镜像,可以看到Nginx镜像成功拉取下来了!

C:\WINDOWS\system32>docker pull hub.c.163.com/library/nginx:latest
latest: Pulling from library/nginx
5de4b4d551f8: Pull complete
d4b36a5e9443: Pull complete
0af1f0713557: Pull complete
Digest: sha256:f84932f738583e0169f94af9b2d5201be2dbacc1578de73b09a6dfaaa07801d6
Status: Downloaded newer image for hub.c.163.com/library/nginx:latest

C:\WINDOWS\system32>docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
hello-world                   latest              05a3bd381fc2        7 weeks ago         1.84kB
hub.c.163.com/library/nginx   latest              46102226f2fd        6 months ago        109MB

      (3)我们使用docker run hub.c.163.com/library/nginx运行Nginx镜像

docker run hub.c.163.com/library/nginx

      运行之后,你会发现没有任何反应,我们再开一个终端查看下当前运行的容器,你可以看到Nginx其实已经运行起来了,说明这是使用前台启动的方式,我们使用Ctrl+C把它停了,再次docker ps,发现已经停止运行了。

C:\WINDOWS\system32>docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED              STATUS              PORTS               NAMES
f756bb16d3cc        hub.c.163.com/library/nginx   "nginx -g 'daemon ..."   About a minute ago   Up About a minute   80/tcp              modest_poincare

      其实最好的运行方式是后台运行,使用docker run -d表明运行程序在后台,并打印容器的ID (如果不知道用什么参数,可以使用docker run --help查看帮助),再通过查看docker ps是否成功运行。

C:\WINDOWS\system32>docker run -d hub.c.163.com/library/nginx
6f80393759d2ac6884faa5a5ff78588e7e57838e613c054cb960513c730af981

      (4)进入容器内容 docker exec -it 6f80 bash

C:\WINDOWS\system32>docker exec -it 6f80 bash
root@6f80393759d2:/# ls
bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  etc  lib   lib64  media   opt  root  sbin  sys  usr
root@6f80393759d2:/# which nginx
/usr/sbin/nginx
root@6f80393759d2:/# exit
exit

      3.Docker网络

      (1)网络类型

      Docker的隔离性,网络也是隔离性的一部分,Linux用了namespace(即命名空间)来进行资源的隔离,比如pid namespace就是用来隔离进程的,network namespace就是用来隔离网络的,每一个network namespace都提供了一个独立的网络环境,包括像网卡、路由、iptable规则等都是与其他的network namespace隔离的。

  • Bridge :Docker容器一般在默认情况下,会分配一个独立的network namespace,也就是网络类型中的Bridge桥接模式。
  • Host :另一种是Host,如果启动容器指定使用Host模式,那么这个容器就不会获得一个独立的network namespace,而是和主机共同使用一个,这个时候容器不会再虚拟出自己的网卡、配置自己的ip等,只会使用宿主机上的ip和端口,也就是说当你在Docker里面使用网络的时候,跟在主机上使用是一样的
  • None :第三种就是没有网络,这种情况下,Docker将不会跟外界的任何东西进行通讯

      (2)端口映射:在使用Bridge模式的时候,就涉及到如何让容器中的端口可以在主机上访问到(因为它有独立的namespace),这个时候就需要用到端口映射技术。Docker可以指定,你想把容器内的某一个端口和容器所在主机上的端口做一个映射,当你访问主机的端口时,其实就是访问容器里的一个端口。

     

      我们将Nginx容器的端口和主机的端口做一个端口映射,这样访问主机的指定端口时就可以访问Nginx容器中的指定端口了:

      (1)使用docker run -d -p 8080:80 hub.c.163.com/library/nginx命令

C:\WINDOWS\system32>docker run -d -p 8080:80 hub.c.163.com/library/nginx
b3d5a8b4472b0e072abdc496c2a0748a5a341a3c260ba932dcc40a0216aea7f1

C:\WINDOWS\system32>docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                  NAMES
b3d5a8b4472b        hub.c.163.com/library/nginx   "nginx -g 'daemon ..."   8 seconds ago       Up 7 seconds        0.0.0.0:8080->80/tcp   practical_torvalds

      我们上面可以看到我们将本机的8080端口映射到了Nginx容器中的80端口,并且成功启动,我们在浏览器访问本机的8080端口,看是否可以访问到Nginx容器的80端口(当看到下图是,表明成功的访问到了Nginx的欢迎页):

     

      (2)使用docker run -d -P hub.c.163.com/library/nginx命令,表示主机的所有端口可以和容器做端口映射,并且会随机分配一个端口32768映射到80端口,我们再次使用浏览器访问本机8080端口已经无法打开了,这次需要访问分配的随机端口32768进行访问!

C:\WINDOWS\system32>docker run -d -P hub.c.163.com/library/nginx
8e539fc8a0cd3a357bc466e7cbdfb7386430ce53aa008338a2c5f21f790c014c

C:\WINDOWS\system32>docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                   NAMES
8e539fc8a0cd        hub.c.163.com/library/nginx   "nginx -g 'daemon ..."   8 seconds ago       Up 8 seconds        0.0.0.0:32768->80/tcp   frosty_darwin

 

本文为原创文章,如果对你有一点点的帮助,别忘了点赞哦!比心!如需转载,请注明出处,谢谢!

 

转载于:https://my.oschina.net/aibinxiao/blog/1560529

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值