Docker 基础(一)| 青训营笔记

146 阅读8分钟

这是我参与「第五届青训营 」笔记创作活动的第14天

人生没有白走的路,每一步它都算数——考研政治老师孔昱力

序言

传统虚拟机

虚拟机是虚拟出一套硬件,在其上面运行一个完整的操作系统,例如我们使用VMware,指定系统镜像,然后装系统,最终可以使用,在该系统上再运行所需的应用程序。

VMware创建虚拟机时,需要在其模拟出来的硬件上安装繁重的操作系统。每一个虚拟机可以看做是一个当前主机上的独立空间。当我们需要在当前主机上模拟出多个独立空间时,就需要运行多个繁重的操作系统。这是虚拟机的天然缺陷。

流程图 (27).jpg

换个角度来看,假设你的公司开发了一个“稀土掘紫金”,从开始到开发完成,开发小哥哥配置好各种环境,引入了各种依赖。现在需要移交给OA进行测试,在测试小姐姐那她同样需要配置各种环境、引入各种依赖。开发小哥哥所走过的环境配置路线,测试小姐姐同样需要走一遍,环境配置这种东西,那就是玄学,总会有各种各样的问题。此外,人工配置也避免不了马虎失误。假设测试小姐姐测试完毕了,运维需要讲“稀土掘紫金”上线,对于线上环境,运维同样需要走一遍曾经走过的环境配置路线。属实是太麻烦了。。。。。

容器技术

容器内的应用程序直接运行在宿主机的内核上,容器内没有自己的内核,也没有对硬件进行虚拟,因此容器比起虚拟机更为轻便。

流程图 (28).jpg

为什么选择docker

  • docker更高效的利用系统资源

    容器不需要进行硬件虚拟化以及运行一个完整操作系统的额外开销,docker对系统资源的利用率更高,无论是应用执行,文件存储,还是在内存消耗等方面,都比传统虚拟机更高效。因此一个同样配置的主机,可以运行处更多数量的容器实例。

  • 更快的启动时间

    传统的虚拟机启动时间较久,docker容器直接运行在宿主机的内核上,无须启动一个完整的操作系统,因此可以达到秒级启动,大大的解决开发,测试,部署的时间。

  • 一致性的环境

    在企业里,程序从开发环境,到测试服务器,到生产环境,难以保证机器环境一致性,极大可能出现系统依赖冲突,导致难以部署等Bug。

    然而利用docker的容器—镜像技术,提供了除了内核以外完整的运行时环境,确保了应用环境的一致性。

    整个容器内部的内容可以被打包在一起,打包完成的东西叫做镜像image,由于我们的应用就运行在该容器内部,即该容器提供了应用运行的全部环境,于是image就可看做是当前容器内容的一个副本,将该副本放到其余任何存在Docker引擎上的环境中都可以无缝衔接地运行。

  • 持续交付和部署

    还是刚才所说的一致性的环境,对于开发和运维的人员,最希望的就是环境部署迁移别处问题,利用docker可以定制镜像,以达到持续集成,持续交付和部署。

    通过Dockerfile来进行镜像构建,实现系统集成测试,运维进行生产环境的部署。

    且Dockerfile可以使镜像构建透明化,方便技术团队能够快速理解运行环境部署流程。

  • 更轻松的迁移

    Docker可以在很多平台运行,无论是物理机,虚拟机,云服务器等环境,运行结果都是一致的。用于可以轻松的将一个平台的应用,迁移到另一个平台,而不用担心环境的变化,导致程序无法运行。

流程图 (29).jpg

把docker跑起来先

安装docker

我这里的操作系统是Centos

  • 查看当前Centos版本,根据版本配置镜像(我这配置的是阿里的镜像)

    • [root@4bd9ee8cbed3 /]# cat /etc/redhat-release
      CentOS Linux release 8.4.2105
      
  • 可以看到,我这边是Centos8,就应该配置Centos8的镜像。不是Centos8的自行百度镜像。

    • # curl
      curl -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
      
  • 开启流量转发。docker是主机内一个隔离的环境,不开启流量转发docker内的应用是没有办法连接到网络的。

    • modprobe tfilter
      
      cat <<EOF> /etc/sysctl.d/docker.conf
      net.bridge.bridge-nf-call-ip6tables = 1 
      net.bridge.bridge-nf-call-iptables =1 
      net.ipv4.conf.default.rp_filter=0 
      net.ipv4.conf.all.rp_filter =0 
      net.ipv4.ip_forward=1
      EOF
      
  • 重新加载内核参数

    • sysctl -p /etc/sysctl.d/docker.conf
      
  • 然后更新源、安装docker、启动docker、设置开机自启

    • yum -y update
      yum -y install docker
      

配置镜像加速器

使用docker首要操作就是获取镜像文件,默认下载是从Docker Hub下载,网速较慢,国内很多云服务商都提供了加速器服务,阿里云加速器,Daocloud加速器,灵雀云加速器。

mkdir -p /etc/docker
touch /etc/docker/daemon.json
vim /etc/docker/daemon.json

# 把下边这段粘进去
{
    "registry-mirrors":[
        "https://8xpk5wnt.mirror.aliyuncs.com" 
    ]
}

重新读取一下配置,设置开机自启

systemctl daemon-reload
systemctl enable docker

启动docker

systemctl start docker

验证docker是否启动

docker version

启动第一个docker容器

Docker平台的组成

第一节我们了解到容器就是一个独立的环境,其中包含了能够运行的应用以及支持应用运行的依赖。将容器打包封装到一起就形成了该容器的镜像。

开始一个使用docker之前,非常有必要了解docker的组成部分。

  • Registry是镜像仓库,保存镜像文件,提供上传,下载镜像操作(常见的应用都可以在仓库中找到镜像)
  • Docker_host就是运行在操作系统上的docker服务,其包含着容器以及镜像。镜像是可以从仓库中获取的。获取后的镜像可以运行,成为当前主机中一个容器。即容器可以打包成镜像,镜像可以运行成为容器。一个dockerHost中可以运行多个容器。
  • Client就是docker提供的一个交互客户端,通过客户端执行不同的命令操作dockerHost。

获取镜像→启动容器

这里以Nginx为例, Nginx 是一个web服务器,运行后会监听80端口。

先搜索一下Nginx镜像是和否存在

docker search nginx

第一个是官方的Nginx,我们要用的就是这个,其他的可能是别人基于Nginx添加一下环境或者其他依赖又打包的镜像,这个我们后边会了解到。

获取镜像

docker pull nginx

查看本地镜像

docker images

可以看到ignix已经下载到本地了

一键启动

使用docker run nginx启动容器,这个命令需要详细解释一下。此时,nginx就启动了,但是这个控制台也就没办法再操作了。一会对docker run 命令详细解释。另起一控制台,使用docker ps查看运行的容器。

常用命令

Docker run

# 将镜像运行为容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Options说明:

  • -d: 后台运行容器,它会返回容器ID
  • -it:以交互模式运行容器,并返回一个伪终端。这是俩命令,但是通常一起用。
  • --name=“容器名”:自定义指定容器名
  • -p:指定端口映射,格式为宿主机端口:容器端口
  • -P:随机映射端口
  • -v:将宿主机的目录映射到容器的目录,格式为宿主机目录:容器目录

例子:

使用nginx镜像在后台运行一个容器,并将容器命名为"mynginx"

docker run --name mynginx -d nginx

使用nginx镜像在后台运行一个容器,并将容器的80端口映射到宿主机的一个可用的随机端口。因为nginx本身使用的就是80端口,所以是将容器的80端口向主机端口映射。

docker run -P -d nginx

使用nginx:latest镜像在后台运行一个容器,并将容器的80端口映射到宿主机的80端口,将宿主机的/data目录映射到容器的/data目录

docker run -p 80:80 -v /data:/data -d nginx:latest

使用nginx:latest镜像以交互模式运行一个容器

docker run -it nginx:latest bash
root@b8573233d675/# 

Docker ps

查看正在运行的容器

docker ps

下图的输出中显示目前有两个容器在运行,第一列是容器的ID,第六列是容器端口映射。我们可以基于容器ID操作容器。


Docker ps -a

查看所有的容器,包括正在运行的和已经停止运行的。

docker ps -a

下图展示的容器中,通过第五列的STATUS可以看出,有两个容器正在运行,有一个已经在10h之前下线。


Docker exec

常用docker exec -it 容器ID bash/sh 进入正在运行的容器内部。

下图先用docker ps 查看正在运行的容器,然后根据容器ID进入redis容器内部并开启伪命令行。在这里就可输入命令,打开redis客户端

镜像管理

操作命令备注
搜索镜像docker search 镜像名
获取镜像docker pull 镜像名
查看镜像docker images
删除镜像docker rmi 镜像名如果该镜像的容器正在运行,是无法删除的。需要停止该容器,并删除容器。docker rm 容器id/容器名