Docker 入门指南——常用命令

Docker 容器学习笔记系列:
前面已经介绍了 Docker 的安装方式,本文总结一下使用 Docker 的基本概念和常用命令。
基本概念
镜像 Image
镜像是一些打包好的已有的环境,可以被用来启动和创建容器
容器 Container
容器是镜像的实例化
容器的UUID
UUID -- 通用唯一标识符(Universally Unique Identifier)
容器有三种方式来进行标识:
- 长UUID
- 短UUID
- Name
UUID 是 Docker daemon 产生的,在一台主机上是唯一的,在创建容器的时候可以通过 --name 来指定容器的名字,如果不指定会自动分配一个字符串名称。
通过 docker ps、docker inspect 等命令可以查看到容器的标识信息
容器启动过程
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个 ip 地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
镜像
- 查看
image列表:
docker iamges
- 下载镜像:
docker pull registry.domain.com/library/ubuntu:14.04
制作镜像
# 常用下面这种方式制作镜像,Dockerfile 文件更透明
docker build [-f DockerfileName] -t image_name DockerfilePath
这里 DockerfilePath 是 Context 上下文目录,在创建的时候会全部上传到 Docker Server 端,所以这个目录不要太大。
参数说明:
-f/--file:Name of the Dockerfile (Default is 'PATH/Dockerfile'),Dockerfile的完整路径-t/--tag:Name and optionally a tag in the 'name:tag' format,指定了镜像名称,镜像的名字及 tag,通常name:tag或者name格式--no-cache:Do not use cache when building the image,这篇文章介绍了使用这个参数的场景,构建镜像中有时候包含git clone命令,会默认使用缓存,新代码就不会下载了,所以,有时候需要加上这个参数;--pull,默认false。Always attempt to pull a newer version of the image,设置该选项,总是尝试 pull 镜像的最新版本
其他的 build 参数,可以采用 docker build -h 查看。
删除镜像
删除 image 之前,需要先删除 container:
docker ps -a
docker rm container_id/container_name
删除 image:
docker rmi <image-id>
docker rmi <image-name>:<tag>
删除虚悬镜像(dangling image):
$docker image ls -f dangling=true #列出虚悬镜像
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
无tag镜像(dangling)
显示无 tag 镜像:
$ docker images --filter "dangling=true"
当新构建的镜像占用这个镜像ID的 repo:tag 时,会出现这些图像,将其保留为 : 或 untagged。可以使用如下命令批量删除这类镜像
$ docker rmi $(docker images -f "dangling=true" -q)
迁移镜像
保存镜像到文件,语法格式:
docker save [OPTIONS] IMAGE [IMAGE...]
例如:
docker save image_name -o file.tar
# Or
docker save image_name --output file.zip
将镜像保存一个 tar 包文件了,也可以是 zip 格式的压缩包。
加载一个 tar 包的镜像:
docker load -i file.tar
容器操作
- 查看运行中的容器
docker ps
- 查看所有容器
docker ps -a
- 显示运行的容器里的进程信息
docker top cid
此处, cid 表示你运行的容器名
- 显示容器详细信息
docker inspect cid
- 日志查看
docker logs cid
# 实时查看日志输出
docker logs -f cid
- 查看容器root用户密码
docker logs cid 2>&1 | grep '^User: ' | tail -n1
容器运行
语法格式:
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
例如:
docker run -it --name cidregistry.domain.com/library/ubuntu:14.04
如果直接 docker run -it registry.domain.com/library/ubuntu 可能会出错,因为不加 tag ,默认就去运行 latest 版本,而本地没有 latest 版本,所以,需要将 image+tag,以冒号分隔拉去。
-i交互操作-t终端--name指定容器名字-d后台运行一个容器--rm,表明退出容器后随之将其删除,可以避免浪费空间-p映射端口-v挂载 volumn--privileged=false容器内 root 拥有真正 root 权限
当处于一个容器中时,利用exit退出容器
- 在容器中运行一段程序
docker run ubuntu apt-get update
启动已终止(stop)容器:
docker restart 3e8 # 3e8 为容器的 id 号,不需要全写,也可以用容器名替代
进入容器
- 进入正在运行的容器,退出不会造成容器停止:
docker exec -it cid /bin/bash
- 附着到正在运行的容器中,退出时会导致容器终止,不常用:
docker attach cid
从容器拷贝文件出来
拷贝文件出来
docker cp cid:/container_path to_path
删除容器
docker rm cid
# 强制删除
docker rm -f cid
# 删除所有容器
# -q 表示只列出容器的 id 值
docker rm `docker ps -a -q`
容器运行状态修改
docker start/stop/kill/restart cid
更改容器名字
docker rename old new
修改容器,制作镜像
image 相当于类,container 相当于实例,不过可以动态给实例安装新软件,然后把这个 container 用 commit 命令固化成一个 image:
docker commit -m "修改yum源" -a "michaelxiang" cid registry.domain.com/ci/centos-os:latest
这种制作镜像的方式并不推荐,因为不如 Dockerfile 方式透明。
推送镜像
docker login registry.domain.com -u username -p password
docker push registry.domain.com/michael/IMAGE[:TAG]
如果支持 accesstoken 权限认证:
docker login registry.domain.com -u test -p ACCESSTOKEN:XXXXXXXXXXXXX:ACCESSTOKEN
其他
你可以通过以下命令来便捷的查看镜像、容器、数据卷所占用的空间:
docker system df
docker 配置
daemon.json 文件
{
"insecure-registries": ["registry.xxx.com"],
"registry-mirrors": ["https://xxxx.mirror.domain.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
FAQ
Q1:Docker 空间问题
Docker长时间运行后的volumes目录清理
参考
命令:
- 官宣——Command-Line Interfaces (CLIs) 强烈
推荐 - Docker 使用总结 本文的主要参考
- Docker 入门教程
- Docker —— 从入门到实践
- 只要一小时,零基础入门Docker
- SF-docker命令详解
- 简书-Docker命令使用
- Docker命令行参考(8) – docker images列出镜像 删除无 tag 镜像
镜像登录:
Docker 入门指南——常用命令的更多相关文章
- Docker入门以及常用命令
目的: Docker入门 Docker简介 Centos7安装Docker Docker HelloWorld运行原理解析 阿里云镜像仓库配置 Docker常用命令 Docker基本命令 Docker ...
- Docker入门之常用命令
写在前面 细数当前最流行的技术莫过于容器化和人工智能了,而容器化技术能有今天的热度,Docker可谓功不可没. 让我们一起来回顾一下Docker 是什么? 是一种虚拟化技术 能够将应用程序自动部署到容 ...
- docker入门及常用命令
Docker简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布 ...
- Docker的入门及常用命令
Docker入门及常用命令 1. 各个容器之间是相互隔离状态: 这样减少了我们软件之间的影响. 2. docker是os层虚拟化架构的一种产品体现, os层虚拟化架构出来的操作系统需要和宿主机操作系统 ...
- Docker 入门指南
Docker 入门指南 目录 基础概念 安装教程 基本操作 常用安装 构建操作 容器编排 壹.基础概念 什么是Docker? Docker是基于Go开发的应用容器引擎,属于 Linux 容器的一种封装 ...
- Docker基础和常用命令
Docker基础和常用命令 一,Docker 简介 1.1,什么是 Docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,nam ...
- docker 安装与常用命令与常用容器(containers)环境
注意区别 container 与 image 的关系,container 的建立需要 image 的承载,也即 container 依赖 image,停止并删除了 container 并不会删除 im ...
- Docker系列之常用命令操作手册
目录 1.安装虚拟机 2.安装Docker 3.Docker镜像操作 4.Docker容器操作 Docker系列之常用命令操作手册 继上一篇博客Docker系列之原理简单介绍之后,本博客对常用的Doc ...
- Docker(2):快速入门及常用命令
什么是Docker? Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题.运维人员利用 Docker 可以在隔离容器中并行运行和管理 ...
随机推荐
- MYSQLi数据访问分页查询
<?php //分页工具 直接加载使用 /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录 ...
- [3]windows内核情景分析--内存管理
32位系统中有4GB的虚拟地址空间 每个进程有一个地址空间,共4GB,(具体分为低2GB的用户地址空间+高2GB的内核地址空间) 各个进程的用户地址空间不同,属于各进程专有,内核地址空间部分则几乎完全 ...
- Python全栈-day6-day7-字符编码和文件处理
一.字符编码 1.编码基础 定义:人在使用计算机时,使用的是人类能够读懂的字符,使用者必须通过一张字符和数字间的相对应关系表实现人机交互,这一系列标准称为字符编码 Python应用中解决核心字符串乱码 ...
- UML之状态机图
状态机图 基本概念: 状态机图,UML 1.x规范中称状态图,是一个展示状态机的图. 状态机图基本上就是一个状态机中元素的投影,这也就意味着状态机图包括状态机的所有特征.状态机图显示了一个对象如何根据 ...
- map 的用法
#include<iostream> #include<map> #include<string> #define s second #define f first ...
- scrapy:get cookie from response
scrapy shell fetch('your_url') response.headers.getlist("Set-Cookie")https://stackoverflow ...
- MyBatis学习笔记(一)——MyBatis快速入门
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4261895.html 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优 ...
- mybatis源码解析8---执行mapper接口方法到执行mapper.xml的sql的过程
上一篇文章分析到mapper.xml中的sql标签对应的MappedStatement是如何初始化的,而之前也分析了Mapper接口是如何被加载的,那么问题来了,这两个是分别加载的到Configura ...
- Flask的请求对象--request
request-Flask的请求对象 请求解析和响应封装大部分是有Werkzeug完成的,Flask子类化Werkzeug的请求(Request)对象和响应(Response)对象,并添加了和程序的特 ...
- 转:【专题八】P2P编程
引言: 前面的介绍专题中有朋友向我留言说介绍下关于P2P相关的内容的,首先本人对于C#网络编程也不是什么大牛,因为能力的关系,也只能把自己的一些学习过程和自己的一些学习过程中的理解和大家分享下的,下面 ...