docker常用操作
docker简介
docker是一个开源的容器引擎,可以将开发者的应用以及依赖包打包到轻量级、可移植的容器中,从而部署到Linux系统中,可以实现虚拟化操作。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低
docker 简易安装方法
由于docker一般会在Linux上使用较多,因此本文以ubuntu为例
执行如下命令:第一步获取下载安装docker的shell脚本,第二步执行脚本即可完成安装
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
或者
curl -sSL https://get.daocloud.io/docker | sh
如果想要Docker在非root用户下使用吗,则需要将用户添加至docker用户组, your-user:你的用户名
sudo usermod -aG docker your-user
在安装后执行docker命令可能会出现以下问题:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json": dial unix /var/run/docker.sock: connect: permission denied
只需要对/var/run/docker.sock授予权限即可
sudo chmod 777 /var/run/docker.sock
docker的优缺点
优点
1.更快的进行项目交付与部署
2.易于迁移与扩展
3.CPU/内存资源的开销少
4.环境隔离
不同的容器之间环境互不依赖,因此可以部署在同一台机器上
缺点
1.无法在32bit的linux/Windows/unix环境下使用。
2.对于磁盘的管理比较有限
docker使用场景
1.web应用的打包与部署,例如flask环境、redis、mongdb等环境
2.自动化测试与持续集成、发布
3.任何不依赖于硬件(或可以将依赖虚拟化)的可独立的环境打包,例如安卓不同项目、不同版本的编译
镜像仓库命令
login/logout
docker login : 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hubdocker logout : 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库
login:
- -u、--username:用户名
- --password-stdin: 从输入接收密码
- -p、--password:密码
# 登录镜像仓库
docker login -u user -p passwd
# 登出镜像仓库
docker logout
pull
从镜像仓库拉取镜像或者更新镜像
- -a、-all-tags: 下载镜像仓库的所有tag的镜像
- --disable-content-trust: 跳过镜像校验、默认开启
- --platform: 如果服务器支持多平台,则设置平台
- -q、--quiet: 不要详细输出
# 下载所有的mysql镜像并不输出日志
docker pull mysql -a -q
push
将本地镜像推送到镜像仓库
- -a、-all-tags: push所有tag的镜像到镜像仓库
- --disable-content-trust: 跳过镜像校验、默认开启
- -q、--quiet: 不要详细输出
# 推送镜像到镜像仓库并不输出日志
docker push mysql -q
push推送镜像到特定的路径
首先需要打tag号,规则如下
docker tag [image_id] [dockerhub服务器地址/路径/名称:版本号]
# 示例
docker tag 1a2a2asda [dockerHub.com/build/test:v1.0.1]
push也是使用打的tag
docker push [dockerhub服务器地址/路径/名称:版本号]
search
从镜像仓库中搜索镜像
- -f, --filter: 搜索过滤输出
- --format: 使用Go模板进行漂亮的打印搜索
- --limit: 限制搜索的结果
- --no-trunc: 不截断输出,主要是描述那不省略,如果加上
# 搜索python 最多展示4个
docker search python --limit 4
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
python Python is an interpreted, interactive, objec… 7518 [OK]
pypy PyPy is a fast, compliant alternative implem… 322 [OK]
circleci/python Python is an interpreted, interactive, objec… 49
hylang Hy is a Lisp dialect that translates express… 45 [OK]
# 搜索python 最多展示4个且不截断展示信息
docker search python --limit 4 --no-trunc
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
python Python is an interpreted, interactive, object-oriented, open-source programming language. 7518 [OK]
pypy PyPy is a fast, compliant alternative implementation of the Python language. 322 [OK]
circleci/python Python is an interpreted, interactive, object-oriented, open-source programming language. 49
hylang Hy is a Lisp dialect that translates expressions into Python's abstract syntax tree. 45 [OK]
搜索展示的每列参数说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思
AUTOMATED: 自动构建
本地镜像管理命令
images
列出本地镜像
- -a、-all:显示所有镜像,默认隐藏中间映像层
- --digests:显示摘要
- -f、--filter:根据过滤条件过滤输出
- --format:使用Go模板输出镜像
- --no-trunc:不截断输出,较长的一般会显示省略号
- -q、--quiet:只显示镜像id
# 显示所有的镜像并携带摘要
docker images -a --digests
# 显示REPOSITORY为python的所有镜像
docker images python
rmi
删除一个或多个镜像
- -f、--force:强制删除镜像
- --no-prune:不删除过程镜像、默认删除
# 强制删除两个镜像,多个镜像只需添加空格区分即可
docker rmi -f 066abc7e4212 6143e7a8b55c
tag
标记本地镜像,相当于基于镜像重新创建另一个镜像,但镜像id不变
docker tag python:latest python:v1
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python latest 675cf548c64d 3 days ago 920MB
python v1 675cf548c64d 3 days ago 920MB
mysql latest 65b636d5542b 4 days ago 524MB
build
基于Dockefile构建镜像
- –build-arg=[] : 设置镜像创建时的变量;
- –cpu-shares : 设置 cpu 使用权重;
- –cpu-period : 限制 CPU CFS周期;
- –cpu-quota : 限制 CPU CFS配额;
- –cpuset-cpus : 指定使用的CPU id;
- –cpuset-mems : 指定使用的内存 id;
- –disable-content-trust : 忽略校验,默认开启;
- -f : 指定要使用的Dockerfile路径;
- –force-rm : 设置镜像过程中删除中间容器;
- –isolation : 使用容器隔离技术;
- –label=[] : 设置镜像使用的元数据;
- -m : 设置内存最大值;
- –memory-swap : 设置Swap的最大值为内存+swap,"-1"表示不限swap;
- –no-cache : 创建镜像的过程不使用缓存;
- –pull : 尝试去更新镜像的新版本;
- –quiet, -q : 安静模式,成功后只输出镜像 ID;
- –rm : 设置镜像成功后删除中间容器;
- –shm-size : 设置/dev/shm的大小,默认值是64M;
- –ulimit : Ulimit配置。
- –squash : 将 Dockerfile 中所有的操作压缩为一层。
- –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
- –network: 默认 default。在构建期间设置RUN指令的网络模式
# 基于当前文件夹作为上下文路径创建镜像
docker build -t test:v1 .
# 使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像
docker build github.com/creack/docker-firefox
# 通过 -f Dockerfile文件的位置 创建镜像
docker build -f /path/to/a/Dockerfile .
history
查看镜像的历史
- --format:使用Go模板输出镜像
- -H、--human:以可读格式打印大小和日期(默认为true)
- --no-trunc:不截断信息
- -q、--quiet:只显示镜像id
docker history -H 675cf548c64d
IMAGE CREATED CREATED BY SIZE COMMENT
675cf548c64d 3 days ago /bin/sh -c #(nop) CMD ["python3"] 0B
<missing> 3 days ago /bin/sh -c set -eux; wget -O get-pip.py "$… 10.2MB
<missing> 3 days ago /bin/sh -c #(nop) ENV PYTHON_GET_PIP_SHA256… 0B
<missing> 3 days ago /bin/sh -c #(nop) ENV PYTHON_GET_PIP_URL=ht… 0B
<missing> 3 days ago /bin/sh -c #(nop) ENV PYTHON_SETUPTOOLS_VER… 0B
<missing> 3 days ago /bin/sh -c #(nop) ENV PYTHON_PIP_VERSION=22… 0B
<missing> 3 days ago /bin/sh -c set -eux; for src in idle3 pydoc… 32B
<missing> 3 days ago /bin/sh -c set -eux; wget -O python.tar.xz… 56.9MB
<missing> 3 days ago /bin/sh -c #(nop) ENV PYTHON_VERSION=3.10.4 0B
<missing> 3 days ago /bin/sh -c #(nop) ENV GPG_KEY=A035C8C19219B… 0B
<missing> 3 days ago /bin/sh -c set -eux; apt-get update; apt-g… 18.5MB
<missing> 3 days ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
<missing> 3 days ago /bin/sh -c #(nop) ENV PATH=/usr/local/bin:/… 0B
<missing> 4 days ago /bin/sh -c set -ex; apt-get update; apt-ge… 529MB
<missing> 4 days ago /bin/sh -c apt-get update && apt-get install… 152MB
<missing> 4 days ago /bin/sh -c set -ex; if ! command -v gpg > /… 19MB
<missing> 4 days ago /bin/sh -c set -eux; apt-get update; apt-g… 10.7MB
<missing> 4 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 4 days ago /bin/sh -c #(nop) ADD file:dd3d4b31d7f1d4062… 124MB
save
将一个镜像打包成tar包
- -o、--output:写入到某个文件
docker save 675cf548c64d -o 1.tar
load
从一个tar包中解压读取镜像
- -i、--input:读取的tar包路径
- -q、--quiet:不显示读取过程
docker load -i 1.tar -q
import
从归档文件(tar包)中创建镜像
- -c、--change:应用dockerfile指令创建镜像
- -m、--message:设置提交信息
- --platform:设置平台如果服务器支持多平台
docker import -m 'commit' 1.tar test:v1
sha256:78040418a9264f9e8b5092326e8fae244ee4fcbcc8660d784f590ed12b3fc02f
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 78040418a926 3 seconds ago 942MB
python latest 675cf548c64d 3 days ago 920MB
python v1 675cf548c64d 3 days ago 920MB
mysql latest 65b636d5542b 4 days ago 524MB
容器生命周期管理命令
run
创建一个新容器:可选参数:
- --name:设置容器的名称
- -d: 容器以后台模式运行
- -i: 交互式方式操作
- -t: 分配一个伪终端
- -p: 设置将容器的端口映射到主机的端口
- -v: 设置将主机的路径映射到容器的对应路径,当映射完成后,主机路径内容改变会影响到容器对于路径的内容改变
- /bin/bash: 在创建玩容器后直接进入docker的命令行终端
# 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
docker run --name mynginx -d nginx:latest
# 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
# 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it nginx:latest /bin/bash
start/stop/restart
- docker start : 启动一个或多个已经被停止的容器。
- docker stop : 停止一个运行中的容器。
- docker restart : 重启容器。
# 启动已被停止的容器mynginx
docker start mynginx
# 停止运行中的容器mynginx
docker stop mynginx
# 重启容器mynginx
docker restart mynginx
kill
杀掉一个运行中的容器。可选参数:
- -s : 发送什么信号到容器,默认 KILL
# 根据容器名字杀掉容器
docker kill tomcat7
# 根据容器ID杀掉容器
docker kill 65d4a94f7a39
rm
删除一个或多个容器
# 强制删除容器 db01、db02:
docker rm -f db01 db02
# 删除容器 nginx01, 并删除容器挂载的数据卷:
docker rm -v nginx01
# 删除所有已经停止的容器:
docker rm $(docker ps -a -q)
create
创建一个新的容器但不启动它。
# 使用docker镜像nginx:latest创建一个容器,并将容器命名为mynginx
docker create --name mynginx nginx:latest
exec
在运行的容器中执行命令;也可以进入容器,可选参数
- -d : 分离模式: 在后台运行
- -i : 即使没有附加也保持STDIN 打开
- -t : 分配一个伪终端
# 在容器 mynginx 中以交互模式执行容器内 /root/nginx.sh 脚本
docker exec -it mynginx /bin/sh /root/nginx.sh
# 在容器 mynginx 中开启一个交互模式的终端
docker exec -i -t mynginx /bin/bash
# 也可以通过 docker ps -a 命令查看已经在运行的容器,然后使用容器 ID 进入容器。
docker ps -a
docker exec -it 9df70f9a0714 /bin/bash
attach
当容器以后台模式运行时,需要进入容器,除了上述的exec,还有attach,但exec与attach有一个区别,当使用exec进入容器后推出,容器不会停止,但attach在退出后容器会停止,所以建议使用exec
# 进入容器id为1e560fca3906的容器
docker attach 1e560fca3906
pause/unpause
- docker pause :暂停容器中所有的进程。
- docker unpause :恢复容器中所有的进程。
# 暂停数据库容器db01提供服务。
docker pause db01
# 恢复数据库容器 db01 提供服务
docker unpause db0
容器操作命令
ps
列出容器,可选参数:
- -a : 显示所有的容器,包括未运行的。
- -f : 根据条件过滤显示的内容。
- –format : 指定返回值的模板文件。
- -l : 显示最近创建的容器。
- -n : 列出最近创建的n个容器。
- –no-trunc : 不截断输出。
- -q : 静默模式,只显示容器编号。
- -s : 显示总的文件大小。
# 列出所有在运行的容器信息。
docker ps
# 列出最近创建的5个容器信息。
docker ps -n 5
# 列出所有创建的容器ID。
docker ps -a -q
补充说明:容器的7种状态:created(已创建)、restarting(重启中)、running(运行中)、removing(迁移中)、paused(暂停)、exited(停止)、dead(死亡)。
inspect
获取镜像或容器的元数据(详细信息),例如状态、环境变量、大小等信息
- -f、--format : 指定返回值的模板文件。
- -s、--size : 显示总的文件大小。
- –type : 为指定类型返回JSON。
# 查看python容器的相关信息
docker inspect python
# 获取容器的Id,Created属性,拿取属性时需要添加.
docker inspect --format='{{.Id}} {{.Created}}' db751dd6f406
top
查看容器中的进程信息,可以使用ps命令参数
# 查看容器中运行的进程
docker top db751dd6f406
# 查看所有容器的进程
for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
event
获取实时事件, 一般用于查看docker相关日志及操作使用
- -f、--filter :根据条件过滤事件;
- --format :使用给予的模板输出
- –since :从指定的时间戳后显示所有事件;
- –until :流水时间显示到指定的时间为止;
# 获取从此时间戳之后的事件
docker events --since 1654061000
# 获取从此时间戳,且image包含python的信息
docker events --since 1654061000 -f "image"="python"
# 获取从此时间戳,且container包含python的信息
docker events --since 1654061000 -f "container"="python"
# 如果时间不是精确到秒的,则可以直接使用如下:
docker events --since 2022-05-31
说明
说明:如果指定的时间是到秒级的,需要将时间转成时间戳。如果时间为日期的话,可以直接使用,如–since=“2016-07-01”。
log
获取容器的日志
- -f、--follow : 跟踪日志输出
- –since : 显示某个开始时间的所有日志
- -t、--timestamps : 显示时间戳
- -n、--tail : 仅列出最新N条容器日志
- --details: 显示额外的数据到日志中
- --until: 显示在时间戳之前的所有日志
# 跟踪查看数据
docker logs -f f635d693d4e7
# 查看自从某个时间戳的前一条数据
docker logs f635d693d4e7 --since='2022-05-31' -n 1
export
将文件系统作为一个tar归档文件导出到STDOUT
- -o: 将输入内容写入到文件
# 将输入内容写入以时间戳为名称的tar包
docker export -o python-`date +%Y%m%d.tar` f635d693d4e7
port
列出容器的端口映射
docker port container
容器rootfs命令
commit
基于容器的变化创建一个新镜像
- -a、--author: 提交镜像的作者
- -c、--change: 使用Dockerfile指令来创建镜像
- -m、--message: 提交的信息
- -p、--pause: 创建镜像时是否暂停镜像,默认是true
# 基于容器,设置作者,及提交信息,创建新镜像,注意后面添加创建完成的镜像名称及tag号
docker commit -a 'author' -m 'create new image' f635d693d4e7 python3_2:v2
cp
用于主机与容器之间的数据拷贝
-a、--archive: 存档模式(复制所有uid/gid信息)
-L、--follow-link: 保持源目标中的链接
# 将主机的文件拷贝至容器中对应位置
docker cp get-docker.sh f635d693d4e7:/home/test
# 将容器中的文件拷贝至主机的位置
docker cp f635d693d4e7:/home/test get-docker.sh
diff
检查容器内文件结构改变
docker diff f635d693d4e7
基础版本信息指令
info
docker的详细信息,包含容器数、镜像数、系统平台等
docker info
version
显示docker的版本信息
docker version
补充
1.批量停止容器
docker ps -a -q | xargs docker stop
2.批量启动容器
docker ps -a -q | xargs docker start
3.批量删除容器
docker ps -a -q | xargs docker stop;docker ps -a -q | xargs docker rm -f
4.批量删除镜像
建议先停止并删除所有容器后再删除所有镜像
切记,删除镜像要谨慎
docker images -q | xargs docker rmi -f
未完,持续更新中
More info: docker常用命令
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)