【docker】入门基础和镜像、容器

文章目录

  • 【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 删除镜像)
      • 离线迁移镜像
    • [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

使用模板:

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强制删除。

  • 如果不希望强制删除:

    shell 复制代码
    docker 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的时候就可以对内存和资源限制

相关推荐
未济3 天前
linux 配置环境变量
linux
傲世仙尊3 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS3 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
_艾伦 耶格尔.3 天前
进程间通信
linux
AI职业加油站3 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
Liuqy-053 天前
Linux IO编程——静态库、动态库
linux
此冬歌咏3 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
彧azz3 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
玉&心3 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas