文章目录
- Docker镜像
- 镜像基本概念
- 为什么需要镜像?
- Union FS(联合文件挂载)
- docker镜像原理
- Docker镜像命令
- docker rmi
- docker save
- docker load
- docker history
- docker image prune
- docker镜像实战
- 离线迁移镜像
- 镜像存储的压缩与共享
- Docker容器
- 容器基本概念
- docker容器命令
- 命令清单
- docker create
- docker log
- docker attach
- docker exec
- docker start
- docker stop
- docker restart
- docker kill
- docker top
- docker stats
- docker container inspect
- docker port
- docker cp
- docker diff
- docker commit
- docker pause
- docker unpause
- docker rm
- docker export
- docker import
- docker wait
- docker rename
- docker container prune
- docker update
- 容器基本操作
- 容器批量处理技巧
- 容器交互模式
- MySQL容器化安装
- Redis容器化安装
- C++容器的制作
- 容器常见问题
- docker create、 docker start 和 docker run 有什么区别?
- docker import 和 docker load 有什么区别?
- docker rm & docker rmi & docker prune 的差异?
Docker镜像
镜像基本概念
Docker镜像是什么?
Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。
可以把Docker image 理解成一个模板, 可以通过这个模板实例化出来很多容器。
image 里面是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。 每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker镜像中每一层文件系统都是只读的。 构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。
镜像就像C++中的类和模板一样,可以很方便的构建出来不同的对象。
为什么需要镜像?
在部署应用时,通过手工或写一些脚本的方式进行部署。这样部署面临问题就是云端和本地环境一致问题。用户为每个应用打包过程比较繁琐,需要配置和给中修改等操作,非常费劲。
docker 最大的贡献就是定义了容器镜像的分层的存储格式, docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。
docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便的将其用于个人用途或与其他 Docker 用户公开共享。
Union FS(联合文件挂载)
**联合挂载是一种文件系统,它是在不修改其原始(物理)源的情况下创建将多个目录的内容合并为一个逻辑目录。**更有创意的用法是:能将相关的文件集存储在不同的磁盘或媒体中,但我们在单个视图中显示它们。总之,将多个、种类不同的数据源整合成一个逻辑数据源是有意义的。
一个例子是来自远程 NFS 服务器的一堆用户的 /home 目录全部合并到一个目录中,另一个例子是:将拆分的 ISO 映像合并到一个完整的目录中。
而对于Docker这种分层结构,需要将每一层的文件展示到用户观察的一个平面上,换句话就是要用户感觉不出分层的存在。
Union FS是怎么样工作的?
Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像。可以制作各种具体的应用镜像。
分层的优点:
- 分层最大的一个优点是共享资源;
- 多个镜像都由相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像即可;
- 内存中也只需要加载一份base镜像,就可以为所有容器服务,而且镜像的每一层都可以被共享。
浏览Docker hub时,能发现大多数镜像都不是从头开始制作,而是从一些base镜像基础上创建,比如centos基础镜像,而新镜像就是从基础镜像上一层层叠加新的逻辑构成的。这种分层设计,一个优点就是资源共享。
比如我们在服务器上运行了100台centos镜像容器,每一份容器都保存一份基础debian源文件?
显然不是,借助Linux的UnionFS,宿主机只需要在磁盘上保存一份base镜像,内存中也只需要加载一份,就能被基于这个镜像的所有容器共享。
当某个容器修改了基础镜像的内容,比如 /bin文件夹下的文件,这时其他容器的/bin文件夹是否会发生变化呢?
根据容器镜像的 写时拷贝(Copy-on-Write) 技术,某个容器对基础镜像的修改会被限制在单个容器内。
docker镜像原理
-
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统为UnionFS。
-
bootfs(boot file system) 主要包含bootloader 和 kernel,bootloader主要引导加载kernel,linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层时bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此使内存的使用权已由bootfs转交给内核,此使系统也会卸载bootfs。
-
rootfs(root file system) ,在bootfs之上。包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,CentOS等等。
-
将中间只读的 rootfs 的集合称为 Docker 镜像,Docker 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。UnionFS 使得镜像的复用、定制变得更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
-
当用docker run启动这个容器时,实际上在镜像的顶部添加了一个新的可写层,这个可写层也叫容器层。
- 容器启动后,其内的应用所有对容器的改动,文件的增删改操作都只会发生在容器层中,对容器层下面的所有只读镜像层没有影响。
Docker镜像命令
命令 | 别名 | 功能 |
---|---|---|
docker images | docker image ls/docker image list | 列出本地镜像 |
docker tag | docker image tag | 给镜像打标签, 可用于推送镜像仓库 |
docker pull | docker image pull | 从镜像仓库拉取 镜像 |
docker push | docker image push | 推送镜像到仓库 |
docker rmi | docker image rm/ docker image remove | 删除本地镜像 |
docker build | docker image build | 通过 dockerfile 制作镜像 |
docker save | docker image save | 将指定镜像保存 成 tar 归档文件 |
docker load | docker image load | 导入使用 docker save 命 令导出的镜像 |
docker image inspect | 查看镜像详细信 息 | 必须掌握 |
docker history | docker image history | 查看镜像历史 |
docker import | docker image import | 从归档文件 docker export 中创建镜像。 |
docker image prune | 删除不使用的镜 |
docker rmi
功能:删除镜像。
语法:
docker rmi [OPTIONS] IMAGE [IMAGE...]
# 别名
docker image rm, docker image remove
关键参数:
- f :强制删除;
- –no-prune :不移除该镜像的过程镜像,默认移除;
注意:删除镜像时,如果该镜像对应有容器还在运行,那么需要先关闭容器删除容器,最后再删除镜像
docker save
功能:将指定镜像保存成 tar 归档文件。
语法:
docker save [OPTIONS] IMAGE [IMAGE...]
# 别名
docker image save
关键参数:
- -o:输出到的文件
案例:
docker save -o nginx.tar nginx:1.23.3
# 也可以一次加载多个文件
docker save -o busybox.tar busybox:latest registry.cn-hangzhou.aliyuncs.com/westmo/req1:v0.3
docker load
功能:导入使用 docker save 命令导出的镜像。
语法:
docker load [OPTIONS]
# 别名
docker image load
关键参数:
- –input , -i : 指定导入的文件,代替 STDIN。
- –quiet , -q : 精简输出信息。
docker history
功能:显示镜像历史。
docker镜像是通过Union FS文件系统一层一层叠加的,使用docker history命令就可以查看镜像的组成信息。
语法 :
docker history [OPTIONS] IMAGE
# 别名
docker image history
关键参数:
- -H , --human :大小和日期采用人容易读的格式展现
- –no-trunc :显示全部信息,不要隔断;
- -q, --quiet: 只显示镜像 id 信息;
具体每条命令的意义,将在dockerfile部分进行解析。
docker image prune
功能:删除不使用的镜像。
语法:
docker image prune [OPTIONS]
关键参数:
- -a , --all : 删除全部不使用的镜像;
- –filter filter:指定过滤条件;
- -f, --force :不提示是否删除;
docker镜像实战
离线迁移镜像
第一步:服务器 1 上镜像保存为 tar 文件。
docker save -o busybox.tar busybox
第二步:scp 或者只用使用可视化工具拷贝镜像到第二台服务器上 。
scp命令
scp命令是用于通过 SSH 协议安全地将文件复制到远程系统和从远程系统复制文件到本地的命令。使用 SSH 意味着它享有与 SSH 相同级别的数据加密,因此被认为是跨两个远程主机传输文件的安全方式。
Linux SCP 命令是一种在两个远程节点之间传输文件的便捷且安全的方式,而无需担心攻击者窥探你的数据。
语法:
scp [option] /path/to/source/file user@server-ip:/path/to/destination/directory
/path/to/source/file – 这是打算复制到远程主机的源文件。
user@server-IP: – 这是远程系统的用户名和 IP 地址。请注意 IP 地址后面加冒号。
/path/to/destination/directory – 这是文件将复制到的远程系统上的目标目录。
以下是scp命令常用的几个选项:
- -C - 这会在复制过程中压缩文件或目录。
- -P - 如果默认 SSH 端口不是 22,则使用此选项指定 SSH 端口。
- -r - 此选项递归复制目录及其内容。
- -p - 保留文件的访问和修改时间。
第三步:在第二台服务器上恢复并运行
docker load -i busybox.tar
docker run -it --rm busybox:1.36.0 sh
镜像存储的压缩与共享
docker镜像在远程存放时会压缩,在拉取到本地时会解压。
可以看到在docker hub上,nginx:1.21.1的大小为51.26m大小。下面我们把它拉取到本地。
docker pull nginx:1.21.1
拉取到本地,docker的大小为133m。说明远端存储发生了压缩,因为仓库到本地需要走网络,所以文件越小越好 。
把一个镜像打多个 tag,然后同时推送仓库,可以看到是说层已经存在,不会重复存储:
docker tag nginx:1.21.1 registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.1
docker tag nginx:1.21.1 registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.2
docker tag nginx:1.21.1 registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.3
docker push registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.1
docker push registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.2
docker push registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.3
当layer层已经存在时,docker服务器只会保留一份。
添加一个仓库中已经有的镜像,服务器会提示已经存在镜像,或者直接mount(挂载)一个镜像,而不是推送上去。
我们再推送一个nginxv0.2的镜像上去:
docker push registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.2
c23548ea0b99: Mounted from library/nginx
82068c842707: Mounted from library/nginx
c2adabaecedb: Mounted from library/nginx
1.16.1: digest:
sha256:2963fc49cc50883ba9af25f977a9997ff9af06b45c12d968b7985dc1e92
54e4b size: 948
服务器提示镜像是直接挂载过去,而不是推送上去的。
Docker容器
容器基本概念
什么是容器?
容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态 。
容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本 。
容器的生命周期:
容器的生命周期是容器可能处于的状态。
- created:初建状态
- running:运行状态
- stopped:停止状态
- paused: 暂停状态
- deleted:删除状态
容器命令导致生命周期的转化:
docker create : 创建容器后,不立即启动运行,容器进入初建状态;
docker run : 创建容器,并立即启动运行,进入运行状态;
docker start : 容器转为运行状态;
docker stop : 容器将转入停止状态;
docker kill : 容器在故障(死机)时,执行 kill(断电),容器转入停止状态,这种操作容易丢失数据,除非必要,否则不建议使用;
docker restart : 重启容器,容器转入运行状态;
docker pause : 容器进入暂停状态;
docker unpause : 取消暂停状态,容器进入运行状态;
docker rm : 删除容器,容器转入删除状态。
killed by out-of-memory(因内存不足被终止) :宿主机内存被耗尽,也被称为 OOM: 非计划终止这时Linux会选择需要杀死最吃内存的容器,从而拯救尽可能多的容器
container process exitde(异常终止):出现容器被终止后,将进入 Should restart?选
择操作:
• yes 需要重启,容器执行 start 命令,转为运行状态。
• no 不需要重启,容器转为停止状态。
OOM
OOM也就Out of memory,内存不足。
docker在处理OOM时会出现三种状态:
(1)如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发 OOM 事件。例如,在容器当中,部署了一个 web 服务。假设主机分配给此容器的内存上限为 1G,当脚本申请的内存大于 1G 时,此容器就会触发 OOM 事件。而在这种情况下,此容器将会被强制关闭。
此时关闭容器的并非是 Docker Daemon,而是宿主机操作系统。 因为容器实际上是运行在宿主机中的一组进程。宿主机操作系统通过
cgroups 对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的是宿主机操作系统的内核 OOM 事件,因此最终是由宿主机内核来关闭这些进程
(2)如果用户不想关闭这个容器,那么可以选择–oom-kill-disable 来禁用 OOM-Killer。使用此参数时,仍需要注意,如果使用-m 设置了此容器内存上限,那么当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器将处于 hung 状态。
(3)如果用户使用了–oom-kill-disable,但也没有使用-m 来设定上限,因而此时此容器将会尽可能多地使用主机内存资源。换言之,主机内存有多大,它就将用多大。
容器的异常退出
每个容器内部都存在一个 Init 进程,容器中其他所有进程都是此进程的子进程。 运行的容器是因为 Init 进程在运行,如果一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至 Init 进程也退出。当 Init 进程退出时,也就代表着此容器被关闭。
docker容器命令
命令清单
命令 | 别名 | 功能 |
---|---|---|
docker create | docker container create | 创建容器 |
docker run | docker container run | 运行容器 |
docker attach | docker container attach | 连接到正在运行中的容 器。 |
docker commit | docker container commit | 将镜像提交为容器 |
docker cp | docker container cp | 在容器和宿主机之间拷贝 |
docker diff | docker container diff | 检查容器里文件结构的更 改。 |
docker exec | docker container exec | 在运行的容器中执行命令 |
docker export | docker container export | 将容器导出为 tar |
docker container inspect | 查看容器详细信息 | 必须掌 握 |
docker kill | docker container kill | 杀死容器 |
docker logs | docker container logs | 查看日志 |
docker ps | docker container ls, docker container list, docker container ps | 查看正在运行的进程 |
docker pause | docker container pause | 暂停进程 |
docker port | docker container port | 查看容器的端口映射 |
docker container prune | 删除停止的容器 | |
docker rename | docker container rename | 重命名容器 |
docker restart | docker container restart | 重启容器 |
docker rm | docker container rm, docker container remove | 删除容器 |
docker start | docker container start | 启动容器 |
docker stats | docker container stats | 查看资源占用信息 |
docker stop | docker container stop | 停止容器 |
docker top | docker container top | 查看某个容器的资源占用 |
docker unpause | docker container unpause | 继续运行容器 |
docker update | docker container update | 更新容器配置 |
docker wait | docker container wait | 阻止一个或多个容器停止,然后打印退出代码 |
docker create
功能:创建一个新的容器但不启动它
语法 :
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
# 别名
docker container create
关键参数:
- i: 以交互模式运行容器,通常与 -t 同时使用;
- -P: 随机端口映射,容器内部端口随机映射到主机的端口
- -p: 指定端口映射,格式为: 主机(宿主)端口:容器端口
- -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- –name=“nginx-lb”: 为容器指定一个名称;
- -h “mars”: 指定容器的 hostname;
- -e username=“ritchie”: 设置环境变量;
- –cpuset-cpus=“0-2” or --cpuset-cpus=“0,1,2”: 绑定容器到指定 CPU 运行;
- -m :设置容器使用内存最大值;
- –network=“bridge”: 指定容器的网络连接类型;
- –link=[]: 添加链接到另一个容器;
- –volume , -v: 绑定一个卷
- –rm :shell 退出的时候自动删除容器
- –restart:自动重启
案例:
docker create --name website1 -p 80:80 nginx:1.23.3
可以看到容器只是被创建出来,并没有运行。下面我们运行该容器:
docker start website1
80号端口已经被使用,无法启动容器,再次证明了docker create只是创建并没有运行容器。
docker log
功能:查看容器日志
语法:
docker logs [OPTIONS] CONTAINER
# 别名
docker containers logs
关键参数:
- -f ,–follow: 跟踪日志输出
- –since :显示某个开始时间的所有日志
- -t,–timestamps : 显示时间戳
- -n, --tail :仅列出最新 N 条容器日志
docker attach
功能:连接到正在运行的容器。
语法:
docker attach [OPTIONS] CONTAINER
# 别名
docker container attach
关键参数:
- –sig-proxy:是否将所有信号代理,默认是 true,如果设置为 false,退出的话不会影响容器, 否则退出会导致容器退出。
案例:
我们后台运行一个nginx容器,接下来连接到该容器中。
docker run --name=mywebsite2 -d -p 8080:80 nginx:1.23.3
docer attach mywebsite2
attach后,我们接管了mywebsite的日志和通信管道。如果我们按下ctrl+c关闭该容器:
日志显示接收到了2号信号,容器退出。说明默认情况下,代理信号会影响到容器的运行。下面我们设置不代理信号,再ctrl+c退出:
docker start mywebsite2
docker attach mywebsite2 --sig-proxy=false
ctrl+c
容器不设置信号代理,信号就不会影响到容器的运行。
docker exec
功能:在容器中执行命令
语法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
#别名
docker container exec
关键参数:
- -d :分离模式: 在后台运行
- -i :即使没有附加也保持 STDIN 打开
- -t :分配一个伪终端
- -e :设置环境变量
- -u,–user :指定用户 “<name|uid>[:<group|gid>]”
- -w,–workdir:指定工作目录
案例:
docker exec -it mywebsite2 bash
docker start
功能:启动停止的容器
语法 :
docker start [OPTIONS] CONTAINER [CONTAINER...]
# 别名
docker container start
docker stop
功能:停止运行的容器
语法:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
# 别名
docker container stop
关键参数:
- -s:发送的信号
docker restart
功能:重启容器
语法:
docker restart [OPTIONS] CONTAINER [CONTAINER...]
# 别名
docker container restart
关键参数:
- -s:发送的信号
docker kill
功能:强制退出容器
语法:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
# 别名
docker container kill
关键参数:
- -s:发送的信号
注意事项:
docker stop发送的是 SIGTERM 信号, docker kill 发送的是 SIGKILL 信号
docker top
功能:查看容器中运行的进程信息,支持 ps 命令参数。
语法:
docker top CONTAINER [ps OPTIONS]
# 别名
docker container top
注意事项:
容器运行时不一定有/bin/bash 终端来交互执行 top 命令,而且容器还不一定有top 命令,因此可以使用 docker top 来实现查看 container 中正在运行的进程。
docker stats
功能:显示容器资源的使用情况,包括: CPU、内存、网络 I/O 等。
语法:
docker stats [OPTIONS] [CONTAINER...]
# 别名
docker container stats
关键参数:
- –all , -a :显示所有的容器,包括未运行的。
- -format :指定返回值的模板文件。如 table,json
- –no-stream :展示当前状态就直接退出了,不再实时更新。
- –no-trunc :不截断输出。
返回报文
- CONTAINER ID 与 NAME: 容器 ID 与名称。
- CPU % 与 MEM %: 容器使用的 CPU 和内存的百分比。
- MEM USAGE / LIMIT: 容器正在使用的总内存,以及允许使用的内存总量。
- NET I/O: 容器通过其网络接口发送和接收的数据量。
- BLOCK I/O: 容器从主机上的块设备读取和写入的数据量。
- PIDs: 容器创建的进程或线程数。
案例
docker start mywebsite2
docker stats mywebsite2
docker container inspect
功能:查看容器详细信息
语法:
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
关键参数:
- -f :指定返回值的模板文件。如 table、 json
- -s :显示总的文件大小
注意事项:
- docker inspect 会自动检查是镜像还是容器然后显示相信信息
docker container inspect -f json mywebsite2
docker port
功能 :用于列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口。
语法:
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
# 语法
docker container port
案例
docker port mywebsite2
docker cp
功能:在容器和宿主机之间拷贝文件
语法:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# 别名
docker container cp
案例:
#将主机/www/目录拷贝到容器 mynginx 的/www 目录下。
docker cp /www/ mynginx:/www/
#将容器/www/目录拷贝到主机的/wwwbak 目录下。
docker cp mynginx:/www/ /wwwbak/
docker diff
功能:检查容器里文件结构的更改。
语法:
docker diff CONTAINER
docker commit
功能:从容器创建一个新的镜像。
最关键的功能是:可以通过该命令实现自定义镜像的创建。
语法:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
参数:
- -a :提交的镜像作者;
- -c :使用 Dockerfile 指令来创建镜像;可以修改启动指令
- -m :提交时的说明文字;
- -p :在 commit 时,将容器暂停
案例:制作自定义镜像
首先先运行起一个容器实例
docker run --name=mywebsiteforcommit -d -p 8081:80 nginx:1.23.3
docker ps
查看是否有docker images 镜像
docer images | grep mywebsiteforcommit
制作一个简单镜像
docker commit mywebsiteforcommit mywebsite:v1.0
docker images mywebsite
可以看到镜像制作成功。
接下来我们向镜像中加一些文件:
docker exec -it mywebsiteforcommit bash
echo "hello world by west" > mywebhello.txt
exit
制作带有文件的镜像,并查看文件
docker commit mywebsiteforcommit mywebsite:v2.0
docker images
docker run -it --name mywebsite2.0 mywebsite:v2.0 bash
cat mywebhello.txt
可以读取到mywebhello.txt文件的内容,说明成功制作了加有文件的镜像。
制作镜像:修改nginx的启动命令 -c
首先查看原来nginx的启动命令
docker image inspect nginx:1.21.1
将启动命令CMD修改为:tail -f /etc/hosts
docker commit -c 'CMD ["tail","-f","etc/hosts"]' -p mywebsiteforcommit mywebsite:v3.0
查看镜像的启动命令
docker inspect mywebsite:v3.0
可以看到nginx镜像mywebsite:v3.0的启动命令被修改。
docker pause
功能:暂停容器中所有的进程。
语法:
docker pause CONTAINER [CONTAINER...]
# 语法
docker container pause
docker unpause
功能:恢复容器中所有的进程。
语法:
docker unpause CONTAINER [CONTAINER...]
# 语法
docker container unpause
docker rm
功能:删除停止的容器
语法:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 语法
docker container rm
关键参数
- -f :通过 SIGKILL 信号强制删除一个运行中的容器。
案例
#删除 mynginx 容器
docker stop mynginx
docker rm mynginx
#删除所有停止的容器
docker rm $(docker ps -a -q)
docker export
功能:导出容器内容为 tar 文件
语法:
docker export [OPTIONS] CONTAINER
# 别名
docker container export
关键参数:
- -o: 写入到文件。
案例
docker ps -a
docker export -o mywebsite2.0.tar mywebsite2.0
ls
成功将mywebsite2.0导出成为一个tar文件。
docker import
功能:从归档文件中创建镜像。
语法 :
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
# 别名
docker image import
关键参数:
- -c :应用 docker 指令创建镜像;
- -m :提交时的说明文字
案例:
创建一个镜像
docker import mywebsite2.0.tar mywebsitev4.0
docker images
成功创建了一个mywebsitev4.0的镜像。
docker wait
功能:阻塞运行直到容器停止,然后打印出它的退出代码。
语法:
docker wait CONTAINER [CONTAINER...]
# 别名
docker container wait
docker rename
功能:重命名容器
语法:
docker rename CONTAINER NEW_NAME
# 别名
docker container rename
docker container prune
功能:删除所有停止的容器
语法
docker container prune [OPTIONS]
参数:
- -f,–force:不提示是否进行确认
docker update
功能:更新容器配置
语法:
docker update [OPTIONS] CONTAINER [CONTAINER...]
# 别名
docker container update
关键参数:
- –cpus:cpu数量
- –cpuset-cpus:使用哪些CPU
- –memory:内存限制
- –memory-swap:交互内存
- –cpu-period :是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配
- –cpu-quota: 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器
案例:
docker run my
docker update -m 400m myweb
容器基本操作
容器批量处理技巧
命令 | 解释 |
---|---|
docker container ls -qf name=xxx | 根据名称过滤得到容器编号 |
docker container ls --filter status=running | 根据状态过滤容器信息 |
docker container ls -aq | 静默获取全部容器 id |
docker container ls --filter ancestor=xxx | 过滤镜像名为 xxx 的容器信息 |
docker container ls --filter ancestor=xxx | 过滤镜像 id 为 xxx 的容器信息 |
参数:
- -a:表示打印所有的容器信息, 包括正在运行和已经退出的
- -q: 表示只返回容器 ID
- -f: 表示基于给的条件过滤 等价于 --filter 选项
案例
# 通过参数传递方式批量删除容器, 建议使用
docker container rm $(docker container ls-aq)
# 按照状态过滤删除已经退出的容器
docker container rm $(docker container ls-q --filter status=exited)
容器交互模式
**attached模式(前台运行模式) **
attached模式也叫做前台运行模式;比如我们将nginx映射到前台端口运行;
docker container run -p 80:80 nginx
问题:
- 如果是在 Linux 服务器上,按 Ctrl+C 就会停止掉 Docker 服务,很容易误操作,所以我们需要一个更好的,更稳定的模式,对应的是 detached 模式。
- attached模式仅适用于容器和程序的调试阶段。
- attached模式不能用于生产环境。
**detached模式(后台运行模式) **
detached模式也叫后台运行模式;
特点:
- 在后台运行,启动后只显示容器 ID,并且可以输入任何命令
- 就算关掉窗口依然继续运行,停止和删除容器都需要使用 shell 命令,减少了很多的误操作
docker container run -p -d 80:80 nginx
**interactive模式(交互模式) **
当我们创建好一个容器之后, 可能需要去容器内部获取一些信息或执行一些命令,就需要进入到交互式模式。
例如创建一个 Ubuntu 容器之后,需要到系统里输入各种Shell 命令和系统进行交互就需要进入交互式模式才可以完成。
docker container run -it nginx sh
MySQL容器化安装
登录docker hub查看MySQL常用的镜像;
第一步:下载MySQL镜像
docker pull mysql:5.7
第二步:启动MySQL容器
我们知道 msyql 的默认端口是 3306,而且有密码,查看官网的启动用例 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 指定了 mysql 的密码信息
#启动一个 msyql,并指定密码和端口开放
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 8200:3306 -d mysql:5.7
第三步:与MySQL容器交互,并登陆mysql
docker exec -it mysql:5.7 bash
mysql -p
接下来就可以正常使用MySQL;使用docker ps就可以查看MySQL容器对外映射的端口:
docker ps
Redis容器化安装
Redis 全称 Remote Dictionary Server,中文名为远程字典服务器。
Redis 是现在最受欢迎的 NoSQL 数据库之一, Redis 是一个使用 ANSI C 编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value 存储系统
- 开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、 Key-Value 数据库,并提供多种语言的 API
第一步:拉取镜像
docker pull redis:7.0
第二步:启动容器并进入Redis
docker run --name redis -p 8300:6379 -d redis:7.0
docker exec -it redis bash
redis-cli
向Redis中设置Key:向Redis中添加字符串类型的key的命令是set
set key1 west
# 获取key1的值
get key1
C++容器的制作
什么是源?
源就是来源。就是你安装软件时,程序从哪里获取软件包(安装程序在你的机器上,但需要安装的
东西却在软件源服务器上)。
源,在 Ubuntu 下,它相当于软件库,需要什么软件,只要记得正确的软件名就可以用命令行安装:其实你可以把他称软件仓库。安装软件时,就是从仓库里面调取数据放在你的机器上。
什么是镜像源?
镜像源就是把官方的源做一个镜像,你可以在这下载软件。比如 ubuntu 官方源在国外,下载软件可能会很慢,这时候就需要换成国内的镜像源 。
中科大源:
https://mirrors.ustc.edu.cn/help/
替换为中科大源,执行下面的shell:
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
-i.bak \
/etc/yum.repos.d/CentOS-Base.repo
以上命令只替换了默认启用的仓库。替换之后请运行 yum makecache
更新缓存。
C++镜像制作
第一步:拉取Ubuntu 镜像 :docker pull
docker pull ubuntu:22.04
第二步:运行Ubuntu容器
docker run --name=ubuntu -it ubuntu:22.04 bash
第三步:替换为中科大源,下载C++编译器GCC
sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list
# 跟新缓存
apt update
# 下载gcc编译器
apt install gcc vim -y
替换为国内源后,我们就可以很快的下载好编译器:
第四步:编写C++代码并编译
vim docker.c
#include <stdio.h>
int main()
{
printf("hello docker!\n");
return 0;
}
编译代码:
g++ -o demo docker.c
./demo
容器常见问题
docker create、 docker start 和 docker run 有什么区别?
docker create 命令根据Docker镜像创建一个全新的容器。但是它不会立即运行它。
docker start 命令将启动任何已停止的容器。如果使用 docker create 命令创建容器,则可以使用此命令启动它。
docker run 命令是创建并启动的组合。实际上,如果 docker run 命令在系统上找不到上述映像,它可以从 Docker Hub 中提取映像。
docker import 和 docker load 有什么区别?
docker save和docker load是一对命令;docker import和docker export是一对命令。
docker save images_name:将一个镜像导出为文件,再使用 docker load 命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比 docker export 命令导出的文件大,因为会保存镜像的所有历史记录。
docker export container_id:将一个容器导出为tar文件,再使用 docker import 命令将tar文件导入成为一个新的镜像,但是相比 docker save 命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。
docker rm & docker rmi & docker prune 的差异?
docker rm : 删除一个或多个容器
docker rmi : 删除一个或多个镜像
docker prune: 用来删除不再使用的 docker 对象