docker 容器详解

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;
docker 容器详解

容器定义工具
允许用户定义容器的内容和属性,容器可以被保存,共享和重建;
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的日志工具;

容器和虚拟机的区别

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

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

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

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

实验环境
redhat7.3 firewalld和seliunx的状态为关闭状态

docker采用rpm包安装

[root@foundation60 docker]# ls
docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm
docker-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 httpd
NAME                                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
httpd                                   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 ubuntu
Untagged: ubuntu:latest
Deleted: sha256:07c86167cdc4264926fa5d2894e34a339ad27f730e8cc81a16cd21b7479e8eac
Deleted: sha256:0aaccda2aadfc70ab2248437568fd17f4e8860cf612cc4b7e154b97222dccf91
Deleted: sha256:9dcfe19e941956c63860afee1bec2e2318f6fbd336bc523094ed609a9c437a01
Deleted: sha256:6ff1ee6fc8a0358aeb92f947fb7125cd9e3d68c05be45f5375cb59b98c850b4d
Deleted: 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 images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
rhel7                      v1                  d2459b8cf75b        4 days ago          169 MB
[root@foundation60 images]# docker tag d2459b8cf75b(镜像id) root(用户)/redhat(镜像原名):westos(标签)
[root@foundation60 images]# docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
rhel7                      v1                  d2459b8cf75b        4 days ago          169 MB
root/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 ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
582cb5e2f764        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 vm1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                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 process
docker 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`.tar
game-20180729.tar

从归档文件中创建镜像:
[root@foundation60 ~]# docker import  my_images.tar images.name
my_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 vm1
vm1

启动容器:
[root@foundation60 images]# docker start vm1

删除容器:删除容器时必须停止容器否则会报错
[root@foundation60 images]# docker rm vm1
vm1
[root@foundation60 images]# docker kill -s KILL vm1
-s    ##向容器发送一个信号

浏览器访问创建的小游戏:
docker 容器详解
网络管理:

[root@foundation60 ~]# ip netns list
[root@foundation60 ~]# ip netns help
[root@foundation60 ~]# ip netns add tset
[root@foundation60 ~]# ip netns list
tset
对于生成的网络文件进行查看:
[root@foundation60 ~]# cd /var/run/netns/
[root@foundation60 netns]# ls
tset
[root@foundation60 netns]# ip netns del tset
网络相关设置:
[root@foundation60 netns]# docker run -it --name vm1  --net none ubuntu
root@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 list
19458
[root@foundation60 ns]# ip link set veth1 netns 19458
[root@foundation60 ns]# brctl addif docker0 veth0
[root@foundation60 ns]# brctl show
docker0		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 Dockerfile
FROM rhel7
MAINTAINER hello@westos.org
ENV HOSTNAME server1
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN yum install -y httpd && yum clean all
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
4.[root@foundation60 docker]# vim dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.254.60/rhel7.3
gpgcheck=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 centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
256b176beaff: Pull complete
Digest: sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf
Status: Downloaded newer image for docker.io/centos:latest
[root@localhost ~]# docker images centos
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.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 ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                NAMES
5ef69ea7f61c        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-vim
sha256:3f12389b98be1712cc32d63a25d3c2c7b8f4d89573582008b094f499ade8070b
[root@localhost ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED              SIZE
centos-with-vim         latest              3f12389b98be        About a minute ago   348 MB  #我们自己保存的镜像
docker.io/hello-world   latest              4ab4c602aa5e        2 weeks ago          1.84 kB
docker.io/httpd         latest              d595a4011ae3        2 weeks ago          178 MB
docker.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  var
bin                etc  lib   media  opt  root  sbin  sys  usr
[root@97c804af9f8c /]# vim anaconda-post.log  #可以使用vim编辑文件

2.Docketfile文件构建镜像

[root@localhost ~]# pwd
/root
[root@localhost ~]# ls
Dockerfile
[root@localhost ~]# cat Dockerfile
FROM centos
RUN  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 images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
centos-with-dockerfile   latest              dc5ed57418c5        17 seconds ago      349 MB
centos-with-vim          latest              3f12389b98be        21 minutes ago      348 MB
docker.io/hello-world    latest              4ab4c602aa5e        2 weeks ago         1.84 kB
docker.io/httpd          latest              d595a4011ae3        2 weeks ago         178 MB
docker.io/centos         latest              5182e96772bf        6 weeks ago         200 MB
###build context 为当前目录 /root,Dockerfile 中的 ADD、COPY 等命令可以将该目录下的所有文件和子目录都会被发送给 Docker daemon。因此放置文件时需要注意

###查看镜像制作过程中具体执行了什么命令
[root@localhost ~]# docker history centos-with-dockerfile
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
dc5ed57418c5        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
<missing>           6 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema....   0 B
<missing>           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 dockerfile
FROM centos
MAINTAINER kang
WORKDIR /testdir
RUN  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 kB
Step 1/7 : FROM centos
 ---> 5182e96772bf
Step 2/7 : MAINTAINER kang
 ---> Running in b1cc4331efae
 ---> 2bc74d720ab7
Removing intermediate container b1cc4331efae
Step 3/7 : WORKDIR /testdir
 ---> fc4d6484ad68
Removing intermediate container e8f1403e3aa2
Step 4/7 : RUN touch tmpfile1
 ---> Running in eb5ce5f0afd9

 ---> 077aa268352d
Removing intermediate container eb5ce5f0afd9
Step 5/7 : COPY tmpfile2 .
 ---> c87a1cbf1300
Removing intermediate container 5199ac121255
Step 6/7 : ADD nginx-1.12.2.tar.gz .
 ---> 6175f37f9228
Removing intermediate container 51a868f34d62
Step 7/7 : ENV WELCOME "you are in my container,welcome!
 ---> Running in 64cd3d517f31
 ---> cdee0cc207d8
Removing intermediate container 64cd3d517f31
Successfully built cdee0cc207d8
[root@localhost httpd]# docker run -it httpd1
[root@b9c7983069e7 testdir]# ls
nginx-1.12.2  tmpfile1  tmpfile2
[root@b9c7983069e7 testdir]# echo $WELCOME
you are in my container,welcome!

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

上一篇:python环境搭建和开发工具的配置【转】


下一篇:Docker网络详解