从入门到精通:Docker常用命令全解析

docker信息

docker info

显示 Docker 系统信息,包括镜像和容器数。。

docker info [OPTIONS]

docker version

显示 Docker 版本信息。

镜像仓库

命令作用
docker login/docker logout登陆到一个Docker镜像仓库
docker pull从镜像仓库中拉取或者更新指定镜像
docker push将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker search从Docker Hub查找镜像

docker login

登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

docker logout

登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

docker login [OPTIONS] [SERVER]
docker logout [OPTIONS] [SERVER]
sudo docker login -u xxx -p xxx
sudo docker logout

OPTIONS说明:

  •  -u : 登陆的用户名
  •  -p : 登陆的密码

docker pull

从镜像仓库中拉取或者更新指定镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
sudo docker pull python

OPTIONS说明:

  •  -a : 拉取所有 tagged 镜像
  •  –disable-content-trust : 忽略镜像的校验,默认开启
指定版本
docker pull mongo:3.2.4
dockre pull redis:3.2

docker push

将本地的镜像上传到镜像仓库,要先登陆到镜像仓库

docker push [OPTIONS] NAME[:TAG]
sudo docker push mine/ubuntu:v1
sudo docker push 475378094/li:v1

OPTIONS说明:

  •  –disable-content-trust : 忽略镜像的校验,默认开启

docker search

从Docker Hub查找镜像

docker search [OPTIONS] TERM
sudo docker search -s 10 python

OPTIONS说明:

  •  –automated : 只列出 automated build类型的镜像;
  •  –no-trunc : 显示完整的镜像描述;
  •  -s : 列出收藏数不小于指定值的镜像。

本地镜像管理

命令作用
images列出本地镜像。
rmi删除本地一个或多少镜像。
tag标记本地镜像,将其归入某一仓库。
build使用 Dockerfile 创建镜像。
history查看指定镜像的创建历史。
save将指定镜像保存成 tar 归档文件。
load从归档文件tar中创建镜像。

docker images

列出本地镜像。

docker images [OPTIONS] [REPOSITORY[:TAG]]
sudo docker iamges -a

OPTIONS说明:

 -a : 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);

 –digests : 显示镜像的摘要信息

 -f : 显示满足条件的镜像

 –format : 指定返回值的模板文件

 –no-trunc : 显示完整的镜像信息

 -q : 只显示镜像ID。

docker rmi

删除本地一个或多少镜像。

docker rmi [OPTIONS] IMAGE [IMAGE...]
sudo  docker rmi -f runoob/ubuntu:v4

OPTIONS说明:

  •  -f : 强制删除;
  •  –no-prune : 不移除该镜像的过程镜像,默认移除;

docker tag

标记本地镜像,将其归入某一仓库。

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
sudo docker tag learn/ping mine/ubuntu:v1
docker tag <existing-image> <hub-user>/<repo-name>[:<tag>]
其中existing-image代表本地待上传的镜像名加tag,后面<hub-user>/<repo-name>[:<tag>]则是为上传更改的标签名,tag不指定则为latest。
sudo docker tag mynginx:v1 475378094/li:v1  #将本地的镜像打上标签,打上仓库同名的镜像名,才能push(上传)成功

docker build

命令用于使用 Dockerfile 创建镜像。

docker build [OPTIONS] PATH | URL | -

OPTIONS说明:

  •  –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配置。
  • –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
  • –network: 默认 default。在构建期间设置RUN指令的网络模式

实例

使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。

docker build -t runoob/ubuntu:v1 . 

使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。

docker build github.com/creack/docker-firefox

也可以通过 -f Dockerfile 文件的位置:

$ docker build -f /path/to/a/Dockerfile .

在 Docker 守护进程执行 Dockerfile 中的指令前,首先会对 Dockerfile 进行语法检查,有语法错误时会返回:

$ docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD

docker history

查看指定镜像的创建历史。

docker history [OPTIONS] IMAGE
sudo docker history mine/ubuntu:v1

OPTIONS说明:

  •  -H : 以可读的格式打印镜像大小和日期,默认为true;
  •  –no-trunc : 显示完整的提交记录;
  •  -q : 仅列出提交记录ID。

docker save

将指定镜像保存成 tar 归档文件。

docker save [OPTIONS] IMAGE [IMAGE...]
sudo docker save -o mydocker.tar ubuntu:v1

OPTIONS说明:

  •  -o : 输出到的文件。

docker load

从归档文件tar中创建镜像。

docker load [OPTIONS]
sudo docker load -i mydocker.tar

OPTIONS说明:

  •  -i : 从文件 输入

容器rootfs命令

命令作用
commit从容器创建一个新的镜像。(更新镜像)
cp用于容器与主机之间的数据拷贝
diff检查容器里文件结构的更改。

docker commit

从容器创建一个新的镜像。

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
sudo docker commit -a "secondbrother" -m "my apache" a404c6c174a2  mymysql:v1 #将容器a404c6c174a2 保存为新的镜像,并添加提交人信息和说明信息

OPTIONS说明:

  •  -a : 提交的镜像作者;
  •  -c : 使用Dockerfile指令来创建镜像;
  •  -m : 提交时的说明文字;
  •  -p : 在commit时,将容器暂停。

docker cp

用于容器与主机之间的数据拷贝。

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

sudo docker cp /www/web 96f7f14e99ab:/www/
#将主机/www/web目录拷贝到容器96f7f14e99ab的/www目录下。
sudo docker cp  96f7f14e99ab:/www/tmp/
#将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。

OPTIONS说明:

  •  -L : 保持源目标中的链接

docker diff

检查容器里文件结构的更改。

docker diff [OPTIONS] CONTAINER
sudo docker diff mymysql #查看容器mymysql的文件结构更改。

docker network

docker network ls

这个命令用于列出所有当前主机上或Swarm集群上的网络:

lj@instance-5r0pfuh1:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
a6b8826943bf        bridge              bridge              local
e454c7bc9f7e        host                host                local
71f625c08e3c        none                null                local

在默认情况下会看到三个网络,它们是Docker Deamon进程创建的。它们实际上分别对应了Docker过去的三种『网络模式』:

bridge:容器使用独立网络Namespace,并连接到docker0虚拟网卡(默认模式) none:容器没有任何网卡,适合不需要与外部通过网络通信的容器 host:容器与主机共享网络Namespace,拥有与主机相同的网络设备

docker network create / rm

这两个命令用于新建或删除一个容器网络,创建时可以用『–driver』参数使用的网络插件,例如:

lj@instance-5r0pfuh1:~$ docker network create br0
6420f7391a9e689173e22a4824f61b8aaa40be637043c863ec726a712c10364d
lj@instance-5r0pfuh1:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6420f7391a9e        br0                 bridge              local
a6b8826943bf        bridge              bridge              local
e454c7bc9f7e        host                host                local
71f625c08e3c        none                null                local
lj@instance-5r0pfuh1:~$ docker network rm br0
br0
lj@instance-5r0pfuh1:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
a6b8826943bf        bridge              bridge              local
e454c7bc9f7e        host                host                local
71f625c08e3c        none                null                local

docker network connect / disconnect

这两个命令用于动态的将容器添加进一个已有网络,或将容器从网络中移除。为了比较清楚的说明这一点,我们来看一个例子。

参照前面的libnetwork容器网络模型示意图中的情形创建两个网络:

$ docker network create –driver=bridge frontend
$ docker network create –driver=bridge backend

然后运行三个容器,让第一个容器接入frontend网络,第二个容器同时接入两个网络,三个容器只接入backend网络。首先用『–net』参数可以很容易创建出第一和第三个容器:

$ docker run -td –name ins01 –net frontendindex.alauda.cn/library/busybox
$ docker run -td –name ins03 –net backendindex.alauda.cn/library/busybox

如何创建一个同时加入两个网络的容器呢?由于创建容器时的『–net』参数只能指定一个网络名称,因此需要在创建过后再用docker network connect命令添加另一个网络:

$ docker run -td –name ins02 –net frontendindex.alauda.cn/library/busybox
$ docker network connect backend ins0212

现在通过ping命令测试一下这几个容器之间的连通性:

容器操作

命令作用
ps列出容器
inspect获取容器/镜像的元数据。
top查看容器中运行的进程信息,支持 ps 命令参数。
attach连接到正在运行中的容器。
events从服务器获取实时事件
logs获取容器的日志
wait阻塞运行直到容器停止,然后打印出它的退出代码。
port列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。
export将容器作为一个tar归档文件导出。
import从压缩包中导入内容以创建文件系统映像。

docker ps

列出容器

docker ps [OPTIONS]
sudo docker ps -a

OPTIONS说明:

  •  -a : 显示所有的容器,包括未运行的。
  •  -f : 根据条件过滤显示的内容。
  •  –format : 指定返回值的模板文件。
  •  -l : 显示最近创建的容器。
  •  -n : 列出最近创建的n个容器。
  •  –no-trunc : 不截断输出。
  •  -q : 静默模式,只显示容器编号。
  •  -s : 显示总的文件大小。

docker inspect

获取容器/镜像的元数据。

docker inspect [OPTIONS] NAME|ID [NAME|ID...]
sudo docker inspect learn/ping  获取镜像learn/ping的元信息。

OPTIONS说明:

  •  -f : 指定返回值的模板文件。
  •  -s : 显示总的文件大小。
  •  –type : 为指定类型返回JSON。

docker top

查看容器中运行的进程信息,支持 ps 命令参数。

docker top [OPTIONS] CONTAINER [ps OPTIONS]
sudo docker top mymysql

容器运行时不一定有/bin/bash终端来交互执行top命令,而且容器还不一定有top命令,可以使用docker top来实现查看container中正在运行的进程。

docker attach

连接到正在运行中的容器。

docker attach [OPTIONS] CONTAINER
sudo docker attach --sig-proxy=false mymysql

要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。

官方文档中说attach后可以通过CTRL-C来detach,但实际上经过我的测试,如果container当前在运行bash,CTRL-C自然是当前行的输入,没有退出;如果container当前正在前台运行进程,如输出nginx的access.log日志,CTRL-C不仅会导致退出容器,而且还stop了。这不是我们想要的,detach的意思按理应该是脱离容器终端,但容器依然运行。好在attach是可以带上–sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。

待验证

以守护形式运行容器

我们执行完需要的操作退出容器时,不要使用exit退出,可以利用Ctrl+P Ctrl+Q代替,以守护式形式推出容器。)

docker events

从服务器获取实时事件

docker events [OPTIONS]
sudo docker events --since="1467302400" #显示docker 2016年7月1日后的所有事件。

OPTIONS说明:

  •  -f : 根据条件过滤事件;
  •  –since : 从指定的时间戳后显示所有事件;
  •  –until : 流水时间显示到指定的时间为止;

docker logs

获取容器的日志

docker logs [OPTIONS] CONTAINER
sudo docker logs --tail=10 gracious_kepler #查看容器gracious_kepler最新10条日志

OPTIONS说明:

  • -f : 跟踪日志输出
  •  –since : 显示某个开始时间的所有日志
  • -t : 显示时间戳
  •  –tail : 仅列出最新N条容器日志

docker wait

阻塞运行直到容器停止,然后打印出它的退出代码。

docker wait [OPTIONS] CONTAINER [CONTAINER...]
docker wait CONTAINER

docker port

列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。

docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]
sudo docker port gracious_kepler  #查看容器gracious_kepler的端口映射情况。

docker export

将容器作为一个tar归档文件导出。

docker export [OPTIONS] CONTAINER
sudo docker export -o mydocker.tar 8b4f

OPTIONS说明:

  •  -o : 将输入内容写到文件。

docker import

docker import将container导入后会成为一个image,而不是恢复为一个container。

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
sudo docker import mydocker.tar mydocker:latest

容器生命周期管理

命令作用
run创建一个新的容器并运行一个命令
start/stop/restart启动一个或多个已经被停止的容器/关闭/重启
kill杀掉一个运行中的容器。
rm删除一个或多少容器
pause/unpause暂停/恢复 容器中所有的进程
create创建一个新的容器但不启动它
exec在运行的容器中执行命令

docker run

创建一个新的容器并运行一个命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -p: 端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • –name=”nginx-lb”: 为容器指定一个名称;
  • –dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • –dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h “mars”: 指定容器的hostname;
  • -e username=”ritchie”: 设置环境变量;
  • –env-file=[]: 从指定文件读入环境变量;
  • –cpuset=”0-2″ or –cpuset=”0,1,2″: 绑定容器到指定CPU运行;
  •  -m : 设置容器使用内存最大值;
  • –net=”bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • –link=[]: 添加链接到另一个容器;
  • –expose=[]: 开放一个端口或一组端口;

-P,–publish-all=true | false,大写的P表示为容器暴露的所有端口进行映射;

-p,–publish=[],小写的p表示为容器指定的端口进行映射,有四种形式:

containerPort:只指定容器的端口,宿主机端口随机映射; hostPort:containerPort:同时指定容器与宿主机端口一一映射; ip::containerPort:指定ip和容器的端口; ip:hostPort:containerPort:指定ip、宿主机端口以及容器端口。

docker run -p 80 -i -t ubuntu /bin/bash
docker run -p 8080:80 -i -t ubuntu /bin/bash
docker run -p 0.0.0.0::80 -i -t ubuntu /bin/bash
docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash
实例

使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。

docker run --name mynginx -d nginx:latest

使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。

docker run -P -d nginx:latest

使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。

docker run -p 80:80 -v /data:/data -d nginx:latest

绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。

$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash

使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。

runoob@runoob:~$ docker run -it nginx:latest /bin/bash
root@b8573233d675:/# 

docker start

启动一个或多个已经被停止的容器

docker stop

停止一个运行中的容器

docker restart

重启容器

docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker restart [OPTIONS] CONTAINER [CONTAINER...]
sudo docker start mymysql
sudo docker stop mymysql
sudo docker restart mymysql

docker kill

杀掉一个运行中的容器。

docker kill [OPTIONS] CONTAINER [CONTAINER...]
sudo docker kill gracious_kepler  #杀掉运行中的容器gracious_kepler

OPTIONS说明:

  •  -s : 向容器发送一个信号

docker rm

删除一个或多少容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  •  -f : 通过SIGKILL信号强制删除一个运行中的容器
  •  -l : 移除容器间的网络连接,而非容器本身
  • -v :-v 删除与容器关联的卷

docker pause

暂停容器中所有的进程。

docker unpause

恢复容器中所有的进程。

docker pause [OPTIONS] CONTAINER [CONTAINER...]
docker unpause [OPTIONS] CONTAINER [CONTAINER...]
sudo docker pause gracious_kepler  #暂停容器gracious_kepler提供服务
sudo docker unpause gracious_kepler  #恢复容器gracious_kepler提供服务

docker create

创建一个新的容器但不启动它

用法同 docker run

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
sudo docker --name mylinux learn/ping

语法同 docker run

docker exec

在运行的容器中执行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
sudo docker exec -it gracious_kepler /bin/bash
#在容器mynginx中开启一个交互模式的终端
docker exec -it mynginx /bin/sh /root/runoob.sh
#在容器mynginx中以交互模式执行容器内/root/runoob.sh脚本

OPTIONS说明:

  •  -d : 分离模式: 在后台运行
  •  -i : 即使没有附加也保持STDIN 打开
  •  -t : 分配一个伪终端

docker api

本文记录docker怎么打开api remote接口设置,docker的版本更新太快了,不同的版本之间,设置可能不同,本文是针对docker13.1

查看配置文件位于哪里

systemctl show --property=FragmentPath docker 

编辑配置文件内容,接收所有ip请求

vim  /lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:5678

重新加载配置文件,重启docker daemon

sudo systemctl daemon-reload 
sudo systemctl restart docker

测试

[root@node1 docker]# docker -H localhost:5678 version
Client:
 Version:      1.13.1
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   092cba3
 Built:        Wed Feb  8 06:38:28 2017
 OS/Arch:      linux/amd64

Server:
 Version:      1.13.1
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   092cba3
 Built:        Wed Feb  8 06:38:28 2017
 OS/Arch:      linux/amd64
[root@node1 docker]# curl http://182.61.34.87:4567/images/json

StatusCode        : 200
StatusDescription : OK
Content           : [{"Containers":-1,"Created":1557967722,"Id":"sha256:d3e3588af5178bae2c8ffdbfa227c7d0305518d3821a71615c14ffb8643d7eb3","Labels":null,"ParentId":"","RepoDigests":["redis@sha256:e549a30b3c31e6305b973e0d9...
RawContent        : HTTP/1.1 200 OK
                    Api-Version: 1.39
                    Docker-Experimental: false
                    Ostype: linux
                    Transfer-Encoding: chunked
                    Content-Type: application/json
                    Date: Fri, 05 Jul 2019 17:45:35 GMT
                    Server: Docker/18.09.6 (...
Forms             : {}
Headers           : {[Api-Version, 1.39], [Docker-Experimental, false], [Ostype, linux], [Transfer-Encoding, chunked]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : System.__ComObject
RawContentLength  : 2303

接下来我们格式化一下

curl http://182.61.34.87:4567/info | python -m json.tool

是不是出现了版本信息? 说明成功了,python -m json.tool这个干嘛的自行百度吧,格式化工具

docker api 常用接口

列举docker容器

curl http://localhost:2375/containers/json

列举docker镜像

curl  http://localhost:2375/images/json   

查询镜像详细信息

curl http://localhost:2375/images/pid/json

启动容器

curl -X POST -H "Content-Type: application/json" http://localhost:2375/containers/pid/start

停止容器

 curl -X POST -H "Content-Type: application/json" http://localhost:2375/containers/pid/stop
POST http://host:port/images/create # 创建镜像
POST http://host:port/containers/create?name=${containerName}  # 创建容器
POST http://host:port/containers/{containerId}/start # 启动容器
POST http://host:port/containers/{containerId}/stop # 停止容器
DELETE http://host:port/containers/{containerId} # 删除容器

  查看原文:从入门到精通:Docker常用命令全解析

 关注公众号 "字节航海家" 及时获取最新内容

  • 32
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值