# docker基本命令
docker基本命令
# 查看运行状态
docker ps
# 查看指定显示的模板
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}"
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}"
# 可用占位符
.ID 容器ID
.Image 镜像ID
.Command 执行的命令
.CreatedAt 容器创建时间
.RunningFor 运行时长
.Ports 暴露的端口
.Status 容器状态
.Names 容器名称
.Label 分配给容器的所有标签
.Mounts 容器挂载的卷
.Networks 容器所用的网络名称
# 显示完整信息
docker ps -a --no-trunc
# 查看docker容器信息
docer inspect containerId
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 容器启动停止
docker stop
docker start
docker restart
# 查看容器运行日志
docker logs +容器id
# 进入docker容器内部 并运行bash
docker exec -it 容器id bash
# 退出容器
ctrl+D
2
3
4
5
6
7
8
9
10
11
12
13
14
# 容器日志
# 查看容器运行日志
docker logs +容器id
# 查看最后 100行
docker logs --tail 100 +容器id/name
# 持续输出log 日志
docker logs --follow +容器id/name
# 持续输出log 日志 10s
docker logs --follow --until=10s +容器id/name
2
3
4
5
6
7
8
9
10
11
12
13
# docker build
# 在Dockerfile 目录下build 镜像 . 代表以当前目录为上下文
docker build .
# 构建镜像 名称
docker build -t imageName .
# 指定Dockerfile 目录
docker build -t imageName -f /home/Dockerfile-prod .
2
3
4
5
6
7
8
9
# docker镜像常用命令
# 搜索公共仓库镜像
docker search
# 下载镜像到本地
docker pull 'imageName'
# 查看docker镜像
docker images
# 删除镜像 -f 强制删除
docker image rm
# 查看镜像层记录
docker history imagename
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# docker 文件操作命令
# 查看容器挂载目录
docker inspect redis-master | grep Mounts -A 10
docker inspect -f "{{.Mounts}}" mysql
# 挂载
-v [host-dir]:[container-dir]:[rw|wo]
host-dir:表示主机上的目录,如果不存在,Docker 会自动在主机上创建该目录.
container-dir:表示容器内部对应的目录,如果该目录不存在,Docker 也会在容器内部创建该目录.
rw|ro:用于控制卷的读写权限.
# 查看docker volume (/var/lib/docker/volumes/)
docker volume ls
# 拷贝
docker cp 本地文件 container-id:path 复制文件
e.g.,docker cp sbmysql.war 1dde5b08d489:/usr/local/tomcat/webapps
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# docker 其他命令
# 更新容器参数
# 如果创建时未指定 --restart=always ,可通过update 命令设置
docker update --restart=always xxx
# 还可以在使用on - failure策略时,指定Docker将尝试重新启动容器的最大次数。默认情况下,Docker将尝试永远重新启动容器。
docker run --restart=on-failure:10 redis
2
3
4
5
# docker镜像导出及导入(export、import、save、load)
- export 和 import
这两个命令是通过容器来导入、导出镜像。
- export 导出镜像 使用 docker export 命令根据容器 ID 将镜像导出成一个文件。
docker export f299f501774c > test_server.tar
- import 导入镜像
docker import - new_test_server < test_server.tar
- save 和 load
这两个命令是通过镜像来保存、加载镜像文件的。
- save 保存镜像
# 根据镜像id保存
docker save 0fdf2b4c26d3 > test_server.tar
# 根据名称及版本号保存,可以将多个镜像保存至一个压缩包
docker save -o images.tar postgres:9.6 mongo:3.4
2
3
4
- load 载入镜像
docker load < test_server.tar
# 或
docker load -i test_server.tar
2
3
- 两种方案的差别
特别注意:两种方法不可混用。 如果使用 import 导入 save 产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,会出现类似"docker: Error response from daemon: Container command not found or does not exist"的错误。
文件大小不同 export 导出的镜像文件体积小于 save 保存的镜像
是否可以对镜像重命名 docker import 可以为镜像指定新名称 docker load 不能对载入的镜像重命名
是否可以同时将多个镜像打包到一个文件中 docker export 不支持 docker save 支持
是否包含镜像历史 export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。 而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。
应用场景不同 docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。 docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。
# 根据docker-compose.yml文件导出所有镜像
#!/usr/bin/env bash
IMAGES=""
for svc in $(docker-compose config --services); do
IMAGES="$IMAGES $(docker-compose images -q $svc)"
done
for img in $(echo $IMAGES | tr ' ' '\n' | sort | uniq); do
name=$(docker inspect --format='{{index .RepoTags 0}}' $img | tr '/:.' '-')
echo $name
docker save -o "${name}.tar" $img
done
2
3
4
5
6
7
8
9
10
# docker容器占用及清理
# 查看docker信息
docker info
# docker 状态
docker stats
# 清理不在运行的container images
docker system prune -a
# 清理不使用的docker image
docker image prune --all
2
3
4
5
6
7
8
排查方式
查看 /var/lib/docker
占用
cd /var/lib/docker
du -lh --max-depth=1
du -h --max-depth=1 | sort -rh
2
3
4
5
6
7
找到对应的container或者overlay,查看占用