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服务器地址/路径/名称:版本号]

从镜像仓库中搜索镜像

  • -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常用命令

posted @   形同陌路love  阅读(249)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示