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 可以在隔离容器中并行运行和管理 ...
随机推荐
- c++ 常用的数据结构
set // constructing sets #include <iostream> #include <set> void checkin(std::set<int ...
- Yii2 Restful api设计--App接口编程
Yii2框架写一套RESTful风格的API,对照魏曦教你学 一,入门 一.目录结构 实现一个简单地RESTful API只需用到三个文件.目录如下: frontend ├─ config │ └ m ...
- html5-output的用法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- Spark学习之路 (二)Spark2.3 HA集群的分布式安装
一.下载Spark安装包 1.从官网下载 http://spark.apache.org/downloads.html 2.从微软的镜像站下载 http://mirrors.hust.edu.cn/a ...
- flask模板应用-消息闪现(flash())
消息闪现 flask提供了一个非常有用的flash()函数,它可以用来“闪现”需要提示给用户的消息,比如当用户登录成功后显示“欢迎回来!”.在视图函数调用flash()函数,传入消息内容,flash( ...
- Spring整合Shiro
apache shiro 是一个安全认证框架,和 spring security 相比,在于他使用了比较简洁易懂的 认证和授权方式.其提供的 native-session(即把用户认证后的授权信息保存 ...
- java获取前一天时间SimpleDateFormat,java判断某个时间段
java获取前一天时间SimpleDateFormat SimpleDateFormat predf = new SimpleDateFormat("yyyy-MM-dd"); D ...
- Oracle执行计划 explain plan
Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的. 对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值.不过你可以像使用其它列那样 ...
- WordConuts
import java.io.File; import java.io.FileNotFoundException; import java.util.HashMap; import java.uti ...
- 解决keepalived脑裂问题
检测思路:正常情况下keepalived的VIP地址是在主节点上的,如果在从节点发现了VIP,就设置报警信息 脚本如下: #!/bin/bash # 检查脑裂的脚本,在备节点上进行部署 LB01_VI ...