Docker 容器学习笔记系列:

前面已经介绍了 Docker 的安装方式,本文总结一下使用 Docker 的基本概念和常用命令。

基本概念

镜像 Image

镜像是一些打包好的已有的环境,可以被用来启动和创建容器

容器 Container

容器是镜像的实例化

容器的UUID

UUID -- 通用唯一标识符(Universally Unique Identifier

容器有三种方式来进行标识:

  • 长UUID
  • 短UUID
  • Name

UUID 是 Docker daemon 产生的,在一台主机上是唯一的,在创建容器的时候可以通过 --name 来指定容器的名字,如果不指定会自动分配一个字符串名称。

通过 docker psdocker inspect 等命令可以查看到容器的标识信息

容器启动过程

  1. 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  2. 利用镜像创建并启动一个容器
  3. 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  4. 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  5. 从地址池配置一个 ip 地址给容器
  6. 执行用户指定的应用程序
  7. 执行完毕后容器被终止

镜像

  • 查看 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 相当于实例,不过可以动态给实例安装新软件,然后把这个 containercommit 命令固化成一个 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目录清理

参考

命令:

镜像登录:

Docker 入门指南——常用命令的更多相关文章

  1. Docker入门以及常用命令

    目的: Docker入门 Docker简介 Centos7安装Docker Docker HelloWorld运行原理解析 阿里云镜像仓库配置 Docker常用命令 Docker基本命令 Docker ...

  2. Docker入门之常用命令

    写在前面 细数当前最流行的技术莫过于容器化和人工智能了,而容器化技术能有今天的热度,Docker可谓功不可没. 让我们一起来回顾一下Docker 是什么? 是一种虚拟化技术 能够将应用程序自动部署到容 ...

  3. docker入门及常用命令

    Docker简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布 ...

  4. Docker的入门及常用命令

    Docker入门及常用命令 1. 各个容器之间是相互隔离状态: 这样减少了我们软件之间的影响. 2. docker是os层虚拟化架构的一种产品体现, os层虚拟化架构出来的操作系统需要和宿主机操作系统 ...

  5. Docker 入门指南

    Docker 入门指南 目录 基础概念 安装教程 基本操作 常用安装 构建操作 容器编排 壹.基础概念 什么是Docker? Docker是基于Go开发的应用容器引擎,属于 Linux 容器的一种封装 ...

  6. Docker基础和常用命令

    Docker基础和常用命令 一,Docker 简介 1.1,什么是 Docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,nam ...

  7. docker 安装与常用命令与常用容器(containers)环境

    注意区别 container 与 image 的关系,container 的建立需要 image 的承载,也即 container 依赖 image,停止并删除了 container 并不会删除 im ...

  8. Docker系列之常用命令操作手册

    目录 1.安装虚拟机 2.安装Docker 3.Docker镜像操作 4.Docker容器操作 Docker系列之常用命令操作手册 继上一篇博客Docker系列之原理简单介绍之后,本博客对常用的Doc ...

  9. Docker(2):快速入门及常用命令

    什么是Docker? Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题.运维人员利用 Docker 可以在隔离容器中并行运行和管理 ...

随机推荐

  1. c++ 常用的数据结构

    set // constructing sets #include <iostream> #include <set> void checkin(std::set<int ...

  2. Yii2 Restful api设计--App接口编程

    Yii2框架写一套RESTful风格的API,对照魏曦教你学 一,入门 一.目录结构 实现一个简单地RESTful API只需用到三个文件.目录如下: frontend ├─ config │ └ m ...

  3. html5-output的用法

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  4. Spark学习之路 (二)Spark2.3 HA集群的分布式安装

    一.下载Spark安装包 1.从官网下载 http://spark.apache.org/downloads.html 2.从微软的镜像站下载 http://mirrors.hust.edu.cn/a ...

  5. flask模板应用-消息闪现(flash())

    消息闪现 flask提供了一个非常有用的flash()函数,它可以用来“闪现”需要提示给用户的消息,比如当用户登录成功后显示“欢迎回来!”.在视图函数调用flash()函数,传入消息内容,flash( ...

  6. Spring整合Shiro

    apache shiro 是一个安全认证框架,和 spring security 相比,在于他使用了比较简洁易懂的 认证和授权方式.其提供的 native-session(即把用户认证后的授权信息保存 ...

  7. java获取前一天时间SimpleDateFormat,java判断某个时间段

    java获取前一天时间SimpleDateFormat SimpleDateFormat predf = new SimpleDateFormat("yyyy-MM-dd"); D ...

  8. Oracle执行计划 explain plan

    Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的. 对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值.不过你可以像使用其它列那样 ...

  9. WordConuts

    import java.io.File; import java.io.FileNotFoundException; import java.util.HashMap; import java.uti ...

  10. 解决keepalived脑裂问题

    检测思路:正常情况下keepalived的VIP地址是在主节点上的,如果在从节点发现了VIP,就设置报警信息 脚本如下: #!/bin/bash # 检查脑裂的脚本,在备节点上进行部署 LB01_VI ...