docker从入门到实战

这是一些自己的小感悟:
Docker 镜像是用于创建 Docker 容器的模板。相当于Java中的类和对象的关系。
创建一个需要长期运行的容器:docker run -itd --name mycentos3 -p 8090:8080 3662aa10cc6a /bin/bash
登录容器且退出不会关闭容器:docker exec -it f157e658a0c8 /bin/bash
推送镜像的规范是:docker push 注册用户名/镜像名

docker commit :从容器创建一个新的镜像。
# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。

docker commit -a "dongxq:852783734@qq.com" -m "this is docker repository.  It contains centos7 jdk8:usr/local tomcat8:usr/local,在/root/.bashrc文件中配置了source /etc/profile,使得每次重新进入容器时,环境变量生效" b616b49b50cc mycentos7:v2
重命名镜像docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签):docker tag ca1b6b825289 vampiredawn/mycentos7:v1

docker stop $(docker ps -a -q)
docker rmi $(docker images -q)
如果因为有多个容器id一样,删除不掉的话,根据名称删除
删除时使用name  不要用  IMAGE ID  
删除name后删除 IMAGE ID
  1. 虚拟化
    在计算机中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。

在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件对资源充分利用。

虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、虚拟机等等。

1.1. Hypervisor
Hypervisor也叫虚拟机监视器(Virtual Machine Monitor),是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,它可以协调访问服务器上的所有物理设备和虚拟机。

Hypervisor是所有虚拟化技术的核心。当服务器启动并执行Hypervisor时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统。使软硬件架构和管理更高效、更灵活,硬件的效能能够更好地发挥出来。

常见的产品有:VMware、KVM、Xen等等。

1.2. 容器技术
在计算机的世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化(hypervisor virtualization)有所不同,管理程序虚拟化通过中间层将一台或者多台独立的机器虚拟运行与物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间。因此,容器虚拟化也被称为“操作系统级虚拟化”,容器技术可以让多个独立的用户空间运行在同一台宿主机上。

由于“客居”于操作系统,容器只能运行与底层宿主机相同或者相似的操作系统,这看起来并不是非常灵活。例如:可以在Ubuntu服务中运行Redhat Enterprise Linux,但无法再Ubuntu服务器上运行Microsoft Windows。

容器被认为是精益技术,因为容器需要的开销有限。和传统虚拟化以及半虚拟化相比,容器不需要模拟层(emulation layer)和管理层(hypervisor layer),而是使用操作系统的系统调用接口。这降低了运行单个容器所需的开销,也使得宿主机中可以运行更多的容器。

  1. Docker介绍
    2.1. Docker组件

Docker核心组件都有:
 Docker客户端
 Docker服务器
 Docker镜像
 Docker仓库
 Docker容器。

2.1.1. Docker客户端和服务器
Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。我们可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。

2.1.2. Docker镜像和仓库
Docker 镜像是用于创建 Docker 容器的模板。用户基于镜像来创建Docker容器。
镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。例如:
 添加一个文件;
 执行一个命令;
 打开一个窗口。
也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。

Docker仓库是用来保存用户构建的镜像的地方也叫做Registry。仓库分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。

2.1.3. 容器
Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。

我们可以简单的认为,镜像是Docker中的构建或者打包阶段,而容器则是启动或者执行阶段。容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。

Docker借鉴了标准集装箱的概念,标准集装箱将货物打包装箱后,运往世界各地。Docker将这个模型运用到自己的设计中,不同的是:集装箱运输货物,而Docker运输软件。

和集装箱一样,Docker在执行上述操作时,并不关心容器中到底装了什么,它不管是web服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容“装载”进去。

Docker也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱一样,Docker容器方便替换,可以叠加,易于分发,并且尽量通用。

2.2. Docker优点
Docker 是一个开源的虚拟化容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。
2.2.1. 提供一个简单、轻量的建模方式
Docker上手非常快,用户只需要几分钟,就可以把自己的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改”的境界。
随后,就可以创建容器来运行应用程序了。大多数Docker容器只需要不到1秒中即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。
2.2.2. 职责的逻辑分离
使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是正常的,上线后出了问题就归结为肯定是运维的问题)”

Build once,Run anywhere

2.2.3. 快速、高效的开发
Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件件的取。)

2.2.4. 鼓励使用面向服务的架构
Docker还鼓励面向服务的体系结构和微服务架构。Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用 程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程序)

2.2.5. 使用上区别
在这里插入图片描述

  1. 安装Docker
    3.1. 说明
    Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。

    由于我们学习的环境都使用的是CentOS,因此这里我们将Docker安装到CentOS上。注意:这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境而且Docker很多补丁不支持更新。
    3.2. CentOS 7 下安装Docker
    在课程资料中找到以下镜像文件安装到VMware Workstation中
    CentOS-7-x86_64-DVD-1611.iso

3.3. 安装Docker
使用yum命令安装
[root@VM_0_2_centos ~]# yum install docker

查看docker版本号
[root@VM_0_2_centos ~]# docker –v
在这里插入图片描述

3.4. Docker服务命令
 开机启动:systemctl enable docker.service/docker
 启动docker:systemctl start docker.service
 停止docker:systemctl stop docker.service
 重启docker:systemctl restart docker.service
 查看docker状态:systemctl status docker.service
 查看docker概要信息:docker info
 查看docker帮助文档:docker --help
4. 使用Docker镜像和仓库
4.1. 列出镜像
在这里插入图片描述
 REPOSITORY:镜像所在的仓库名称
 TAG:镜像标签
 IMAGE ID:镜像ID
 CREATED:镜像的创建日期(不是获取该镜像的日期)
 SIZE:镜像大小
4.2. 镜像tag
为了区分同一个仓库下的不同镜像,Docker提供了一种称为标签(Tag)的功能。每个镜像在列出来时都带有一个标签,每个标签对组成特定镜像的一些镜像层进行标记(比如,标签12.04就是对所有Ubuntu12.04镜像层的标记)。这种机制使得同一个仓库中可以存储多个镜像。
我们在运行同一个仓库中的不同镜像时,可以通过在仓库名后面加上一个冒号和标签名来指定该仓库中的某一具体的镜像,例如docker run --name custom_container_name –i –t docker.io/ubunto:12.04 /bin/bash,表明从镜像Ubuntu:12.04启动一个容器,而这个镜像的操作系统就是Ubuntu:12.04。
4.3. 查找镜像
在这里插入图片描述
可以使用 docker search ${name} 查找docker hub上的镜像
 NAME:仓库名称
 DESCRIPTION:镜像描述
 STARS:用户评价,反应一个镜像的受欢迎程度
 OFFICIAL:是否官方
 AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的

4.4. 拉取镜像
4.4.1. 说明
Docker镜像首页,包括官方镜像和其它公开镜像。Docker Hub上最受欢迎的10大镜像(通过Docker registry API获取不了镜像被pull的个数,只能通过镜像的stars数量,来衡量镜像的流行度。)。
在这里插入图片描述
国情的原因,国内下载 Docker HUB 官方的相关镜像比较慢,可以使用国内(docker.io)的一些镜像加速器,镜像保持和官方一致,关键是速度块,推荐使用。Mirror与Private Registry的区别:
 Private Registry(私有仓库)是开发者或者企业自建的镜像存储库,通常用来保存企业内部的 Docker 镜像,用于内部开发流程和产品的发布、版本控制。
 Mirror是一种代理中转服务,我们(比如daocloud)提供的Mirror服务,直接对接Docker Hub的官方Registry。Docker Hub 上有数以十万计的各类 Docker 镜像。
 在使用Private Registry时,需要在Docker Pull 或Dockerfile中直接键入Private Registry 的地址,通常这样会导致与 Private Registry 的绑定,缺乏灵活性。
 使用 Mirror 服务,只需要在 Docker 守护进程(Daemon)的配置文件中加入 Mirror 参数,即可在全局范围内透明的访问官方的 Docker Hub,避免了对 Dockerfile 镜像引用来源的修改。
 简单来说,Mirror类似CDN,本质是官方的cache;Private Registry类似私服,跟官方没什么关系。对用户来说,由于用户是要拖docker hub上的image,对应的是Mirror。yum/apt-get的Mirror又有点不一样,它其实是把官方的库文件整个拖到自己的服务器上做镜像,并定时与官方做同步;而Docker Mirror只会缓存曾经使用过的image。

4.4.2. 从docker hub拉取镜像

docker pull centos:7(指定version)。
目前国内访问docker hub速度上有点尴尬,使用docker Mirror势在必行。现有国内提供docker镜像加速服务的商家有不少,下面介绍:

4.4.3. ustc的镜像
ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
步骤:
1. 编辑文件

vi /etc/docker/daemon.json

2. 在文件中输入如下内容
{
“registry-mirrors”: [“https://docker.mirrors.ustc.edu.cn”]
}

3. 重启docker服务,如果重启docker后无法加速,可以重新启动Linux

systemctl restart docker.service
注意:一定要重启才能生效

4. 使用docker pull命令下载镜像

docker pull centos:7

5. 查看已下载的镜像
docker images

4.4.4. 其他镜像仓库
4.4.4.1. daocloud镜像
DaoCloud也提供了docker加速器,但是跟ustc不同,需要用户注册后才能使用,并且每月限制流量10GB。linux上使用比较简单,一条脚本命令搞定。
官网:https://www.daocloud.io/mirror#accelerator-doc
配置加速器步骤:
1、 执行该命令:curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://{your_id}.m.daocloud.io

2、 实际上面的脚本执行后,改的是/usr/lib/systemd/system/docker.service文件,加了个–registry-mirror参数。如果不执行上面的脚本命令,可以如下直接修改这个文件也可.

3、 重启加载配置。说明:加速效果不是很明显。
 systemctl daemon-reload // 重新加载配置
 systemctl restart docker
4、 下载镜像:以nginx为例

执行命令:docker pull daocloud.io/daocloud/nginx-proxy

4.4.4.2. alicloud
阿里云也提供了docker加速器,不过比daocloud更麻烦:不光要注册为阿里云的用户,还得加入开发者平台。不过虽然麻烦,但是它的服务还真是不错,pull速度很溜!配置方法跟daocloud类似,也是开通加速器以后给一个url。
步骤:
1、 同daocloud一样,在该/usr/lib/systemd/system/docker.service文件中添加: --registry-mirror=https://{your_id}.mirror.aliyuncs.com
2、 重新加载配置并且重启
3、 下载需要的镜像,例如:docker pull ubuntu

4.4.4.3. 网易镜像
网易也提供了Docker镜像服务:网易蜂巢(https://c.163.com/hub#/m/home/)

4.5. 删除镜像
1、 docker rmi $IMAGE_ID:删除指定镜像

2、 docker rmi docker images -q:删除所有镜像

  1. 容器操作
    5.1. 创建容器
    5.1.1. 创建容器命令
    使用命令docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
    创建容器常用的参数说明:
     创建容器命令:docker run
     -i:表示以“交互模式”运行容器
     -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
     --name :为创建的容器命名。
     -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
     -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
     -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

5.1.2. 实例
创建一个交互式容器并起名叫mycentos
docker run -it --name mycentos centos:7 /bin/bash

创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。命令如下(容器名称不能重复):
docker run -itd --name mycentos2 centos:7 /bin/bash

5.2. 查看容器
5.2.1. 查看正在运行的容器
docker ps

退出当前容器,该容器也随之停止:

5.2.2. 查看所有的容器
启动过的历史容器:
docker ps –a

5.2.3. 查看最后一次运行的容器
docker ps –l

5.3. 登录退出容器
5.3.1. 登录容器
 登录(附着)守护式容器方式:
 docker attach container_name 或者 container_id
例如:docker attach 83a46ff1aef6
exit退出时,容器随之停止

 docker exec –it container_name 或者 container_id /bin/bash
例如:docker exec -it mycentos3 /bin/bash
exit退出时,容器不会停止

5.3.2. 退出容器
退出容器可以使用exit命令或者使用[ctrl + D]退出。

5.4. 容器命名
docker rename 原名称 新名称

5.5. 启动停止容器
5.5.1. 停止正在运行的容器
docker stop $CONTAINER_NAME/ID
例如:docker stop 5982286fa3a8

5.5.2. 启动已运行过的容器
docker start $CONTAINER_NAME/ID
例如:docker start 5982286fa3a8

5.5.3. 删除容器
删除容器:docker rm $CONTAINER_ID/NAME
例如:docker rm 5982286fa3a8

删除所有容器:docker rm docker ps -a -q

5.6. 其他操作
5.6.1. 深入容器内部:
docker inspect $CONTAINER_NAME/ID
例如:docker inspect 3f311573c03e

还可以通过-f或者–format来选定查看的结果
docker inspect -f=’{{.NetworkSettings.IPAddress}}’ 3f311573c03e

  1. Docker环境下部署应用程序
    在docker中部署应用可以有多种方式:
     方案一:根据系统镜像创建Docker容器,这个时候Docker就相当于一个虚拟机,然后进入容器部署对应的应用。具体步骤如下:
    1、 启动Centos系统镜像的容器my_container;
    2、 在该容器中部署应用程序,例如:Tomcat、Nginx等;
    3、 将部署完的my_container提交为新的镜像;
    4、 然后根据新的镜像去创建容器;
    5、 这个镜像可以打包,导入到其他的Docker服务器上
     方案二:直接通过docker pull拉取别人提交好的tomcat、nginx等应用程序镜像,然后基于这些镜像去创建容器。

6.1. 安装Tomcat-方案一
步骤:
1、 从docker hub上拉取镜像
docker pull centos:7

2、 列出已有的镜像
docker images

3、 创建交互式容器
docker run -it --name=mycentos centos:7 /bin/bash

4、 在容器中安装jdk。
1)将jdk上传到容器中:
先将jdk上传到宿主机中

2)从宿主机复制jdk到容器中
[root@VM_0_2_centos ~]# docker cp jdk-7u75-linux-x64.tar.gz mycentos:/
3)在容器中解压缩,并将jdk移动到/usr/local目录下
[root@9e6c1035c223 /]# tar -zxf jdk-7u75-linux-x64.tar.gz
[root@9e6c1035c223 /]# mv jdk1.7.0_75/ /usr/local/jdk7
4)配置环境变量
[root@9e6c1035c223 /]# vi /etc/profile
5)在文件末尾追加
export JAVA_HOME=/usr/local/jdk7
export PATH= P A T H : PATH: PATH:JAVA_HOME/bin

5、 将Tomcat上传到容器中
1)将Tomcat上传到宿主机,

2)上传到容器中。
[root@VM_0_2_centos ~]# docker cp apache-tomcat-7.0.47.tar.gz mycentos:/

6、 安装Tomcat
1) 在容器中解压Tomcat
[root@9e6c1035c223 /]# tar -zxf apache-tomcat-7.0.47.tar.gz
2) 移动Tomcat到/usr/local中
[root@9e6c1035c223 /]# mv apache-tomcat-7.0.47/ /usr/local/tomcat7

7、 将此容器提交为新的镜像
[root@VM_0_2_centos ~]# docker commit mycentos mytomcat7

8、 我们可以将手动制作好的镜像打包:
[root@VM_0_2_centos ~]# docker save mytomcat7 > /root/tomcat7.tar.gz

然后将这个镜像包上传到别的机器上

9、加载镜像
[root@VM_0_2_centos ~]# docker load < /root/tomcat7.tar.gz

10、利用新提交的镜像启动tomcat容器
创建容器时做端口映射,将host的8888端口映射到容器的8088端口,使用-p参数做映射
[root@VM_0_2_centos ~]# docker run -dit --name tomcat2 -p 8888:8080 mytomcat7 /bin/bash

11、登陆容器,启动tomcat进程
[root@VM_0_2_centos ~]# docker exec -it tomcat2 /bin/bash
[root@7c63d3925b50 /]# source /etc/profile
[root@7c63d3925b50 /]# /usr/local/tomcat7/bin/startup.sh

12、通过浏览器访问
http://宿主机IP:端口/
在这里插入图片描述

6.2. 安装tomcat-方案二
步骤:
1、 获取Tomcat镜像
docker pull tomcat
2、 查看镜像
docker images
3、 创建守护式容器,并设置端口映射
[root@VM_0_2_centos ~]# docker run -d --name tomcat3 -p 8889:8080 tomcat /bin/bash
4、 访问Tomcat
在这里插入图片描述

  1. 将镜像推送到Docker Hub(了解)
    1.1 注册Docker hub账号
    在Docker Hub注册后创建private/public的Repository。
    在这里插入图片描述
    1.2 登录docker login
    在这里插入图片描述

1.3 推送docker push
推送镜像的规范是:docker push 注册用户名/镜像名,所以要先重命名
在这里插入图片描述

1.4 Docker hub查看
在这里插入图片描述
1.5 下载
复制仓库里的 Docker Pull Command
在这里插入图片描述

1.6 镜像备份
docker save -o mynginx.tar mynginx
-o 输出到的文件
执行后,运行ls命令即可看到打成的tar包
1.7 镜像恢复与迁移
首先我们先删除掉mynginx镜像
然后执行此命令进行恢复
docker load -i mynginx.tar
-i 输入的文件
执行后再次查看镜像,可以看到镜像已经恢复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值