Docker初识

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

attachments-2020-08-VooUJjmS5f49c4b450f6a.png


一、Docker 架构


Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类。

Docker 面向对象

容器 对象

镜像 类


attachments-2020-08-VPXaEXhx5f49c6cce779d.jpg


Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板。Docker 容器(Container) 容器是独立运行的一个或一组应用。Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。Docker 仓库(Registry) Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是linux容器(LXC)等技术。


二、Docker的概念,安装及镜像管理


2.1、docker的概念:

镜像:是一个只读的模板,类似于安装系统用到的那个iso文件,我们通过镜像来完成各种应用的部署。镜像可以用来创建Docker容器


容器:镜像类似于操作系统,而容器类似于虚拟机本身。它可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。可以把容器看做是一个简易版的linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。


仓库:存放镜像的一个场所,仓库分为公开仓库和私有仓库。最大的公开仓库是Docker hub(hub.docker.com),国内公开仓库(dockerpool.com)


2.2、docker安装启动:

yum install -y epel-releaseyum instal -y dockersystemctl enable docker.servicesystemctl start docker

 

2.3、镜像管理

2.3.1、获取镜像

语法:docker pull NAME[:TAG]

其中,NAME是镜像仓库的名称(用来区分镜像),TAG是镜像的标签(用来表示版本信息)

docker pull  centos:从docker.com获取centos镜像

2.3.2、查看镜像

语法:docker images 
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZEdocker.io/nginx latest b175e7467d66 2 days ago 109 MB 

 

attachments-2020-08-FN8b3lQS5f49c6e2366fa.jpg

docker tag centos long:为centos镜像设置标签为long,再使用docker images查看会多出来一行,打了标签的image id和centos的一样
[root@localhost ~]# docker tag nginx nginx_1.12.2[root@localhost ~]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEdocker.io/nginx     latest              b175e7467d66        2 days ago          109 MBnginx_1.12.2        latest              b175e7467d66        2 days ago          109 MB
docker inspect {IMAGE_ID | IMAGE_NAME}:获取镜像详细信息
[root@localhost ~]# docker inspect nginx
返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用参数-f来指定,例如,获取镜像的Architecture[root@localhost ~]# docker inspect -f {{".Architecture"}} nginxamd64

2.3.3、搜索镜像

docker search [image-name]:从docker仓库搜索docker镜像,后面是关键词
[root@localhost ~]# docker search nginx

2.3.4、删除镜像

docker rmi centos:用来删除指定镜像, 其中后面的参数可以是tag,如果是tag时,实际上是删除该tag,只要该镜像还有其他tag,就不会删除该镜像。当后面的参数为镜像ID时,则会彻底删除整个镜像,连通所有标签一同删除
[root@localhost ~]# docker rmi nginx_1111Untagged: nginx_1111:latestUntagged: docker.io/nginx@sha256:37350fbb4afbb1c01b6e542fe1537dd701e4430983d6d9c673cbb5eccdbec357
docker rmi -f centos:强制删除,一般不建议使用,会导致某些问题
[root@localhost ~]# docker rmi -f nginx_1111
Untagged: nginx_1111:latest

 2.3.5、创建镜像

创建镜像的方法有以下3种方式:

(1)基于已有镜像的容器创建

(2)基于本地模板导入

(3)基于Dockerfile创建 

(1)基于已有镜像的容器创建命令格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]主要选项:-a:作者信息-m:提交消息-p:提交时暂停容器运行运行docker run后,进入到该容器中,我们做一些变更,比如安装一些东西,然后针对这个容器进行创建新的镜像[root@localhost ~]# docker ps -a   //查看所有的容器[root@localhost ~]# docker start 67d   //启动ID为67d的容器,ID可简写为前3位[root@localhost ~]# docker exec -it 67d /bin/bash    //进入67d容器[root@67dde53e0651 /]# yum install -y net-tools wget[root@67dde53e0651 /]# exit[root@localhost ~]# docker commit -m "centos_with_nettools_wget" -a "long" 67d centos_with_net       //创建新的镜像sha256:90f2a945a44d466c8a8d46dcdd4ab80f9f2aab79761482a1b5839d9ea2cf7904tips:这个命令有点像svn的提交,-m 加一些改动信息,-a 指定作者相关信息  67d这一串为容器id,再后面为新镜像的名字[root@localhost ~]# docker imagesREPOSITORY        TAG               IMAGE ID            CREATED          SIZEcentos_with_net   latest           90f2a945a44d     32 seconds ago    300.6MBdocker.io/centos  latest           328edcd84f1b     11 days ago       192.5MBlong              long             328edcd84f1b      11 days ago      192.5MB2)基于本地模板导入模块获取,可以直接在网上下载一个模块[root@izwz920g719hydx1spem46z ~]# wget https://download.openvz.org/template/precreated/contrib/centos-7-x86_64-minimal-20170709.tar.xzhttp://openvz.org/Download/templates/precreated 可惜速度并不快,若我们下载了一个centos的模板 centos-7-x86_64-minimal-20170709.tar.xz那么导入该镜像的命令为:cat centos-7-x86_64-minimal-20170709.tar.xz |docker import - centos-5-x86

2.3.6、存出和载入镜像以及上传镜像

docker save -o ***.tar IMAGE:TAGdocker load --input ***.tar 或 dokcer load < ***.tardocker push IMAGE_NAME把现有镜像,导出为一个文件,可以作为备份:docker save -o long.tar long:long我们还可以用该文件恢复本地镜像:docker load --input long.tar  或者docker load < long.tardocker push image_name  //可以把自己的镜像传到dockerhub官方网站上去,但前提是需要先注册一个用户,后续如果有需求再研究吧


三、操作Docker容器


3.1、创建容器

当使用docker run来创建并启动容器时,Docker在后台运行的标准操作:(1)检查本地是否存在指定的镜像centos,不存在就从公有仓库下载(2)利用镜像创建并启动一个容器(3)分配一个文件系统,并在只读的镜像层外面挂载一层可读写层(4)从宿主主机配置的桥接网络接口中桥接一个虚拟接口到容器中去(5)从地址池配置一个IP地址给容器(6)执行用户指定的应用程序(7)执行完毕后,容器被终止
语法:
创建容器:docker create -it {image_name}docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。启动容器:docker start {container_id}新建并启动容器:docker run -t -i centos /bin/bash用下载到的镜像开启容器,-i表示让容器的标准输入打开,-t表示分配一个伪终端,要把-i -t 放到镜像名字前面[root@localhost ~]# docker run -t -i nginx /bin/bashroot@c1eff06c8501:/#守护态运行容器:docker run -itd centos /bin/bash


3.2、终止容器

可以使用docker stop来终止一个运行中的容器,改命令的格式为docker stoop [container]

首先向容器发送SIGTERM信号,等待一段超时时间(默认为10s)后,再发送SIGKILL信号来终止容器

docker kill命令会直接发送SIGKILL信号来强行终止容器

[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES402e1bd8ff16 centos "/bin/bash" 16 hours ago Up 16 hours mynginx[root@localhost ~]# docker stop mynginxmynginx


3.3、进入容器

进入容器有以下3种方法:

(1)attach命令

(2)exec命令(推荐方式)

(3)nsenter工具

(1)attach命令

[root@localhost ~]# docker attach mynginx[root@402e1bd8ff16 /]#注意:使用attach命令有时候并不方便,当多个窗口同时使用attach命令链接到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法进行操作。

(2)exec命令(推荐方式)

[root@localhost ~]# docker exec -it mynginx /bin/bash[root@402e1bd8ff16 /]#

(3)nsenter工具

[root@localhost ~]# yum install -y util-linux #安装nsenter工具

为了使nsenter链接到容器,还需要找到容器进程的PID,可以通过以下命令获取

PID=$(docker inspect --format "{{.State.Pid}}" <container>)

通过这个pid就可以连接到这个容器

nsenter -t $PID -u -i -n -p

一般情况下,将这个工具写成一个脚本更方便:

[root@localhost ~]# cat ns.sh
#!/bin/bashPID=`docker inspect --format "{{.State.Pid}}" $1`nsenter -t $PID -u -i -n -p[root@localhost ~]# ./ns.sh mynginx[root@402e1bd8ff16 ~]#


3.4、删除容器

可以使用docker rm 命令来删除处于终止或退出状态的容器,命令格式为docker rm <container>

默认情况下,docker rm 只能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器。如果需要直接删除一个运行中的容器,可以添加-f参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除。

选项:

-f:强行终止并删除在运行的一个容器

-l:删除容器的链接,但保留容器

-v:删除容器挂载的数据卷

[root@localhost ~]# docker rm nginx2
nginx2


 3.5、导入和导出容器

导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令

格式为:docker export CONTAINER_ID

docker export container_id > file.tar // 导出容器,可以迁移到其他机器上,需要导入

举例:

[root@localhost ~]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMESc40ae00fd190        centos_1            "bash"              14 hours ago        Up 14 hours         0.0.0.0:82->80/tcp   mad_yonath84acb55af1f9        nginx               "bash"              14 hours ago        Up 14 hours         0.0.0.0:81->80/tcp   prickly_montalcini[root@localhost ~]# docker export 84acb55af1f9 > file.tar

导出的文件file.tar又可以使用docker import 命令导入,成为镜像

格式:cat ***.tar |docker import - IMAGENAME:TAG

[root@localhost ~]# cat /tmp/mynginx.tar |docker import - test/nginx:v1sha256:f133989eba3b11f0b81e6976421f9510a94d8692cceb7505c4d98029870cd110[root@localhost ~]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEtest/nginx          v1                  f133989eba3b        3 seconds ago       199 MB


3.6、docker的基础命令

[root@localhost ~]# docker -hFlag shorthand -h has been deprecated, please use --helpUsage:  docker COMMANDA self-sufficient runtime for containersOptions:--config string     Location of client config files (default "/root/.docker") #客户端配置文件的位置-D, --debug         Enable debug mode  #启用Debug调试模式--help              Print usage  #查看帮助信息-H, --host list     Daemon socket(s) to connect to (default [])  #守护进程的套接字(Socket)连接-l, --log-level string   Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")    #设置日志级别-v, --version            Print version information and quit  #打印版本信息并退出Commands:  attach      Attach to a running container  #进入一个正在运行的容器  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  #创建一个新的容器  diff        Inspect changes 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归档文件  history     Show the history of an image #展示一个镜像形成历史  images      List images #列出系统当前镜像  import      Import the contents from a tarball to create a filesystem image #导入一个镜像  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  #移除一个或者多个镜像  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.  #运行docker命令在帮助可以获取更多信息


四、访问Docker仓库


4.1、解析Docker 仓库

仓库(Repository)是集中存放镜像的地方。

一个容易混淆的的概念是注册服务器(Registry)。实际上注册服务器是存放仓库的具体服务器,每个服务器上都有很多个仓库,而每个仓库下面都有多个镜像。从这方面来说,仓库可以认为是一个具体的项目或目录。例如对于仓库地址dl.dockerpool.com/centos来说,dl.dockerpool.com是注册服务器地址,centos是仓库名。

仓库又分为公有仓库(public)和私有仓库(private)

 

4.2、创建和使用私有仓库

使用registry镜像来创建私有仓库:docker pull registry

//以registry镜像启动容器,-p会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口

[root@lcalhost ~]# docker run -d -p 5000:5000 registry #这里将自动下载registry镜像并启动容器,创建本地私有仓库。Unable to find image 'registry:latest' locallyTrying to pull repository docker.io/library/registry ...latest: Pulling from docker.io/library/registry49388a8c9c86: Pull completee4d43608dd22: Pull complete3a41740f900c: Pull completee16ef4b76684: Pull complete65f212f7c778: Pull completeDigest: sha256:d837de65fd9bdb81d74055f1dc9cc9154ad5d8d5328f42f57f273000c402c76dc9bba59aa7ce072b888ca8214a76211bf03cf9d3bcb55d2183183b876683f33f[root@localhost ~]# docker psCONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMESc9bba59aa7ce        registry            "/entrypoint.sh /etc/"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp   sick_wozniak

默认的情况下,会将仓库创建在容器的/tmp/registry目录下,可以通过-v参数来将镜像文件存放在本地的指定路径上。

[root@localhost ~]# mkdir -p /opt/data/registry[root@localhost ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry[root@localhost ~]# docker imagesREPOSITORY                   TAG                 IMAGE ID            CREATED             SIZEtest/nginx                 1.10.1              def358072817        3 hours ago         106.7 MB[root@localhost ~]# docker tag test/nginx:1.10.1 192.168.0.134:5000/test2 //标记一下tag,必须带有私有仓库的ip:port[root@localhost ~]# docker push 192.168.0.134:5000/test2Get https://192.168.0.165:5000/v2/: http: server gave HTTP response to HTTPS client

tips:由于客户端采用https,docker registry未采用https服务所致。<br/>处理方法:更改配置文件:/etc/docker/daemon.json

 [root@localhost ~]# vim /etc/docker/daemon.json{"insecure-registries":["192.168.0.134:5000"]}修改完配置文件需要进行重启docker[root@localhost ~]# systemctl restart dockerdocker重启后,原先运行的容器会停止掉,需要重新开启容器[root@localhost ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry[root@localhost ~]# docker push 192.168.0.134:5000/test2The push refers to a repository [192.168.0.134:5000/test2]c4c704007df5: Pushedlatest: digest: sha256:2fa255d11989458a1f9d3173e36a911c5f40c0ba1d74b16608a27ba52fa9237a size: 528[root@localhost ~]# curl http://192.168.0.134:5000/v2/_catalog{"repositories":["test2"]}在第二台机器(192.168.0.136)上进行验证私有仓库是否可用[root@backup ~]# yum install -y docker[root@backup ~]# systemctl start docker[root@backup ~]# curl http://192.168.0.134:5000/v2/_catalog{"repositories":["test2"]}[root@backup ~]# docker pull 192.168.0.134:5000/test2Using default tag: latestTrying to pull repository 192.168.0.134:5000/test2 ...Get https://192.168.0.165:5000/v1/_ping: http: server gave HTTP response to HTTPS client出现在docker私有仓库一样的错误,于是同样修改配置文件[root@backup ~]# vim /etc/docker/daemon.json{"insecure-registries":["192.168.0.134:5000"]}[root@backup ~]# systemctl restart docker[root@backup ~]# docker pull 192.168.0.134:5000/test2Using default tag: latestTrying to pull repository 192.168.0.134:5000/test2 ...latest: Pulling from 192.168.0.134:5000/test29ff86f02c57e: Pull completeDigest: sha256:2fa255d11989458a1f9d3173e36a911c5f40c0ba1d74b16608a27ba52fa9237a[root@backup ~]# docker imagesREPOSITORY                 TAG                 IMAGE ID            CREATED                  SIZE192.168.0.165:5000/test2   latest              def358072817        Less than a second ago   106.7 MB

小结:

仓库概念的引入,为Docker镜像文件的分发和管理提供了便捷的途径,在企业生产环境中,则往往需要使用私有仓库来维护内部镜像。

 

五、Docker数据管理


用户在使用Docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及到容器的数据管理操作。

容器中管理数据主要有两种方式:

(1)数据卷(Data Volumes)

(2)数据卷容器(Data Volumes Dontainers)

 

文章导读: Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

  • 发表于 2020-08-29 11:07
  • 阅读 ( 147 )
  • 分类:docker

0 条评论

请先 登录 后评论
阿梓
阿梓

879 篇文章

作家榜 »

  1. 阿梓 879 文章
  2. p270228163 0 文章
  3. 陈洋 0 文章
  4. 维子老师 0 文章
  5. gyy 0 文章
  6. 花橙 0 文章
  7. 朱利海 0 文章
  8. 小熊 0 文章