一.docker的win10安装

对于win10专业版,docker官方提供了可以直接使用的docker for windows。

下载地址

下载完成后,

docker spring参数覆盖_docker


点击运行,如果win10 没有开启 hyper-v ,会提示你开启。

开启之后,docker不一定可以安装成功,因为电脑的cpu虚拟化可能没开通过。查看是否开通,通过任务管理器查看:

docker spring参数覆盖_nginx_02


上面的虚拟化:已启用

如果没有启用,就进入bios中设置

security->visuality 开启cpu虚拟化安装完成后,docker的图标就会出现了,任务栏中可爱的小鲸鱼就是docker的图标。

右键有两个地方,常用。一个是settings,进入后

docker spring参数覆盖_docker_03


这里Daemon中,可以通过配置指定镜像源,因为国外网太差了,因此,可以采用阿里镜像仓库。

另一个就是

kitematic,如果电脑中没有安装的话,就会提示你安装,这是个图形化的docker管理客户端。

ps:如果原来装过docker,现在重新装,有可能会导致kitematic启动不成功的情况,这个时候,把错误放在google中搜一下,在github的issue中有解答。

二.docker 的理解和使用

2.1 理解docker的三大核心内容

镜像:docker把应用所需要的环境统一打包成一个镜像,可以理解成一个轻量级的操作系统了。
容器:docker运行镜像,根据镜像的模型,创造出一个容器,运行。
仓库:存放镜像的地方。

这样理解:docker是一个瓷器厂,镜像就是模具,容器就是根据模具制造出来的瓷器,仓库就是方模具的小房子。

拥有了docker镜像,只要你把环境和app一起打包成镜像,放到docker远程仓库中去。如果你的app需要放到生产环境上,只需要在linux中安装docker,然后运行你的镜像就好了。无需关心环境。
在分布式环境下,如果要做集群横向扩展,只需要把docker镜像在多个机器上运行,就行了。非常方便。

docker的整体架构:

docker spring参数覆盖_docker_04


docker的核心就是这个Docker deaemon 后台程序,我们通过client 终端,通过命令行的形式,来和这个后台程序交互。

如:

docker pull 从镜像仓库中pull一个镜像到本地

docker run 将一个镜像变成容器,运行

2.2 各种命令详解

  • 远程仓库获取docker images
    docker pull 镜像名:tag
    默认获取最新latest版本,如果不指定tag
  • 列出镜像
    docker images
    结果

Repository

Tag

image id

ubuntu

latest

c9d990395902

这里的Repository是指镜像全名在冒号:之前的部分,冒号之后的部分是tag(这个镜像的版本)
镜像的唯一标志 repository:tag 或者 image id

  • 删除镜像
    docker rmi imageid 根据imagid删除id
  • 运行镜像生成容器
    docker run -p 8080:80 -d daocloud.io/nginx

docker run daocloud.io/nginx 这是没有任何参数的启动一个容器。这里注意 daocloud.io/nginx 表示的并不是完整的镜像名,完整的镜像名应该是 daocloud.io/nginx:latest 应该要指定一个tag ,如果没有的话,就默认是latest。

-p 表示端口映射 本机端口:镜像端口 -d 表示这个进程是后台启动

上面的命令也可以写成 docker run -p 8080:80 -d imageId 用imageId也是可以指定镜像的。

docker run -it imgaeId /bin/bash
运行容器,并执行 /bin/bash 命令开启终端

  • 查看正在运行的容器
    docker ps 显示正在运行的 加了参数 -a 会显示所有的容器(容器并不是关了就会消失的,而是会存在,只是处于停止状态)
    结果:

Container id

image

names

0e82e93e1ee3

daocloud.io/nginx

ndaeg-da

container id 表示 容器的id 能指定唯一container
image 表示容器的镜像模具
names 如果不指定 名字,会随机生成一个名字。 可以通过 –name zkRabbitmq 参数指定名字。

根据 container id ,可以对容器进行 docker stop停/restart重启/start开启/rm删除 cotainerId 对容器进行操作

  • 把文件copy到容器内
    docker cp Desktop\API.md 78c04://usr
    通过cp 把当前文件 copy 到 指定容器中去
    78c04 指容器的id ://进入到根目录

注意:如果重启这个容器,那么根目录中这个文件就会消失了,因为容器在重启之后,因为容器内所做的改变都是暂时的。
如果想要保留这个改变,唯一的办法就是在这个基础上,生成一个新的镜像

docker commit -m “api” 78c04 nginx-api 这样就在源镜像 daocloud.io/nginx 基础上生成了新的镜像名为 nginx-api

三.Dockerfile的使用

通过编写简单的文件,自创docker
一个简单的Dockerfile

FROM ubuntu:14.04       //from表示从哪个基础镜像之上构建        
    MAINTAINER horseChestnut  // 表明创作者
    RUN apt-get update   //在构建镜像时,执行的命令
    RUN apt-get -y -q install nginx
    RUN mkdir -p /var/www/html
    ADD nginx/global.conf /etc/nginx/conf.d/   //向镜像中添加文件
    ADD nginx/nginx.conf /etc/nginx/nginx.conf
    EXPOSE 80    // 暴露端口给外界
    ENTRYPOINT["java", "-jar", "/app.jar"]  
   // ENTRYPOINT 表示,容器启动后要执行的命令,通过字符串数组形式分开,实际执行的是 java -jar /app.jar
    VOLUMN["/opt/project", "/data"] // volumn把镜像中特定文件,绕过文件系统,挂载到宿主机上,进行数据持久化,下一节会详细讲如何挂载

一个实际web项目的Dockerfile

FROM maven  // jdk8基础上构建镜像

MAINTAINER HorseChest   //创作者

ADD server/target/*.jar web.jar   //把web项目jar包 放到镜像中

EXPOSE 8080  //暴露端口

ENTRYPOINT ["java", "-jar", "/app.jar"]

在Dockerfile执行的时候,每执行一句都会生成一个新的镜像,docker中镜像是一层一层的堆叠的。因此,如果RUN命令每个命令都要重新构建一个镜像那会造成镜像过多。因此我们把第一个Dockerfile来修改一下:

FROM ubuntu:14.04              
    MAINTAINER horseChestnut  

    // 三行run变成了一行
    RUN apt-get update  \                  
    && apt-get -y -q install nginx \
    && mkdir -p /var/www/html

    ADD nginx/global.conf /etc/nginx/conf.d/   
    ADD nginx/nginx.conf /etc/nginx/nginx.conf
    EXPOSE 80    
    ENTRYPOINT["java", "-jar", "/app.jar"]  
    VOLUMN["/opt/project", "/data"]
  • 通过Dockerfile 创建一个镜像的命令
    在Dockerfile在的目录下通过: docker build -t 镜像名
  • 将镜像推送到远程仓库
    docker push horse/hello-world:[镜像版本号]
    这里推送没有加任何地址,是因为默认推送到cloudhub中去。
    如果要推送到阿里云仓库中:
    docker push registry.cn-hangzhou.aliyuncs.com/horse/hello-world:[镜像版本号]
    而且,这样推送是不会成功的,因为没有权限的,你要先登录到阿里云仓库
    docker login –username=用户名 registry.cn-hangzhou.aliyuncs.com

四.Docker中volums的挂载

前面也提到了docker容器在删除后,就会丢失所有容器内的改变(容器关闭,再重启是不会丢失数据的!!)。但是有时候,数据很重要,那么就需要做持久化处理,docker是怎么解决的呢?
docker 通过 volumn 机制,可以把主机某个目录和容器中的某个目录关联起来,使得容器内的改变,容器内的数据都会存储在宿主机中。即使容器被删除了,数据也不会丢失。
独立于容器之外的持久化存储技术

相关命令详解

  • docker run -v /usr/share/nginx/html daocloud.io/nginx
    运行容器,并把容器中的 /usr/share/nginx/html 目录和宿主机中随机分配的一个目录关联起来了
  • docker insepect containid
    查看容器的详细信息,可以看到
"Mounts": [
           {
               "Type": "volume",
               "Name": "c32152bd9d809cda018a120ad0996a5c7567e24d1950464cd1d1bdf4ba84e89c",
               "Source": "/var/lib/docker/volumes/c32152bd9d809cda018a120ad0996a5c7567e24d1950464cd1d1bdf4ba84e89c/_data",
               "Destination": "/usr/share/nginx/html",
               "Driver": "local",
               "Mode": "",
               "RW": true,
               "Propagation": ""
           }
        ],

分配了一个随机目录 /var/lib/docker/volumes/c32152bd9d809cda01/_data,
如果是linux系统,就可以直接进去看了,我是window for docker ,没找到什么方法进入虚拟机中查看。
只要你在宿主机的目录中修改了,那么容器中也会相应改动。

  • docker run –name nginxzk -p 8080:80 -v /e/zlog:/usr/test daocloud.io/nginx
    表示把 e盘下的zlog文件夹挂载到容器内 /usr/test 文件夹
    注意:1.windows系统下 e盘用 /e 来表示
    2.如果容器中test文件夹本身存在,那么zlog的内容会把它覆盖掉
  • docker run -d –name nginxzy -p 8080:80 -v $pwd/zlog:/usr/share/nginx/html daocloud.io/nginx
    和上面命令意思一样,但是路径用 $pwd 代表当前路径

小问题:在docker镜像中一般都不含vim,但是有时候,我们需要修改配置文件,因此要在容器中安装vim。命令是:
apt-get update
apt-get install vim