目录: 

  1. Docker介绍 

  2. 传统虚拟化与容器虚拟化的区别 

  3. Container的核心技术及相关概念 

  4. 安装docker

  5. Docker镜像管理 

  6. Docker容器管理  

  7. Docker网络之端口映射

  8. Docker存储之挂载目录

  9. 手动构建一个docker镜像 

  10. 未完待续... 


正文: 

一、Docker介绍:  

  什么是docker?Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会,遵从了Apache2.0协议,项目代码在GitHub上进行维护。Docker自开源后受到广泛的关注和讨论,Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。 

 为什么要使用Docker?作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势。

首先,Docker?容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。其次,Docker对系统资

源的利用率很高,一台主机上可以同时运行数千个Docker容器。容器除了运行其中的应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽可能量小。传统虚拟机方式运行10个不同的应用就要起10个虚拟机,而Docker只需要启动10个隔离的应用即可。具体说来,Docker?在如下几个方面具有较大的优势: 

  • 更快速的交付和部署 

  对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行,开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。 

  • 更高效的虚拟化 

  Docker容器的运行不需要额外的hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。 

  • 更轻松的迁移和扩展  

    Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服

务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

  • 更简单的管理 

    使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分

发和更新,从而实现自动化并且高效的管理。 

二、传统虚拟化与容器虚拟化的区别  

  • 传统虚拟化:  

    创建速度: 很慢; 

    性能影响: 通过对于硬件层的模拟, 增加了系统调用链路的环节, 有性能损耗;  

    资源消耗: 很大; 

    操作系统覆盖: 支持Linux,Windows,Mac等.  

  • 容器虚拟化: 

    创建速度: 非常快,秒级; 

    性能影响: 共享kernel, 几乎没有性能损耗;  

    资源消耗: 很小, 一台机器可以轻松创建多个Container.

    操作系统覆盖: 仅仅kernel所支持的OS.   

图示: 

Docker入门详解_第1张图片

三、Container的核心技术及相关概念    

核心技术: 

1. NameSpace:内核级别,实现容器间的隔离;    

  • PID NameSpace:PID隔离

  • Network NameSpace:网络设备、网络栈、端口等网络资源隔离

  • User NameSpace:用户和用户组资源隔离

  • IPC NameSpace:信号量、消息队列和共享内存的隔离

  • UTS NameSpace:主机名和域名的隔离;

  • Mount NameSpace:挂载点(文件系统)隔离; 

2. CGroup:Linux Control Group,限制容器的资源使用;  

  • blkio:设定块设备的IO限制;

  • cpu:设定CPU的限制;

  • cpuacct:报告cgroup中所使用的CPU资源;

  • cpuset:为cgroup中的任务分配CPU和内存资源;

  • memory:设定内存的使用限制;

  • devices:控制cgroup中的任务对设备的访问;

  • freezer:挂起或恢复cgroup中的任务;

  • ...

 功能包括: 

  • Resource limitation:资源限制;

  • Prioritization:优先级控制;

  • Accounting:审计和统计,主要为计费;

  • Control:挂起进程,恢复进程;

四、安装docker    

关于docker的安装网上的资料很多,推荐到官网查看安装文档进行安装。  

官网安装文档: https://docs.docker.com/engine/installation/linux/centos/   

安装步骤:  

新版的docker分为社区版和企业版,且企业版收费。 

此处安装社区版(docker-ce): 

1. check linux system version:

[root@docker ~]# cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core) 
[root@docker ~]#

2. Install yum-utils, which provides the yum-config-manager utility:

[root@docker ~]# yum install -y yum-utils

3. Use the following command to set up the stable repository:

[root@docker ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

4. Optional: Enable the edge repository.

[root@docker ~]# yum-config-manager --enable docker-ce-edge

5. Update the yum package index.  

[root@docker ~]# yum makecache fast

6. Install the latest version of Docker 

[root@docker ~]# yum install docker-ce

7. Start Docker.

[root@docker ~]# systemctl start docker.service

8. Verify that docker is installed correctly by running the hello-worldp_w_picpath. 

[root@docker ~]# docker run hello-world
Unable to find p_w_picpath 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete 
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer p_w_picpath for hello-world:latest

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" p_w_picpath from the Docker Hub.
 3. The Docker daemon created a new container from that p_w_picpath 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 p_w_picpaths, 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/

[root@docker ~]#

查看docker是否正确安装,只要输出以上信息,则表示已正确安装;也有可能运行docker run hello-world没有以上信息输出,这是因为docker被墙的原因. 

查看docker版本: 

[root@docker ~]# docker -v
Docker version 17.03.0-ce, build 3a232c8
[root@docker ~]#

或: 

[root@docker ~]# docker version 
Client:
 Version:      17.03.0-ce
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 08:10:07 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.0-ce
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 08:10:07 2017
 OS/Arch:      linux/amd64
 Experimental: false
[root@docker ~]#

至此,docker安装完成,以上安装过程全都基于官网安装文档完成。 

五、docker镜像管理 

 1. 查看本地镜像: # docker p_w_picpaths  

 2. 删除镜像: # docker rmi "镜像名称或ID" 

   注: 不能删除已创建容器的镜像, 如果要强制删除,用-f选项.  

 3. 下载一个镜像到本地: # docker pull "镜像名称"

 4. 查询可用的镜像: # docker search "想要查询的镜像名称"

 5. 导入一个本地镜像: # docker load < "镜像包文件" 

 6. 导出一个本地镜像: # docker save "镜像名称或ID"  > xxx.tar.gz   

由于我的docker run hello-world这一步操作成功,已自动在本地pull了一个镜像hello-world: 

[root@docker ~]# docker p_w_picpaths
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              48b5124b2768        2 months ago        1.84 kB
[root@docker ~]#

下载一个centos7.3镜像到本地:  

首先进行查询: 

[root@docker ~]# docker search centos7.3
NAME                                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
zhangshengju/centos7.3                   This p_w_picpath contains iproute package based ...   0                    
hiramag/centos7.3                        centos 7.3 - run yum update, install git, ...   0                    
faressoft/centos7.3                                                                      0                    
alang85/centos7.3                                                                        0                    
shinnyh/centos7.3                                                                        0                    
erixero/centos7.3-jre8                   Centos 7.3 with Java JRE 8                      0                    
sidclab/centos7.3-ansible                                                                0                    
erixero/centos7.3-base-p_w_picpath             Centos 7.3 Base Image                           0                    
bigstepnetops/bsi-docker-centos7.3-***                                                   0                    
[root@docker ~]#

下载: 

[root@docker ~]# docker pull hiramag/centos7.3     
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/hiramag/centos7.3/manifests/latest: read tcp 10.68.7.222:52190->50.17.62.194:443: read: connection reset by peer
[root@docker ~]#

以上错误是典型的GFW的原因. 

解决办法要么本地导入一个镜像,要么找国内的docker hub.  

1) 本地导入: (我在此处导入的镜像包已上传至百度云:http://pan.baidu.com/s/1pLlUO2n 

[root@docker ~]# ls
anaconda-ks.cfg  centos-latest.tar.xz
[root@docker ~]# docker load < centos-latest.tar.xz 
fa5be2806d4c: Loading layer [==================================================>] 1.024 kB/1.024 kB
2ebc6e0c744d: Loading layer [==================================================>] 204.2 MB/204.2 MB
044c0f15c4d9: Loading layer [==================================================>] 1.024 kB/1.024 kB
28e524afdd05: Loading layer [==================================================>] 1.024 kB/1.024 kB
[root@docker ~]#

查看: 

[root@docker ~]# docker p_w_picpaths
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              48b5124b2768        2 months ago        1.84 kB
centos              latest              778a53015523        11 months ago       197 MB
[root@docker ~]#

可以看到第二个镜像就是刚才手动导入的那个。 

2) 国内的docker hub:  

DaoCloud上面有提供免费的镜像供下载: https://hub.daocloud.io/

此处我查找一个nginx的镜像下载下来: 

[root@docker ~]# docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d daocloud.io/nginx 
Unable to find p_w_picpath 'daocloud.io/nginx:latest' locally
latest: Pulling from nginx
5040bd298390: Pull complete 
333547110842: Pull complete 
4df1e44d2a7a: Pull complete 
Digest: sha256:3a9a844e5066f9ec9e11dc26f19e6f0bd5a433620b81a6d9ee25c53372ec9b30
Status: Downloaded newer p_w_picpath for daocloud.io/nginx:latest
038b4e08add26f6cfda9437a5cca2449b4e92c21d2697b039cb8652d3024bf65
[root@docker ~]#

该命令为我直接复制粘贴的,docker run命令的作用等下会说. 

查看从DaoCloud下载下来的镜像:  

[root@docker ~]# docker p_w_picpaths
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/nginx   latest              cc1b61406712        7 weeks ago         182 MB
hello-world         latest              48b5124b2768        2 months ago        1.84 kB
centos              latest              778a53015523        11 months ago       197 MB
[root@docker ~]#

六、Docker容器管理   

 1. 创建一个容器: # docker run ... 

   查看帮助: # docker run --help   

 2. 启动一个容器: # docker start "容器名称或ID"   

 3. 关闭容器: # docker stop "容器名称或ID"  

 4. 查看正在运行的容器: # docker ps

 5. 查看所有已创建的容器: # docker ps -a 

   -l: 查看容器的更详细信息. 

 6. 删除容器: # docker rm "容器名称或ID"

 7. 到容器上执行一个命令后退出立即删除该容器:docker run --rm "镜像名称或ID" "要执行的命令"

 8. 杀死正在运行的容器: # docker kill "容器名称或ID"  

 9. 进入容器的三种方法:  

   # docker attach 

   # docker exec  

   # nsenter 

下面开始举例各命令的用法: 

1)利用本地镜像创建一个镜像: 

[root@docker ~]# docker run -i -t centos 
[root@61602baab3f0 /]#   ---->这样就成功创建了一个容器并且进到容器里面,退出用"exit"命令.

关于选项"-i -t"的作用,可以通过"docker run --help"获悉. 

注: 该创建容器的命令还可以写成"docker run -i -t centos bash",bash的作用表示执行bash命令,省略表示默认执行。但是如果想让容器一创建就执行你想执行的命令,则不能够省略,且该"docker run"命令最后必须加一个供容器一启动就能执行的命令. 

然后查看该容器: 

[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS               NAMES
61602baab3f0        centos              "/bin/bash"              9 minutes ago       Exited (0) 41 seconds ago                          cocky_murdock
038b4e08add2        daocloud.io/nginx   "nginx -g 'daemon ..."   27 minutes ago      Up 27 minutes                  80/tcp, 443/tcp     some-nginx
2a05fb13921e        hello-world         "/hello"                 About an hour ago   Exited (0) About an hour ago                       quizzical_varahamihira
[root@docker ~]#

可以看到刚才创建的容器已存在,包括各种信息,NAMES为容器的名称,可以手动指定,如果没有手动指定,系统就会自动随机创建一个.其他两个容器分别是运行"docker run hello-world"和从DaoCloud下载镜像时自动创建的容器。

2)启动一个容器: 

[root@docker ~]# docker start 61602baab3f0   //这里我用的容器ID,也可以用容器名称。 
61602baab3f0
[root@docker ~]#

3)查看已启动的容器: 

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
61602baab3f0        centos              "/bin/bash"              16 minutes ago      Up About a minute                       cocky_murdock
038b4e08add2        daocloud.io/nginx   "nginx -g 'daemon ..."   34 minutes ago      Up 34 minutes       80/tcp, 443/tcp     some-nginx
[root@docker ~]#

可以看到第一个就是。第二个是刚才从DaoCloud下载镜像时自动创建并启动的容器。

4)杀死正在运行的容器: 

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
61602baab3f0        centos              "/bin/bash"              19 minutes ago      Up 4 minutes                            cocky_murdock
038b4e08add2        daocloud.io/nginx   "nginx -g 'daemon ..."   36 minutes ago      Up 36 minutes       80/tcp, 443/tcp     some-nginx
[root@docker ~]# docker kill 61602baab3f0
61602baab3f0
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
038b4e08add2        daocloud.io/nginx   "nginx -g 'daemon ..."   37 minutes ago      Up 37 minutes       80/tcp, 443/tcp     some-nginx
[root@docker ~]#

如果想要杀死所有正在运行的容器,执行命令: 

# docker kill $(docker ps -q)

选项"-q"表示仅列出正在运行的容器的ID号。 

5)进入容器的方法: 

第一种: 使用"docker attach"命令 

首先开启刚才kill掉的容器: 

[root@docker ~]# docker start ea0928cfcad2
ea0928cfcad2
[root@docker ~]#

查看正在运行的容器: 

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ea0928cfcad2        centos              "/bin/bash"              6 minutes ago       Up About a minute                       wonderful_northcutt
038b4e08add2        daocloud.io/nginx   "nginx -g 'daemon ..."   47 minutes ago      Up 2 seconds        80/tcp, 443/tcp     some-nginx
[root@docker ~]#

进入ID为ea0928cfcad2的容器:   

[root@docker ~]# docker attach ea0928cfcad2 
[root@ea0928cfcad2 /]#

可以看到主机名已变,已成功进入,并且发现容器的主机名默认就是容器的ID号其实容器的主机名可以更改,后面再详述。 

注: 通过"attach"进入容器后,执行"exit"退出后容器也就终止了,通过docker ps命令查看时该容器已不再运行。并且如果通过该命令打开两个终端界面,可以发现操作是实时同步的。 

第二种方法: 使用"docker exec"命令 

继续先退出ID为ea0928cfcad2的容器,然后开启它,执行下面的命令:

[root@docker ~]# docker exec -i -t ea0928cfcad2 
"docker exec" requires at least 2 argument(s).
See 'docker exec --help'.

Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container
[root@docker ~]# docker exec -i -t ea0928cfcad2 /bin/bash
[root@ea0928cfcad2 /]#

可以看到,执行的第一条命令报错了,原因是"docker exec" requires at least 2 argument(s),根据该命令的用法,最后加可执行的命令就可以了。

该命令可以让容器在后台运行,退出再次进入容器不会终止。 

第三种方法: 使用第三方工具nsenter. 

该工具如果没有安装,安装方法: yum install util-linux 

使用该工具需要知道容器的PID, 因此需要先启动容器,因为停止的容器没有PID. 

查看正在运行的容器: 

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ea0928cfcad2        centos              "/bin/bash"              18 minutes ago      Up 6 minutes                            wonderful_northcutt
038b4e08add2        daocloud.io/nginx   "nginx -g 'daemon ..."   59 minutes ago      Up 12 minutes       80/tcp, 443/tcp     some-nginx
[root@docker ~]#

获取ID为ea0928cfcad2的容器的PID: 

[root@docker ~]# docker inspect --format "``.`State`.`Pid`" ea0928cfcad2
5755
[root@docker ~]#   //注意格式,还有"``.`State`.`Pid`"中字母大小写不能错。

通过nsenter命令进入容器: 

[root@docker ~]# nsenter -t 5755 -p -n -u -i
[root@ea0928cfcad2 ~]#   //通过主机名可以发现已成功进入容器里面。

注: nsenter命令的用法可以查看帮助文档。并且生产环境也比较推荐使用该种方法进入容器。

七、Docker网络之端口映射  

Docker的端口映射分为两种: 随机端口映射和指定端口映射。

随机端口映射的好处是端口为系统随机分配,不会产生冲突。 

  1. 随机端口映射: 

1) 查看网桥

[root@docker ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242a838182e	no		
[root@docker ~]#

2)创建一个容器并指定随机端口: 

[root@docker ~]# 
[root@docker ~]# docker p_w_picpaths  //查看镜像.
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/nginx   latest              cc1b61406712        7 weeks ago         182 MB
hello-world         latest              48b5124b2768        2 months ago        1.84 kB
centos              latest              778a53015523        11 months ago       197 MB
[root@docker ~]# docker run -d -P daocloud.io/nginx   //创建一个容器.
6147656a8adeeb67a0758f2c0b05294ca99e6eff0efbe82362572ee7a3dac669
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                           NAMES
6147656a8ade        daocloud.io/nginx   "nginx -g 'daemon ..."   10 seconds ago      Up 9 seconds        0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp   agitated_noether
[root@docker ~]#

可以看到系统把宿主机的32769端口映射到了容器的80号端口. 

# docker run -d -P   

选项: 

  -d: 在后台运行容器并打印容器ID.

  -P: 将所有暴露端口发布到随机端口. 

此时,浏览器访问: http://10.68.7.222:32769 即可访问到容器的80端口处: 

Docker入门详解_第2张图片

查看容器log: 

[root@docker ~]# docker logs 6147656a8ade
10.68.7.174 - - [17/Mar/2017:02:29:14 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0" "-"

10.68.7.174是我笔记本的IP,用的火狐浏览器访问的,都没问题。 

 2. 指定端口映射   

[root@docker ~]# docker p_w_picpaths
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/nginx   latest              cc1b61406712        7 weeks ago         182 MB
hello-world         latest              48b5124b2768        2 months ago        1.84 kB
centos              latest              778a53015523        11 months ago       197 MB
[root@docker ~]# docker run -d -p 81:80 daocloud.io/nginx   //再新创建一个基于指定端口的容器。
fbd4b2a65a0fe34bb05f050ea5aa163c5bf9bd524c6f87415f30e49db9a52a40
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                           NAMES
fbd4b2a65a0f        daocloud.io/nginx   "nginx -g 'daemon ..."   8 seconds ago       Up 8 seconds        443/tcp, 0.0.0.0:81->80/tcp                     zealous_northcutt
6147656a8ade        daocloud.io/nginx   "nginx -g 'daemon ..."   15 minutes ago      Up 15 minutes       0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp   agitated_noether
[root@docker ~]#

可以看到,上面第一个容器就是基于指定端口创建的,宿主机的81端口映射到了容器的80号端口.

浏览器访问: 

Docker入门详解_第3张图片

没有问题.  

八、Docker存储之挂载目录 

Docker存储目录在容器创建时挂载分为数据卷挂载和数据卷容器挂载: 

挂载数据卷: 

   -v /data 不指定宿主机目录挂载.

   -v src:dst  指定宿主机目录挂载.

挂载数据卷容器: 

   --volumes-from 

  1. 数据卷挂载 - 不指定宿主机目录: 

[root@docker ~]# docker p_w_picpaths
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/nginx   latest              cc1b61406712        7 weeks ago         182 MB
hello-world         latest              48b5124b2768        2 months ago        1.84 kB
centos              latest              778a53015523        11 months ago       197 MB
[root@docker ~]# docker run -i -t --name "volume" -h "volume" -v /data 778a53015523   
[root@volume /]# ls /data
[root@volume /]#

几个选项: 

  --name: 指定容器的名称,如不指定则系统自动分配;

  -h: 指定容器的主机名,如不执定则为该容器的ID号。  

查找挂载至容器的宿主机的被挂载目录:

[root@docker ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
eefb3ba02459        778a53015523        "/bin/bash"         6 minutes ago       Up 6 minutes                            volume
[root@docker ~]# docker inspect volume 
 ... 
 "Mounts": [
            {
                "Type": "volume",
                "Name": "d6f1de76c43ec7690e52d8ff88f27c7872b946dae6f379608a3102f9614b8d7c",
                "Source": "/var/lib/docker/volumes/d6f1de76c43ec7690e52d8ff88f27c7872b946dae6f379608a3102f9614b8d7c/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
 ...

可以看到"Source"那一行所在路径就是:

[root@docker ~]# cd /var/lib/docker/volumes/d6f1de76c43ec7690e52d8ff88f27c7872b946dae6f379608a3102f9614b8d7c/_data
[root@docker _data]# ls
[root@docker _data]# mkdir from_suzhuji
[root@docker _data]#   // 进入该目录并创建目录。

然后到容器挂载目录下查看并创建目录: 

[root@volume /]# ls /data
from_suzhuji
[root@volume /]# mkdir to_suzhuju
[root@volume /]#

到宿主机下查看: 

[root@docker _data]# ls
from_suzhuji  to_suzhuju
[root@docker _data]#

没问题。  

2. 数据卷挂载-指定宿主机目录: 

[root@docker ~]# docker p_w_picpaths
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/nginx   latest              cc1b61406712        7 weeks ago         182 MB
hello-world         latest              48b5124b2768        2 months ago        1.84 kB
centos              latest              778a53015523        11 months ago       197 MB
[root@docker ~]# docker run -i -t --name "src_dst" -h "src_dst" -v /src:/dst centos  
[root@src_dst /]# ls /dst
[root@src_dst /]#

到宿主机下创建文件: 

[root@docker ~]# ls /src
[root@docker ~]# mkdir /src/to_dst

到容器里面查看并创建文件: 

[root@src_dst /]# ls /dst
to_dst
[root@src_dst /]# mkdir /dst/to_src
[root@src_dst /]#

宿主机下查看: 

[root@docker ~]# ls /src
to_dst  to_src
[root@docker ~]#

还可以指定对挂载目录的读写权限: ro表示只读,rw表示读写。 

[root@docker ~]# docker p_w_picpaths
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/nginx   latest              cc1b61406712        7 weeks ago         182 MB
hello-world         latest              48b5124b2768        2 months ago        1.84 kB
centos              latest              778a53015523        11 months ago       197 MB
[root@docker ~]# docker run -i -t -v /suzhuji:/rongqi:ro centos 
[root@b213a8acdd64 /]# ls /rongqi/
[root@b213a8acdd64 /]# mkdir /rongqi/hello
mkdir: cannot create directory '/rongqi/hello': Read-only file system
[root@b213a8acdd64 /]#

3. 数据卷容器挂载: 

数据卷容器就是在一个容器上挂载的目录,其他容器可以来共享此目录:

此处前后启用两台容器测试,其中一台沿用上一步骤所创建的容器:

[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f4b5133b5d5d        centos              "/bin/bash"         About an hour ago   Up About an hour                        src_dst
[root@docker ~]#

该容器挂载的目录是宿主机的src目录和容器的dst目录。 

再启用一台容器,使用数据卷容器挂载的方式: 

[root@docker ~]# docker p_w_picpaths
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/nginx   latest              cc1b61406712        7 weeks ago         182 MB
hello-world         latest              48b5124b2768        2 months ago        1.84 kB
centos              latest              778a53015523        11 months ago       197 MB
[root@docker ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f4b5133b5d5d        centos              "/bin/bash"         About an hour ago   Up About an hour                        src_dst
[root@docker ~]# docker run -i -t --name "node" -h "node" --volumes-from "src_dst" centos
[root@node /]#  
[root@node /]# ls /dst
to_dst  to_src
[root@node /]#

可以看到,容器名为"src_dst"的容器挂载的目录"dst"通过使用数据卷容器挂载的方式成功的挂载到了容器名为"node"的容器中,如果再有其他容器想共享此目录,还可以以这种方式继续挂载。 

九、手动构建一个docker镜像.   

首先启动一个容器:  

[root@docker ~]# docker p_w_picpaths
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/nginx   latest              cc1b61406712        7 weeks ago         182 MB
hello-world         latest              48b5124b2768        2 months ago        1.84 kB
centos              latest              778a53015523        11 months ago       197 MB
[root@docker ~]# docker run -i -t --name "centos" -h "centos" centos 
[root@centos /]# cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core) 
[root@centos /]#

从阿里云镜像站点获取epel源,使用rpm安装:

[root@centos /]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm   
Retrieving https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
warning: /var/tmp/rpm-tmp.4GTKAT: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:epel-release-7-9                 ################################# [100%]
[root@centos /]#

用yum安装nginx,vim, ifconfig: 

[root@centos /]# yum -y install nginx vim net-tools

注: ifconfig命令需要用net-tools包来安装.  

提交镜像: 

[root@docker ~]# docker commit -m "myself create mirror" 3ca2b0d7d50c yangbin/centos7.2:v1 
sha256:3f4344bee94a9f904376538ac61ecebbc06326cecf21d97fd21b91987c2379b4
[root@docker ~]#

-m: Commit message,即要提交的信息。 

3ca2b0d7d50c是容器ID. 

yangbin/centos7.2:v1是完整的镜像名称,v1指版本,latest指最终版。 

注:”Error response from daemon: invalid reference format: repository name must be lowercase”,如果报该错误,则是因为没有将“yangbin/centos7.2:v1”全部改为小写。

查看已提交的镜像: 

[root@docker ~]# docker p_w_picpaths
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
yangbin/centos7.2   v1                  3f4344bee94a        11 minutes ago      378 MB
daocloud.io/nginx   latest              cc1b61406712        7 weeks ago         182 MB
hello-world         latest              48b5124b2768        2 months ago        1.84 kB
centos              latest              778a53015523        11 months ago       197 MB
[root@docker ~]#

用已创建的镜像运行一个容器: 

[root@docker ~]# docker run -it -p 83:80 yangbin/centos7.2:v1 
[root@b207705c00bb /]# nginx   //启动nginx服务。 
[root@b207705c00bb /]#

浏览器访问: 

Docker入门详解_第4张图片

十、未完待续...  


以上是我学习Docker的一些基础知识,在此做个总结,之后我会抽空将Docker的高级功能做个总结。