隔离: 虚拟机隔离时系统级别隔离。虚拟各种资源。容器是进程级别隔离
磁盘:虚拟机占用磁盘较大,以GB计算。容器磁盘占用小以MB计算
速度:容器启动速度可以算是秒级启动。虚拟机启动时间较长。需要初始化系统初始化各种设备。比如:网卡等
性能:容器的运行性能接近原生。虚拟机大约由5%的损耗
数量:相同大小的硬件资源。容器可以运行成百上千个。虚拟机一般几十台不等
操作系统:容器只支持Linux,虚拟机几乎支持所有的操作系统
封装程度:容器只打包镜像和依赖关系,共享宿主机内核。虚拟机是独立的一套完整的操作系统
Docker分为社区版(Community Edition,CE) 和企业版(Enterprise Edition,EE)
支持的平台为: Linux(CentOS,Debian,Fedora,Oracle Linux,RHEL,SUSE和Ubuntu)、Mac 、Windows
官方文档:https://docs.docker.com
阿里云源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker软件包源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker CE
yum install -y docker-ce
# 启动Docker服务并设置开机启动
systemctl start docker
systemctl enable docke
镜像不是一个单一的文件,而且多层构成。可以通过docker history <ID/NAME> 查看镜像中各层内容及大小。每层对应着Dockerfile中的一个指令。Docker镜像默认存储在/var/lib/docker/<storage-driver>中
Docker Hub由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。 地址: https://hub.docker.com/explore
镜像加速器:
https://www.daocloud.io/mirror
curl -sSl https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。
如果容器删除了。最上面的读写层也就删除了。改动也就丢失了。所以无论多少个容器共享一个镜像。所做的写操作都是从镜像的文件系统中复制过来操作的。并不会修改镜像的源文件。这种方式提高了磁盘利用率
若想持久化这些改动。可以通过docker commit将容器保存成一个新的镜像。
指令 | 描述 |
---|---|
ls/images | 列出镜像 |
build | 构建镜像来自Dockerfile |
history | 查看镜像历史 |
inspect | 显示一个或者多个镜像详细信息 |
pull | 从镜像仓库拉取镜像 |
push | 推送镜像到镜像仓库 |
rm | 删除一个或多个镜像 |
prune | 删除未使用的镜像,没有被标记或者被任何容器引用的镜像。 |
tag | 创建一个引用源镜像标记目标镜像 |
export | 导出容器文件系统到tar归档文件 |
import | 导入容器文件系统tar归档文件创建镜像 |
save | 保存一个或者多个镜像到一个tar归档文件 |
load | 加载镜像来自tar归档或者标准输入 |
选项 | 描述 |
---|---|
-i,--interactive | 交互式 |
-t, --tty | 分配一个伪终端 |
-d, --detach | 运行容器到后台 |
-e,--env | 设置环境变量 |
-p, --publish list | 发布容器端口到主机 |
-P,--publish-all | 发布容器所有expose的端口到宿主机随机端口 |
--name string | 指定容器名称 |
-h,--hostname | 设置容器主机名 |
--ip string | 指定容器IP,只能用于自定义网络 |
--network | 链接容器到一个网络 |
--mount mount | 将文件系统附件到容器 |
-v, --volume list | 绑定挂载一个卷 |
--restart string | 容器退出时重启策略,默认no ,可选值【always|on-failure】 |
选项 | 描述 |
---|---|
-m, --memory | 容器可以使用的最大内存量 |
--memory-swap | 允许交换到磁盘的内存量 |
--memory-swappiness=<0-100> | 容器使用的SWAP分区交换的百分比(0-100,默认为-1) |
--oom-kill-disble | 禁用OOM killer |
--cpus | 可以使用的CPU数量 |
--cpuset-cpus | 限制容器使用特定的CPU核心,如(0-3,0,1) |
--cpu-shares | CPU共享(相对权重) |
OOM killer :Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory()被触发,然后调用select_bad_process()选择一个”bad”进程杀掉。如何判断和选择一个”bad进程呢?linux选择”bad”进程是通过调用oom_badness(),挑选的算法和想法都很简单很朴实:最bad的那个进程就是那个最占用内存的进程。
示例:
内存限额:
允许容器最多使用500M内存和100M Swap,并禁用OOM Killer
docker run -d --name nginx03 --memory="500m" --memory-swap="600m" --oom-kill-disable nginx
cpu限额:
允许容器最多使用一个半的CPU
docker run -d --name nginx04 --cpus="1.5" nginx
允许容器最多使用50%的CPU
docker run -d --name nginx05 --cpus=".5" nginx
选项 | 描述 |
---|---|
ls/ ps -a | 列出容器 |
inspect | 查看一个或者多个容器详细信息 |
exec | 在容器中运行命令 |
commit | 提交容器修改内容到镜像 |
cp | 拷贝文件/文件夹到一个容器 |
logs | 查看容器日志 |
port | 列出或者指定容器端口映射 |
top | 显示一个容器运行的进程 |
stats | 查看容器资源使用统计 |
sto/start/restart | 停止/启动/重启一个或多个容器 |
rm | 删除一个或者多个容器 |
Docker提供三种挂载方式将数据从宿主机挂载到容器中:
官方说明:https://docs.docker.com/engine/admin/volumes/volumes/#start-a-container-with-a-volume
管理卷
#创建
docker volume create nginx-vol
#查看
docker volume ls
#查看卷内信息
docker volume inspect nginx-vol
#用卷创建一个容器
docker run -d --name =nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
或者
docker run -d --name=nginx-test -v nginx-vol:/usr/shar/nginx/html nginx
清理
停止容器
docker stop nginx-test
删除容器
docekr rm nginx-test
删除卷
docker volume rm nginx-vol
注意:
1、如果没有指定的卷,就会自动创建
2、建议使用--mount,因为更通用
用卷创建一个容器
docker run -d -it --name=nginx-test --mount type=bind, src=/app/wwwroot,dst=/usr/share/nginx/html nginx
或者
docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/shar/nginx/html nginx
验证绑定:
docker inspect nginx-test
清理:
docker stop nginx-test
docker rm nginx-test
注意:
1、如果源文件/目录没有存在如果挂载目标在容器中为非空目录。则该目录现有内容会被隐藏
2、不会自动创建,会抛出一个异常错误信息
默认网络。Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中
容器不会获得一个独立的network namespace 而是与宿主机共用一个。这意味着容器不会由自己的网卡信息。而是使用宿主机的。容器除了网络。其他都是隔离的
获取独立的network namespace 但不为容器进行任何网络配置。需要手动进行配置
与指定的容器使用同一个network namespace ,具有同样的网络配置信息。两个容器除了网络,其他的还是隔离的
与默认的bridge原理以用,但是自定义网络具备内部DNS发现功能,可以通过容器名进行容器间的网络通信。
指令 | 描述 |
---|---|
From | 基于那个镜像进行构建 |
Maintainer Laber | 镜像的维护者或者是邮件地址 |
Run | 构建镜像时运行的Shell命令 |
Copy | 拷贝文件或者目录到镜像中 |
Env | 设置环境变量 |
User | 为Run、Cmd和Entrypoint执行命令指定运行用户 |
Expose | 声明容器运行的服务器端口 |
Healtheck | 容器中服务健康检查 |
Workdir | 为Run、Cmd、Entrypoint、Copy和Add设置工作目录 |
Entrypoint | 运行容器时执行,如果有多个Entrypoint指令,只有最后一个生效 |
Cmd | 运行容器时执行,如果有多个CMD指令,最后一个生效 |
Usage: docker build [OPTIONS] PATH | URL|- [flags]
Options:
? -t, --tag list 镜像名称
-f, --file string 指定Dockerfile文件位置
docker build -t shykes/myapp .
docker build -t shykes/myapp -f /path/Dockerfile /path
docker build -t shykes/myapp http://www.example.com/Dockerfile
Harbor是由VMware公司开源的容器镜像仓库,Harbor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用。
新的企业级特性包括: 管理用户界面,基于角色的访问控制,AD/LADP集成以及审计日志等。
官方地址:https://vmware.github.io/harbor/cn/
组件 | 功能 |
---|---|
harbor-adminserver | 配置管理中心 |
harbor-db | Mysql数据库 |
harbor-jobservice | 负责镜像复制 |
harbor-log | 记录操作日志 |
harbor-ui | Web管理页面和API |
nginx | 前端代理,复制前端页面和镜像上传/下载转发 |
redis | 会话 |
registry | 镜像存储 |
Harbor安装的三种方式
tar zxvf harbor-offline-installer-v1.6.1.tgz
cd harbor
vi harbor.cfg
-------------------------
hostname=10.206.240.188
ui_url_protocol=http
harbor_admin_password=123456
-------------------------
./prepare
./install.sh
1、配置http镜像仓库信任
vi /etc/docker/daemon.json
{"insecure-registries":["reg.ctnrs.com"]}
systemctl restart docker
2、打标签
docker tag centos:6 reg.ctnrs.com/library/centos:6
3、上传
docker push reg.ctnrs.com/library/centos:6
4、下载
docker pull reg.ctnrs.com/library/centos:6
原文:https://www.cnblogs.com/yangsj10086/p/12718771.html