第七章 部署docker容器虚拟化平台

本节所讲内容:

7.1 Docker概述

7.2 部署docker容器虚拟化平台并配置docker镜像加速地址

7.3 docker平台基本使用方法

7.4 docker镜像制作和发布方法

7.5 Container容器端口映射

7.1 Docker概述

实验环境: CENTOS7.5-63 64位

7.1.1 Dcoker概述

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统。 扩展:沙盒 沙盒也叫沙箱,英文sandbox。在计算机领域指一种虚拟技术,且多用于计算机安全技术。安全软件可以先让它在沙盒中运行,如果含有恶意行为,则禁止程序的进一步运行,而这不会对系统造成任何危害。 Docker是dotCloud公司开源的一个基于LXC的高级容器引擎,源代码托管在Github上, 基于go语言并遵从Apache2.0协议开源。 Docker让开发者可以打包他们的应用以及依赖包到一个可移植的container中,然后发布到任何流行的Linux机器上。 互动: 现在接触的软件是怎么发布的? windows下的 2016-0ffice.exe ,不能在xp运行 ;mk.rpm 在redhat系列Linux上运行,但是不能在其他linux版本上运行。 例: /mnt/Packages/vsftpd-3.0.2-10.el7.x86_64.rpm #这个包是rhel7,就不能在rhel6运行。 docker的创新: docker镜像一次构建,到处运行。 扩展: LXC为Linux Container的简写。Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。 LXC主要通过来自kernel的namespace实现每个用户实例之间的相互隔离,通过cgroup实现对资源的配额和度量。 官方网站: https://www.docker.com/ 1-部署docker容器虚拟化平台-笔记-v14 - 图1 docker [ˈdɒkə(r)] 码头工人 logo: 1-部署docker容器虚拟化平台-笔记-v14 - 图2 注:docker服务相当于鲸鱼,container容器就是集装箱。 container :集装箱,容器 docker: 码头工人 docker源代码:https://github.com/moby/moby 扩展:

集装箱是海上运货的一个创新。

1-部署docker容器虚拟化平台-笔记-v14 - 图3

7.1.2 Docker容器技术和虚拟机对比

相同点: docker容器技术和虚拟机技术,都是虚拟化技术。

1-部署docker容器虚拟化平台-笔记-v14 - 图4

总结:docker相对于VM虚拟机,少了虚拟机操作系统这一层,所以docker效率比虚拟机高

你的物理系统启动使用几秒? 10秒

在docker上启动一个实例 1-2秒 吃鲸:1

7.1.3 Docker 架构

1-部署docker容器虚拟化平台-笔记-v14 - 图5

工作流程:服务器A上运行docker Engine 服务,在docker Engine上启动很多容器container , 从外网Docker Hub上把image操作系统镜像下载来,放到container容器运行。这样一个容器的实例就运行起来了。

最后,通过Docker client 对docker 容器虚拟化平台进行控制。

dockerhubdockerhub是docker官方的镜像存储站点,其中提供了很多常用的镜像供用户下载,如ubuntu, centos等系统镜像。通过dockerhub用户也可以发布自己的docker镜像,为此用户需要注册一个账号,在网站上创建一个docker仓库。

github : 有自己的帐号:1 没有:2

作为一个成功的开源人士或运维人才: 一定要注册一个github和dockerhub帐号。

为了?

1-部署docker容器虚拟化平台-笔记-v14 - 图6

Docker 核心技术

1.Namespace — 实现Container的进程、网络、消息、文件系统和主机名的隔离。

2.Cgroup — 实现对资源的配额和度量。

注:Cgroup的配额,可以指定实例使用的cpu个数,内存大小等。就像如下图,vmware虚拟机中的硬件配置参数。

1-部署docker容器虚拟化平台-笔记-v14 - 图7

7.1.4 Docker特性

文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里。

资源隔离:系统资源,像CPU和内存等可以分配到不同的容器中,使用cgroup。

网络隔离:每个进程容器运行在自己的网络空间,虚拟接口和IP地址。

日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。

变更管理:容器文件系统的变更可以提交到新的镜像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。

交互式shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。

优点:

1.一些优势和VM一样,但不是所有都一样。

比VM小,比VM快,Docker容器的尺寸减小相比整个虚拟机大大简化了分布到云和从云分发时间和开销。Docker启动一个容器实例时间很短,一两秒就可以启动一个实例

2.对于在笔记本电脑,数据中心的虚拟机,以及任何的云上,运行相同的没有变化的应用程序,IT的发布速度更快。

Docker是一个开放的平台,构建,发布和运行分布式应用程序。

Docker使应用程序能够快速从组件组装和避免开发和生产环境之间的摩擦。

3.您可以在部署在公司局域网或云或虚拟机上使用它。

4.开发人员并不关心具体哪个Linux操作系统

使用Docker,开发人员可以根据所有依赖关系构建相应的软件,针对他们所选择的操作系统。

然后,在部署时一切是完全一样的,因为一切都在DockerImage的容器在其上运行。

开发人员负责并且能够确保所有的相关性得到满足。

5.Google,微软,亚马逊,IBM等都支持Docker。

6.Docker支持Unix/Linux操作系统,也支持Windows或Mac

1-部署docker容器虚拟化平台-笔记-v14 - 图8

缺点局限性:

1.Docker用于应用程序时是最有用的,但并不包含数据。日志,跟踪和数据库等通常应放在Docker容器外。 一个容器的镜像通常都很小,不适合存大量数据,存储可以通过外部挂载的方式使用。比如使用:NFS,ipsan,MFS等, -v 映射磁盘分区

一句话:docker只用于计算,存储交给别人。

oracle 不适合使用docker来运行,太大了,存储的数据太多。

7.1.5 Docker版本简单介绍

互动:安装docker

yum install docker

yum install docker-engine

yum install docker-ce

哪个是正确的安装docker方法?

答: 都正确

Docker最早的版本名是docker 和 docker-engine,现在名字是docker-ce和docker-ee。如下图,官方网站上有明确说明:

https://docs.docker.com/install/linux/docker-ce/centos/

1-部署docker容器虚拟化平台-笔记-v14 - 图9

2017年年初,docker公司将原先的docker开源项目改名为moby。

moby是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品

docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品

docker-ee是docker公司维护的闭源产品,是docker公司的商业产品。

注:moby是源代码 ; docker-ce和docker-ee是容器产品,是rpm包。

所以,现在我们经常使用到的版本就是docker-ce版本了。

7.2 部署docker容器虚拟化平台并配置docker镜像加速地址

7.2.1 实验环境准备

实战1:部署docker容器虚拟化平台

实验环境: CENTOS7.5 64位 IP: 192.168.1.63

安装docker环境依赖

[root@xuegod63 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

配置国内docker的yum源(阿里云)

[root@xuegod63 ~]# yum-config-manager —add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker-ce

[root@xuegod63 ~]# yum install docker-ce docker-ce-cli containerd.io -y

注:docker-ce-cli 作用是docker命令行工具包

containerd.io 作用是容器接口相关包

yum info 软件包的名字,可以查看一个包的具体作用。

[root@xuegod63 ~]# systemctl start docker && systemctl enable docker

[root@xuegod63 ~]# docker version #显示 Docker 版本信息

[root@xuegod63 ~]# docker info #查看 docker 信息(确认服务运行)显示 Docker 系统信息,包括镜像和容器数。

Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 18.09.4 Storage Driver: overlay2 Backing Filesystem: xfs

。。。

Name: xuegod63.cn

ID: K62B:LVPB:WOAN:AUS6:XSOJ:XIKT:2MLA:D5GR:PBZX:2I4B:6OWK:5D6U

Docker Root Dir: /var/lib/docker ##默认的docker的家目录,后期镜像也在这个目录下

Debug Mode: false

Registry: https://index.docker.io/v1/ #默认去这个index.docker.io/v1/网站找docker镜像

7.2.2 下载docker镜像

1-部署docker容器虚拟化平台-笔记-v14 - 图10

搜索 images

[root@xuegod63 ~]# docker search centos #从 Docker Hub 中搜索符合条件的镜像。

docker镜像名字 描述 受欢迎受欢迎程度 是否官方提供

1-部署docker容器虚拟化平台-笔记-v14 - 图11

如果OFFICIAL 为[ok] ,说明可以放心使用。

方法1:从公网docker hub 拉取(下载)image pull:拉

[root@xuegod63 ~]# docker pull centos

Using default tag: latest

Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout

#报错了,因为网络的问题。 无法连接到dockerhub 下载镜像。 如果你的网络没有问题,你可以下载。 解决:换一个docker镜像下载地址

方法2:使用阿里云docker镜像加速器,提升pull的速度:

你只需要登录容器Hub服务 https://cr.console.aliyun.com的控制台,使用你的支付宝帐号,第一次登录时,需要设置一个独立的密码,左侧的加速器帮助页面就会显示为你独立分配的加速地址。

1-部署docker容器虚拟化平台-笔记-v14 - 图12

网易镜像:

https://c.163.com/hub#/m/home/ #需要先注册登录上,才能打开此站点

1-部署docker容器虚拟化平台-笔记-v14 - 图13

daemon [ˈdiːmən] 守护进程 方法1:创建配置文件daemon.json

[root@xuegod63 ~]# vim /etc/docker/daemon.json #需要手动创建daemon.json文件。写入以下内容

{ “registry-mirrors”: [“https://e9yneuy4.mirror.aliyuncs.com“] }

镜像源可以添加多个,根据自己的网络环境选择速度快的。这里给大家添加了3个老师常用的。

[root@xuegod63 ~]# vim /etc/docker/daemon.json #在文件中插入

{ “registry-mirrors”:[“https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com“] }

扩展:azk8s.cn 这个域名是上海蓝云网络科技有限公司的。

上海蓝云网络科技有限公司于2013年3月成立,由世纪互联专门为在中国境内提供Windows Azure和Office 365服务而成立,为世纪互联的全资子公司。

[root@xuegod63 ~]# systemctl daemon-reload

[root@xuegod63 ~]# systemctl restart docker

[root@xuegod63 ~]# docker info

。。。

Registry Mirrors:

https://e9yneuy4.mirror.aliyuncs.com/ #在最后,可以看到镜像仓库的地址,已经改为阿里云

[root@xuegod63 ~]# docker pull centos #再下载,就可以了。

[root@xuegod63 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos latest 0f3e07c0138f 4 weeks ago 220MB

方法2:修改docker服务启动脚本

[root@xuegod63 ~]# vim /usr/lib/systemd/system/docker.service

改:

14 ExecStart=/usr/bin/dockerd -H fd:// —containerd=/run/containerd/containerd.sock

为:

14 ExecStart=/usr/bin/dockerd -H fd:// —registry-mirror=https://rncxm540.mirror.a liyuncs.com —containerd=/run/containerd/containerd.sock

如下图:

1-部署docker容器虚拟化平台-笔记-v14 - 图14

推荐大家使用创建配置文件daemon.json的方法

重启docker服务使daemon.json生效

[root@xuegod63 ~]# systemctl daemon-reload #只有修改了systemd服务脚本,才需要重新加载,修改配服务的置文件,不需要执行这个。

[root@xuegod63 ~]# systemctl restart docker

方法3:把之前下载好的image镜像导入image:

把docker-centos7.tar 镜像上传到linux上

参数: -i docker-centos7.tar 指定载入的镜像归档。

[root@xuegod63 ~]# docker load -i /root/docker-centos7.tar

方法4:直接下载其他站点的镜像

[root@xuegod63 ~]# docker pull hub.c.163.com/library/tomcat:latest

[root@xuegod63 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

hub.c.163.com/library/tomcat latest 72d2be374029 4 months ago 292.4 MB 查看 images 列表 [root@xuegod63 ~]# docker images #列出本地所有镜像。其中 [name] 对镜像名称进行关键词查询。 REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 8caf41e7a3ea 31 minutes ago 205.3 MB 注:docker镜像相当于,对程序+程序依赖的库 打一个包 软件是依赖操作系统中的库或二进制文件。 如果我把软件所依赖的库和二进制文件打包在一起发布,不用物理机系统上的文件,也就不依赖操作系统了。 ### 7.2.3 开启动网络转发功能 开启动网络转发功能,默认会自动开启. 手动开启: [root@xuegod63 ~]# vim /etc/sysctl.conf #插入以下内容 net.ipv4.ip_forward = 1 [root@xuegod63 ~]# sysctl -p #生效 net.ipv4.ip_forward = 1 [root@xuegod63 ~]# cat /proc/sys/net/ipv4/ip_forward 1 否则,docker启动实例时,会报错以下警告: 1-部署docker容器虚拟化平台-笔记-v14 - 图15 [root@xuegod63 ~]# systemctl stop firewalld && systemctl disable firewalld #关了防火墙 [root@xuegod63 ~]# systemctl restart docker #关了防火墙,要把docker服务重启一下,不然后docker 的ip包转发功能无法使用。即使防火墙关了,docker会调用内核模块netfilter增加规则,所以有防火墙规则。 8.3 docker平台基本使用方法 例1:运行一个 container并加载镜像centos,运行起来这个实例后,在实例中执行 /bin/bash命令

docker常用参数:

run 运行

-i 以交互模式运行容器,通常与 -t 同时使用;

-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

[root@xuegod63 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos latest 196e0ce0c9fb 12 days ago 196.6 MB

[root@xuegod63 ~]# docker run -it centos:latest bash #启动一个实例,也就2秒就可以搞定

[root@068fd8c70344 /]# ls #查看实例环境

[root@f072b5ae7542 /]# cat /etc/redhat-release

退出容器:

[root@f072b5ae7542 /]#exit

例2:在 container 中启动一个长久运行的进程,不断向stdin输出 hello world 。模拟一个后台运行的服务

docker常用参数:

-d 后台运行容器,并返回容器ID;

-c 后面跟待完成的命令

[root@xuegod63 ~]# docker run -d centos:latest /bin/sh -c “while true;do echo hello world; sleep 1; done”

1b3493487c4fde6eb233d59fa9ab9a204ad993cd3debbd5a9a28be6816694605

容器的ID

从一个容器中取日志,查看输出的内容,可用于后期检查docker实例在标准输出中弹出的错误信息或正常的信息。

语法: docker logs 容器实例的Name/ID

[root@xuegod63 ~]# docker logs 1b3493487c4 #容器的ID可以写全,也可以不写全,只要唯一就可以了

hello world

hello world

hello world

hello world

查看正在运行的容器:

[root@xuegod63 ~]# docker ps #列出所有运行中容器。

1-部署docker容器虚拟化平台-笔记-v14 - 图16

也可以使用短ID或docker实例的名字查看日志输出:

[root@xuegod63 ~]# docker logs 4109c3446284

或:

[root@xuegod63 ~]# docker logs flamboyant_davinci

[root@xuegod63 ~]# docker ps -a #-a 列出所有容器(包含沉睡/退出状态的容器);

1-部署docker容器虚拟化平台-笔记-v14 - 图17

例3:杀死一个容器。 比如:杀死一个正在后台运行的容器

查看要杀死容器的ID:

[root@xuegod63 ~]# docker ps -a #-a 列出所有容器(包含沉睡/退出状态的容器);

1-部署docker容器虚拟化平台-笔记-v14 - 图18

杀死ID为c4a213627f1b的容器

[root@xuegod63 ~]# docker kill c4a213627f1b #杀死一个容器

c4a213627f1b

查看结果:

[root@xuegod63 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

例4:启动、停止、重启 container容器实例

启动: run # 创建并运行docker实例

[root@xuegod63 ~]# docker run -d centos:latest /bin/sh -c “while true;do echo hello world; sleep 1; done”

查看容器:

[root@xuegod63 ~]# docker ps

[root@xuegod63 ~]# docker stop 1a63ddea6571 关闭容器

1a63ddea6571

查看:

[root@xuegod63 ~]# docker ps

[root@xuegod63 ~]# docker start 1a63ddea6571

1a63ddea6571

[root@xuegod63 ~]# docker ps

[root@xuegod63 ~]# docker restart 1a63ddea6571

1a63ddea6571

删除指定 container : rm [root@xuegod63 ~]# docker rm 8683629d2925 Error response from daemon: You cannot remove a running container 8683629d29252eac84786bc6a0a930a10e997e4a30c071a803673f3b0d30c42d. Stop the container before attempting removal or force remove 解决:你可以先把容器8683629d2925 ,关闭然后再删除,或者加-f 强制删除 [root@xuegod63 ~]# docker rm -f 1a63ddea6571 1a63ddea6571 ## 7.4 docker镜像制作方法 Docker Image 的制作两种方法

方法1:docker commit #保存 container 的当前状态到 image后,然后生成对应的image

方法2:docker build #使用 Dockerfile 文件自动化制作 image

7.4.1 方法1:docker commit

创建一个安装好apache web服务器的容器镜像

[root@xuegod63 ~]# docker run -it centos:latest /bin/bash

[root@1d3563200047 /]# yum -y install httpd #在 container 中安装 apache 软件包

[root@1d3563200047 /]# exit

查看 images 列表

[root@xuegod63 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos latest 196e0ce0c9fb 13 days ago 196.6 MB注:当前只有一个image centos

根据容器当前状态做一个image镜像:创建一个安装了apache工具的centos镜像

语法: docker commit <新的image_name>

例:

查看容器ID:

[root@xuegod63 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

1d3563200047 centos “/bin/bash” 10 minutes ago Exited (0) 6 minutes ago tender_joliot [root@xuegod63 ~]# docker commit 1d3563200047 centos:apache sha256:e5917c01599c70d0680beeb35f6df98889dd22106399efd6907d956d8a943242 [root@xuegod63 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos apache 4fd446f1034a 16 seconds ago 269MB centos latest 0f3e07c0138f 5 weeks ago 220MB 使用新创建的centos:apache镜像,生成一台容器实例: [root@xuegod63 ~]# docker run -it centos:apache /bin/bash [root@8b1afc920454 /]# rpm -qa httpd #查看,已经安装好apache命令 httpd-2.4.6-67.el7.centos.2.x86_64 注:说明基于apache镜像的容器创建成功。 ### 7.4.2 使用docker build创建镜像 通过:docker build创建一个基于centos的httpd web服务器镜像。 使用docker build创建镜像时,需要使用 Dockerfile 文件自动化制作 image 镜像 注:Dockerfile有点像源码编译时./configure后产生的Makefile 以前安装web服务器:1、安装系统, 2、安装web 需要20分钟, 实战场景:现在要求2秒安装好一个web服务器。 实战场景: 公司要求,今天新开20个游戏服务区, 共200个服务器, 需要2分钟搞完 。 怎么办? 不会:1 解决: 提前生成web服务器的docker镜像,然后直接加载web docker镜像启动服务。 以下操作要在docker物理机上操作: 1. 创建工作目录 [root@xuegod63 ~]# mkdir /docker-build [root@xuegod63 ~]# cd /docker-build [root@xuegod63 docker-build]# touch Dockerfile 注: make自动化编译时需要Makefile文件,自动化创建docker镜像时,需要Dockerfile 2. 编辑 Dockerfile Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等。 [root@xuegod63 docker-build]# vim Dockerfile
FROM centos:7.6.1810 MAINTAINER mk@xuegod.cn RUN yum -y install httpd ADD start.sh /usr/local/bin/start.sh ADD template /var/www/html/ CMD /usr/local/bin/start.sh

注释:

FROM centos:latest # FROM 基于哪个镜像

MAINTAINER mk@xuegod.cn # MAINTAINER 镜像创建者

RUN yum -y install httpd #RUN 安装软件用

ADD start.sh /usr/local/bin/start.sh

ADD template /var/www/html/

CMD /usr/local/bin/start.sh

ADD 将文件拷贝到新产生的镜像的文件系统对应的路径。所有拷贝到新镜像中的文件和文件夹权限为0755,uid和gid为0

CMD /usr/local/bin/start.sh #当docker实例启动成功后,会执行CMD 后面的命令。所以CMD后面一般跟需要开机启动的服务或脚本。一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD. 3. 创建 start.sh脚本启动httpd服务和apache默认首页index.html文件

[root@xuegod63 docker-build]# echo “/usr/sbin/httpd -DFOREGROUND” > start.sh

注:/usr/sbin/httpd -DFOREGROUND 参数的含意:

Systemd is designed to run processes “in the foreground”, that is, they don’t have to specifically run themselves as daemons. The processes don’t exactly run in the foreground, they run under systemd and it captures their input and output, but from the process’s perspective, it is the same as running in the foreground. That is systemd’s preferred method of operation, but it does have compatibility with traditional daemons.

[root@xuegod63 docker-build]# chmod a+x start.sh

上传站点模板

[root@xuegod64 docker-build]# rz

1-部署docker容器虚拟化平台-笔记-v14 - 图19

解压模板

[root@xuegod63 ~]# unzip -d /docker-build/ /root/template.zip

4. 使用命令build来创建新的image

语法:docker build -t 父镜像名:镜像的tag Dockerfile文件所在路径

-t :表示tage,镜像名

例:使用命令docker build来创建新的image,并命名为centos:httpd

[root@xuegod63 ~]# cd /docker-build

[root@xuegod63 docker-build]# docker build -t centos:httpd-v2 ./

注: ./ 表示当前目录。另外你的当前目录下要包含Dockerfile

Sending build context to Docker daemon 1.198MB

Step 1/6 : FROM centos:7.6.1810

7.6.1810: Pulling from library/centos

ac9208207ada: Pull complete

Step 2/6 : MAINTAINER mk@xuegod.cn

—-> Running in f83bb1c5f7e1

Removing intermediate container f83bb1c5f7e1

—-> e40c3cc7dbdf

Step 3/6 : RUN yum -y install httpd

—-> Running in 607c74ace876

。。。

Step 4/6 : ADD start.sh /usr/local/bin/start.sh

—-> 7b73449d72f4

Step 5/6 : ADD template /var/www/html/

—-> 48a02ba93b7e

Step 6/6 : CMD /usr/local/bin/start.sh

—-> Running in 52e32eb93a12

Removing intermediate container 52e32eb93a12

—-> c9c29ef621bc

Successfully built c9c29ef621bc

Successfully tagged centos:httpd-v2

查看 images 列表

[root@xuegod63 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

centos httpd-v2 bfaf1b0488d1 31 seconds ago 324.5 MB 注:docker镜像主要的内容:应用/程序+库
### 7.4.3 Docker Image 的发布: 方法1:Save Image To TarBall 方法2:Push Image To Docker Hub 方法1:Save Image To TarBall 保存 Image 到 tar 包 语法:docker save -o 导出的镜像名.tar 本地镜像名:镜像标签

例:

[root@xuegod63 ~]# docker save -o docker-centos-httpd-image.tar centos:httpd-v2

[root@xuegod63 ~]# ll -h docker-centos-httpd.tar

-rw———- 1 root root 265M 1月 2 22:43 docker-centos-httpd.tar

互动:如果觉得导入的tar包太大?如何缩小?

语法:docker save 本地镜像名:镜像标签 | gzip > 导出的镜像名.tar.gz

例:

[root@xuegod63 ~]# docker save centos:httpd-v2 | gzip > docker-centos-httpd.tar.gz

查看大小:

[root@xuegod63 ~]# ll -h docker-centos-httpd.tar

-rw———- 1 root root 265M 1月 2 22:43 docker-centos-httpd.tar

-rw-r—r— 1 root root 136M 1月 2 22:43 docker-centos-httpd.tar.gz

注:发现少了1半的大小。 所以压缩效果很明显。

例: 使用导入本地镜像:

[root@xuegod63 ~]# docker rmi centos:httpd-v2 #删除镜像,这里写自己镜像的ID或名字

[root@xuegod63 ~]# docker images #发现在镜像已经被删除

[root@xuegod63 docker-build]# docker load -i docker-centos-httpd-image.tar

方法2:Push Image To Docker Hub 发布到外网

1、Signup on docker hub & create repo 注册一个帐号

https://hub.docker.com/

2、Login to docker hub

docker login -u userabc -p abc123 -e userab@gmail.com

3、Push image to docker hub #上传镜像

docker push centos:httpd

4、Pull image from docker hub #下载镜像

docker pull userabc/centos:httpd-v2 # 用户名/镜像名

方法3: 使用阿里云的私有仓库来发布你的镜像,等下节讲完私有仓库的搭建,再讲

7.5 实战-Container容器端口映射

[root@xuegod63 ~]# iptables -F

[root@xuegod63 ~]# systemctl restart docker

启动 container

[root@xuegod63 ~]# docker run -d -p 80:80 centos:httpd-v2 87fadc0249a96736f588f16b7d3ad662ef3536a06d7a74115cd7c76546ed3a22

注: -p 物理机的80端口:容器实例的80端口 ,把容器中的80端口映射到物理机上的80端口

在物理机上查看容易状态:

[root@xuegod63 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

c72fdb8da879 centos:httpd “/bin/bash -c /usr/lo” 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp sleepy_newton

查看物理机上开启的80代理端口

[root@xuegod63 ~]# netstat -antup | grep 80

tcp6 0 0 :::80 :::* LISTEN 50768/docker-proxy-

测试:http://192.168.1.63

1-部署docker容器虚拟化平台-笔记-v14 - 图20

注:现在docker实例运行的网络模式像VMware的NAT模式。 后期会讲给docker配置静态IP,就像VMware的桥接模式。 多个docker实例映射一个端口,使用k8s负载均衡,像LVS-NAT模式。

实战:访问正在运行的 container 容器实例

语法: docker exec -it /bin/bash

查看正在运行的容器ID:

[root@xuegod63 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

87fadc0249a9 centos:httpd “/bin/sh -c /usr/loca” 4 minutes ago Up 4 minutes 0.0.0.0:9000->80/tcp elated_perlman [root@xuegod63 ~]# docker exec -it 87fadc0249a9 /bin/bash #进入容器 创建 test.html 文件 [root@87fadc0249a9 /]# echo xuegod > /var/www/html/test.html [root@87fadc0249a9 /]# 测试:在物理机上查看新添加的test.html文件 [root@xuegod63 ~]# curl http://192.168.1.63/test.html xuegod 查看物理机和容器的网络:

查看容器的IP:

[root@ee28a7860cbe html]# yum install net-tools -y

[root@ee28a7860cbe html]# ip addr

。。。

22: eth0@if23: mtu 1500 qdisc noqueue state UP group default

  1. link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  2. inet <font style="color:#FF0000;">172.17.0.2</font>/16 brd 172.17.255.255 scope global eth0
  3. valid_lft forever preferred_lft forever

物理机的IP:

[root@xuegod63 ~]# ifconfig

docker0: flags=4163 mtu 1500

  1. inet <font style="color:#FF0000;">172.17.0.1 </font>netmask 255.255.0.0 broadcast 0.0.0.0

注:相当于虚拟机的NAT网络模式

测试网络:

[root@xuegod63 ~]# ping 172.17.0.2

PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.

64 bytes from 172.17.0.4: icmp_seq=1 ttl=64 time=0.414 ms

单台docker的网络结构如下:

1-部署docker容器虚拟化平台-笔记-v14 - 图21

总结:

7.1 Docker概述

7.2 部署docker容器虚拟化平台并配置docker镜像加速地址

7.3 docker平台基本使用方法

7.4 docker镜像制作和发布方法

7.5 Container容器端口映射