本篇文章给大家带来了关于docker核心技术之容器操作,以及dockerfile详解等等相关问题,希望对大家有帮助。



参考文章安装: Install Docker Engine on Ubuntu | Docker Documentation





docker run:
-it 交互
-d 后台运行
-p 端口映射
-v 磁盘挂载

docker start

docker stop

docker ps

docker inspect

docker cp file1 <containerid>:/file_to_path

docker images

Docker hub: https://hub.docker.com
创建私有镜像仓库: docker run -d -p 5000:5000 registry
Dockerfile一般分为四个部分:基础镜像信息、维护信息、镜像操作指令和容器启动时操作指令
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
示例:
FROM ubuntu
格式:
MAINTAINER <name>
示例
MAINTAINER ribbon
格式:
shell执行:RUN <command>
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 <src> ... <dest>
示例:
ADD bin/amd64/httpserver /httpserver
在Dockerfile中使用multi-stage: Dockerfile 中的 multi-stage(多阶段构建) - sparkdev - 博客园
格式:
COPY<src> ... <dest>
示例:
COPYbin/amd64/httpserver /httpserver
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD ["ethtool", "--help"]
CMD echo "1111"
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
范例:
ENTRYPOINT /httpserver
CMD [-c]
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
范例:
LABEL multi.label1="value1" multi.label2="value2" other="value3"
格式:
ENV <key> <value>
范例:
ENV MY_SERVICE_PORT=80 UDP_PORT=90
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80
EXPOSE 80/tcp
EXPOSE 80 90
格式:
VOLUME [<path>]
范例:
VOLUME ["/data", "/usr1/jenkins"]
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
格式:
ARG <name>[=<default value>]
示例:
ARG build_user=ribbon

Linux NameSpace_Frank_Abagnale的博客-CSDN博客 这篇文章比较详细的介绍,可以参考这篇

lsns -t <type>

ls -la /proc/<pid>/ns/

nsenter -t <pid> -n

容器核心:cgroups - 简书 可以参考这篇文章来进行了解
通过模拟来更好的熟悉Cgroups控制资源的效果, 首先创建cpudemo文件夹

执行top可以看到busyloop占用两个CPU资源
将进程添加进cgroup进程配置组

设置cpuquota

可以看到成功将占用200%CPU资源的降低成1%

/sys/fs/cgroup/memory目录下创建memorydemo文件夹

运行消耗内存程序, 使用watch查询内存使用情况


将进程配置进cgroups配置组
设置最大内存大小

等待程序被OOM kill, dmesg可以看到杀死信息


备注:删除自主创建的cgroup文件夹, 需要使用cgroup-tools

Docker前面使用的技术都是源于linux的技术并没有创新,而Docker的创新正是文件系统。
Docker镜像的设计中,引入了层(layer)的概念,也就是说,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量rootfs(一个目录),这样应用A和应用B所在的容器共同引用相同的ubuntu操作系统层、Golang环境层(作为只读层),而各自有各自应用程序层,和可写层。启动容器的时候通过UnionFS把相关的层挂载到一个目录,作为容器的根文件系统。


由于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目录删除不掉。
Centos系统:
$ yum install bridge-utils
Ubuntu系统:
$ apt-get install bridge-utils


1)host模式:使用 --net=host 指定。 跟host公用一套net



2)none模式:使用 --net=none 指定。网络配置需要由自己来进行配置


3)bridge模式:使用 --net=bridge 指定,默认设置。


docker网络逻辑图 网桥和NAT


4)container模式:使用 --net=container:NAME_or_ID 指定。使用其他容器的网络配置



网络模式图大概如下图所示







生成eth0网络设备在nginx docker中

给eth0配置ip 网关






推荐学习:《docker视频教程》
以上就是最系统的掌握Docker核心技术(总结分享)的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号