page contents

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
  • 阅读 ( 578 )
  • 分类:Docker

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章