原创声明: 作者: Arnold.zhao 博客园地址: https://www.cnblogs.com/zh94
Docker 常用命令速查手册
搜索仓库镜像
docker search nginx
获取镜像
docker pull nginx
列出镜像
docker images
查看镜像, 容器, 数据卷所占用的空间.
docker system df
查看 Docker 容器的相关信息
docker info
删除镜像 (or 标签)
docker image rm ID
启动镜像
docker run -d -p 8088:80 --name nginx-sip nginx (--rm -it 参数)
停止容器
docker stop nginx-sip
将 stop 后的容器直接启动
docker start nginx-sip
重新启动一个容器
docker restart nginx-sip
删除一个已经停止了的容器
docker rm nginx-sip
删除所有已经停止运行的容器
docker container prune
查看容器列表
docker ps -a
查看镜像或容器的信息
docker inspect nginx(nginx-sip)
进入当前容器的文件系统
docker exec -it nginx-sip sh
容器与镜像的导入导出
导出本地某个容器为 tar 包 (目前容器打包为镜像后, 不能直接启动, 通过 docker inspect 查看发现当前镜像不存在 CMD 相关配置, 暂保留)
docker export nginx-sip> /home/psrt/docker/nginx-sip-export.tar
将所归档的容器文件导入为当前 docker 镜像
docker import nginx-sip-export.tar nginx_arnold:v1
docker import/docker export; 将一个容器导出为文件, 再使用 docker import 命令将容器导入成为一个新的镜像, 但是相比 docker
save 命令, 容器文件会丢失所有元数据和历史记录, 仅保存容器当时的状态, 相当于虚拟机快照.
https://www.cnblogs.com/linjiqin/p/8618635.html
导出本地镜像为 tar 包
docker save -o 文件名. tar 镜像名称
docker save 镜像名称 >/opt / 文件名. tar
将对应的打包镜像加载到对应的 Docker 镜像中
docker load < 文件名. tar
docker load/docker save; 将一个镜像导出为文件, 再使用 docker load 命令将文件导入为一个镜像, 会保存该镜像的的所有历史记录. 比 docker export 命令导出的文件大, 很好理解, 因为会保存镜像的所有历史记录.
查看容器, 镜像的改动记录 Diff & history
通过 diff 查看当前 容器 存储层的具体改动记录
docker diff nginx-sip
查看 镜像内的历史记录
- (是针对镜像使用的命令, 于 docker diff 区分开, docker diff 是针对容器进行使用的)
- docker history nginx:v1224
查看镜像或容器的信息
docker inspect nginx(nginx-sip)
查看镜像, 容器, 数据卷所占用的空间.
- docker system df
- Docker commit
将当前 nginx-sip 容器存储层保存为名称为 nginx:v1224 的镜像, 其中包含了容器内的所有改动, 其中镜像内包含了原有容器的所有文件变化 (可以配合 docker save 再将镜像归档为 tar 的包)
docker commit --author 'mailto:arnold_zhao@xiaoi.com' --message '修改了网页和新增了 arnold 文件夹' nginx-sip nginx:v1224
慎用 docker commit , 因为会把镜像搞的很臃肿, 且黑箱,; 但有需求的话, 还是要用滴; 毕竟需求最大
数据卷的操作
原创声明: 作者: Arnold.zhao 博客园地址: https://www.cnblogs.com/zh94
创建一个数据卷
docker volume create my-vol
查看当前所有的数据卷
docker volume ls
查看对应数据卷的具体信息
docker volume inspect my-vol
删除指定数据卷
docker volume rm my-vol
清理无主的数据卷
docker volume prune
建议:
所有的容器挂载等相关操作, 都基于数据卷的方式进行挂载, 这样将会易于容器的后续管理; 否则随着后续容器的越来越多, 每一个容器都随意挂载宿主机的文件目录, 将会导致后续的 Docker 容器管理越来越混乱;
Mount 挂载
docker volume create kbase-sip-volume
采用数据卷的方式进行挂载:
docker run -d -p 8088:8088 --mount type=volume,src=kbase-sip-volume,target=/log/kbase-psrt/ --name kbase-psrt kbase-psrt
关于目录挂载相关的信息, 详情可查看如下文章:
(通过如下文章可以知悉 -v,volume 的挂载方式, 尽管如此, 此处仍然建议使用者优先使用 mount 做目录挂载)
& 使用绑定挂载 (bind mount) & 数据卷 https://www.imooc.com/article/26316 & 数据持久化 volume 和 bind mounts 两种方式
批量删除
停止所有容器
docker stop $(docker ps -s -q )
删除所有容器
docker rm $(docker ps -a -s -q )
删除所有镜像
docker image rm $(docker images -q )
核心:
主要是通过:-q 参数表示只显示对应的 ID, 也可以通过 -f 参数 (过滤器), 筛选出更多的条件数据; 如:
- docker image ls -f since=mongo:3.2(表示获取 mongo:3.2 以后的镜像信息)
- docker image ls -f label=com.example.version=0.1(获取指定标签的镜像数据)
通过使用 filter 过滤器以及配合 - q 后所产生的指定范围的 ID 列表的方式, 来配合另外一个 docker 命令作为参数, 以此来删除所对应的 批量容器或镜像等信息; 除了上述常用的删除操作外, 还可以使用 --format 来自定义模板展示, 详情可查看该链接:
Docker logs
获取 docker 容器的日志路径:
docker inspect --format '{{.LogPath}}' CONTAINER_ID
查看当前 Docker 的全局守护进程的默认日志驱动程序 (默认为: JSON-file,)
docker info --format '{{.LoggingDriver}}'
容器启动时设置对应的日志启动类型 (此处设置驱动为 JSON-file, 且设置 JSON 日志文件最大为 10M, 超出 10M 则自动生成新的文件, max-file=3 表示最多生成 3 个日志文件, 超出则删除)
docker run -d -p 80:80 --log-driver JSON-file --log-opt max-size=10m --log-opt max-file=3 --name nginx nginx
容器日志的几种查看方式:
查看指定时间后的日志, 只显示最后 100 行:
docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID
查看最近 30 分钟的日志:
docker logs --since 30m CONTAINER_ID
查看某时间段日志:
docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID
可参考文章链接:
Docker 日志官网文档 & 容器日志的几种查看方式 & 容器启动时指定驱动及文件配置 http://www.imooc.com/article/278633
不在容器启动时候进行日志驱动的配置, 而是直接配置当前整个 Docker 服务的驱动配置, 可参考如下链接:
注意: 很多文章写法不明不白有些曲解人意, docker 的容器日志也是日志, docker 的整个守护进程的服务日志也是日志, 所以 在查看下述文章链接或查找相关资料的时候, 一定要自我区分什么是 Docker 容器的日志配置, 什么是针对整个 Docker 引擎的日志配置, 不要搞的不明不白即可;
Docker 日志位置 & 日志配置 & Docker 日志设置 & Docker 守护进程的日志配置
Dockfile
原创声明: 作者: Arnold.zhao 博客园地址: https://www.cnblogs.com/zh94
RUN 指令是用来执行命令行命令的, 由于命令行的强大能力, RUN 指令在定制镜像时是最常用的指令之一, 构建镜像时会被运行使用
RUN echo '<h1>Hello, Docker!</h1>'> /usr/share/nginx/HTML/index.HTML
镜像构建
docker build -t nginx:v3 .
COPY 指令将从构建上下文目录中 < 源路径 > 的文件 / 目录复制到新的一层的镜像内的 < 目标路径 > 位置:
COPY dev/application-dev.properties /App/kbase-psrt/
CMD 命令是在容器被启动后执行, 定义 CMD 容器启动时的命令操作
CMD ["nginx", "-g", "daemon off;"]
entrypoint 替换 CMD 指令,(用于 docker 启动时的传参, docker 启动时所输入的命令都会替换原有构建文件中的 CMD 命令, 所以此处 entrypoint 可以接受 cmd 命令的方式, 就是所输入的参数替换了 CMD, 然后又执行 entrypoint 时得到对应的参数信息)
ENV 设置环境变量 无论是后续构建的指令使用 还是运行时的容器应用都可以使用该环境变量,$VERSION
- ENV VERSION=1.0 DEBUG=on \
- NAME="Happy Feet"
ARG 也是定义环境变量参数, 不同的是, ARG 定义的变量, 在容器运行时是不会存在这些变量
ARG VERSION=1.0
Volume 定义匿名卷 (目的: 容器内存储层尽量不发生写操作, 将所对应的动态保存数据的目录, 挂载到对应的宿主机目录上去, 或直接挂载到匿名目录中 , 保持了容器存储层的无态变化)
EXPOSE < 端口 1> [< 端口 2>...] 暴露对应的端口; 运行时使用随机端口映射时 docker run -p , 会自动随机映射一个 EXPOSE 的端口
上下文路径的解释 (推荐)
基于 Docker 的私有仓库的搭建
Docker 仓库的访问操作默认是必须为 Https 的方式进行, 所以首先需要先搭建一个 Https 的代理环境, 用于后续的 Docker 的操作:
本人此处是使用的腾讯云域名厂商所签发的 https 证书, 然后再通过 Nginx https 反向代理的方式用来访问 Docker 的仓库地址;
关于腾讯云的 SSL 证书申请步骤如下所示 (各大云厂商实际都具备颁发 SSL 证书的能力, 此处以腾讯云举例了, 毕竟楼主目前使用的是腾讯云):
只要有购买该厂商的域名, 都可以申请免费的 SSL 证书 https://cloud.tencent.com/product/ssl
申请完以后在对应的证书列表中, 可以查看对应的已颁发证书 https://console.cloud.tencent.com/ssl
Https 证书的安装步骤详情, 本人此处选择的是通过 Nginx 进行证书的安装
创建对应的数据卷, 并启动 registry docker 仓库镜像
- docker volume create my-docker-register
- docker run -d -p 5000:5000 --mount type=volume,src=my-docker-register,target=/var/lib/registry --name docker-registry registry
启动完对应的 registry 仓库后, 直接配置对应的 Nginx 反向代理到对应的 5000 的端口上, 当前本人的 Nginx 配置如下 (可以参考腾讯云所给的配置建议):
- server {
- #SSL 访问端口号为 443
- listen 443;
- #填写绑定证书的域名
- server_name docker.register.zhivx.com;
- #启用 SSL 功能
- ssl on;
- #证书文件名称
- ssl_certificate /opt/App/nginx/conf/docker-https/1_docker.register.zhivx.com_bundle.crt;
- #私钥文件名称
- ssl_certificate_key /opt/App/nginx/conf/docker-https/2_docker.register.zhivx.com.key;
- ssl_session_timeout 5m;
- #请按照以下协议配置
- ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
- #请按照以下套件配置, 配置加密套件, 写法遵循 openssl 标准.
- ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
- ssl_prefer_server_ciphers on;
- location / {
- proxy_pass_header Server;
- proxy_set_header Host $http_host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Scheme $scheme;
- #万能的 Nginx, 此处需注意需反向代理后的 registry 的访问方式为 http
- proxy_pass http://registry;
- }
- #location / {
- #网站主页路径. 此路径仅供参考, 具体请您按照实际目录操作.
- # root /opt/App/nginx/HTML;
- # index index.HTML index.htm;
- #}
- }
- upstream registry {
- server 127.0.0.1:5000;
- }
当前 Windows 的机器作为 Docker 的 Client 端, Pull 相关数据
- docker tag kbase-psrt:latest docker.register.zhivx.com/kbase-psrt
- docker push docker.register.zhivx.com/kbase-psrt
以上, 基本上你的 Docker 私有仓库就已经配置成功了:
但是, Docker 的私有仓库的功能很多, 所以再向下继续深挖就有点过于运维了 [~~ / 捂脸笑]
所以此处列举一些可能存在的问题点, 后续如有兴趣可以再继续深入
1,register 的使用过程中, 由于是使用的 Nginx 做的反向代理, 所以对于过大的镜像文件 pull 或 push 时超时的问题处理 (修改 nginx 超时时间理论上可以解决, 暂未验证)
2,register 仓库的安全性 (针对各团队成员分配唯一的账号密码及权限配置)
3,register 仓库的可视化管理工具 (GitHub 上有一些, 此处推荐一下 https://github.com/mkuchin/docker-registry-web , 不过感觉目前的可视化工具都还不够完善, 坑有点多.. 所以还不敢深入, 感兴趣有时间的同学可以尝试下)
4, 仓库一直在深度使用的过程中磁盘占用较大等数据迁移, 以及正常团队使用过程中网络异常是否会导致仓库中存在脏数据等现象? 部分 push 一半的镜像如果中间停止了 push, 通过查看仓库的映射目录, 会发现的确还是存在已经上传一半的数据的, 那么这些数据的处理方式是什么? 手动的在服务器脚本清理, 或者是在可视化界面中进行清理? 目前看到的现象是 https:/**/v2/_catalog 时针对脏数据等镜像信息是不能显示出来的;
可参考的外部文章链接:
openssl 自行签发域名证书 & 阿里域名厂商的所提供的站点证书进行配置 https://segmentfault.com/a/1190000015108428
原创声明: 作者: Arnold.zhao 博客园地址: https://www.cnblogs.com/zh94
Docker Compose
原本是想整理下自己印象笔记中的一些关于 Docker 的随笔, 顺带汇总下相关的常用 Docker 命令, 方便后续回顾时使用, 但没想到一整理还花费了挺长时间! 尼玛.. 后续会持续的更新维护 ing....... 后续再升级, 就是, 璀璨钻石版? 超凡大师版? end 最强王者
来源: https://www.cnblogs.com/zh94/p/12120233.html