博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker 容器详解
阅读量:4683 次
发布时间:2019-06-09

本文共 17762 字,大约阅读时间需要 59 分钟。

Docker 是一个开源的应用容器引擎,基于Go语言 并遵Apache2.0协议开源,也是一种虚拟化技术。让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

docker核心技术

容器规范

包括docker和Google在内的若干公司组成open container lnitiative (OCI)的组织,目的是指定开放的容器规范。目前发布两个规范:runtime sec和image format spec;

容器runtime

runtime是容器运行的地方和环境,runtime需要和操作系统kernel紧密协作,为容器提供运行环境;
lxc,runc和rkt是目前主流的容器runtime;

容器管理工具

用户用来管理容器的工具,对内与runtime交互,对外为用户提供interface(接口);
runc的管理工具是docker engine,docker engine后台包含两部分deamon和cli;
在这里插入图片描述

容器定义工具

允许用户定义容器的内容和属性,容器可以被保存,共享和重建;
image是容器的模板,runtime依据image创建容器;dockerfile是包含若干命令的文件,通过命令创建image;ACI(App container image)和docker image类似,是由coreOS开发的image;

仓库registry(注册)

统一存放dockers image的仓库叫做registry。Docker hub是docker为公共提供的托管registry;
企业可以通过docker image创建私有的registry;

容器OS

为容器定制的os,是专门运行容器的操作系统,与常规os比较,体积更小,启动更快;

容器平台技术

容器编排引擎

基于容器的服务一般会采用微服务架构,该架构下应用被分为不同组件,以服务的形式运行在各自的容器中,通过api对外提供服务。
编排含义是容器管理,调度,集群定义和服务发现。通过容器编排引擎,容器有机组合成微服务应用实现业务需求。
docker swarm 是 Docker 开发的容器编排引擎。kubernetes 是 Google 领导开发的开源容器编排引擎。

容器管理平台

支持多种编排引擎,抽象了编排引擎的底层细节,为用户提供方便的功能。
Rancher 和 ContainerShip 是容器管理平台的典型代表。

基于容器的paas

为微服务应用开发人员和公司提供开发部署和管理应用平台,用户不用关心底层基础设施;
Deis、Flynn 和 Dokku 都是开源容器 PaaS 的代表。

容器支持技术

容器的基础设施

容器网络

容器的网络拓扑更加复杂和动态,需要专门的解决方案管理容器和容器,容器和其他实体之间的连通性和隔离性;
docker network是docker的原生网络解决方案

服务发现

动态变化是微服务的一大特点,负载增加时需要创建容器,负载减小时容器需要被销毁,在复杂的情况下容器内部的端口,ip和服务会发生变化,服务发现技术就是解决让客户端知道如何在变化的情况下访问容器内部的应用;它会保存容器最新信息;

监控

docker ps/top/stats是docker的原生命令监控工具。docker提供的stats API,用户可以通过http请求获取容器的状态信息;

数据管理

flocker数据管理工具保证容器会在不同host之间迁移,需要保证数据持久化和动态迁移;

日志管理

docker log是docker的日志工具;

容器和虚拟机的区别

在这里插入图片描述

虚拟化技术是在硬件物理资源的基础上,虚拟出多个os,然后在os的基础上构建相对独立的程序运行环境,而docker是在硬件物理资源os基础上进行虚拟,所有容器共享同一个os,使得容器在体积比虚拟机小很多。容器在启动方面不需要启动整个操作系统,所以部署和启动方面比虚拟机更快;

docker可以将任何应用和以及依赖的打包成一个轻量级,可移植,自包含的容器,容器可以在任何操作系统上运行;

docker基本架构

在这里插入图片描述
docker采用的是client/server架构,客户端向服务器发送请求,服务器负责构建,运行,分发,销毁容器。容器和服务器可以安装在同一个服务器也可以通过socket和REST API与远程的服务器通信!

docker应用场景

Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。

实验环境

redhat7.3 firewalld和seliunx的状态为关闭状态

docker采用rpm包安装

[root@foundation60 docker]# lsdocker-engine-17.03.1.ce-1.el7.centos.x86_64.rpmdocker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm安装完成启动docker程序[root@foundation60 docker]# systemctl start docker

docker的镜像命令:

运行容器时,使用的镜像需要本地存在。如果不存在需要连网docker自动从docker镜像仓库中下载:查看本地镜像:[root@foundation60 docker]# docker images查找镜像:需要连接网络查找:OFFICIAL:是否docker官方发布[root@foundation60 docker]# docker search httpdNAME                                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDhttpd                                   The Apache HTTP Server Project                  1853      [OK]       hypriot/rpi-busybox-httpd               Raspberry Pi compatible Docker Image with ...   41                   centos/httpd                                                                            18                   [OK]centos/httpd-24-centos7                 Platform for running Apache httpd 2.4 or b...   13                   armhf/httpd                             The Apache HTTP Server Project                  8                    macadmins/netboot-httpd                 use in combination with bruienne/bsdpy          6                    [OK]lolhens/httpd                           Apache httpd 2 Server                           2                    [OK]salim1983hoop/httpd24                   Dockerfile running apache config                2                    [OK]tplatform/aws-linux-httpd24-php70       aws-linux-httpd24-php70                         1                    [OK]fboaventura/dckr-httpd                  Small footprint http server to use with ot...   1                    [OK]lead4good/httpd-fpm                     httpd server which connects via fcgi proxy...   1                    [OK]epflidevelop/os-wp-httpd                WP httpd                                        1                    [OK]tplatform/aws-linux-httpd24-php71-fpm   aws-linux-httpd24-php71-fpm                     1                    [OK]dockerpinata/httpd                                                                      0                    trollin/httpd                                                                           0                    interlutions/httpd                      httpd docker image with debian-based confi...   0                    [OK]itsziget/httpd24                        Extended HTTPD Docker image based on the o...   0                    [OK]manasip/httpd                                                                           0                    tplatform/aws-linux-httpd24-php71       aws-linux-httpd24-php71                         0                    [OK]cilium/demo-httpd                                                                       0                    ppc64le/httpd                           The Apache HTTP Server Project                  0                    publici/httpd                           httpd:latest                                    0                    [OK]buzzardev/httpd                         Based on the official httpd image               0                    [OK]manageiq/httpd                          Container with httpd, built on CentOS for ...   0                    [OK]amd64/httpd                             The Apache HTTP Server Project                  0                    获取新的镜像:我们获取httpd第一个镜像:[root@foundation60 docker]# docker pull httpd  删除本地一个或多少镜像: [root@foundation60 ~]# docker rmi -f ubuntuUntagged: ubuntu:latestDeleted: sha256:07c86167cdc4264926fa5d2894e34a339ad27f730e8cc81a16cd21b7479e8eacDeleted: sha256:0aaccda2aadfc70ab2248437568fd17f4e8860cf612cc4b7e154b97222dccf91Deleted: sha256:9dcfe19e941956c63860afee1bec2e2318f6fbd336bc523094ed609a9c437a01Deleted: sha256:6ff1ee6fc8a0358aeb92f947fb7125cd9e3d68c05be45f5375cb59b98c850b4dDeleted: sha256:56abdd66ba312859b30b5629268c30d44a6bbef6e2f0ebe923655092855106e8 -f   强制删除本地镜像使用 Dockerfile 创建镜像:[root@foundation60 images]# docker build -f /www/Dockerfile  .-t    镜像的名字及标签-q    安静模式,成功后只输出镜像 ID-m    设置内存最大值-f    指定要使用的Dockerfile路径如果镜像版本不能满足我们的需求时,两种方法对镜像进行更新:1. 从已经创建的容器中更新镜像,并且提交这个镜像2.使用 Dockerfile 指令来创建一个新的镜像设置镜像标签:[root@foundation60 images]# docker imagesREPOSITORY                 TAG                 IMAGE ID            CREATED             SIZErhel7                      v1                  d2459b8cf75b        4 days ago          169 MB[root@foundation60 images]# docker tag d2459b8cf75b(镜像id) root(用户)/redhat(镜像原名):westos(标签)[root@foundation60 images]# docker imagesREPOSITORY                 TAG                 IMAGE ID            CREATED             SIZErhel7                      v1                  d2459b8cf75b        4 days ago          169 MBroot/redhat                westos              d2459b8cf75b        4 days ago          169 MB镜像加速器

下载镜像时太大会导致下载变慢,我们可以使用镜像加速来提高下载速度,具体配置如下:配置文件不存时需要创建

[root@foundation14 ~]# vim /etc/docker/daemon.json{  "registry-mirrors": ["https://fz55luup.mirror.aliyuncs.com"],  "bip": "172.17.0.1/24"

容器使用:

查看容器的使用命令:[root@foundation60 images]# docker -help创建一个容器:[root@foundation60 images]# docker run -d --name vm1 game2048(一个小游戏的镜像)582cb5e2f7642a6e3e5a34b2d191c2fba5fad2fb94115d8053f811ffcacf07ce另外一种创建容器方法:创建一个新的容器但不启动它[root@foundation60 images]# docker create -d  --name vm1  game2048一些常用参数:-d      ##让程序处于后台运行,并返回容器ID--name  ##自定义命名容器-i      ##以交互模式运行容器,通常与 -t 同时使用;-p      ##端口映射,格式为:主机(宿主)端口:容器端口-m      ##设置容器使用内存最大值;容器的端口映射:[root@foundation60 images]# docker run -p 800:800 -v /game:/game -d game2048使用镜像game2048,以后台模式启动一个容器,将容器的800端口映射到主机的800端口,主机的目录/game映射到容器的/game。查看我们创建的容器:[root@foundation60 images]# docker psCONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES582cb5e2f764        game2048            "/bin/sh -c 'sed -..."   About a minute ago   Up About a minute   80/tcp, 443/tcp     vm1常用参数:-a    ##显示所有的容器,包括未运行的-l    ##显示最近创建的容器-q    ##静默模式,只显示容器编号查看docker运行的日志:[root@foundation60 images]# docker logs -f  vm1(582cb5e2f7642a6e3e5a34b2d191c2fba5fad2fb94115d8053f811ffcacf07ce) ##可以写容器的id和容器的名字172.17.0.1 - - [28/Jul/2018:15:38:16 +0000] "GET / HTTP/1.1" 200 4072 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" "-"常用参数:-f   ##作用和tail -f一样的标准输出查看容器的内部进程:[root@foundation60 images]# docker top vm1UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMDroot                13953               13936               0                   23:34               ?                   00:00:00            /bin/sh -c sed -i "s/ContainerID: /ContainerID: "$(hostname)"/g" /usr/share/nginx/html/index.html && nginx -g "daemon off;"root                13974               13953               0                   23:34               ?                   00:00:00            nginx: master process nginx -g daemon off;100                 13975               13974               0                   23:34               ?                   00:00:00            nginx: worker processdocker pause :暂停容器中所有的进程docker unpause :恢复容器中所有的进程查看Docker的底层信息或者获取容器/镜像的元数据:[root@foundation60 images]# docker inspect vm1......................... "IPAddress": "172.17.0.2",  ##容器的ip。我们可以通过浏览器访问我们刚才创建的小游戏.........................运行中的容器执行命令:[root@foundation60 images]# docker exec -it vm1 /bin/sh /root/script.sh##容器vm1执行/root/script.sh的脚本连接正在运行的容器:[root@foundation60 netns]# docker container attach vm1将文件系统作为一个tar归档文件导出到STDOUT:[root@foundation60 ~]# docker export -o game-`date +%Y%m%d`.tar vm1[root@foundation60 ~]# ls game-`date +%Y%m%d`.targame-20180729.tar从归档文件中创建镜像:[root@foundation60 ~]# docker import  my_images.tar images.namemy_images.tar ##tar镜像源文件images.name   ##指定镜像的名字-c            ##应用docker 指令创建镜像将镜像的tar文件导入本地镜像:[root@foundation14 images]# docker load  -i game2048.tar 从容器创建一个新的镜像:[root@foundation60 ~]# docker commit [option] vm1  game:vm1参数[option]:-a    ##提交的镜像作者;-c    ##使用Dockerfile指令来创建镜像;-m    ##提交时的说明文字;-p    ##在commit时,将容器暂停。容器与主机之间的数据拷贝:[root@foundation60 ~]# docker cp /www/game vm1:/www/将主机/www/game文件拷贝到vm1容器的/www/目录下停止容器:[root@foundation60 images]# docker stop vm1vm1启动容器:[root@foundation60 images]# docker start vm1删除容器:删除容器时必须停止容器否则会报错[root@foundation60 images]# docker rm vm1vm1[root@foundation60 images]# docker kill -s KILL vm1-s    ##向容器发送一个信号

浏览器访问创建的小游戏:

这里写图片描述
网络管理:

[root@foundation60 ~]# ip netns list[root@foundation60 ~]# ip netns help[root@foundation60 ~]# ip netns add tset[root@foundation60 ~]# ip netns listtset对于生成的网络文件进行查看:[root@foundation60 ~]# cd /var/run/netns/[root@foundation60 netns]# lstset[root@foundation60 netns]# ip netns del tset网络相关设置:[root@foundation60 netns]# docker run -it --name vm1  --net none ubunturoot@d9eb434dfac3:/# ip addr[root@foundation60 ~]www.yongshi123.cn# docker inspect vm1 | grep Pid            "Pid": 19458,            "PidMode": "",            "PidsLimit": 0,[root@foundation60 ~]# cd www.fengshen157.com/ /proc/19458[root@foundation60 ns]# ip www.thd540.com link add veth0 type veth peer name veth1[root@foundation60 ns]# ln -s /proc/19458/ns/net /var/run/netns/19458[root@foundation60 ns]# ip netns list19458[root@foundation60 ns]# ip link set veth1 netns 19458[root@foundation60 ns]# brctl addif docker0 veth0[root@foundation60 ns]# brctl showdocker0		8000.02427684c23a	no		veth0[root@foundation60 ns]# ip link set up dev veth0

使用Dockerfile文件安装httpd

1.[root@foundation60 ~]# docker rm -f `docker ps -aq`2.[root@foundation60 tmp]# pwd/tmp[root@foundation60 tmp]# mkdir docker[root@foundation60 tmp]# cd docker/3.[root@foundation60 docker]# vim DockerfileFROM rhel7MAINTAINER hello@westos.orgENV HOSTNAME server1EXPOSE 80COPY dvd.repo /etc/yum.repos.d/dvd.repoRUN yum install -y httpd && yum clean allCMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]4.[root@foundation60 docker]# vim dvd.repo[dvd]name=rhel7.3baseurl=http://172.25.254.60/rhel7.3gpgcheck=0

镜像的导入导出

Export命令用于持久化容器(不是镜像)

[root@localhost ~]# docker export vm1 > /root/httpd.tar
  • 1

Save命令用于持久化镜像(不是容器)

[root@localhost ~]# docker save httpd > /root/http1.tar
  • 1

tar镜像的导入

[root@localhost ~]# docker load < /root/game2048.tar
  • 1

Docker镜像构建

1.docker commit 命令

创建新镜像最直观的方法,其过程包含三个步骤:
运行容器
修改容器
将容器保存为新的镜像

[root@localhost ~]# docker pull centosUsing default tag: latestTrying to pull repository docker.io/library/centos ... latest: Pulling from docker.io/library/centos256b176beaff: Pull complete Digest: sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024fafStatus: Downloaded newer image for docker.io/centos:latest[root@localhost ~]# docker images centosREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEdocker.io/centos    latest              5182e96772bf        6 weeks ago         200 MB[root@localhost ~]# docker run -it centos[root@5ef69ea7f61c /]# vim bash: vim: command not found[root@5ef69ea7f61c /]# yum install -y vim重新开启新的窗口保存新的镜像:[root@localhost ~]# docker psCONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                NAMES5ef69ea7f61c        centos              "/bin/bash"          5 minutes ago       Up 5 minutes                              laughing_goldstine  #docker随机为镜像的命名d80f027e7921        httpd               "httpd-foreground"   26 minutes ago      Up 26 minutes       0.0.0.0:80->80/tcp   web1[root@localhost ~]# docker commit laughing_goldstine centos-with-vimsha256:3f12389b98be1712cc32d63a25d3c2c7b8f4d89573582008b094f499ade8070b[root@localhost ~]# docker imagesREPOSITORY              TAG                 IMAGE ID            CREATED              SIZEcentos-with-vim         latest              3f12389b98be        About a minute ago   348 MB  #我们自己保存的镜像docker.io/hello-world   latest              4ab4c602aa5e        2 weeks ago          1.84 kBdocker.io/httpd         latest              d595a4011ae3        2 weeks ago          178 MBdocker.io/centos        latest              5182e96772bf        6 weeks ago          200 MB[root@localhost ~]# docker run -it centos-with-vim[root@97c804af9f8c /]# ls  anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  varbin                etc  lib   media  opt  root  sbin  sys  usr[root@97c804af9f8c /]# vim anaconda-post.log  #可以使用vim编辑文件

2.Docketfile文件构建镜像

[root@localhost ~]# pwd/root[root@localhost ~]# lsDockerfile[root@localhost ~]# cat Dockerfile FROM centosRUN  yum install -y vim && yum install -y wget && yum install -y net-tools[root@localhost ~]# docker build -t centos-with-dockerfile .# -t  命名镜像名字   .   表示在当前目录下查询Dockerfile文件[root@localhost ~]# docker imagesREPOSITORY               TAG                 IMAGE ID            CREATED             SIZEcentos-with-dockerfile   latest              dc5ed57418c5        17 seconds ago      349 MBcentos-with-vim          latest              3f12389b98be        21 minutes ago      348 MBdocker.io/hello-world    latest              4ab4c602aa5e        2 weeks ago         1.84 kBdocker.io/httpd          latest              d595a4011ae3        2 weeks ago         178 MBdocker.io/centos         latest              5182e96772bf        6 weeks ago         200 MB###build context 为当前目录 /root,Dockerfile 中的 ADD、COPY 等命令可以将该目录下的所有文件和子目录都会被发送给 Docker daemon。因此放置文件时需要注意###查看镜像制作过程中具体执行了什么命令[root@localhost ~]# docker history centos-with-dockerfileIMAGE               CREATED             CREATED BY                                      SIZE                COMMENTdc5ed57418c5        9 minutes ago       /bin/sh -c yum install -y vim && yum insta...   150 MB              5182e96772bf        6 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
6 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.... 0 B
6 weeks ago /bin/sh -c #(nop) ADD file:6340c690b08865d... 200 MB ###Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建。

3.dockerfile文件解释

FROM :指定需要的base镜像

COPY:将镜像的context目录下的文件复制到镜像里面;
ADD :和COPY命令类似,将context目录下文件复制到镜像里面,如果src时归档文件时会被解压到test
ENV :设置环境变量,环境变量可以被后面的指令使用;
EXPOSE: 指定容器的进程会监听某个端口
VOLUME :将文件或者目录声明为volume
WORKDIR : 为后面的run和cmd,entrypoint,add,copy指令设置镜像中当前工作目录;
RUN :在容器中运行指定的命令。
CMD : 容器启动时运行指定的命令。
Dockerfile: 中可以有多个 CMD 指令,但只有最后一个生效。CMD 可以被 docker run 之后的参数替换。
ENTRYPOINT:设置容器启动时运行的命令。

小实验:[root@localhost ~]# mkdir httpd   #新建http目录[root@localhost httpd]# cat Dockerfile #my dockerfileFROM centosMAINTAINER kangWORKDIR /testdirRUN  touch tmpfile1 COPY ["tmpfile2","."]ADD ["nginx-1.12.2.tar.gz","."]ENV WELCOME "you are in my container,welcome![root@localhost httpd]# ls    # 构建前确保 build context 中存在需要的文件Dockerfile  nginx-1.12.2.tar.gz  tmpfile2[root@localhost httpd]# docker build -t httpd1 .Sending build context to Docker daemon 985.6 kBStep 1/7 : FROM centos ---> 5182e96772bfStep 2/7 : MAINTAINER kang ---> Running in b1cc4331efae ---> 2bc74d720ab7Removing intermediate container b1cc4331efaeStep 3/7 : WORKDIR /testdir ---> fc4d6484ad68Removing intermediate container e8f1403e3aa2Step 4/7 : RUN touch tmpfile1 ---> Running in eb5ce5f0afd9 ---> 077aa268352dRemoving intermediate container eb5ce5f0afd9Step 5/7 : COPY tmpfile2 . ---> c87a1cbf1300Removing intermediate container 5199ac121255Step 6/7 : ADD nginx-1.12.2.tar.gz . ---> 6175f37f9228Removing intermediate container 51a868f34d62Step 7/7 : ENV WELCOME "you are in my container,welcome! ---> Running in 64cd3d517f31 ---> cdee0cc207d8Removing intermediate container 64cd3d517f31Successfully built cdee0cc207d8[root@localhost httpd]# docker run -it httpd1[root@b9c7983069e7 testdir]# lsnginx-1.12.2  tmpfile1  tmpfile2[root@b9c7983069e7 testdir]# echo $WELCOMEyou are in my container,welcome!

--------------------- 本文来自 守护灬天使 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/weixin_39249306/article/details/81266562?utm_source=copy 

转载于:https://www.cnblogs.com/qwangxiao/p/9741743.html

你可能感兴趣的文章
追加内容到指定的行
查看>>
Centos7下安装Redis
查看>>
Codeforces Round #369 (Div. 2) C. Coloring Trees DP
查看>>
Android Preference 实现长按监听 long-clickable
查看>>
03 django1.0.2 默认管理配置
查看>>
mysql 中 unix_timestamp和from_unixtime函数
查看>>
Java Web项目BlogAutoGenerator编写日志1
查看>>
简单数论(一)
查看>>
Populating Next Right Pointers in Each Node
查看>>
CXF和Axis的比较【转】
查看>>
设计一个函数,它接受不定数量的参数,这是参数都是函数。这些函数都接受一个回调函数作为参数,按照回调函数被调用的顺序返回函数名...
查看>>
Android 轮播
查看>>
我的人生导师
查看>>
Ubuntu 18.04 安卓调试小米
查看>>
<泛> STL - vector 模拟实现
查看>>
[Error]configure: error: Package requirements (fuse >= 2.3 glib-2.0 gthread-2.0) were not met:
查看>>
MyBatis学习总结_06_调用存储过程
查看>>
java课程课后作业190425之一维数组最大子数组—功能扩展(界面实现)
查看>>
Android开发:Eclipse+OpenCV环境搭建
查看>>
netlink--内核态与用户态通信
查看>>