docker--初体验

时间:2023-03-08 19:02:11

  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引导过程如下:

docker--初体验

  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第一次启动一个容器时,初始的读写层是空的,当文件系统发生变化的时候,这些变化都会应用在读写层上。如果想改一个文件,这个文件首先会从读写层下面的只读层复制到读写层,文件的只读版本依然存在,操作的是读写层的副本。当创建一个容器的时候,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 
docker--初体验docker--初体验
  有了镜像,就可以从镜像启动容器,
docker--初体验

容器中的80端口被映射到宿主机32772端口,一个nginx服务便在docker容器中运行了。

docker--初体验