Docker基础介绍

What‘s Docker

Docker是开发,运行和部署应用程序的开放管理平台。

  • 开发人员能利用docker 开发和运行应用程序
  • 运维人员能利用docker 部署和管理应用程序

Docker提供了在一个完全隔离的环境中打包和运行应用程序的能力,这个隔离的环境被称为容器。
由于容器的隔离性和安全性,因此可以在一个主机(宿主机)上同时运行多个相互隔离的容器,互不干预。
Docker已经提供工具和组件(Docker Client、Docker Daemon等)来管理容器的生命周期:

- 使用容器来开发应用程序及其支持组件。
- 容器成为分发和测试你的应用程序的单元。
- 准备好后,将您的应用程序部署到生产环境中,作为容器或协调服务。无论您的生产环境是本地数据中心,云提供商还是两者的混合,这都是一样的。
  • Docker主要解决的问题:
    保证程序运行环境的一致性;
    降低配置开发环境、生产环境的复杂度和成本;
    实现程序的快速部署和分发。

docker

Docker客户端(Docker Client) 
	Docker客户端(Docker Client)是用户与Docker进行交互的最主要方式。当在终端输入docker命令时,对应的就会在服务端产生对应的作用,并把结果返回给客户端。Docker Client除了连接本地服务端,通过更改或指定DOCKER_HOST连接远程服务端。
Docker服务端(Docker Server)
	Docker Daemon其实就是Docker 的服务端。它负责监听Docker API请求(如Docker Client)并管理Docker对象(Docker Objects),如镜像、容器、网络、数据卷等
Docker Registries
	俗称Docker仓库,专门用于存储镜像的云服务环境.
	Docker Hub就是一个公有的存放镜像的地方,类似Github存储代码文件。同样的也可以类似Github那样搭建私有的仓库。
Docker 对象(Docker Objects) 
	镜像:一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。
	容器:镜像被运行起来后的实例。
	网络:外部或者容器间如何互相访问的网络方式,如host模式、bridge模式。
	数据卷:容器与宿主机之间、容器与容器之间共享存储方式,类似虚拟机与主机之间的共享文件目录。

Docker Engine

Docker Engine

Docker Engine是一个包含以下组件的客户端-服务端(C/S)应用程序:

服务端 --- 一个长时间运行的守护进程(Docker Daemon)
REST API --- 一套用于与Docker Daemon通信并指示其执行操作的接口
客户端 --- 命令行接口CLI( Command Line Interface)

CLI利用Docker命令通过REST API直接操控Docker Daemon执行操作
Docker Daemon负责创建并管理Docker的对象(镜像、容器、网络、数据卷)

Docker 底层技术了解

Docker使用Go语言实现。
Docker利用linux内核的几个特性来实现功能:
	利用linux的命名空间(Namespaces)
	利用linux控制组(Control Groups)
	利用linux的联合文件系统(Union File Systems)
	这也就意味着Docker只能在linux上运行。
	在windows、MacOS上运行Docker,其实本质上是借助了虚拟化技术,然后在linux虚拟机上运行的Docker程序。
容器格式( Container Format ):
	Docker Engine将namespace、cgroups、UnionFS进行组合后的一个package,就是一个容器格式(Container Format)。Docker通过对这个package中的namespace、cgroups、UnionFS进行管理控制实现容器的创建和生命周期管理。
	容器格式(Container Format)有多种,其中Docker目前使用的容器格式被称为libcontainer
Namespaces(命名空间):为Docker容器提供操作系统层面的隔离
	进程号隔离:每一个容器内运行的第一个进程,进程号总是从1开始起算
	网络隔离:容器的网络与宿主机或其他容器的网络是隔离的、分开的,也就是相当于两个网络
	进程间通隔离:容器中的进程与宿主机或其他容器中的进程是互相不可见的,通信需要借助网络
	文件系统挂载隔离: 容器拥有自己单独的工作目录
	内核以及系统版本号隔离:容器查看内核版本号或者系统版本号时,查看的是容器的,而非宿主机的
Control Groups(控制组-cgroups):为Docker容器提供硬件层面的隔离
	控制组能控制应用程序所使用的硬件资源。
	基于该性质,控制组帮助docker引擎将硬件资源共享给容器使用,并且加以约束和限制。如控制容器所使用的内存大小。
Union File Systems(联合文件系统--UnionFS):利用分层(layer)思想管理镜像和容器

Docker 安装

Docker-CE指Docker社区版,由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用。
Docker-EE指Docker企业版,为收费版本,由售后团队和技术团队提供技术支持,专为企业开发和IT团队而设计。
相比Docker-EE,增加一些额外功能,更重要的是提供了更安全的保障。

此外,Docker的发布版本分为Stable版和Edge版,区别在于前者是按季度发布的稳定版(发布慢),后者是按月发布的边缘版(发布快)。

通常情况下,Docker-CE足以满足我们的需求。后面学习主要针对Docker-CE进行学习。

Centos7 安装Docker-CE

教程很多,在此给出两个相关帖子(包含我碰到的问题):
python版本问题
配置仓库yum问题

完整安装docker以及python2、3版本冲突问题
配置仓库yum报错问题: No module named yum
安装成功后,使用 docker version查看

docker 配置加速器

  • 为什么使用加速器:
    配置Docker加速器,将会提升在国内获取Docker官方镜像的速度,否则后面下载镜像的过程会很慢,甚至有可能无法下载镜像
  • 配置阿里云加速器
    阿里云官方加速教程

Docker Image

镜像是一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。
通过镜像可以创建一个或多个容器。

docker search

命令格式:
	docker search [OPTIONS] TERM
命令参数(OPTIONS):
	-f,  --filter filter   	根据提供的格式筛选结果
	     --format string   	利用Go语言的format格式化输出结果
	     --limit int       	展示最大的结果数,默认25个
	     --no-trunc        	内容全部显示

docker images/docker image ls

命令格式:
	docker images [OPTIONS] [REPOSITORY[:TAG]]  
     或者  docker image ls [OPTIONS] [REPOSITORY[:TAG]]
命令参数(OPTIONS):	
	-a, --all             		展示所有镜像 (默认隐藏底层的镜像)
	     --no-trunc        	不缩略显示
	-q, --quiet           	只显示镜像ID

docker pull

命令格式:
	docker pull [OPTIONS] NAME[:TAG|@DIGEST]
命令参数(OPTIONS):
	-a, --all-tags               	下载所有符合给定tag的镜像

docker rmi/docker image rm

命令格式:
	docker rmi [OPTIONS] IMAGE [IMAGE...]
     或者  docker image rm [OPTIONS] IMAGE [IMAGE...]
命令参数(OPTIONS):	
	-f, --force      		强制删除

docker save

命令格式:
	docker save [OPTIONS] IMAGE [IMAGE...]
命令参数(OPTIONS):	
	-o, --output string   		指定写入的文件名和路径

docker load

命令格式:
	docker load [OPTIONS]
命令参数(OPTIONS):	
	-i,  --input string   	指定要打入的文件,如没有指定,默认是STDIN
	-q, --quiet          		不打印导入过程信息

docker tag

命令格式:
	docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

docker image inspect/docker inspect

命令格式:
	docker image inspect [OPTIONS] IMAGE [IMAGE...]
      或者 docker inspect [OPTIONS] IMAGE [IMAGE...]
命令参数(OPTIONS):	
	-f, --format string          利用特定Go语言的format格式输出结果

docker history

命令格式:
	docker history [OPTIONS] IMAGE
命令参数(OPTIONS):
	-H, --human		将创建时间、大小进行优化打印(默认为true)
	-q, --quiet           	只显示镜像ID
	     --no-trunc        	不缩略显示

docker image

Docker Container

容器(Container):容器是一种轻量级、可移植、并将应用程序进行的打包的技术,使应用程序可以在几乎任何地方以相同的方式运行
Docker将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例。
容器具备一定的生命周期。
另外,可以借助docker ps命令查看运行的容器,如同在linux上利用ps命令查看运行着的进程那样。

docker 容器 vs 虚拟机

  • same
    • 容器和虚拟机一样,都会对物理硬件资源进行共享使用。
    • 容器和虚拟机的生命周期比较相似(创建、运行、暂停、关闭等等)。
    • 容器中或虚拟机中都可以安装各种应用,如redis、mysql、nginx等。也就是说,在容器中的操作,如同在一个虚拟机(操作系统)中操作一样。
    • 同虚拟机一样,容器创建后,会存储在宿主机上:linux上位于/var/lib/docker/containers下
  • diff
    • 虚拟机的创建、启动和关闭都是基于一个完整的操作系统。一个虚拟机就是一个完整的操作系统。而容器直接运行在宿主机的内核上,其本质上是一系列进程的结合。
    • 容器是轻量级的,虚拟机是重量级的。首先容器不需要额外的资源来管理(不需要Hypervisor、Guest OS),虚拟机额外更多的性能消耗;其次创建、启动或关闭容器,如同创建、启动或者关闭进程那么轻松,而创建、启动、关闭一个操作系统就没那么方便了。
      也因此,意味着在给定的硬件上能运行更多数量的容器,甚至可以直接把Docker运行在虚拟机上。
      docker container VM

容器的生命周期

life

docker create

Usage: docker create [OPTIONS] IMAGE [COMMAND] [ARG…]
Create a new container:利用镜像创建出一个Created 状态的待启动容器

  • 命令参数(OPTIONS):查看更多
    -t, --tty 分配一个伪TTY,也就是分配虚拟终端
    -i, --interactive 即使没有连接,也要保持STDIN打开
    –name 为容器起名,如果没有指定将会随机产生一个名称
  • 命令参数(COMMAND\ARG):
    COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
    ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
    docker create

docker start

docker start [OPTIONS] CONTAINER [CONTAINER…]

question

docker create -ti --name python centos:8 python or
docker create -ti --name python centos:latest python

docker start -ai python 会报错:

Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"python\": executable file not found in $PATH": unknown 

采用如下创建命令可以正常运行,centos8不清楚怎么处理,有方法的朋友可以评论分享,谢谢!:
docker create -ti --name python centos:7 python

docker run

docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

  • 命令参数(OPTIONS):查看更多
    -t, --tty 分配一个伪TTY,也就是分配虚拟终端
    -i, --interactive 即使没有连接,也要保持STDIN打开
    –name 为容器起名,如果没有指定将会随机产生一个名称
    -d, --detach 在后台运行容器并打印出容器ID
    –rm 当容器退出运行后,自动删除容器

  • docker run 相当于 docker create + docker start –a 前台模式

  • docker run -d 相当于 docker create + docker start 后台模式

docker stop

docker stop [OPTIONS] CONTAINER [CONTAINER…]
docker stop 命令不可以停止

docker kill

docker kill [OPTIONS] CONTAINER [CONTAINER…]

  • 命令参数(OPTIONS):
    -s, --signal string 指定发送给容器的关闭信号 (默认“KILL”信号)
    不常用
docker stop vs docker kill
  • 前提知识点:
    Linux其中两种终止进程的信号是:SIGTERM和SIGKILL(kill -l 查看)

    • SIGKILL信号:无条件终止进程信号。进程接收到该信号会立即终止,不进行清理和暂存工作。该信号不能被忽略、处理和阻塞,它向系统管理员提供了可以杀死任何进程的方法。
    • SIGTERM信号:程序终结信号,可以由kill命令产生。与SIGKILL不同的是,SIGTERM信号可以被阻塞和终止,以便程序在退出前可以保存工作或清理临时文件等。
  • docker stop 会先发出SIGTERM信号给进程,告诉进程即将会被关闭。在-t指定的等待时间过了之后,将会立即发出SIGKILL信号,直接关闭容器。

  • docker kill 直接发出SIGKILL信号关闭容器。但也可以通过-s参数修改发出的信号。

因此会发现在docker stop的等过过程中,如果终止docker stop的执行,容器最终没有被关闭。而docker kill几乎是立刻发生,无法撤销。

此外还有些异常原因也会导致容器被关闭,比如docker daemon重启、容器内部进程运行发生错误等等“异常原因”。

docker pasue

docker pause CONTAINER [CONTAINER…]
Pause all processes within one or more containers

docker restart

docker restart [OPTIONS] CONTAINER [CONTAINER…]

docker rm

  • 作用:
    删除一个或多个容器
  • 命令格式:
    docker container rm [OPTIONS] CONTAINER [CONTAINER…]
    或者 docker rm [OPTIONS] CONTAINER [CONTAINER…]
  • 命令参数(OPTIONS):
    -f, --force 强行删除容器(会使用 SIGKILL信号)
    -v, --volumes 同时删除绑定在容器上的数据卷
    区别 docker rmi
    删除container也可以利用 docker run/create --rm 参数实现

docker inspect

  • 命令格式:
    docker container inspect [OPTIONS] CONTAINER [CONTAINER…]
    或者 docker inspect [OPTIONS] CONTAINER [CONTAINER…]
  • 命令参数(OPTIONS):
    -f, --format string 利用特定Go语言的format格式输出结果
    -s, --size 显示总大小
  • demo
    docker inspect -f “{{json .NetworkSettings.Network}}” b6d0

docker logs

  • 作用:
    查看容器的日志信息
  • 命令格式:
    docker logs [OPTIONS] CONTAINER
  • 命令参数(OPTIONS):
    –details 显示日志的额外信息
    -f, --follow 动态跟踪显示日志信息
    –since string 只显示某事时间节点之后的
    –tail string 显示倒数的行数(默认全部)
    -t, --timestamps 显示timestamps时间
    –until string 只显示某事时间节点之前的
  • 注意:
    容器日志中记录的是容器主进程的输出STDOUT\STDERR
    区分docker exec

docker rename

docker rename CONTAINER NEW_NAME

docker attach

容器运行时命令: docker attach&exec
docker attach [OPTIONS] CONTAINER

Attach local standard input, output, and error streams to a running container
将当前终端的STDIN、STDOUT、STDERR绑定到正在运行的容器的主进程上实现连接

docker attach
docker attach 绑定到容器的cmd中的序号1(主)进程

docker exec

  • 作用:
    在容器中运行一个命令
  • 命令格式:
    docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
  • 命令参数(OPTIONS):
    -d, --detach 后台运行命令
    -i, --interactive 即使没连接容器,也将当前的STDIN绑定上
    -t, --tty 分配一个虚拟终端
    -w, --workdir string 指定在容器中的工作目录
    -e, --env list 设置容器中运行时的环境变量

dicker exec
doker exec 只是创建新的进程来运行cmd,不影响1号进程

docker container 小节

docker container

Docker Image&Container

container vs image

docker commit

Create a new image from a container’s changes
运行展示


[root@instance-j62dkvi8 ~]# docker commit -m "installnettools" 178d centos-net:v1.0
sha256:7c4ad38b8083efaf7853c7d99623a91455e5305cf8c4511a1fb3a254b5dfacdb
[root@instance-j62dkvi8 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos-net          v1.0                7c4ad38b8083        12 seconds ago      290MB
ubuntu              18.04               2eb2d388e1a2        10 days ago         64.2MB
ubuntu              1804                2eb2d388e1a2        10 days ago         64.2MB
centos              7                   b5b4d78bc90c        3 months ago        203MB
[root@instance-j62dkvi8 ~]# docker run -dti 7c4a
f422223228286c6e2b6f3b1a99ee444d3754a90a29dd5e438c825537c8f74457
[root@instance-j62dkvi8 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f42222322828        7c4a                "/bin/bash"         32 seconds ago      Up 31 seconds                           sweet_almeida
178dc242da07        centos:7            "/bin/bash"         About an hour ago   Up About an hour                        wizardly_matsumoto
[root@instance-j62dkvi8 ~]# docker exec f422 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255

docker export

  • 作用:
    将容器当前的文件系统导出成一个tar文件
  • 命令格式:
    docker export [OPTIONS] CONTAINER
  • 命令参数(OPTIONS):
    -o, --output string 指定写入的文件,默认是STDOUT
  • demo
[root@instance-j62dkvi8 ~]# docker export -h
Flag shorthand -h has been deprecated, please use --help

Usage:  docker export [OPTIONS] CONTAINER

Export a container's filesystem as a tar archive

Options:
  -o, --output string   Write to a file, instead of STDOUT
[root@instance-j62dkvi8 ~]# docker export -o "nettools.tar"  178d
[root@instance-j62dkvi8 ~]# ls
dockersavefile.tar  mai  nettools.tar
[root@instance-j62dkvi8 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
178dc242da07        centos:7            "/bin/bash"         About an hour ago   Up About an hour                        wizardly_matsumoto

docker import

  • 作用:
    从一个tar文件(export得到的tar文件)中导入内容创建一个镜像
  • 命令格式:
    docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
  • 命令参数(OPTIONS):
    -c, --change list 为创建的镜像加入Dockerfile命令
    -m, --message string 导入时,添加提交信息
  • demo:
[root@instance-j62dkvi8 ~]# docker import -h
Flag shorthand -h has been deprecated, please use --help

Usage:  docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

Import the contents from a tarball to create a filesystem image

Options:
  -c, --change list       Apply Dockerfile instruction to the created image
  -m, --message string    Set commit message for imported image
      --platform string   Set platform if server is multi-platform capable
[root@instance-j62dkvi8 ~]# docker import -m "nettools2" nettools.tar centos2:v1.0
sha256:0c28faf1dc8e05a24a23f4568d97319730f2d232e3cfe75ea936686f891fb8c1
[root@instance-j62dkvi8 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos2             v1.0                0c28faf1dc8e        10 seconds ago      266MB
docker commit vs import
[root@instance-j62dkvi8 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos2             v1.0                0c28faf1dc8e        10 seconds ago      266MB
centos-net          v1.0                555411c8b690        12 minutes ago      290MB
<none>              <none>              7c4ad38b8083        26 minutes ago      290MB
ubuntu              18.04               2eb2d388e1a2        10 days ago         64.2MB
ubuntu              1804                2eb2d388e1a2        10 days ago         64.2MB
centos              7                   b5b4d78bc90c        3 months ago        203MB
[root@instance-j62dkvi8 ~]# docker history centos2:v1.0
IMAGE               CREATED             CREATED BY          SIZE                COMMENT
0c28faf1dc8e        6 minutes ago                           266MB               nettools2
[root@instance-j62dkvi8 ~]# docker history centos-net:v1.0
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
555411c8b690        19 minutes ago      /bin/bash                                       87MB                installnettools
b5b4d78bc90c        3 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           3 months ago        /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>           3 months ago        /bin/sh -c #(nop) ADD file:38e2d2a1a0cd8694b…   203MB

commit保留历史,import 刷新历史。
另外,在inspect详细信息里也可以看到Config以及RootFS.Layers的不同

联合文件系统与镜像容器

镜像的layer
image layer
镜像的视角
image version

容器的layer
container layer
container commit
容器的视角
container version
容器的运行
申请进程空间
写入文件
容器与镜像的底层关系
image&container

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值