分类 运维 下的文章

Docker基础篇

什么是Docker?

在聊 Docker 是什么之前,我们先来回顾一下传统的产品开发上线涉及到的难点。一款产品从开发到上线,经历了开发环境、测试环境、生产环境等不同的操作系统、运行环境和应用配置等环境。在项目管理中,还涉及到不同版本以及不同版本之间兼容性等问题。

这些问题对开发人员和运维人员都是极大的考验,同时对各方的协作也有一定的要求。不然就会出现”代码在我这里运行的好好的啊“,这种尴尬的局面。而 Docker 的出现就是提供了一套用来解决此类问题的标准解决方案。

Docker

Docker 的口号是”一次创建或配置,可以在任意地方正常运行“。如口号所说,Docker 的出现对于开发和运维人员是一大福音,基于 Docker 可以方便地搞定标准化的发布流程,再也不用纠结不同环境导致的问题了。

其实,Docker 的使用可以理解为:软件是带环境安装的,也就是说,安装的时候把原始环境一模一样的复制过来一份。这样也就消除了不同机器运行结果不同的问题。

那么,Docker 是什么呢?Docker 是一个开源的应用容器引擎,基于 Go 语言,并遵从 Apache2.0 协议开源。它可以让开发者打包应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker 可用于开发应用、交付应用、运行应用等场景。

容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。Docker 允许用户将基础设施中的应用单独分割出来,形成更小的部分容器,从而提高软件交付速度。

  • Docker组成三要素

    • 镜像(image)

      • 镜像是静态的定义 更像是一个模板
      • Docker 镜像就是一个只读的模板,是文件与 meta data 的集合。镜像是基于分层的实现的,每一层都可以添加删除文件,从而形成新的镜像。
        镜像可以理解为是一个树状结构,每一个镜像都会依赖于另一个镜像,这个依赖关系体现在 Docker 镜像制作的 Dockerfile 中的 FROM 指令上的。关于 Dockerfile 及其中的 FROM 指令,需要注意的是:如果是树的根,那么就需要"FROM scratch"。
        镜像可以用来创建 Docker 容器,一个镜像可以创建多个容器。
    • 容器(container)

      • 容器来源于镜像
      • 一个镜像可以创建多个容器
      • 不同的镜像可以创建不同的容器
      • 每个镜像都是相互隔离的
      • 容器可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境和运行在其中的应用程序。
    • 仓库(repository)

      • hub.docker.com 存放Docker镜像的地方,提供了一些官方镜像
      • 仓库分为公开,私有

接下来我们来安装Docker

跟着命令依次执行下去 就可安装成功哦

环境需要

  1. CentOS7+ 能上网
  2. 卸载旧版本
  3. yum安装gcc
yum -y install gcc
yum -y install gcc-c++

安装客户端

1.执行命令

sudo yum install -y yum-utils

2.设置stable镜像仓库(自行选择,推荐阿里云)

官网(慢 容易报错)

sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo  

阿里云(推荐)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.安装最新版Docker

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
按y继续

4.启动Docker

sudo systemctl start docker

5.查看是否成功启动

docker version
systemctl start docker

6.开始配置镜像

docker配置镜像的流程,先从本地拉取,本地没有再去云端拉取

一个简单的小例子:

sudo docker run hello-world


  
  Unable to find image 'hello-world:latest' locally
  latest: Pulling from library/hello-world
  2db29710123e: Pull complete
  Digest: sha256:6e8b6f026e0b9c419ea0fd02d3905dd0952ad1feea67543f525c73a0a790fefb
  Status: Downloaded newer image for hello-world:latest
  
  Hello from Docker!
  This message shows that your installation appears to be working correctly.
  
  To generate this message, Docker took the following steps:
   1. The Docker client contacted the Docker daemon.
   2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
      (amd64)
   3. The Docker daemon created a new container from that image which runs the
      executable that produces the output you are currently reading.
   4. The Docker daemon streamed that output to the Docker client, which sent it
      to your terminal.
  
  To try something more ambitious, you can run an Ubuntu container with:
   $ docker run -it ubuntu bash
  
  Share images, automate workflows, and more with a free Docker ID:
   https://hub.docker.com/
  
  For more examples and ideas, visit:
  https://docs.docker.com/get-started/

docker run 都干了什么?

  • 本地是否有该镜像

      • 以该镜像为模板在本机运行
      • 去Docker Hub上查找该镜像

        • 找到

          • 下载镜像到本地

            • 以该镜像为模板生产容器实例运行
        • 没找到

          • 返回失败错误,查不到该镜像

docker 虚悬镜像是什么

  • 仓库名 TAG都是的镜像,俗称虚悬镜像dangling image
  • 虚悬镜像有ID 也有大小
  • 虚悬镜像没有存在价值 用 docker image prune 命令删除

番外

如果你需要工具来远程连接docker可以执行以下操作
首先开启防火墙和安全组端口(2333),端口可以自定义.

vim /lib/systemd/system/docker.service

ExecStart末尾加上

-H tcp://0.0.0.0:2333

变成

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2333

修改后保存文件,然后通知docker服务做出的修改

systemctl daemon-reload

重启docker服务

service docker restart

接下来测试一下看是否能连接到docker api。上面的2333就是对应端口

curl http://localhost:2375/verion