文章目录
- 【docker】入门基础和镜像、容器
-
- docker基础
- docker镜像仓库
-
- [docker vs 虚拟机](#docker vs 虚拟机)
- [docker vs JVM](#docker vs JVM)
- 版本
- 镜像仓库
- 命令
-
- [docker login 登入](#docker login 登入)
- [docker pull 拉取](#docker pull 拉取)
- [docker push 推送](#docker push 推送)
- [docker tag 打标签](#docker tag 打标签)
- [docker images 查看images信息](#docker images 查看images信息)
- [docker search 查找镜像](#docker search 查找镜像)
- [docker logout 登出](#docker logout 登出)
- 尝试镜像运行nginx
- [docker run 创建容器并运行一个命令](#docker run 创建容器并运行一个命令)
- [docker ps](#docker ps)
- busybox
- [docker 镜像](#docker 镜像)
-
- 设计原因
- 命令
-
- [docker rmi删除镜像](#docker rmi删除镜像)
- [docker save 镜像保存成tar归档文件](#docker save 镜像保存成tar归档文件)
- [docker load [OPTIONS ] tar变回镜像](#docker load [OPTIONS ] tar变回镜像)
- [docker history [OPTIONS] IMAGE 查看中间层](#docker history [OPTIONS] IMAGE 查看中间层)
- [docker image prune [OPTIONS] 删除不需要的镜像](#docker image prune [OPTIONS] 删除不需要的镜像)
- [docker build](#docker build)
- [使用docker image inspect + 镜像:查看详细配置信息](#使用docker image inspect + 镜像:查看详细配置信息)
- [docker histoy 查看layers](#docker histoy 查看layers)
- [docker push -a 上传所有版本](#docker push -a 上传所有版本)
- [cat /root/.docker/config.json可以查看连接的是哪个网址](#cat /root/.docker/config.json可以查看连接的是哪个网址)
- 运行和删除镜像
-
- [docker run -it ma/mytest /bin/bash 运行镜像(如果没有会自动pull)](#docker run -it ma/mytest /bin/bash 运行镜像(如果没有会自动pull))
- [docker rm 删除容器](#docker rm 删除容器)
- [docker rmi 删除镜像](#docker rmi 删除镜像)
- 离线迁移镜像
-
- [scp mytestv1.0.tar root@127.0.0.1:/data/](#scp mytestv1.0.tar root@127.0.0.1:/data/)
- [docker 容器](#docker 容器)
-
- 为什么需要容器
- 容器的生命周期
-
- [created:初建 Created](#created:初建 Created)
- [running:运行 UP](#running:运行 UP)
- [stopped:停止 Exited](#stopped:停止 Exited)
- paused:暂停
- deleted:删除
- 命令
-
- [docker create 创建](#docker create 创建)
- [docker logs 日志](#docker logs 日志)
- [docker attach [OPTIONS] CONTAINER](#docker attach [OPTIONS] CONTAINER)
- [docker exec [OPTIONS] CONTAINER COMMAND [ARG ..]](#docker exec [OPTIONS] CONTAINER COMMAND [ARG ..])
- [docker stop 停止容器](#docker stop 停止容器)
- [docker restart 重启容器](#docker restart 重启容器)
- [docker kill](#docker kill)
- [docker start 启动容器](#docker start 启动容器)
- [docker top 查看容器中运行的进程信息](#docker top 查看容器中运行的进程信息)
- [docker stats +容器名 查看容器的资源使用](#docker stats +容器名 查看容器的资源使用)
- [docker stats 查看容器占用资源](#docker stats 查看容器占用资源)
- [docker container inspect](#docker container inspect)
- [docker port](#docker port)
- [docker cp](#docker cp)
- [docker diff + 容器名](#docker diff + 容器名)
- [docker commit 借助容器创建新的镜像](#docker commit 借助容器创建新的镜像)
- [docker pause 暂停容器](#docker pause 暂停容器)
- [docker rm 删除容器](#docker rm 删除容器)
- [docker export 导出容器为tar](#docker export 导出容器为tar)
- [docker import 从归档文件中创建镜像](#docker import 从归档文件中创建镜像)
- [docker wait 阻塞运行直到容器停止,然后打印退出代码](#docker wait 阻塞运行直到容器停止,然后打印退出代码)
- [docker rename 重命名](#docker rename 重命名)
- [docker container prune 删除所有停止的容器 -f 表示是否不需要确认](#docker container prune 删除所有停止的容器 -f 表示是否不需要确认)
- [docker update 重新限制内存(一般用)](#docker update 重新限制内存(一般用))
- [docker ps 容器的批量搜索](#docker ps 容器的批量搜索)
- [docker 批量操作](#docker 批量操作)
- 容器交互模式
- 容器的自动重启
- 容器环境变量设置
- 使用容器执行特殊任务
- 容器镜像导入和导出
- 制作C++镜像
- 容器资源更新
【docker】入门基础和镜像、容器
docker基础
namespace隔离
命令
dd
shell
dd if=/dev/zero of=/text.img bs=8k count=1024
dd if=./test.txt of=./test1.txt conv=lcase
mkfs 文件格式化
shell
mkfs -t ext4 [-v详细显示模式] [fs-options参数] /text.img [blocks磁盘块数]
df 查看文件挂载点
shell
df -t ext4 -T -h -a
- -h表示1024进制,-H表示1000进制
- -a表示0block的也看
- -t限制文件系统格式
- -T便是打印出来文件系统格式
mount 加载文件系统到指定挂载点 umount删除
shell
mount [-t vfstype(可以自己推导类型)] [-o options] /test.img ./test
其中options,loop表示当成硬盘分区挂载到系统,ro表示只读,rw表示读写
挂载后就可以把设备当作磁盘使用、作为入口。
++ps:为什么我们删除img文件后,发现对应的文件目录仍然可以进入呢?++
因为Linux文件系统管理时,以inode为单位,挂载的目录和test.img文件指向的都是同一块inode,本质就是硬链接,所以删除test.img后,因为没有删除对应的文件目录,所以磁盘上对应的inode以及数据块不会被删除,只有test.img与inode的映射关系被删除了
unshare 命名空间隔离
shell
# 命令格式unshare [options] program [arguments]
# 样例
unshare -p ./a.out --fork --mount-proc
- options
- -i ---ipc
- -m --mount
- -n --net
- -p --pid
- -u --uts 主机名、域名
- -U --user 用户组、用户id
- -v --version
- arguments
- --fork表示执行unshare的进程fork新进程执行unshare,
- --mount-proc 执行子进程前,把proc目录挂载过去 否则/proc其他进程能看到,进程隔离不彻底
PID隔离
shell
unshare -p --fork --mount-proc /bin/bash
-
-p表示隔离pid
-
--fork表示创建新线程执行,如果不添加--fork,就会造成
cannot allocate memory,因为没有父进程,被隔离了 -

-
--mount-proc在PID命名空间中重新挂载/proc,讲新的/proc挂载,保证新的进程看不到其他的进程
mount隔离
shell
unshare --mount --fork /bin/bash
cgroup隔离
实现对内存、CPU资源控制
pidstat
监控全部或者指定进程的CPU 内存 IO等信息
shell
## -u cpu
## -r 内存
## -d IO
## -p 指定pid
## -C 指定命令
## m n 每m秒统计一次,共n次
pidstat -r -p All -C stress # 对stress命令下的所有进程的内存查看
stress
压力测试工具
shell
## -c --cpu N 产生N进程循环执行sqrt函数给cpu压力
## -i --io N 产生N个进程一直sync刷新缓冲区给io压力,也会因此给cpu压力
## -m --vm N N个进程一直malloc/free
## --vm-bytes B 指定内存分配大小
## --vm-keep 一直占用内存不动
## -d --hdd N 表示write unlink
## --hdd-bytes B 指定大小
## -t --timeout N 时间后exit
## -q 不打印信息
查看进程cgroup
shell
cat /etc/*release* # 看机器版本
cat /proc/filesystems | grep cgroup # 查看cgroup版本
cat /proc/cgroups # 查看支持什么资源被控制
mount | grep cgroup # 查看控制组位置、挂载信息
# cd到对应的挂载目录
mkdir test_memorylimit
ls #查看目录内容

可以修改对应文件内容修改限制,最后向cgroup.proc插入被控制的pid就可以了
docker镜像仓库
docker与LXC相似,LXC就是软件容器化技术的具体实现,根据namespace + cgroup + 库的API,docker目标就是:一次封装到处运行,原本除了程序还要std库,但docker目标就是安装完就可以直接运行。
dockers打包后放到仓库,下载时只pull就行
docker vs 虚拟机
| 封装 | disk | cpu | 启动速度 | 应用部署 | 隔离级别 |
|---|---|---|---|---|---|
| 容器是面向应用的打包,把依赖和程序打包完毕 | 容器共享内核 | 资源占用率低 | 块 | 从仓库push pull\体系化,自动化 | 进程级别 |
| 虚拟机是打包整个系统 | 虚拟机保留完整内核 | 占用率高(用于OS,占CPU、内存) | 慢(加载内核) | 手动搬运 | 内核级别 |
因为docker容器直接操作硬件资源、共享内核,所以资源利用率高、启动快
docker vs JVM
| 性能 | 虚拟层面 | 代码无关性 | 主机隔离性 |
|---|---|---|---|
| docker没有性能损失 | OS层 | 无关 | 不隔离主机 |
| JVM加载、管理类有性能损失 | 函数库层 | Java、相关 | 隔离主机 |
虚拟化:物理->多台逻辑计算机
容器化:OS层虚拟化技术
以上就是对于函数层、OS层、硬件层的虚拟层面对比
版本
-
一开始LXC作为主流的容器化工具,它通过整合 Namespace(实现进程、网络、挂载等隔离)、Cgroups(控制 CPU、内存等资源)、AppArmor/SELinux 等内核能力,为进程打造接近标准 Linux 系统的独立运行环境,相当于 "轻量级虚拟机",但无需单独内核。
-
2013 年 Docker 诞生时,为快速实现容器的隔离与资源控制,直接将 LXC 作为底层依赖。 Docker 本质是在上层封装了更简洁的命令体系和镜像机制,简化了 LXC 复杂的使用流程,让普通用户能轻松创建和管理容器。
-
但 LXC 的局限性也为后续替代埋下伏笔:一是强依赖 Linux 内核,无法支撑 Docker 的跨平台愿景;二是作为外部组件,Docker 难以对其深度定制,限制了容器生命周期管理和生态扩展的灵活性。
-
随着docker发展,LXC 束缚愈发明显 。Docker 团队在 2014 年发布的 Docker 0.9 版本中,推出了自研的 libcontainer 并将其作为默认容器执行驱动,正式开启对 LXC 的替代。
-
libcontainer 有两个核心优势:一方面,它是纯 Go 语言编写的底层库,可直接调用 Linux 内核 API 操作 Namespace、Cgroups 等,无需依赖外部工具链,让 Docker 能深度掌控容器的创建、启动、停止等全生命周期流程;另一方面,它设计之初就考虑了跨平台潜力,目标是适配不同内核,为 Docker 后续拓展场景铺路。
-
libcontainer 解决了 Docker 的底层控制问题,但容器生态的碎片化问题逐渐凸显 ------ 不同容器平台的运行时不兼容,阻碍了技术普及。为此,Docker 在 2015 年牵头成立 OCI(开放容器倡议),核心目标是制定统一的容器镜像规范和运行时规范,打破平台壁垒。而 runc 正是基于 libcontainer 演进而来的 OCI 规范参考实现。
-
在后续 Docker 架构拆解中,runc 的定位进一步明确:Docker 将容器生命周期管理功能拆分出 containerd,runc 则专门负责容器的创建执行 ------containerd 会先将 Docker 镜像转换为符合 OCI 标准的 Bundle 格式,再调用 runc 与内核交互完成容器启动,启动后 runc 进程便退出,由 containerd - shim 接管容器进程,保障 Docker 守护进程升级时容器不中断(本质是让容器的运行生命周期与 Docker 守护进程的生命周期解耦 ------ 即使重启或升级
dockerd,已经启动的容器仍能持续运行,不会随dockerd停止而终止。)。
镜像仓库
开发者可以通过push将docker上传到私有仓库中,开发、测试、预发布、生产环境就可以通过pull从仓库拉取docker完成部署,如果有bug就再由开发者push,再pull
常见的私有仓库(免费的):Harbor、Nexus。这两个都有界面

命令
docker login 登入
shell
docker login -u lpx
# 回显输入密码
docker pull 拉取
ps: docker的pull和push都会有校验功能,默认是关闭的,只需要知道有这个东西就行。
命令使用:
shell
docker pull [options] NAME [:TAG|@DIGEST]
options : -a表示下载所有。比如:
shell
docker pull nginx # 只会下载nginx的最新的版本
docker pull -a nginx # 会把nginx的所有的镜像版本全部下载下来
NAME : 表示仓库的名称
[:TAG|@DIGEST] : 表示可以通过标签号或者使用digest来获取对应版本
如果本地有相同镜像、会取一个别名,而不是再存一遍,能够节省空间
docker push 推送
shell
docker push [options] NAME [:TAG] # NAME 要求与库的name相同
docker tag 打标签
shell
docker tag nginx:v1.23.4 lpx/test_nginx:v1.23.4
打完标签后可以推送了
shell
docker push lpx/test_nginx:v1.23.4
docker push -a lpx/test_nginx # 表示把所有的版本都推送
docker images 查看images信息
使用模板:
shell
docker images [OPTIONS] [REPOSITORY[:TAG]]
样例:
shell
docker image ls # 查看本地有什么image,并且会显示ID、大小等信息
docker images # 和docker image ls等价
docker images -a # 可以把中间层显示出来
docker images -q # 镜像id
# -f可以进行筛选 --format可以选择打印形式,还可以使用go语法规定格式
# --no-trunc # 显示完整的镜像id
docker image inspect nginx:v1.23.4 # 可以查看更详细的信息,当然,标签可以换成DIGEST
docker search 查找镜像
使用模板:
shell
docker search [OPTIONS] TERM
样例:
shell
docker search -f starts=10 nginx # 大于10
docker search -f before=nginx:v1.23.4 # 比一个版本创建更早
# --no-trunc 表示不截断,显示完整的镜像id
docker logout 登出
shell
docker logout [SERRVER] # SERVER输入站点的名称,可以退出对应站点。默认是dockerhub
尝试镜像运行nginx
nginx安装与卸载
卸载:
shell
# kill 对应pid
dpkg -l nginx
apt --purge autoremove nginx # 干净的删除
安装: 就是apt
启动:
shell
systemctl restart nginx
systemctl stop nginx
配置:
shell
ls /etc/nginx/ # 有个nginx.conf配置文件,http有个include 表示头文件包。找到对应头文件,有个server,会显示监听湍口,root ...会表示默认路径,修改为/usr/share/nginx/html。然后nginx -s reload 然后会发现浏览器首页修改了
docker run 创建容器并运行一个命令
语法:
shell
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
参数:
shell
-d 后台运行
-i 交互模式使用
-t 形成伪终端,通常和-i一起使用
-P 随机端口映射
-p 主机端口:容器端口 指定端口映射
--name="nginx-lb" 为容器指定一个名称
-h 给容器起一个hostname
-e 指定环境变量,比如设置标志位表示是生产环境、测试环境、上线环境
--cpuset-cpus=0 限制cpu,在能在0号CPU运行
-m 设置内存最大值
--link=[] 可以连接到另一个容器,就可以通过名字访问到另一个容器了,这个名字是--name设置的name.这个连接不是双向的,是单向的,单向ping通
--rm 容器退出后自动删除容器
别名:
shell
docker container run
查看容器:
shell
docker ps # 查看运行的容器,还有可以查看运行命令、状态、NAME
docekr ps -a # 查看所有容器,包括已经退出的
如果我们使用docker run跑centos,不带有参数,会直接挂掉,这是因为/bin/bash 在非交互模式下会立即退出,而默认命令就是/bin/bash
docker ps
- -a
- -f 根据条件筛选
- --format 模板格式
- -s 把容器占用的空间也会打印出来
busybox
基本的工具安装包
卸载:
shell
apt --purge autoremove busybox
docker 镜像
设计原因
- 解决在++我机器能跑++的问题
- 保证环境一致性
- 将应用及其依赖打包成镜像
- 在任何支持 Docker 的环境运行
- 镜像设计的优势
- 镜像 = 多个只读层(layers)堆叠
- 共享
命令
docker rmi删除镜像
docker rmi + IMAGE ID
docker rmi + NAME:TAG
-
如果有一个镜像正在运行、然后exit退出,此时使用docker rmi发现不能删除,需要使用-f强制删除。
-
如果不希望强制删除:
shelldocker rm NAME:TAG# 先删除容器 docker rmi + NAME:TAG # 然后删除镜像
docker save 镜像保存成tar归档文件
shell
docker save -o mybusybox.tar busybox:1.36.0 # 把 docker images查找到的镜像编程tar归档文件
docker load [OPTIONS ] tar变回镜像
shell
docker load -i mybustbox.tar # 使用docker images就会发现多出来一个镜像了
# -q选项表示精简命令,不打印出来加载信息
docker history [OPTIONS] IMAGE 查看中间层
shell
# 别名 docker image history
# -H 日期和大小用人易读的方式打印
# --no-trunc 不产生截断
# -q 只显示镜像id
docker image prune [OPTIONS] 删除不需要的镜像
shell
docker image prune -a # 只要没有被加载成为容器,全部清理掉镜像
docker build
/var/lib/docker/ 这是docker的驱动目录。里面会记录对应的对象列表在json里,
使用docker image inspect + 镜像:查看详细配置信息
docker histoy 查看layers
shell
docker history busybox:1.23.4
除此之外,还可以使用官网查看
docker push -a 上传所有版本
shell
docker push busybox -a
cat /root/.docker/config.json可以查看连接的是哪个网址
运行和删除镜像
docker run -it ma/mytest /bin/bash 运行镜像(如果没有会自动pull)
docker rm 删除容器
docker rmi 删除镜像
离线迁移镜像
scp mytestv1.0.tar root@127.0.0.1:/data/
参数解释 :
scp 表示使用ssh来传输
root... 表示目标主机的地址
docker 容器
容器就类似实例化好的对象,镜像就是类。容器和容器之间有隔离、也有资源限制。容器本质就是一个进程,不过每个进程间互相隔离
为什么需要容器
本身就是虚拟化和容器化的技术
-
资源利用率高:ubuntu\centos,如果两个环境都要,本来需要两个服务器,现在只需要一个服务器就行了
-
环境标准化:借助镜像实现环境标准化
-
资源弹性伸缩,保证一个容器的资源固定、资源隔离,所以在做资源弹性伸缩的时候就会很方便
-
不同语言可以一起开发
-
沙箱安全:即使容器挂掉了,但是服务器没问题
-
容器相比虚拟机更快,不用加载内核
-
维护和扩展容易,便于团队之间进行共享
容器的生命周期
created:初建 Created
running:运行 UP
stopped:停止 Exited
容器exit停止运行,或者OOM被系统杀掉。如果希望重新启动就进入running,否则进入stopped
paused:暂停
deleted:删除
命令
docker create 创建
只是创建容器,但不会运行
语法:
shell
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
参数:
shell
-d 后台运行
-i 交互模式使用
-t 形成伪终端,通常和-i一起使用
-P 随机端口映射
-p 主机端口:容器端口 指定端口映射
--name="nginx-lb" 为容器指定一个名称
-h 给容器起一个hostname
-e 指定环境变量,比如设置标志位表示是生产环境、测试环境、上线环境
--cpuset-cpus=0 限制cpu,在能在0号CPU运行
-m 设置内存最大值
--link=[] 可以连接到另一个容器,就可以通过名字访问到另一个容器了,这个名字是--name设置的name.这个连接不是双向的,是单向的,单向ping通
--rm 容器退出后自动删除容器
docker logs 日志
查看容器日志
shell
docker logs [OPTIONS] CONTAINER
参数:
shell
-f 实时查看日志
--since: 显示某个开始时间的所有日志
-t 显示时间戳
-n 查看前几条日志
-nf一起用,就可以实时查看、打印前几条日志
shell
# 把日志重定向
docker logs mynginxx031 > info.log 2>err.log
# 或者查看对应日志文件的json内容
docker attach [OPTIONS] CONTAINER
-
附加到已存在的容器(容器必须正在运行),这点和docker run -d不一样
-
连接到容器的 stdin/stdout/stderr
样例:
shell
docker attach mubits
参数:
shell
--sig-proxy=false 拦截信号,不会因为docker attach退出导致容器退出
docker exec [OPTIONS] CONTAINER COMMAND [ARG ...]
参数:
shell
-d 后台运行
-i 交互模式使用
-t 形成伪终端,通常和-i一起使用
-P 随机端口映射
-p 主机端口:容器端口 指定端口映射
--name="nginx-lb" 为容器指定一个名称
-h 给容器起一个hostname
-e 指定环境变量,比如设置标志位表示是生产环境、测试环境、上线环境
--cpuset-cpus=0 限制cpu,在能在0号CPU运行
-m 设置内存最大值
--link=[] 可以连接到另一个容器,就可以通过名字访问到另一个容器了,这个名字是--name设置的name.这个连接不是双向的,是单向的,单向ping通
--rm 容器退出后自动删除容器
docker stop 停止容器
发送的SIGTERM信号,优雅的shutdown,会打印日志和保存信息
docker restart 重启容器
-s可以传递信号eg:docker restart -9 dev-server
docker kill
发送SIGKILL信号,什么日志都不会打印
docker start 启动容器
docker top 查看容器中运行的进程信息
相当于ps ,但是因为你不是查看本机的进程的状态,而是查看容器内进程的状态,所以可以使用docker top + 容器名即可查看容器进程状态。参数和ps参数一样
docker stats +容器名 查看容器的资源使用
docker stats 查看容器占用资源
如果什么参数都不带,会实时刷新CPU、内存、网络IO
shell
# -a打印出来所有容器,包括未运行的
# --no-stream打印当前监控快照
# --no-trunc不截断
docker container inspect
shell
docker inspect + 容器名
docker port
shell
docekr port myweb 80 # 80表示过滤,查看80端口的映射关系。删除80表示查看所有端口和宿主机的映射关系
docker cp
docker diff + 容器名
查看容器镜像和容器文件差异
A表示添加
C表示修改
D表示删除
docker commit 借助容器创建新的镜像
shell
docker commit myimg myimg:v1.0
shell
-a 作者 # 然后可以docker inspect查看作者
-c 可以修改启动指令
# -c 'CMD' ["tail","-f","/etc/hosts"]
# 使用docker Cmd可以查看变化了
# 使用docker logs 发现日志也不一样
-m 说明文字 #
-p 暂停
docker pause 暂停容器
docker unpause
docker rm 删除容器
-f 表示强制删除运行的容器
docker export 导出容器为tar
导出容器内容为tar文件,,-o参数表示写入到哪个文件
docker import 从归档文件中创建镜像
save 会携带原数据信息,但是export不会:
仅保存当前文件系统
导出结果是一个扁平的文件系统
所以需要使用参数来指定数据内容
shell
docker import -c 'CMD ["nginx","-g","deamon off;"]' -m "create by bit" myweb.tar myweb:v2.0
# 此时使用docker
docker wait 阻塞运行直到容器停止,然后打印退出代码
docker rename 重命名
shell
docker rename container_name new_name
docker container prune 删除所有停止的容器 -f 表示是否不需要确认
docker update 重新限制内存(一般用)
-m 500m myweb
docker ps 容器的批量搜索
shell
-f name=mynginx
-f status=running
-f satus=exited
-f ancestor=nginx:1.23.4
-a # 退出的容器也会显示出来
docker 批量操作
docker ps -ap -f ... 完成筛选并且打印出来id
然后就可以根据id完成批量操作
容器交互模式
attached前台模式
所有的日志都会打印到控制台,通常调试使用
创建方法 :docker run --name mynginx -p 8081:60 mynginx:v1.0 不用-d选项
deattached后台模式
docker run的时候带有-d,上线模式比较多,如果需要命令交互,使用docker exec完成交互
interactive交互模式
就是执行/bin/bash进程,带有-it参数
与后台创建的容器交互
先创建一个后台容器运行,然后
shell
docker exec -it mynginx bash
此时,如果退出交互模式,容器不会退出!
容器的自动重启
--rm 可以完成自动删除
四种策略:
shell
docker run -d --name mynginx -p 8081:31 --restart=always nginx:v1.0 # --restart=always可以永远重启
# docker container inspect 此时查看Restart字段 ,可以查看状态
docker run --restart=no # 不重启
# unless-stopped [容器名] unless-stopped 容器退出时总是重启,但不考虑docker守护进程重启时就停止的容器
# --restart=on-failure:3 [容器名]如果容器的状态非0,自动重启,还可以指定重启次数,如果指定次数未能启动就放弃
docker update --restart=always [容器名]
对于stop指令停止的,都不会重启
容器环境变量设置
shell
-e 设置环境变量
--env-file=./myenv # 使用文件
在docker run时可以完成环境变量设置
容器信息查看
可以看到环境变量、创建时间,使用docker inspect
使用容器执行特殊任务
宿主机没有环境,希望借助容器工具包执行对应任务
shell
docker run --rm --net host busybox config # --net表示使用宿主机
docker run --rm busybox ping 127.0.0.1
容器镜像导入和导出
shell
docker export -o mynginx.tar mynginx:v1.0 # 不会把参数带出去
docker import mynginx.tar mynginx:v0.1
制作C++镜像
shell
docker pull centos:7
docker run -it --name mycpp centos:7 bash
# 进入centos:7后,应该先配置软件源,方便下载gcc
# 然后下载gcc,就可以正常编写运行代码了
容器资源更新
内存:
shell
docker pull java:8
docker run -it --name myjava java:8 bash
docker update -m 200m --memory-swap 200m # 这里--memory-swap表示交换内存的大小,默认是无限大的交换内存上限。如果-m太小,会提示已经占用的内存比10m多,不允许修改。如果交换内存大小和要求的物理内存大小相同,表示不允许使用交换内存
CPU:
shell
docker run -it --name myjava java:8 bash
dd if=/dev/zero of=/dev/null & # 此时没有IO,占用cpu。
docker update --help # 查看命令
docker update --cpu-period 10000 --cpu-quota 1000 # 限制占用比例:10000中的1000
docker run的时候就可以对内存和资源限制