Docker命令大全
通过 docker —help 查看所有命令选项,通过 docker <command> —help 更深入的了解指定的 Docker 命令使用方法

| 分类 | 命令 | 描述 |
|---|---|---|
| 镜像仓库 | login | |
| search | ||
| pull | ||
| push | ||
| 容器 生命周期管理 |
run | |
| start/restart/stop | 启动/重启/停止/(一个或多个)容器 | |
| kill | ||
| rm | ||
| pause/unpause | ||
| create | ||
| exec | ||
| 容器操作 | ps | |
| inspect | ||
| top | ||
| attach | ||
| events | ||
| logs | ||
| wait | ||
| export | ||
| port | ||
| 容器rootfs 命令 |
commit | |
| cp | ||
| diff | ||
| 本地镜像管理 | images | |
| rmi | ||
| tag | ||
| build | ||
| history | ||
| save | ||
| load | ||
| import | ||
| info|version | info | |
| version |
Docker镜像的使用
查找镜像 docker search <镜像名>
#按名称搜索云端镜像docker search redis#按名称redis搜索出星数至少为3颗星的镜像docker search --filter stars=3 redis#按名称搜索并显示非截断描述(--no-trunc)docker search --stars=3 --no-trunc redis#显示名称中包含“redis”的镜像,并且是自动构建docker search --filter "is-automated=true" --no-trunc redis#显示的图像名称包含“redis”,至少3颗星,并且是官方版本docker search --filter "is-official=true" --filter "stars=3" redis#格式化选项(--format)使用Go模板漂亮地打印搜索输出1.使用不带标头的模板,Name并StarCount为所有图像输出 以冒号分隔的条目和条目:docker search --format "{{.Name}}:{{.StarCount}}" redis2.输出表格格式:docker search --format "table {{.Name}}\t{{.IsAutomated}}\t{{.IsOfficial}}" redis
拉取镜像 docker pull <镜像 [:版本号]>
#拉取镜像docker pull <IMAGE_NAME> #默认最新版本的,相当于 <IMAGE_NAME>:latestdocker pull <IMAGE_NAME>:latest #拉取最新版本的docker pull <IMAGE_NAME>:5.0.5 #指定版本
列出本地主机上的镜像docker images -a
#列出本地的镜像docker image ls -adocker images -a#列出本地全部镜像的iddocker image ls -aqdocker images -aqKimdeMacBook-Air:~ kim$ docker images -aREPOSITORY TAG IMAGE ID CREATED SIZEredis 3.0 90d5884b1ee0 5 days ago 188 MBredis 4.0 90d5884b1ee0 5 days ago 188 MBnginx latest 6f8d099c3adc 12 days ago 182.7 MBmysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
- REPOSITORY表示镜像的仓库源
- TAG镜像的标签
- IMAGE ID镜像ID
- CREATED镜像创建时间
- SIZE镜像大小
删除镜像docker rmi <镜像id|镜像name>
#通过image的id来指定删除镜像docker image rm <IMAGE_ID ||IMAGE_NAME>docker rmi <IMAGE_ID ||IMAGE_NAME>#要删除全部images,(首先要停止该服务的容器和卸载容器)docker image rm $(docker image ls -aq)docker rmi $(docker images -q)#想要删除untagged images,也就是那些id为<None>的image的话可以用docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
更新镜像 docker commit
docker container ls -a #通过找到容器iddocker commit -m="updete redis" -a="kim-redis" 43c93a65caf7 kim-redis:v2#启动一个容器docker run -it kim-redis:v2 /bin/bash
- -m提交的描述信息
- -a 指定镜像作者
- 43c93a65caf7容器 ID
- kim-redis:v2 指定要创建的目标镜像名
Docker 容器使用
查看容器命令docker ps -asl
#查看container的服务(ID、名字、等)docker container ls #正在运行的容器服务docker container ls -a #所有的容器服务#批量获取容器IDdocker container ls -aq-a, --all Show all containers (default shows just running)-f, --filter filter Filter output based on conditions provided--format string Pretty-print containers using a Go template-n, --last int Show n last created containers (includes all states) (default -1)-l, --latest Show the latest created container (includes all states)--no-trunc Don't truncate output-q, --quiet Only display numeric IDs-s, --size Display total file sizes

初次安装镜像启动容器
同一仓库源可以有多个 TAG,如 redis 仓库源里,有3.04.0 版本,使用REPOSITORY:TAG来定义不同的镜像
#如果要使用版本为3.0的redis镜像来运行容器时,命令docker run -t -i -d -p 6379:6379 redis:3.0 /bin/bash
- -i interactive交互式操作
- -t terminal终端
- -d 后台一直运行
- -p 6379:6379 映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务
- redis:3.0 这是指用 redis:3.0 版本镜像为基础来启动容器
- /bin/bash 放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
- 如果不指定镜像的版本标签,docker 默认使用 REPOSITORY:latest镜像
启动容器
#以镜像的方式启动服务docker start <IMAGE_NAME||IMAGE_ID >#以镜像的方式重启服务docker restart <IMAGE_NAME||IMAGE_ID >#以镜像的方式停止服务docker stop <IMAGE_NAME||IMAGE_ID >#以容器的方式启动服务docker container start <IMAGE_NAME||IMAGE_ID >#以容器的方式重启服务docker container restart <IMAGE_NAME||IMAGE_ID >##以容器的方式停止服务(⚠️:想删除container,容器不可以是运行状态,先把容器的服务停止)docker container stop <IMAGE_NAME||IMAGE_ID >
访问容器
在创造容器时使用 -d参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入
#方式1: docker attachdocker attach <IMAGE_NAME||IMAGE_ID >方式2: docker exec (推荐,因为这命令退出容器终端时,不会导致容器的停止)docker exec -it <IMAGE_NAME||IMAGE_ID > /bin/bash#访问容器示例:docker exec -itd redis /bin/bashdocker exec -itd redis bash #以shell方式访问docker exec -itd redis redis-cli #直接用redis-cli访问容器内redis-i interactive交互式操作-t terminal终端-d 后台一直运行
更多参数说明请使用 docker exec —help 命令查看
导出/导入容器快照
#导出容器快照docker export nginx> nginx.tar#导入容器快照cat nginx.tar | docker import - nginx:6.6.6
关闭删除卸载容器
#批量停止容器docker container stop $(docker container ls -aq)#批量删除容器docker container rm $(docker container ls -aq)#批量删除镜像docker image rm $(docker image ls -aq)#删除指定的containerdocker rm -f <CONTAINER_ID || CONTAINER_NAME>docker container rm -f <CONTAINER_ID || CONTAINER_NAME>#查询镜像、容器、运行服务docker images && docker container ls -a && docker ps
Docker 容器连接
使用docker ps可以看到容器端口 5000 绑定主机端口 32768
runoob@runoob:~$ docker psCONTAINER ID IMAGE COMMAND ... PORTS NAMESfce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
我们也可以使用 -p 标识来指定容器端口绑定到主机端口。两种方式的区别是:
- -P是容器内部端口随机映射到主机的高端口
- -p是容器内部端口绑定到指定的主机端口
指定容器绑定的网络地址,比如绑定 127.0.0.1:5001
runoob@runoob:~$ docker run -d -p 127.0.0.1:5001:5000 7533524/webapp python app.py95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857crunoob@runoob:~$ docker psCONTAINER ID IMAGE COMMAND ... PORTS NAMES95c6ceef88ca 7533524/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5001->5000/tcp adoring_stonebraker33e4523d30aa 7533524/webapp "python app.py" ... 0.0.0.0:5000->5000/tcp berserk_bartik
就可以通过访问 127.0.0.1:5001 来访问容器的 5000 端口
如果要绑定 UDP 端口,可以在端口后面加上 /udp
runoob@runoob:~$ docker run -d -p 127.0.0.1:5000:5000/udp 7533524/webapp python app.py6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22arunoob@runoob:~$ docker psCONTAINER ID MAGE COMMAND ... PORTS NAMES6779686f06f6 7533524/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5000->5000/udp drunk_visvesvaraya95c6ceef88ca 7533524/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5001->5000/tcp adoring_stonebraker
docker port xxxx 命令可以让我们快捷地查看端口的绑定情况 docker port mysql
Docker 仓库管理
推送镜像
#推送镜像的命令: docker push <注册的用户名/镜像:版本>docker tag redis:latest 7533524/:6.66docker push 7533524/redis:6.66
- 登录docker login
- 退出docker logout
提示denied: requested access to the resource is denied,那是因为用的不是你的注册的用户名
—————————————
Docker操作MySQL
#--------------------------------------------------------------------------------------------------#安装mysql服务docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysqldocker exec -it mysql /bin/bash#--------------------------------------------------------------------------------------------------#停止服务后卸载容器、镜像docker container stop mysql && docker rm mysql && docker image rm mysql
Docker操作Redis
docker run -itd --name redis -d -p 6379:6379 -v /usr/redis/redis.conf:/etc/redis.conf -v /usr/redis/data:/data redis redis-server /etc/redis.conf#docker exec -it redis /bin/bash #docker exec -it redis bash #使用 shell 登录容器内操作#docker run -it --link redis:redis --rm redis redis-cli -h redis -p 6379#docker container ls -a && docker restart redis && docker ps #查看容器、重启、查看服务-d: 容器后台运行,并返回容器ID-p: 指定端口映射,格式为:主机(宿主)端口:容器端口,外部可以直接通过宿主机ip:6379 访问到 Redis 的服务-v: 绑定一个卷,资源映射--name: 给容器命名redis-server <执行文件>: 指定容器启动时执行的命令$PWD/data Redis的持久化文件存储--appendonly yes 开启持久化daemonize yes 守护进程--restart=always Docker启动容器就启动#--------------------------------------------------------------------------------------------------#停止服务后卸载容器、镜像docker container stop redis && docker rm redis && docker image rm redis
Docker操作MongoDB
#docker pull mongo:latest#docker exec -it mongo /bin/bashdocker run -itd --name mongo -p 27017:27017 mongo --auth
-p 27017:27017 映射容器服务的 27017 端口到宿主机的 27017 端口
—auth 需要密码才能访问容器服务
$ docker exec -it mongo mongo admin# 创建一个名为 admin,密码为 123456 的用户。db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'}]});# 尝试使用上面创建的用户信息进行连接。db.auth('admin', '123456')
