敞开成长之旅!这是我参与「日新计划 12 月更文挑战」的第2天,点击检查活动概况
Docker 介绍
官网:链接
Docker 是一个能够简化开发、部署和运转应用程序的开源平台,是用 Go 语言开发的。Docker 能够协助开发者做好基础设施层的作业,让开发者更多地关注事务的实现,加速从开发到上线的迭代速度
Docker 架构形式
Docker 运用了 client / server 的架构形式,如下图所示
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 镜像为例
在创立自界说镜像时,如果修改了 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常用指令
通用操作 / 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