敞开成长之旅!这是我参与「日新计划 12 月更文挑战」的第2天,点击检查活动概况

Docker 介绍

官网:链接

Docker 是一个能够简化开发、部署和运转应用程序的开源平台,是用 Go 语言开发的。Docker 能够协助开发者做好基础设施层的作业,让开发者更多地关注事务的实现,加速从开发到上线的迭代速度

Docker 架构形式

Docker 运用了 client / server 的架构形式,如下图所示

超详细的 Docker 基本概念及常用命令

Docker daemon 是后台总管,对外供给了RESTAPI,当收到 Docker Client 发送的恳求时,履行比如镜像、容器、网络、存储等一系列操作,Registry 是寄存 Docker镜像 的库房

Docker 基本概念

库房 / Registry

Docker Hub 是 Docker 的官方库房,阿里云也供给了镜像加速器,此外,还能够装备私有库房

履行以下指令时,Docker daemon 会和已装备的镜像库房交互(如未装备,运用Docker Hub)

docker pull
docker run 
docker push

镜像 / Image

镜像是用于创立容器的只读模板,包含一系列指令。镜像模板的界说文件叫做 Dockerfile,一般来说,该文件中的每一条指令会创立一个镜像层(Layer)

以 Redis 镜像为例

超详细的 Docker 基本概念及常用命令

在创立自界说镜像时,如果修改了 Dockerfile 中的部分指令,重新编译时,只有变化的指令对应的镜像层会重新构建,这也是 Docker镜像 轻量级、细巧、高速的一个原因

容器 / Container

容器是镜像的可运转实例,一个镜像能够创立出多个容器(这和面向目标语言中的类和目标类似,一个类能够创立多个目标实例)

Docker 底层运用了 namespace 技术,这使得不同容器能够运转在相互隔离的命名空间下

根据定制后的容器,还能够反向生成镜像

网络 / Network

Docker 容器和服务之间经过Docker Network相互衔接,此外,该网络还能够衔接非Docker负载

Docker 的网络子系统是插件式的网络驱动,Docker 供给了如下几种驱动

  • bridge – 默许驱动
  • host
  • overlay
  • ipvlan
  • macvlan
  • none

因为驱动是插件式的,还能够运用第三方或许自研的网络驱动

存储 / Storage

默许情况下,Docker 容器内生成的文件被保存在一个可写的容器层中,容器销毁后,这些文件也跟着销毁了

Docker 供给了 2 种方法耐久化容器内的文件。无论是哪种方法,在容器内看起来是一样的,在容器的文件系统中,要么是一个文件夹,要么是一个独立的文件

1. Volume

这是 Docker 官方引荐的最佳方法,在 Linux 系统中,Volume 存储在 /var/lib/docker/volumes/ 目录下

Docker 不会主动删去 Volume,但是关于不再运用的 Volume,能够用如下指令手动整理

docker volume prune

挂载 Volume 时,引荐为其命名。当然也能够不命名,这种情况下,Docker 会随机分配一个当时宿主机下唯一的姓名

2. bind mount

相比于 Volume, bind mount在功用上有一些约束,且不能经过 Docker 指令行东西直接操作。宿主机上的文件夹或文件以全路径的方法被挂载到容器中

此外,还有一种根据宿主机内存的存储方法:tmpfs mount,这种方法通常用于在容器的生命周期内,保存一些非耐久化的状态或灵敏信息

这3种方法的区别如下图所示

超详细的 Docker 基本概念及常用命令

Docker常用指令

通用操作 / Common Operation

检查 Docker 版别

# Docker版别号
docker -v
# Docker版别详细信息
docker version

镜像操作 / Image Operation

检查镜像列表

# 检查最新创立的镜像,以下两个指令等价
docker images
docker image ls
# 检查一切镜像
docker images --all
docker iamges -a
# 检查与Redis相关的镜像
docker images redis
# 只显现镜像ID,能够与docker rmi指令结合运用
docker images -q

查找当时装备的远程库房中的可用镜像

docker search redis

从镜像库房拉取镜像

# 拉取最新版,相当于docker pull redis:latest
docker pull redis
# 拉取指定版别
docker pull redis:7.0.5

运用 Dockerfile 构建镜像

# 语法:docker build [OPTIONS] PATH | URL | -
###### 第一种方法,根据Dockerfile生成镜像 ######
# 切换到Dockerfile地点目录
cd dockerfile-path
# -t 等价于 --tag,指定镜像的标签
docker build -t image-from-path .
# 语法:docker build [OPTIONS] PATH | URL | -
###### 第二种方法,根据URL生成镜像 ######
# URL能够是Git远程库房(包含Dockerfile文件)
# URL也能够是预先打包好的tarball上下文链接
# URL也能够是普通文本文件(内容和Dockerfile相同)
docker build -t image-from-url github.com/creack/docker-firefox

删去镜像(一个或多个)

# 删去指定镜像
docker rmi redis:7.0.5
# 删去一切符合过滤条件的镜像
docker rmi $(docker images -f "dangling=true" -aq)
# 删去一切Redis镜像
docker rmi $(docker images redis -aq)

为镜像打标签

# 语法 docker image tag sourceImage:version targetImage:version
# 简写 docker tag sourceImage:version targetImage:version
docker tag redis my-local-redis:v1.0

容器操作 / Container Operation

检查容器列表

docker ps
# 检查一切容器,包含已中止的
docker ps -a
# 检查容器ID, -q 等价于 --quiet
docker ps -q

根据某个镜像创立容器但不发动

# 语法:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker create -d --name redis-demo -p 6379:6379 redis:7.0.5

根据某个镜像创立容器并发动

# -d 让容器在后台运转,其实就是一个进程
# --name 指定容器称号
# -p 将容器的端口映射到宿主机的端口
# --cpus CPU核心数
# -m 等价于 --memory 指定最大内存
# -e 等价于 --env,设置环境变量
docker run -d \
    --name redis-demo -p 6379:6379 \
    --cpus 1 -m 100m \
    -e REDIS_NAME=my-redis-demo \
    redis:7.0.5

以交互式的方法进入容器

# docker exec -it containerId /bin/bash
docker exec -it redis-demo /bin/bash

发动/中止/暂停/重启容器

# 发动容器,语法:docker start containerId / containerName
docker start redis-demo
# 中止容器,语法:docker stop containerId / containerName
docker stop redis-demo
# 暂停容器,语法:docker pause CONTAINER [CONTAINER...]
docker pause redis-demo
# 运转状态下重启容器,语法:docker restart containerId / containerName
docker restart redis-demo

删去容器(一个或多个)

# 语法 docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 删去redis-demo,前提是redis-demo已中止
docker rm redis-demo
# 删去redis-demo及其匿名Volume
docker rm -v redis-demo
# 删去一切已中止的容器
docker rm $(docker ps -f status=exited -q)

根据容器的当时改变反向生成镜像

# 语法 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
# -m 等价于 --comment,补白
docker commit -m 'Image from Container' redis-demo local-redis-image:1.0.0
# 检查新建镜像的提交信息
docker image inspect local-redis-image:1.0.0 | grep Comment
# 或许
docker inspect local-redis-image:1.0.0 | grep Comment

检查容器详细信息

# 语法 docker inspect [OPTIONS] NAME|ID [NAME|ID...]
docker inspect redis-demo

检查容器资源运用情况

# 语法:docker stats [OPTIONS] [CONTAINER...]
# 以流式的方法展现一切运转中的容器资源运用数据
docker stats
# 一切容器资源运用数据
docker stats -a
# 指定容器(redis-demo)资源运用数据
docker stats redis-demo
# 资源运用快照
docker stats --no-stream redis-demo

检查容器日志

# 语法:docker logs [OPTIONS] CONTAINER
docker logs redis-demo
# 实时日志, -f 等价于 --follow,-n 等价于 --tail,显现倒数多少行日志
docker logs -f -n 12 redis-demo

存储操作 / Storage Operation

罗列 Volume

docker volume ls

创立 Volume

# 语法:docker volume create [OPTIONS] [VOLUME]
# 创立数据卷时,指定称号:v-redis
docker volume create v-redis
# 创立数据卷时,不指定称号,Docker会创立64位的随机称号
docker volume create

检查 Volume 概况

# 语法:docker volume inspect [OPTIONS] VOLUME [VOLUME...]
docker volume inspect v-redis

删去 Volume

# 语法:docker volume rm [OPTIONS] VOLUME [VOLUME...]
docker volume rm v-redis

整理未运用的Volume

docker volume prune

创立容器时挂载 Volume

# 将数据卷v-redis挂载到容器内的/usr/local/redis目录
docker run -d --name redis-demo -p 6379:6379 \
    -v v-redis:/usr/local/redis \
    redis:7.0.5

网络操作 / Network Operation

检查网络列表

# 语法:docker network ls [OPTIONS]
docker network ls

创立 Docker 网络

# 语法:docker network create [OPTIONS] NETWORK
# -d 等价于 --driver
docker network create -d bridge nw-redis-b

创立容器时指定 Network

docker run -d --name redis-demo-nw -p 6378:6379 \
    --network nw-redis-b \
    redis:7.0.5

运转中的容器衔接 Docker 网络

# 语法:docker network connect [OPTIONS] NETWORK CONTAINER
docker network connect nw-redis-b redis-demo

运转中的容器断开Docker网络

# 语法:docker network disconnect [OPTIONS] NETWORK CONTAINER
docker network disconnect nw-redis-b redis-demo

删去Docker网络

# 语法:docker network rm NETWORK [NETWORK...]
docker network rm nw-redis-b

整理未运用的 Docker 网络

# 语法:docker network prune [OPTIONS]
docker network prune

Docker 指令运用技巧

如果要检查完好的 Docker 指令,能够参考官方文档:链接

下面共享一些运用技巧

Docker 协助手册

Docker 的一切指令,都能够运用 --help 检查协助手册

docker --help 
docker images --help
docker ps --help
docker network create --help

Docker 指令通用参数总结

显现一切

###### --all / -a ######
# 一些示例
docker images -a
docker ps -a

只显现 Docker 目标 ID

###### --quiet / -q ######
# 一些示例
docker images -q
docker ps -q
docker network ls -q
docker volume ls -q

过滤器

###### --filter / -f ######
# 一些示例
docker ps -f status=exited