本篇适合于对docker有一定了解的同学,如果不知道docker是什么,有哪些特点请自行百度。
一、image镜像相关
“镜像”这个词语应该很多人都知道,假设我们安装windows系统,一个windows iso文件,这个iso文件就是镜像文件。但是对于docker的镜像来说并非是iso文件,它也没有文件实体。
获取image方式有如下四种方式:
1、docker pull 镜像名字。例如docker pull centos。默认是从官方dockerhub registry下载,但是很遗憾的告诉,基本上下载不了,因为被墙了。
2、从现有容器中,导出一个镜像。
[root@mycontainer ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b1d9d59b365 67591570dd29 "/bin/bash" 15 minutes ago Up 15 minutes tender_liskov
[root@mycontainer ~]#
[root@mycontainer ~]#
对于导入和导出有两对命令行,如下所示:
1)save/load 这种方式会把images结构和rootfs文件系统一起打包,相当于是完整的images。
[root@localhost containerc]# docker save busybox > busybox.tar
[root@localhost containerc]# docker load < busybox.tar
2)export/import 这种方式只会吧rootfs文件系统打包,并不包含images结构。
话说回来,如果都有docker容器,为啥还要自己去制作镜像呢?所以就下面这两种方式了。
3、从现有linux系统导出rootfs系统。
制作tar包用于打包rootfs(最好找一个比较干净的linux或者重新安装CentOS-7.0-x86_64-minimal.iso,不然打包出的文件很大)
[root@localhost home]#
[root@localhost home]# tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7.0-base.tar /
[root@localhost home]#
通过import命令生成images
cat centos7.0-base.tar | docker import - centos7-base
4、自己制作一个镜像(Centos:febootstrap 、Ubuntu:debootstrap)
以上内容就是获取或者制作镜像。建议:取一个干净、最简单的镜像作为基础镜像。接下来介绍一下镜像相关的命令行。
[root@mycontainer ~]# docker images --help
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter value Filter output based on conditions provided (default [])
--format string Pretty-print images using a Go template
--help Print usage
--no-trunc Don't truncate output
-q, --quiet Only show numeric IDs
Images相关的内容,比较简单。基本上罗列当前系统内的images列表。下面这个命令行,比较底层了,用于查询image和container的信息,此命令行会输出json格式数据,具体内容在另外一篇介绍。
[root@mycontainer ~]#
[root@mycontainer ~]# docker inspect -h
Usage: docker inspect [OPTIONS] CONTAINER|IMAGE|TASK [CONTAINER|IMAGE|TASK...]
Return low-level information on a container, image or task
-f, --format Format the output using the given go template
--help Print usage
-s, --size Display total file sizes if the type is container
--type Return JSON for specified type, (e.g image, container or task)
[root@mycontainer ~]#
[root@mycontainer ~]#
我们辛苦创建的镜像应该如何分享给大家呢?这需要用到私有仓库了,私有仓库搭建请参考此篇。
二、container容器相关
可能有很多像我一样的初学者,一直搞不清楚docker中image和container是什么关系?我可以用一个最简单的例子说明:image是就是类文件(.cpp or .java),容器是就是这些类文件new出来的对象,也就是说image是静态事物,container是动态事物。image只能有且只有一个,但container可以有多个。
通过docker run 命令可以创建一个容器,run子命令是非常庞大的命令,里面有很多参数,这里不一一具体介绍,只介绍常用参数,若想知道相关命令,可通过docker run --help查看。
参数 | 说明 | 举例 | 备注 |
--name | 指定容器名称 | docker run --name hello | 如果没有指定则随机生成 |
-e, --env value | 设置环境变量 | docker run -e “a=b” XX XX | 设置多个环境变量,需写多个-e |
-d, --detach | 后端运行 | docker run -d | 无 |
-h,--hostname string | 执行容器名称 | docker run -h hello | 无 |
-p, --publish value | 端口映射 | docker run -p 1000:2000 | 1000为host主机端口 2000为容器端口 |
-P, --publish-all | 端口映射所有 | docker run -P | 不经常用,出于安全考虑最好不要这样操作。 |
-i, --interactive | 交互式 | docker run -i | 无 |
-t, --tty | 启动终端 | docker run -t | 无 |
-v, --volume value | 挂载目录 | docker run -v /hostdir:dir | Hostdir为主机中目录 Dir为容器内目录 |
下面是具体演示内容:
1、后端启动模式
[root@localhost ~]# docker run -d -p 10000:22 -h mydocker-1 -e hello=hello-world --name myssh3 myos/centos-ssh
e737abe438fce9215bed439415da657002549dd4447a276d28bb7fb3dbdfab2b
[root@localhost ~]#
[root@localhost ~]#
我这个容器是具有ssh服务的,在启动容器的时候如果没有指定Command,默认启动ssh后台服务。我们通过ssh命令进入docker容器内。
[root@localhost ~]# ssh -p 10000 root@127.0.0.1
The authenticity of host '[127.0.0.1]:10000 ([127.0.0.1]:10000)' can't be established.
ECDSA key fingerprint is e8:3e:19:87:3a:ce:8e:7f:48:49:36:57:6b:a2:49:5c.
Are you sure you want to continue connecting (yes/no)? yes
[root@mydocker-1 ~]#
[root@mydocker-1 ~]#
[root@mydocker-1 ~]#
查看docker容器信息
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4813cfbf0566 myos/centos-ssh "/usr/sbin/sshd -D" 4 minutes ago Up 3 minutes 0.0.0.0:10000->22/tcp myssh3
bd9a3709107e myos/centos-ssh "/bin/bash" 7 minutes ago Up 6 minutes 22/tcp myssh
[root@localhost ~]#
[root@localhost ~]#
2、端口映射
端口映设在上面已经配置了,并且用过ssh方法验证通过
3、交互式
[root@localhost ~]#
[root@localhost ~]# docker run -it docker.io/centos /bin/bash
[root@4be2076e67de /]#
[root@4be2076e67de /]#
启动容器还有一个命令exec,那么exec和run有什么区别呢?
exec:在已经存在容器中执行命令。
run: 基于image创建一个容器,同时执行命令。