一.docker的win10安装
对于win10专业版,docker官方提供了可以直接使用的docker for windows。
下载完成后,
点击运行,如果win10 没有开启 hyper-v ,会提示你开启。
开启之后,docker不一定可以安装成功,因为电脑的cpu虚拟化可能没开通过。查看是否开通,通过任务管理器查看:
上面的虚拟化:已启用
如果没有启用,就进入bios中设置
security->visuality 开启cpu虚拟化安装完成后,docker的图标就会出现了,任务栏中可爱的小鲸鱼就是docker的图标。
右键有两个地方,常用。一个是settings,进入后
这里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的核心就是这个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