Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。项目后来加入了 Linux 基金会,并成立推动开放容器联盟,遵从了 Apache 2.0 协议,项目代码在GitHub 上进行维护。

什么是Docker?

Docker的英文翻译是”搬运工”的意思,他搬运的东西就是我们常说的集装箱Container,Container 里面装的是任意类型的App,我们的开发人员可以通过Docker 将App变成一种标准化的、可移植的、自管理的组件,我们可以在任何主流的操作系统中开发、调试和运行。

从概念上来看Docker和传统的虚拟机比较类似,只是更加轻量级,更加方便使用。

Docker的优点

1、虚拟化技术依赖的是物理CPU和内存,是硬件级别的。而我们的Docker是构建在操作系统层面的,利用操作系统的容器化技术。

2、虚拟机中的系统就是我们常说的操作系统镜像,比较复杂。而Docker比较轻量级,我们可以使用Docker部署一个独立的Redis,就像类似于在虚拟机当中安装一个Redis应用,但是我们用Docker部署的应用是完全隔离的。

3、在传统的虚拟化技术是通过快照来保存的。而Docker引用了类似于源码的管理机制,将容器的快照历史版本一一记录下来,切换成本更低。

4、传统的虚拟化技术在构建系统的时候非常复杂。而Docker可以通过一个简单的Dockerfile文件来构建整个容器,更重要的是Dockerfile可以手动编写,这样应用开发人员可以通过发布Dockerfile来定义应用的环境和依赖,对于持续交付更加方便。

Docker--基础篇_Docker

Docker核心概念

Docker namespace

命名空间,Linux内核提供的一种限制进程或者多进程资源隔离机制,目的是将某个特定的全局系统资源(global system resource)通过抽象方法使得namespace中的进程看起来拥有它们自己的隔离的全局系统资源实例。Linux提供了6种NameSpace:UTS、IPC、PID、Network、Mount、User。

NAMESPACE 功能
UTS 提供主机名,域名的隔离能力
IPC 提供进程之间通信、消息内存的隔离能力
PID 提供进程间隔离的能力
Network 提供网络隔离能力
Mount 提供磁盘挂载点和文件系统的隔离能力
User 提供用户、用户组隔离的能力

Docker CGroups

Docker容器使用Linux namespace来隔离其运行环境,使得容器中的进程看起来就像在一个独立的环境中运行。但是光有运行环境隔离还不够,因为这些进程还是可以不受限制地使用系统资源,比如网络、磁盘、CPU以及内存等。关于其目的,是为了防止它占用了太多的资源而影响到其它进程。另一方面,在系统资源耗尽的时候,Linux内核会触发OOM (out of memory killer,OOM会在系统内存耗尽的情况下跳出来,选择性的干掉一些进程以求释放一些内存),为了让容器中的进程更加可控,Docker使用Linux cgroups(Linux Control Groups)来限制容器中的进程允许使用的系统资源(CPU时间、内存、网络带宽等资源的使用限制)。

Docker UnionFS

UFS(UnionFS):联合文件系统,支持将不同位置的目录挂载到同一虚拟文件系统,形成一种分层的模型。成员目录称为虚拟文件系统的一个分支(branch)。

AUFS(advanced multi layered unification filesystem):高级多层统一文件系统,是UFS的一种,每个branch可以指定readonly(ro只读)、readwrite(读写)和whiteout-able(wo隐藏)权限。一般情况下,aufs只有最上层的branch才有读写权限,其他branch均为只读权限。

Docker的架构体系

Docker--基础篇_Docker_02

Docker Damon :DockerD用来监听Docker API的请求和管理Docker对象,比如镜像、容器、网络和Volume。

Docker Client :Docker Client是我们和Docker进行交互的最主要的方式方法,比如可以通过docker run来运行一个容器,然后我们的这个Client会把命令发送给上面的Docker。

Docker Registry :用来存储Docker镜像的仓库,Docker Hub是Docker官方提供的一个公共仓库,Docker默认也是从Docker Hub上查找镜像的,当然也可以运行一个私有仓库,当使用docker pull或者docker run命令时,就会从配置的Docker镜像仓库中去拉取镜像,使用docker push命令时,会将构建的镜像推送到对应的镜像仓库中。

Images :镜像,是一个制度模板(启动容器的模板)。

Containers :容器,是一个镜像的可运行的实例,可以使用Docker REST API或者CLI来操作容器,容器的实质是进程,但与直接在宿主执行的实例进程不同,容器进程属于自己的独立的命名空间。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间等。

Dcoker安装

1、如果之前安装过docker,需要卸载

yum remove docker docker-common docker-selinux docker-engine -y

2、安装依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2

3、安装yum源

wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum clean all
yum makecache

4、安装docker

yum install docker-ce -y

5、docker加速

打开阿里云官网 --> 产品  --> 容器与中间件  -->  容器与镜像服务ACR --> 管理控制台 --> 镜像工具 --> 镜像加速器 --> CentOS

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://c4r37jnz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

6、设置开机自启动

systemctl enable docker

7、检查docker

# 第一种方式
systemctl status docker

# 第二种方式
docker info

# 第三种方式
docker run -d -P nginx

Docker的基本命令

[root@host-cloud ~]# docker --help

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default "/root/.docker")									#客户端配置文件的位置
  -c, --context string     Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use")
  -D, --debug              Enable debug mode									#启用Debug调试模式
  -H, --host list          Daemon socket(s) to connect to			#守护进程的套接字(Socket)连接
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")			#设置日志级别
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")			#信任证书签名CA
      --tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")			#TLS证书文件路径
      --tlskey string      Path to TLS key file (default "/root/.docker/key.pem")								#TLS密钥文件路径
      --tlsverify          Use TLS and verify the remote																				#使用TLS验证远程
  -v, --version            Print version information and quit																		#打印版本信息

Management Commands:
  app*        Docker App (Docker Inc., v0.9.1-beta3)
  builder     Manage builds
  buildx*     Build with BuildKit (Docker Inc., v0.5.1-docker)
  config      Manage Docker configs
  container   Manage containers
  context     Manage contexts
  image       Manage images
  manifest    Manage Docker image manifests and manifest lists
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  scan*       Docker Scan (Docker Inc., v0.8.0)
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container			#当前shell下attach连接指定运行镜像
  build       Build an image from a Dockerfile										#通过Dockerfile定制镜像
  commit      Create a new image from a container's changes				#提交当前容器为新的镜像
  cp          Copy files/folders between a container and the local filesystem			#从容器中拷贝指定文件或者目录到宿主机中
  create      Create a new container													#创建一个新的容器,同run 但不启动容器
  diff        Inspect changes to files or directories on a container's filesystem			#查看docker容器变化
  events      Get real time events from the server								#从docker服务获取容器实时事件
  exec        Run a command in a running container								#在已存在的容器上运行命令
  export      Export a container's filesystem as a tar archive			#导出容器的内容流作为一个tar归档文件(对应import)
  history     Show the history of an image			#展示一个镜像形成历史
  images      List images				#列出系统当前镜像
  import      Import the contents from a tarball to create a filesystem image			#从tar包中的内容创建一个新的文件系统映像(对应export)
  info        Display system-wide information				#显示系统相关信息
  inspect     Return low-level information on Docker objects			#查看容器详细信息
  kill        Kill one or more running containers				#kill指定docker容器
  load        Load an image from a tar archive or STDIN		#从一个tar包中加载一个镜像(对应save)
  login       Log in to a Docker registry			#注册或者登陆一个docker源服务器
  logout      Log out from a Docker registry			#从当前Docker registry退出
  logs        Fetch the logs of a container				#输出当前容器日志信息
  pause       Pause all processes within one or more containers				#暂停容器
  port        List port mappings or a specific mapping for the container			#查看映射端口对应的容器内部源端口
  ps          List containers					#列出容器列表
  pull        Pull an image or a repository from a registry			#从docker镜像源服务器拉取指定镜像或者库镜像
  push        Push an image or a repository to a registry				#推送指定镜像或者库镜像至docker源服务器
  rename      Rename a container							#重命名容器
  restart     Restart one or more containers			#重启运行的容器
  rm          Remove one or more containers				#移除一个或者多个容器
  rmi         Remove one or more images						#移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
  run         Run a command in a new container		#创建一个新的容器并运行一个命令
  save        Save one or more images to a tar archive (streamed to STDOUT by default)			#保存一个镜像为一个tar包(对应load)
  search      Search the Docker Hub for images				#在docker hub中搜索镜像
  start       Start one or more stopped containers			#启动容器
  stats       Display a live stream of container(s) resource usage statistics			#统计容器使用资源
  stop        Stop one or more running containers					#停止容器
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE			#给源中镜像打标签
  top         Display the running processes of a container					#查看容器中运行的进程信息
  unpause     Unpause all processes within one or more containers			#取消暂停容器
  update      Update configuration of one or more containers				#更新一个或多个容器的配置
  version     Show the Docker version information						#查看容器版本号
  wait        Block until one or more containers stop, then print their exit codes			#截取容器停止时的退出状态值

Run 'docker COMMAND --help' for more information on a command.

To get more help with docker, check out our guides at https://docs.docker.com/go/guides/