Docker 常用指令详解

前言


上一篇文章 中已经介绍了 Docker 相关的概念以及 Docker 的安装, 下面正式进入 Docker 的使用。Docker 分为客户端和服务端两部分, docker 为客户端调用的命令, dockerd 为服务端调用的命令, 本文着重介绍客户端的用法。

主要用法:docker [ docker命令选项 ] [ 子命令 ] [ 子命令选项 ]

docker [ 子命令 ] --help 可查看每个子命令的详细用法。

Docker 命令选项列表


选项 说明 其他
--config [string] 客户端本地配置文件路径 默认为 ~/.docker
-D, --debug 启用调试模式
--help 打印用法
-H, --host list 通过 socket 访问指定的 docker 守护进程 ( 服务端 ) unix:// , fd:// , tcp://
-l, --log-level [string] 设置日志级别 ( debuginfowarnerrorfatal ) 默认为 info
--tls 启用 TLS 加密
--tlscacert [string] 指定信任的 CA 根证书 路径 默认为 ~/.docker/ca.pem
--tlscert [string] 客户端证书路径 默认为 ~/.docker/cert.pem
--tlskey [string] 客户端证书私钥路径 默认为 ~/.docker/key.pem
--tlsverify 启用 TLS 加密并验证客户端证书
-v, --version 打印 docker 客户端版本信息

1. 镜像仓库相关


1.1 查找镜像

docker search [ 条件 ]

# 查询三颗星及以上名字包含alpine的镜像
docker search -f=stars=3 alpine

1.2 获取镜像

docker pull [ 仓库 ]:[ tag ]

仓库格式为 [仓库url]/[用户名]/[应用名] , 除了官方仓库外的第三方仓库要指定 url, 用户名就是在对应仓库下建立的账户, 一般只有应用名的仓库代表 官方镜像, 如 ubuntutomcat 等, 而 tag 表示镜像的版本号, 不指定时默认为 latest

# 获取alpine Linux 的镜像
docker pull alpine

1.3 推送镜像到仓库

docker push [ 镜像名 ]:[ tag ]

当然, 需要先登录

ubuntu@VM-84-201-ubuntu:~$ docker push alpine
The push refers to a repository [docker.io/library/alpine]
3fb66f713c9f: Layer already exists
errors:
denied: requested access to the resource is denied(没有权限, 需要登录帐号)
unauthorized: authentication required

1.4 登录/退出第三方仓库

docker [ login/logout ] [ 仓库地址 ]

# 登录
ubuntu@VM-84-201-ubuntu:~$ docker login daocloud.io
Username (username): username
Password:
Login Succeeded
# 退出
ubuntu@VM-84-201-ubuntu:~$ docker logout daocloud.io
Removing login credentials for daocloud.io

2. 本地镜像


2.1 查看本地镜像

docker images

ubuntu@VM-84-201-ubuntu:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
alpine              latest              a41a7446062d        14 hours ago        3.97MB
hello-world         latest              48b5124b2768        4 months ago        1.84kB

2.2 删除本地镜像

docker rmi [ 镜像名 or 镜像 id ]

如果用 镜像 id 作为参数, 可以只输入前几位, 能唯一确定即可 ( 可以同时删除多个镜像, 空格隔开 )。此外, 如果已经使用该 镜像 启动了 容器 需要先删除 容器

ubuntu@VM-84-201-ubuntu:~$ docker rmi a41
Untagged: alpine:latest
Untagged: alpine@sha256:0b94d1d1b5eb130dd0253374552445b39470653fb1a1ec2d81490948876e462c
Deleted: sha256:a41a7446062d197dd4b21b38122dcc7b2399deb0750c4110925a7dd37c80f118
Deleted: sha256:3fb66f713c9fa9debcdaa58bb9858bd04c17350d9614b7a250ec0ee527319e59

2.3 查看镜像详情

docker inspect [ 镜像名 or 镜像 id ]

ubuntu@VM-84-201-ubuntu:~$ docker inspect a41
[
    {
        "Id": "sha256:a41a7446062d197dd4b21b38122dcc7b2399deb0750c4110925a7dd37c80f118",
        "RepoTags": [
            "alpine:latest"
        ],
        "RepoDigests": [
            "alpine@sha256:0b94d1d1b5eb130dd0253374552445b39470653fb1a1ec2d81490948876e462c"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2017-05-25T23:33:22.029729271Z",
        "Container": "19ee1cd90c07eb7b3c359aaec3706e269a871064cca47801122444cef51c5038",
    ......
        }
    }
]

2.4 打包本地镜像, 使用压缩包来完成迁移

docker save [ 镜像名 ] > [ 文件路径 ]

# 默认为文件流输出
docker save alpine > /usr/anyesu/docker/alpine.img

# 或者使用 '-o' 选项指定输出文件路径
docker save -o /usr/anyesu/docker/alpine.img alpine

2.5 导入镜像压缩包

docker load < [ 文件路径 ]

# 默认从标准输入读取
ubuntu@VM-84-201-ubuntu:~$ docker load < /usr/anyesu/docker/alpine.img
3fb66f713c9f: Loading layer [==================================================>]  4.221MB/4.221MB
Loaded image: alpine:latest

# 用 '-i' 选项指定输入文件路径
ubuntu@VM-84-201-ubuntu:~$ docker load -i /usr/anyesu/docker/alpine.img
Loaded image: alpine:latest
Loaded image ID: sha256:665ffb03bfaea7d8b7472edc0a741b429267db249b1fcead457886e861eae25f
Loaded image ID: sha256:a41a7446062d197dd4b21b38122dcc7b2399deb0750c4110925a7dd37c80f118

2.6 修改镜像tag

docker tag [ 镜像名 or 镜像 id ] [ 新镜像名 ]:[ 新 tag ]

ubuntu@VM-84-201-ubuntu:~$ docker tag a41 anyesu/alpine:1.0
ubuntu@VM-84-201-ubuntu:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
anyesu/alpine       1.0                 a41a7446062d        15 hours ago        3.97MB
alpine              latest              a41a7446062d        15 hours ago        3.97MB
hello-world         latest              48b5124b2768        4 months ago        1.84kB

3. 容器相关


3.1 创建、启动容器并执行相应的命令

docker run [ 参数 ] [ 镜像名 or 镜像 id ] [ 命令 ]

如果没有指定命令时就执行 镜像 中默认的命令, 创建 镜像 的时候可设置默认命令。另外要注意的一点, 启动 容器 后要执行一个前台进程 ( 就是能在控制台不断输出的或者一直等待的那种程序, 如 tomcatcatalina.sh ) 才能使 容器 保持运行状态, 否则, 命令执行完 容器 就关闭了, 像下面这个例子执行完就直接结束了。

ubuntu@VM-84-201-ubuntu:~$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

run 命令常用选项

选项 说明
-d 后台运行容器, 并返回容器ID;不指定时, 启动后开始打印日志, Ctrl + C 退出命令同时会关闭容器
-i 以交互模式运行容器, 通常与 -t 同时使用;
-t 为容器重新分配一个伪输入终端, 通常与 -i 同时使用
--name "anyesu-container" 为容器指定一个别名, 不指定时随机生成
-h docker-anyesu 设置容器的主机名, 默认随机生成
--dns 8.8.8.8 指定容器使用的 DNS 服务器, 默认和宿主机一致
-e docker_host=172.17.0.1 设置环境变量
--cpuset="0-2" or --cpuset="0,1,2" 绑定容器到指定 CPU 运行
-m 100M 设置容器使用内存最大值
--net bridge 指定容器的网络连接类型, 支持 bridge / host / none / container 四种类型
--ip 172.18.0.13 为容器分配固定 ip ( 需要使用自定义网络 )
--expose 8081 --expose 8082 开放一个端口或一组端口, 会覆盖镜像设置中开放的端口
-p [宿主机端口]:[容器内端口] 宿主机到容器的端口映射, 可指定宿主机的要监听的 ip, 默认为 0.0.0.0
-P 注意是大写的, 宿主机随机指定一组可用的端口映射容器 expose 的所有端口
-v [宿主机目录路径]:[容器内目录路径] 挂载宿主机的指定目录 ( 或文件 ) 到容器内的指定目录 ( 或文件 )
--add-host [主机名]:[ip] 为容器 hosts 文件追加 host , 默认会在 hosts 文件最后追加内容:[主机名]:[容器ip]
--volumes-from [其他容器名] 将其他容器的数据卷添加到此容器
--link [其他容器名]:[在该容器中的别名] 添加链接到另一个容器, 在本容器 hosts 文件中加入关联容器的记录, 效果类似于 --add-host

一个较完整的例子:

# 创建一个名为anyesu_net、网段为172.18.0.0的网桥(docker默认创建的网段为172.17.0.0)
docker network create --subnet=172.18.0.0/16 anyesu_net

# 创建并启动一个配置复杂的容器
ubuntu@VM-84-201-ubuntu:~$ docker run -d --name anyesu-container -h docker-anyesu --dns 8.8.8.8 -e docker_host=172.18.0.1 -e docker_host2=172.18.0.2 --net anyesu_net --ip 172.18.0.13 --expose 8081 --expose 8082 -P -p 8000:8000 -p 8001:8001 -v /usr/anyesu:/usr/anyesu --add-host anyesu_host:172.18.0.1 tomcat:7
912e6632161de0783a057aa02380e676753f66cfb367ef1686d4d09cdc931659
ubuntu@VM-84-201-ubuntu:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                                                                         NAMES
912e6632161d        tomcat:7              "catalina.sh run"   6 seconds ago       Up 5 seconds        0.0.0.0:8000-8001->8000-8001/tcp, 0.0.0.0:32783->8080/tcp, 0.0.0.0:32782->8081/tcp, 0.0.0.0:32781->8082/tcp   anyesu-container
 

单字符选项可以合并, 如 -i -t 可以合并为 -it

3.2 查看运行中的容器

docker ps

-a 选项可查看所有的 容器

3.3 开启/停止/重启容器

# 关闭容器(发送SIGTERM信号,做一些'退出前工作',再发送SIGKILL信号)
docker stop anyesu-container
# 强制关闭容器(默认发送SIGKILL信号, 加-s参数可以发送其他信号)
docker kill anyesu-container
# 启动容器
docker start anyesu-container
# 重启容器
docker restart anyesu-container

3.4 删除容器

docker rm [ 容器名 or 容器 id ]

可以指定多个容器一起删除, 加 -f 选项可强制删除正在运行的 容器

ubuntu@VM-84-201-ubuntu:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                                                                                                         NAMES
fd7a6c1ba0f0        tomcat              "catalina.sh run"   20 seconds ago       Up 18 seconds       0.0.0.0:32798->8080/tcp, 0.0.0.0:32797->8081/tcp, 0.0.0.0:32796->8082/tcp                                     musing_newton
61941bea1c87        tomcat              "catalina.sh run"   About a minute ago   Up About a minute   0.0.0.0:8000-8001->8000-8001/tcp, 0.0.0.0:32795->8080/tcp, 0.0.0.0:32794->8081/tcp, 0.0.0.0:32793->8082/tcp   anyesu-container
ubuntu@VM-84-201-ubuntu:~$ docker rm musing_newton anyesu-container -f
musing_newton
anyesu-container

3.5 查看容器详情

docker inspect [ 容器名 or 容器 id ]

docker inspect anyesu-container

3.6 查看容器中正在运行的进程

docker top [ 容器名 or 容器 id ]

ubuntu@VM-84-201-ubuntu:~$ docker top anyesu-container
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                31769               31752               1                   00:26               ?                   00:00:03            /docker-java-home/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

3.7 将容器保存为镜像

docker commit [ 容器名 or 容器 id ] [ 镜像名 ]:[ tag ]

ubuntu@VM-84-201-ubuntu:~$ docker commit anyesu-container anyesu/tomcat:1.0
sha256:582fcffd3209a2478e2179c9381a1ef67e0df9ba95aba713875c0857f5dae4e5
ubuntu@VM-84-201-ubuntu:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
anyesu/tomcat       1.0                 582fcffd3209        2 seconds ago       334MB
alpine              latest              a41a7446062d        17 hours ago        3.97MB
tomcat              latest              3695a0fe8320        2 days ago          334MB
hello-world         latest              48b5124b2768        4 months ago        1.84kB

3.8 使用 Dockerfile 构建镜像

docker build -t [ 镜像名 ]:[ tag ] -f [ DockerFile 名 ] [ DockerFile 所在目录 ]

数据是实时更新的, 点击 查看详细用法。

4. 硬件资源相关


4.1 显示容器硬件资源使用情况

docker stats [ 选项 ] [ 0个或多个正在运行容器 ]

# 不指定容器时显示所有正在运行的容器
ubuntu@VM-84-201-ubuntu:~$ docker stats
CONTAINER           CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
9bb9d6bed6e6        0.00%               20.57MiB / 864.5MiB   2.38%               104kB / 1.99MB      4.9MB / 4.1kB       11

4.2 更新容器的硬件资源限制

docker update [ 选项 ]

这个操作可能会输出下面的错误内容:

Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap

解决办法

# /etc/default/grub
sudo vi /etc/default/grub

# 添加内核启动参数
GRUB_CMDLINE_LINUX="...   cgroup_enable=memory swapaccount=1"

# 更新 grub
sudo update-grub

# 重启
sudo reboot

注意是在 GRUB_CMDLINE_LINUX追加 上述参数内容, 我试过简单粗暴的在文件末尾添加下面内容, 这么做会覆盖原有的启动参数, 导致网络连接失败。网络坏了, ssh 都连不上了, 幸好可以在 腾讯云 的网页控制台登录, 修改内容重启就好了。所以呢, 这一步操作一定要慎重。

4.3 使用压力测试工具 stress 验证效果

使用已有的 stress 镜像 progrium/stress, 开两个终端, 在其中一个终端中执行下面的命令

docker run -m 100m --rm -it progrium/stress --cpu 2 --io 1 --vm 10 --vm-bytes 9M

在另一个终端执行 docker stats 进行监控

CONTAINER           CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
9eb0                88.42%              92.22MiB / 100MiB   92.22%              0B / 0B             1.65MB / 2.88MB     14

再开一个终端执行

# 9eb0为容器id开头, 请根据实际情况替换。内存限制只能调大不能调小
docker update -m 200m 9eb0
相关文章:

基础子命令列表


选项 说明
attach 进入运行中的容器, 显示该容器的控制台界面。注意, 从该指令退出会导致容器关闭
build 根据 Dockerfile 文件构建镜像
commit 提交容器所做的改为为一个新的镜像
cp 在容器和宿主机之间复制文件
create 根据镜像生成一个新的容器
diff 展示容器相对于构建它的镜像内容所做的改变
events 实时打印服务端执行的事件
exec 在已运行的容器中执行命令
export 导出容器到本地快照文件
history 显示镜像每层的变更内容
images 列出本地所有镜像
import 导入本地容器快照文件为镜像
info 显示 Docker 详细的系统信息
inspect 查看容器或镜像的配置信息, 默认为 json 数据
kill -s 选项向容器发送信号, 默认为 SIGKILL 信号 ( 强制关闭 )
load 导入镜像压缩包
login 登录第三方仓库
logout 退出第三方仓库
logs 打印容器的控制台输出内容, -f 选项可以持续输出
pause 暂停容器
port 容器端口映射列表
ps 列出正在运行的容器, -a 选项显示所有容器
pull 从镜像仓库拉取镜像
push 将镜像推送到镜像仓库
rename 重命名容器名
restart 重启容器
rm 删除已停止的容器, -f 选项可强制删除正在运行的容器
rmi 删除镜像 ( 必须先删除该镜像构建的所有容器 )
run 根据镜像生成并进入一个新的容器
save 打包本地镜像, 使用压缩包来完成迁移
search 查找镜像
start 启动关闭的容器
stats 显示容器对资源的使用情况 ( 内存、CPU、磁盘等 )
stop 关闭正在运行的容器
tag 修改镜像 tag
top 显示容器中正在运行的进程 ( 相当于容器内执行 ps -ef 命令 )
unpause 恢复暂停的容器
update 更新容器的硬件资源限制 ( 内存、CPU 等 )
version 显示 Docker 客户端和服务端版本信息
wait 阻塞当前命令直到对应的容器被关闭, 容器关闭后打印结束代码
daemon 这个子命令已 过期, 将在 Docker 17.12 之后的版本中移出, 直接使用 dockerd

用于管理的子命令列表


选项 说明
container 管理容器
image 管理镜像
network 管理容器网络 ( 默认为 bridgehostnone 三个网络配置)
plugin 管理插件
system 管理系统资源。其中, docker system prune 命令用于清理没有使用的镜像、容器、数据卷以及网络
volume 管理数据卷
swarm 管理 Swarm 模式
service 管理 Swarm 模式下的服务
node 管理 Swarm 模式下的 Docker 集群中的节点
secret 管理 Swarm 模式下的敏感数据
stack Swarm 模式下利用 compose-file 管理服务

说明

其中 containerimagesystem 一般用前面的简化指令即可。Swarm 模式用来管理 Docker 集群, 它将一群 Docker 宿主机变成一个单一的虚拟的主机, 实现对多台物理机的集群管理。

系列文章


Docker 学习总结

使用 Dockerfile 构建镜像

使用 Docker Compose 构建容器

Docker Daemon 连接方式详解

Docker 下的网络模式


转载请注明出处:http://www.jianshu.com/p/7c9e2247cfbd

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容