【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的时候就可以对内存和资源限制

相关推荐
倔强的石头1061 小时前
Linux 进程深度解析(一):从内核视角看懂进程的本质
linux·运维·服务器
不想画图1 小时前
数据库概念和编译安装mysql流程
linux·数据库·mysql
小毅&Nora1 小时前
【云计算】【Kubernetes】 ③ 深入 containerd - CRI 插件如何驱动 OCI 容器?
容器·kubernetes·云计算
小醉你真好1 小时前
18、CentOS 9 使用 1Panel 安装 Jenkins
linux·centos·jenkins
郝学胜-神的一滴1 小时前
Linux信号的概念与机制
linux·服务器·开发语言·c++·程序人生
a***11351 小时前
使用Kubernetes部署Spring Boot项目
spring boot·容器·kubernetes
沐雨风栉1 小时前
被局域网困住的文件?cpolar让 Go File 随时随地能用
运维·服务器·开发语言·数据库·后端·缓存·golang
ManageEngineITSM1 小时前
把问题“消灭在未来”:IT 资产管理软件与问题管理的深度融合逻辑
大数据·运维·人工智能·itsm·工单系统
退役小学生呀1 小时前
二十五、基于ArgoCD的K8s多集群管理方案及落地
运维·云原生·容器·kubernetes·devops