Docker 是在 Linux 容器里运行应用的开源工具,是一种轻量级的"虚拟机"。Docker 的 Logo 设计为蓝色鲸鱼,拖着许多集装箱。如下图,鲸鱼可以看作宿主机,而集装箱可以理解为相互隔离的容器。每个集装箱中都包含自己的应用程序。
打包应用程序简化部署 可脱离底层硬件任意迁移——如:服务器从腾讯云迁移到阿里云
Docker 镜像是 Docker 容器运行时的只读模板,镜像可以用来创建 Docker 容器。每一个镜像由一系列的层(layers)组成。
Docker 利用容器来运行应用,一个 Docker 容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。容器是从镜像创建的运行实例。它可以被启用,开始,停止,删除。每个容器都是互相隔离的,保证安全的平台。
Docker 仓库是用来集中保存镜像的地方,当创建了自己的镜像后,可以使用 push 命令将它上传到共有仓库(Public)或者私用仓库(Private),这样一来当下次要在另外台机器上使用这个镜像时,只需要从仓库上拉取下来就可以了。
查看 Docker 版本
[root@localhost ~]# docker version1)搜索镜像
命令语法:docker search 关键字 //用来搜索远端官方仓库中的共享镜像2)获取镜像
命令语法:docker pull 名称把刚才提供链接里的 centos7,拖到虚拟机中
[root@Docker ~]# ls anaconda-ks.cfg centos7 docker docker-18.06.1-ce.tgz [root@Docker ~]# [root@Docker ~]# docker load < centos7 #load命令加载成镜像 f972d139738d: Loading layer 208.8MB/208.8MB Loaded image: centos:latest注解:
REPOSITORY:镜像属于的仓库(名称)TAG:镜像的标签信息,标记同一仓库中的不同镜像(默认为 latest)IMAGE ID:镜像的唯一 ID号,唯一标识了该镜像。CREATED:镜像创建时间。SIZE:镜像大小。还可以根据镜像的唯一标识 ID 号,获取镜像详细信息
[root@localhost ~]# docker inspect 75835a67d134只是一个标签,而不是新建一个镜像,只是为了方便:
[root@Docker ~]# docker tag centos:latest centos7:centos7 [root@Docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 75835a67d134 2 years ago 200MB centos7 centos7 75835a67d134 2 years ago 200MB 再添加一个标签,方便后面实验: [root@Docker ~]# docker tag centos:latest centos8:centos8使用 docker rmi 命令可以删除多余镜像
有两种方式:
根据镜像标签 [root@Docker ~]# docker rmi centos7:centos7 Untagged: centos7:centos7 [root@Docker ~]# docker images 根据镜像 ID [root@Docker ~]# docker rmi -f 75835a67d134 [root@Docker ~]# docker images再重新加载一下镜像
[root@Docker ~]# docker load < centos7本地存储的镜像越来越多,就需要指定一个专门的地方存放这些镜像—仓库。
命令格式:docker push 名称:标签注意:因为镜像上传需要网络,所以暂不使用容器的创建必须在镜像的基础上,不可以单独创建,是镜像的可写层。
命令格式:docker create [选项] 镜像 运行的程序常用选项:
-i:表示让容器的输入保持打开。-t:表示让 Docker 分配一个伪终端。--name:指定名字创建容器:
[root@Docker ~]# docker create -it --name test centos:latest /bin/bash [root@Docker ~]# docker ps -a启用容器:
[root@Docker ~]# docker start test [root@Docker ~]# docker ps如果用户想创建并启动容器,可以执行 docker run 命令
命令格式:docker run [选项] 镜像 运行的程序 [root@Docker ~]# docker run --name zhangsan centos:latest /bin/bash -c ls但是通过查看容器运行状态,发现,运行完命令就停止了,start 启动也没有用
[root@Docker ~]# docker ps -a有时候需要在后台持续运行这个容器,就需要添加 -d 选项
[root@localhost ~]# docker run -d --name lisi centos:latest /bin/bash -c "while true;do echo ok;done" [root@localhost ~]# docker ps -a容器的暂停运行
[root@localhost ~]# docker pause test #暂停运行 [root@localhost ~]# docker unpause test #继续运行导出容器:将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。
命令格式:docker export 容器ID/名称 > 文件名 [root@Docker ~]# docker export test > centos-test [root@Docker ~]# ls -lh centos-test -rw-r--r-- 1 root root 199M 12月 6 23:04 centos-test导入容器:将容器文件生成镜像。
命令格式:cat 文件名 | docker import - 生成的镜像名称:标签 [root@Docker ~]# cat centos-test | docker import - centos:test [root@Docker ~]# docker imagesCgroup 是 Control group 的简写,是 Linux 内核提供的一种限制所使用物理资源的机制,这些资源主要包括 CPU、内存、blkio。
只有在容器运行时才会在系统 CPU 路径下生成目录。
[root@Docker ~]# docker create -it --name aaa centos:latest /bin/bash [root@Docker ~]# docker start aaa
当多个容器任务运行时,很难计算 CPU 的使用率,为了使容器合理使用 CPU 资源,可以通过 --cpu-shares 选项设置 CPU 按比例共享 CPU 资源,这种方式还可以实现 CPU 使用率的动态调整。
[root@Docker ~]# docker run -itd --name bbb --cpu-shares 1024 centos:latest在 Docker 中可以使用 --cpuset-cpus 选项来使某些程序独享 CPU 内核,以便提高其处理速度。真实的服务器 CPU 有多个内核;而虚拟机里,默认只有一个,内核0。
[root@Docker ~]# cat /proc/cpuinfo processor : 0 #这行就是CPU的编号的意思,如果有多个CPU ,会有多个这个段 vendor_id : GenuineIntel cpu family : 6 model : 158 model name : Intel(R) Core(TM) i5-9300HF CPU @ 2.40GHz stepping : 13 microcode : 0xc6 cpu MHz : 2400.002 cache size : 8192 KB ---------------------------------创建一个新的容器 ccc,使该容器上的进程,只可以在内核 0 上运行:
[root@Docker ~]# docker run -itd --name ccc --cpuset-cpus 0 centos:latest [root@Docker ~]# docker ps | grep ccc [root@Docker ~]# cat /sys/fs/cgroup/cpuset/docker/根据容器ID号来写/cpuset.cpus 0在 Docker 中可以通过 docker run -m 命令来限制容器内存使用量,当内存超过了限制的容量,Linux 内核将会尝试收回这些内存,如果仍旧没法控制使用内存在限制范围之内,进程就会被杀死。
创建一个新的容器 ddd ,内存限制为 512 MB:
[root@Docker ~]# docker run -itd -m 512MB --name ddd centos:latest [root@Docker ~]# docker ps | grep ddd [root@Docker ~]# cat /sys/fs/cgroup/memory/docker/根据容器ID号来写/memory.limit_in_bytes如果在一台服务器上进行容器的混合部署,那么会存在同时几个程序写入磁盘数据的情况,这时可以通过--device-write-bps 选项来限制每秒写 io 次数来限制指定设备的写速度。相应的还有--device-read-bps 选项可以限制读取的速度,但这种方式只能限制设备,不能限制分区。
限制新建容器的 /dev/sda 的写入速度为 1MB:
[root@Docker ~]# docker run -itd --name eee --device-write-bps /dev/sda:1M centos:latest [root@Docker ~]# docker ps | grep eee [root@Docker ~]# cat/sys/fs/cgroup/blkio/docker/根据容器ID号来写/blkio.throttle.write_bps_device