1.容器狂野屏蔽底层操作系统的差异性,让业务应用不管在哪里都是使用容器的环境运行,从而保证开发测试环境与生产环境的一致性
2.容器部署起来非常便捷和迅速,缩短开发测试部署的周期时间
docker、rontainered、podman、rocket
是一个开源的应用容器引擎
用来运行容器里的应用
docker也是可用来管理容器和镜像的一种工具
特性 | Docker容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 相当于宿主机的进程,几乎无损耗 | 需要通过虚拟机管理程序对宿主机资源虚拟访问,损耗 20-50%左右 |
性能 | 接近原生 | 弱于物理机 |
系统支持单机容量 | 上千个容器 | 几十个虚拟机 |
隔离性 | 通过namespace实现资源隔离,通过cgroup实现限制资源的最大使用量 | 完全隔离。每个虚拟机都有独立的硬件资源 |
内核 | 所有容器共享宿主机的内核 | 每个虚拟机都有独立的操作系统和内核 |
docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g,只有当需要修改时才复制一份数据)。
是创建容器的基础,是一个只读的模板文件,里面包含运行容器中的应用程序所有需要的所有内容(应用程序文件、配置文件、运行库文件、依赖包等)
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器默认是相互隔离、互不可见,以保证平台的安全性。
可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker
systemctl stop firewalld.service setenforce 0
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker.service
systemctl enable docker.service
安装好的Docker系统有两个程序,Docker服务端和Docker客户端。
其中Docker服务端是一个服务进程,负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
docker version
docker info
格式:docker search 关键字
docker search nginx
官方仓库是前面是没有仓库名
仓库名/镜像名
格式:docker pull 仓库名称[:标签]
#如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。
docker pull nginx:1.20 #指定下载1.20版本的nginx镜像
docker images
REPOSITORY:镜像属于的仓库;
TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
CREATED:镜像创建时间;
VIRTUAL SIZE:镜像大小;
格式:docker inspect 镜像ID号
docker inspect 0584b370e957
lowerdir是镜像层,目录或者文件是只读的,其实就是rootfs,image layer可以分很多层,所以对应的lowerdir是可以有多个目录
upperdir是在lowerdir之上的容器层,这层是可读可写的,在启动一个容器时候会进行创建,所有的对容器数据更改都发生在这里层,容器层的文件都是临时的。
MergedDir是表现层,是容器的挂载点
格式:docker tag 名称:[标签] 新名称:[新标签]
docker tag nginx:1.20 wx:dsb
格式:
docker rmi 仓库名称:标签 #当一个镜像有多个标签时,只是删除其中指定的标签
或者
docker rmi 镜像ID号 #会彻底删除该镜像
注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
-f :强制删除
docker rmi wx:dsb
将镜像保存成为本地文件
格式:docker save -o 存储文件名 存储的镜像
docker save -o nginx nginx:latest #存出镜像命名为nginx存在当前目录下
ls -lh
默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。
docker tag nginx:latest soscscs/nginx:web #添加新的标签时必须在前面加上自己的dockerhub的username
docker login #登录公共仓库
Username:soscscs
password:abc123456
docker push soscscs/nginx:web #上传镜像
就是将镜像加载到容器的过程。 新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
格式:docker create [选项] 镜像
常用选项:
-i:让容器开启标准输入接受用户输入命令
-t:让 Docker 分配一个伪终端 tty
-it :合起来实现和容器交互的作用,运行一个交互式会话 shell
docker create -it nginx:latest /bin/bash
docker ps -a #-a 选项可以显示所有的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器的ID号 加载的镜像 运行的程序 创建时间 当前的状态 端口映射 名称
格式:docker start 容器的ID/名称
docker start 7aecd8828d18
docker ps -a
docker stop 容器名|容器ID 发送STGTERM信号,优雅的关闭容器,默认等待10s
docker kill 容器名|容器ID 发送STGKILL信号,强制停止容器
docker rm 容器名|容器ID[-f] 删除容器
docker run -d [-i -t --name --rm]镜像名:标签
创建新容器并启动,执行了一条shell命令(ls)就停止了
docker run centos:7 /usr/bin/bash -c ls /
docker ps -a
需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。
docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
创建容器并持续运行
docker run -itd --name c1 nginx /bin/bash
1.检查本地是否有镜像,如果有则直接使用本地镜像创建容器,如果没有则从仓库拉取镜像再创建容器
2.在只读的镜像层上挂载一层可读可写的容器从
3.从docker0网桥给容器分配一个虚拟接口和TP
4.使用镜像的默认启动命令或者指定的命令启动容器,知道容器中PID为1的主进程退出为止。
docker inspect 容器名|容器ID
docker exec -it 容器名|容器ID bash|sh
-i 选项表示让容器的输入保持打开;
-t 选项表示让 Docker 分配一个伪终端。
进入容器前需要确保容器正在运行
docker start 容器名|容器ID
复制到容器中
docker cp 宿主机文件路径 容器名|容器ID:绝对路径
从容器复制文件到主机
docker cp 容器名|容器ID:绝对路径 宿主机文件路径
用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为容器快照文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
#导出格式:docker export 容器ID/名称 > 文件名
docker export 2592d3fad0fb > centos7.tar
或
docker export -o centos7.tar 2592d3fad0fb
#导入格式:cat 文件名 | docker import – 镜像名称:标签
cat centos7.tar | docker import - centos7:test
#导入后会生成镜像,但不会创建容器
docker import centos7.tar -- centos7:test
docker logs 容器的ID/名称
只显示容器PID=1的主进程日志
使用从32768开始的随机端口映射容器
docker run -P
例如:docker run -d --name test1 -P nginx
docker run -P 宿主机端口:容器端口
docker run -d --name test2 -p 43000:80 nginx
docker run -d -v 宿主机绝对路径:容器绝对路径[:ro(只能读不能写)]
注意:宿主机本地目录的路径必须是使用绝对路径,如果路径不存在,docker会自动创建相应的路径
-v :指定相同的宿主机目录来挂载到容器目录,实现数据卷共享
例如:docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
进入容器里创建“this is web1” 到他的data1目录里,到宿主机里查看/var/www下查看是否也有,完成共享
数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用
docker run -d --volumes-from 数据卷容器名
例如:在web2上指定data1为它的共享目录,并进入
docker run --name web2 -v /data1 -v /data1 -it centos:7 /bin/bash
echo "this is web2" > /data1/abc.txt
echo "ABC123" > /data1/ABC.txt
docker run -d --name web6 --volumes-from web2 nginx:latest
docker run -d --name web7 --volumes-from web2 nginx:latest
进入web6/web7进行验证
docker exec -it web6 bash
docker exec -it web7 bash
cd/data1
ls
ABC.txt abc.txt
在web6上新建一个文件,验证是否能完成两台容器共享
echo a > a
docker exec -it web7 bash
cd data1
ls
ABC.txt a abc.txt
默认情况下docker容器重新创建后,对应的容器ip可能会改变,这样如果两个容器之间通信就会变得非常麻烦,每次都要修改通信的ip地址。
容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。
docker run -d --link 目标容器名:连接别名
--link 可实现容器内通过目标容器名或连接别名与目标容器通信
例如:
1.创建并运行源容器取名web1
docker run -itd -P --name web1 centos:7 /bin/bash
2.创建并允许接收容器取名web2
docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash
#--link 容器名:连接的别名
3.进web2容器,ping web1
docker exec -t web2 bash
ping web1