Build, share and run modern applications anywhere. – Docker

Docker 是一个针对开发者、架构师、DevOps 和 IT 的容器解决方案。

本篇主要记录日常开发中一些常用操作。

容器

启动一个容器并进入容器里

docker run -ti alpine:latest /bin/sh

常用参数解释:

  • -t: 伪终端模式
  • -i: 打开标准输入
  • -d: 后台运行
  • -p: 映射端口
  • -v: 挂载目录

创建一个容器但是不启动它

docker create --name test001 alpine:latest /bin/sh -c "while true; do date; sleep 2; done"

启动/重启/删除一个容器

docker start test001
docker restart test001
docker rm test001

注意:删除操作需要先将容器关闭

进入容器内部

docker attach test001

执行容器内的命令

docker exec -ti --user root test001 /bin/sh

参数解释:

  • --user 指定用户

宿主/容器相互拷贝

docker cp test001:/etc/passwd /tmp/passwd
docker cp /tmp/passwd test001:/cat/passwd

暂停/恢复一个容器

docker pause test001
docker unpause test001

可以使用 docker logs -f test001 验证其状态

关闭/删除容器

docker stop test001

或者直接 Kill 掉容器

docker kill test001

等待容器结束并打印退出码

docker wait test001

删除镜像

docker rm test001

列出运行中的容器

docker ps

可以加 -a 参数列出所有容器

查看容器运行状况(CPU/MEM/IO/NET等)

docker stats

查看容器内进程状态

docker top test001

查看容器端口信息

docker port test001

查看容器日志信息

docker logs -f test001

参数解释:

  • -f 持续输出

查看容器/镜像元数据

docker inspect test001

更改容器名称

docker rename test001 test111
docker rename test111 test001 # 将名称改回来

查看容器文件更改

docker diff test001

更改容器配置

注意:不支持 Windows 系统

docker run -dit --name test002 -m 100M alpine /bin/sh
docker update -m 80M test002

导入/导出

容器 (export/import):

docker export -o /tmp/test001-copy.tar test001 # 单个导出
docker import /tmp/test001-copy.tar test001-copy
docker images

镜像 (save/load):

docker save -o /tmp/test001-copy2.tar test001-copy:latest alpine:latest # 可多个镜像
docker load -i /tmp/test001-copy2.tar

区别:

  • export 针对容器,导出内容不包含中间层信息,适用于制作基础镜像
  • save 针对镜像,可多个一起导出
  • import 导入容器到镜像,可重新命名
  • load 导入镜像,无法命名

镜像

查看镜像列表

docker images

删除镜像

docker rmi test001-copy

注意:删除镜像需要依赖此镜像的容器都删除后才能操作

给镜像打标签

docker tag alpine:latest my/alpine:latest

镜像历史

docker history my/alpine:latest

从容器创建一个新镜像

docker commit -p -a "test" -m "test content" test001 my/test002:latest
docker images | grep my/

参数说明:

  • -p: commit 时暂停
  • -a: 提交镜像作者
  • -m: 提交镜像说明
  • -c: 使用 Dockerfile 创建

事件查看

docker events --filter 'container=test001'
docker events --filter 'image=alpine'
docker events --filter 'container=test' --filter 'container=d9cdb1525ea8'
docker events --filter 'type=volume'
docker events --filter 'type=network'
docker events --filter 'type=container' --format 'Type=\{\{.Type\}\}  Status=\{\{.Status\}\}  ID=\{\{.ID\}\}'

全部以 JSON 输出

docker events --format '\{\{json .\}\}'

更多自定义可以参考:https://docs.docker.com/engine/reference/commandline/events/

资源

列出所有数据卷

docker volume ls

创建/删除数据卷

docker volume create test-volume
docker volume rm test-volume

查看数据卷信息

docker volume inspect test-volume

挂载数据卷

docker run -ti --name test003 --mount type=volume,source=test-volume,target=/data alpine /bin/sh

挂载目录

docker run -ti --name test004 -v /tmp/docker/data:/data alpine /bin/sh

网络列表

docker network ls

创建/删除网络

docker network create -d bridge test-bridge
docker network rm test-bridge

容器指定网络

docker run -ti --name test005 --network=test-bridge alpine /bin/sh

容器设置 CPU 和内存限制

docker run -ti --name test006 --cpus=1 -m 100M alpine /bin/sh

插件

将数据卷通过存储到远程

docker plugin install --grant-all-permissions vieux/sshfs
docker volume create --driver vieux/sshfs -o sshcmd=test@192.168.5.242:/data/docker/sshvolume -o password=youpassword ssh-volume
docker run -ti --name test009 --mount type=volume,volume-driver=vieux/sshfs,source=ssh-volume,target=/data alpine /bin/sh

其它

删除历史不使用的镜像

docker images | grep none | awk '{ print $3; }' | xargs docker rmi

更多

  • https://docs.docker.com/engine/reference/commandline/docker/