本篇文章给大家带来了关于docker核心技术之容器操作,以及Dockerfile详解等等相关问题,希望对大家有帮助。
一. Docker
1. 简介
- 基于Linux内核的Cgroup, Namespace, 以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟技术,由于隔离的进程独立于宿主和其它的隔离进程,因此称为容器
- 最初实现是基于LXC, 从0.7以后开始去除LXC, 转而使用自行开发的Libcontainer, 从1.11开始, 则进一步演进为使用runC和Containerd
- Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护,使得Docker技术比虚拟机技术更为轻便、快捷
2. Docker优势
- 更高效地利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松的迁移
- 更轻松地维护和扩展
3. Docker与虚拟机对比
二. Docker安装
参考文章安装: Install Docker Engine on Ubuntu | Docker Documentation
三. 容器操作
启动:
docker run:
-it 交互
-d 后台运行
-p 端口映射
-v 磁盘挂载
启动已终止容器
docker start
停止容器
docker stop
查看容器进程
docker ps
查看容器细节
docker inspect
拷贝文件到容器内
docker cp file1
docker退出容器,而不关闭容器: ctrl+q+p
docker退出容器,而关闭容器: exit
查询docker所有镜像
docker images
Docker镜像仓库
Docker hub: https://hub.docker.com
创建私有镜像仓库: docker run -d -p 5000:5000 registry
四. Dockerfile详解
Dockerfile一般分为四个部分:基础镜像信息、维护信息、镜像操作指令和容器启动时操作指令
常用命令
FROM:指定基础镜像, 必须为第一个指令
格式:
FROM
FROM
FROM
示例:
FROM ubuntu
MAINTAINER: 维护信息
格式:
MAINTAINER
示例
MAINTAINER ribbon
RUN:构建镜像时执行的命令
格式:
shell执行:RUN
exec执行:RUN ["executable", "param1", "param2"]
示例:
RUN apk update
RUN ["/etc/execfile", "arg1", "arg2"]
RUN apt-get update && apt-get install这两条命令永远用&&连接,否则apt-get update构建层被缓存,会导致新package无法安装
ADD: 将本地文件添加到容器中,tar等类型会自动解压,可以访问网络资源,类似于wget
格式:
ADD
示例:
ADD bin/amd64/httpserver /httpserver
COPY: 功能类似于ADD,但是不会解压缩文件,不能访问网络资源
在Dockerfile中使用multi-stage: Dockerfile 中的 multi-stage(多阶段构建) - sparkdev - 博客园
格式:
COPY
示例:
COPYbin/amd64/httpserver /httpserver
CMD: 构建容器后调用,也就是在容器启动时才进行调用
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD ["ethtool", "--help"]
CMD echo "1111"
ENTRTPOINT: 配置容器,使其可执行化。
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
范例:
ENTRYPOINT /httpserver
CMD [-c]
LABAL: 用于为镜像添加源数据
格式:
LABEL
范例:
LABEL multi.label1="value1" multi.label2="value2" other="value3"
ENV: 设置环境变量
格式:
ENV
范例:
ENV MY_SERVICE_PORT=80 UDP_PORT=90
EXPOSE: 指定外界交互的端口
格式:
EXPOSE
示例:
EXPOSE 80
EXPOSE 80/tcp
EXPOSE 80 90
VOLUME: 用于指定持久化目录
格式:
VOLUME [
范例:
VOLUME ["/data", "/usr1/jenkins"]
USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
ARG: 用于指定传递给构建运行时的变量
格式:
ARG
示例:
ARG build_user=ribbon
五. Linux NameSpace详解
NamesSpace详解:
Linux NameSpace_Frank_Abagnale的博客-CSDN博客 这篇文章比较详细的介绍,可以参考这篇
NameSpace的常用操作
- 查看当前系统的namespace:
lsns -t
- 查看某进程的namespace:
ls -la /proc/
- 查看某namespace运行命令
nsenter -t
六. Linux Cgroups详解
Cgroups详解
容器核心:cgroups - 简书 可以参考这篇文章来进行了解
模拟Cgroups控制CPU资源
通过模拟来更好的熟悉Cgroups控制资源的效果, 首先创建cpudemo文件夹
执行top可以看到busyloop占用两个CPU资源
将进程添加进cgroup进程配置组
设置cpuquota
可以看到成功将占用200%CPU资源的降低成1%
模拟Cgroups超过限定memory资源被OOM kill
/sys/fs/cgroup/memory目录下创建memorydemo文件夹
运行消耗内存程序, 使用watch查询内存使用情况
将进程配置进cgroups配置组
设置最大内存大小
等待程序被OOM kill, dmesg可以看到杀死信息
备注:删除自主创建的cgroup文件夹, 需要使用cgroup-tools
七. Union FS
Docker前面使用的技术都是源于linux的技术并没有创新,而Docker的创新正是文件系统。
1. 概念:
- 将不同目录挂载在同一个虚拟文件系统下的文件系统
- 支持为每一个成员目录设定readonly、readwrite和without-able权限
- 文件系统分层,对readonly权限的目录可以进行逻辑上的修改,这里的修改属于增量的,不影响readonly部分
- 通常Union FS的用途: 多个disk挂载到同一个目录下, 另一个是将readonly部分和writeable的目录联合在一起
2. 图解Union FS
Docker镜像的设计中,引入了层(layer)的概念,也就是说,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量rootfs(一个目录),这样应用A和应用B所在的容器共同引用相同的ubuntu操作系统层、Golang环境层(作为只读层),而各自有各自应用程序层,和可写层。启动容器的时候通过UnionFS把相关的层挂载到一个目录,作为容器的根文件系统。
3. 容器存储驱动
4. 模拟Union FS更好理解效果
由于docker当前版本上使用的是overlayFS的存储驱动,所以我们就以overlay挂载方式来进行实验, overlayfs通过三个目录:lower目录、upper目录、以及work目录实现,其中lower目录可以是多个,work目录为工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为为merged目录。
执行如下命令:
mkdir upper lower merged work echo "lower" > lower/in_lower.txt echo "from lower" > lower/in_both.txt echo "from upper" > upper/in_both.txt echo "upper" > upper/in_upper.txt path=$(pwd) mount -t overlay overlay -o lowerdir=${path}/lower,upperdir=${path}/upper,workdir=${path}/work ${path}/merged
可以看到使用overlay存储驱动文件挂载实现的效果。实验完成后恢复环境需要先umount merged目录后, 再将四个目录进行删除操作,先删除其他的可能会出现rm: cannot remove 'merged/': Device or resource busy,导致merged目录删除不掉。
八. Docker网络
1. 安装工具
Centos系统:
$ yum install bridge-utils
Ubuntu系统:
$ apt-get install bridge-utils
2. Docker网络模式
查询docker内置的网络模式
docker run选择运行的网络模式
1)host模式:使用 --net=host 指定。 跟host公用一套net
2)none模式:使用 --net=none 指定。网络配置需要由自己来进行配置
3)bridge模式:使用 --net=bridge 指定,默认设置。
docker网络逻辑图 网桥和NAT
4)container模式:使用 --net=container:NAME_or_ID 指定。使用其他容器的网络配置
网络模式图大概如下图所示
3. 模拟Docker起网桥的操作
创建--net=none nginx
创建network namespace
建立网络namespace链接
检查当前已经创建的网桥设备
创建veth对
进行A网络配置
进行B网络配置
生成eth0网络设备在nginx docker中
给eth0配置ip 网关
nginx可以访问
配置nat, 让windows通过ip也可以访问
使用完删除指定nat规则
推荐学习:《docker视频教程》
以上是最系统的掌握Docker核心技术(总结分享)的详细内容。更多信息请关注PHP中文网其他相关文章!

LXC是Docker的基础,通过Linux内核的cgroups和namespaces实现资源和环境隔离。1)资源隔离:cgroups限制CPU、内存等资源。2)环境隔离:namespaces提供独立的进程、网络、文件系统视图。

在Linux上使用Docker的最佳实践包括:1.使用dockerrun命令创建和运行容器,2.利用DockerCompose管理多容器应用,3.定期清理未使用的镜像和容器,4.采用多阶段构建优化镜像大小,5.限制容器资源使用提升安全性,6.遵循Dockerfile最佳实践提高可读性和维护性。这些实践能帮助用户高效使用Docker,避免常见问题并优化容器化应用。

在Linux上使用Docker可以提高开发和部署效率。1.安装Docker:使用脚本在Ubuntu上安装Docker。2.验证安装:运行sudodockerrunhello-world。3.基本用法:创建Nginx容器dockerrun--namemy-nginx-p8080:80-dnginx。4.高级用法:创建自定义镜像,使用Dockerfile构建并运行。5.优化与最佳实践:使用多阶段构建和DockerCompose,遵循编写Dockerfile的最佳实践。

Docker监控的核心在于收集和分析容器的运行数据,主要包括CPU使用率、内存使用、网络流量和磁盘I/O等指标。通过使用Prometheus、Grafana和cAdvisor等工具,可以实现对容器的全面监控和性能优化。

DockerSwarm可用于构建可扩展和高可用性的容器集群。1)初始化Swarm集群使用dockerswarminit。2)加入Swarm集群使用dockerswarmjoin--token:。3)创建服务使用dockerservicecreate--namemy-nginx--replicas3nginx。4)部署复杂服务使用dockerstackdeploy-cdocker-compose.ymlmyapp。

如何利用Docker和Kubernetes进行企业应用的容器编排?通过以下步骤实现:创建Docker镜像并推送到DockerHub。在Kubernetes中创建Deployment和Service以部署应用。使用Ingress管理外部访问。应用性能优化和最佳实践,如多阶段构建和资源限制。

Docker常见问题可以通过以下步骤诊断和解决:1.查看容器状态和日志,2.检查网络配置,3.确保卷挂载正确。通过这些方法,可以快速定位并修复Docker中的问题,提升系统稳定性和性能。

Docker是DevOps工程师必备的技能。1.Docker是开源的容器化平台,通过将应用程序及其依赖打包到容器中,实现隔离和可移植性。2.Docker的工作原理包括命名空间、控制组和联合文件系统。3.基本用法包括创建、运行和管理容器。4.高级用法包括使用DockerCompose管理多容器应用。5.常见错误有容器无法启动、端口映射问题和数据持久化问题,调试技巧包括查看日志、进入容器和查看详细信息。6.性能优化和最佳实践包括镜像优化、资源限制、网络优化和使用Dockerfile的最佳实践。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

Dreamweaver CS6
视觉化网页开发工具

WebStorm Mac版
好用的JavaScript开发工具

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

禅工作室 13.0.1
功能强大的PHP集成开发环境