docker这个词已经越来越热,很多docker的概念是从周围人和知乎上看的,打算从功能上先了解docker,深入的话放在以后。
ps:正好手头有一台腾讯云的vps,单核,1G内存,可以拿来做实验,腾讯云还能直接申请配置好的docker环境,一块钱每月,学生党的福利吧
docker是基于c-s架构的,它有一个 docker程序,既能作为客户端,也能作为服务器,作为客户端时,docker程序向docker守护进程发送请求,然后再对返回的结果进行处理。docker的一些命令一般需要在root账户下执行。
1. docker环境可以用了吗
docker安装很简单,安装之后验证它是否能够正常工作,
root@VM---ubuntu:~# docker info Containers: 7 #现有的容器 Images: 11 #现有的镜像 Storage Driver: aufs #存储驱动 Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: Dirperm1 Supported: false Execution Driver: native-0.2 #执行驱动 Logging Driver: json-file Kernel Version: --generic Operating System: Ubuntu LTS CPUs: Total Memory: MiB Name: VM---ubuntu ID: J2H5:LG3K:EL4Q:PKAL:K37L:C36K:GUIE:JQIW:XKAP:AL66:D7RS:7OEN Username: changan Registry: https://index.docker.io/v1/ WARNING: No swap limit support
2.docker用起来是怎么样的?
大部分书都会给运行docker的第一个容器
root@VM---ubuntu:~# docker run -i -t ubuntu /bin/bash root@d05d3db1b990:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
运行这条命令,发现终端从本机的~目录下跳转到 root@d05d3db1b990的 / 目录下,d05d3db1b990就是当前我们创造出来的容器,我们现在所处的是在容器里面的shell,有了这个shell,我们就能很方便的在这个容器里面执行各种操作,做这个容器的时候,我们定制它的模板是 ubuntu,所以我们可以把它当作一个新的操作系统用,这条命令的 -i 参数保证容器里面的STDIN是开启的,-t参数告诉docker要为创造的容器分配一个伪tty终端,这样,新创建的容器才能提供一个与我们交互的shell,这样我们创建的是一个可以交互的容器,同样,我们也能创建一个后台服务的容器。
在这里,我们选择是ubuntu这样一个基础镜像,同样也能选择 centos,fedora等其他镜像,Linux的不同发行版很多,但是它们都是依托唯一的Linux内核。在我们指定了ubuntu参数以后,docker去哪找这么多的基础部件呢,莫非我们在安装的时候就已经把各个操作系统,服务器的代码下载下来放到本地,用的时候去本地找?或者是每次取到用户指定的参数,拼接一个url,然后去一个地方下载?首先,docker回去本地的一个固定目录下去查找是否有本次要用的资源,如果没有,docker会连结官方的的Docker hub,看看网络上是否有镜像,找到后下载到本地,然后构建目标容器,如果本地和网络都找不到,命令只能返回一个失败。
容器操作的几个命令:
root@VM---ubuntu:~# docker ps #查看正在运行的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES root@VM---ubuntu:~# docker ps -a #所有容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d05d3db1b990 ubuntu minutes ago Exited () About a minute ago serene_banach 7916a41706d3 ubuntu hours ago Exited () minutes ago daemon_test
root@VM---ubuntu:~# docker start daemon_test #启动一个容器 daemon_test #返回容器名 root@VM---ubuntu:~# docker ps #容器启动了 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7916a41706d3 ubuntu hours ago Up seconds daemon_test root@VM---ubuntu:~# docker stop daemon_test #停止正在运行的容器 daemon_test #返回容器名
root@VM---ubuntu:~# docker run --name zzztest_daemon -d ubuntu /bin/bash -c "while true; do echo hello docker; sleep 3; done;" #创建一个守护式容器 --name是给这个容器取名 fe97ada54ee9ee5fe96b78033d80595b8e23006527782609757fe11474ba2aca root@VM---ubuntu:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fe97ada54ee9 ubuntu seconds ago Up seconds zzztest_daemon root@VM---ubuntu:~# docker logs zzztest_daemon hello docker hello docker hello docker
root@VM-30-109-ubuntu:~# docker logs -ft zzztest_daemon # -f选项类似 tail -f -t表示加上时间戳
2016-11-27T06:12:18.037582372Z hello docker
2016-11-27T06:12:21.039988788Z hello docker
2016-11-27T06:12:24.041247906Z hello docker
2016-11-27T06:12:27.042243171Z hello docker
2016-11-27T06:12:30.043316648Z hello docker
docker很便捷的是把容器做成了几条命令,直接敲几条命令就能启动几个容器,在容器里运行服务,像其他的命令一样,想知道docker的更多用法,只需要 docker --help
镜像与容器
docker镜像是用来启动容器的构建基石,能够修改,创建,存储,共享镜像,还有docker-hub和本地hub来存储和共享镜像。
1.镜像是什么
回到docker的作用上,docker相当于在寄主机上虚拟出了几个小的虚拟机,我们在构建出来的小的虚拟机里面工作,就像做系统一样,镜像就相当于我们的镜像盘,用来装机,这里相当于装的是小虚拟机。类似于所有机器的启动过程,这里的虚拟机启动也要经过引导然后运行在一定的环境中。Linux引导过程如下:
Linux操作系统引导参考:https://www.ibm.com/developerworks/cn/linux/l-linuxboot/ docker的虚拟过程与之类似。
docker的镜像是由文件系统叠加的,最低端是引导文件系统,跟Linux引导文件系统类似;也可以类比为进程加载的时候loader去加载进程的可执行文件(进程镜像),操作系统的用户不会去跟引导程序打交道,对于docker也是一样,docker用户不会与引导文件系统有什么交互,一个容器启动后,引导文件就完成了它的使命,之后就从内存中卸载了,留出更多的内存供 initrd 磁盘镜像使用。docker镜像的第二层是root文件系统rootfs,位于引导文件系统之上,rootfs可以是一种或多种操作系统(如debian,ubuntu文件系统)。
在传统的Linux引导过程中,root文件系统最先以只读的方式加载,当引导结束,它会被切换为读写模式;但是在docker里,root文件系统永远是只读的状态,并且docker又会在root文件系统上加载更多的只读文件系统,加载会将各层文件系统叠加在一起,这一层一层的文件系统成为镜像。
对于加载的多层镜像,一个镜像可以放在另一个镜像的顶部,容器的镜像最后就是一堆镜像的叠加。最后。当从一个镜像启动容器的时候,docker会在最顶层加载一个读写文件系统,我们想在docker容器中运行的程序就是在这个读写层运行的。
当docker第一次启动一个容器时,初始的读写层是空的,当文件系统发生变化的时候,这些变化都会应用在读写层上。如果想改一个文件,这个文件首先会从读写层下面的只读层复制到读写层,文件的只读版本依然存在,操作的是读写层的副本。当创建一个容器的时候,docker会构建一个镜像栈,并在栈的最顶端增加一个读写层,这个读写层加上其下面的镜像层和配制数据,就构成了容器。
构建容器
用Dockerfile能很快的利用现有镜像构建容器,dockerfile的书写有一定的规则,作用相当于Makefile对于 make,
# commet FROM ubuntu MAINTAINER changan "907743748@qq.com" RUN apt-get update RUN apt-get install -y nginx RUN echo 'index in container..' > /usr/share/nginx/html/index.html EXPOSE
容器中的80端口被映射到宿主机32772端口,一个nginx服务便在docker容器中运行了。