Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?

  • Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
  • Docker应用运行在容器中,使用沙箱机制,相互隔离

Docker如何解决开发、测试、生产环境有差异的问题?

  • Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行

Docker是一个快速交付应用、运行应用的技术,具备下列优势:

  • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
  • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
  • 启动、移除都可以通过一行命令完成,方便快捷

    1. Docker安装

    Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
    Docker CE 分为 stable testnightly 三个更新频道。
    官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 CentOS上的安装。

    1.1 CentOS安装Docker

    Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。

    卸载

    如果之前安装过旧版本的Docker,可以使用下面命令卸载:
    1. yum remove docker \
    2. docker-client \
    3. docker-client-latest \
    4. docker-common \
    5. docker-latest \
    6. docker-latest-logrotate \
    7. docker-logrotate \
    8. docker-selinux \
    9. docker-engine-selinux \
    10. docker-engine \
    11. docker-ce

    安装docker

    安装yum工具
    1. yum install -y yum-utils \
    2. device-mapper-persistent-data \
    3. lvm2 --skip-broken
    然后更新本地镜像源: ```shell

    设置docker镜像源

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

sed -i ‘s/download.docker.com/mirrors.aliyun.com\/docker-ce/g’ /etc/yum.repos.d/docker-ce.repo

yum makecache fast

  1. 然后输入命令:
  2. ```shell
  3. yum install -y docker-ce

docker-ce为社区免费版本。稍等片刻,docker即可安装成功。

启动docker

Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!

  1. # 关闭
  2. systemctl stop firewalld
  3. # 禁止开机启动防火墙
  4. systemctl disable firewalld

通过命令启动docker:

  1. systemctl start docker # 启动docker服务
  2. systemctl stop docker # 停止docker服务
  3. systemctl restart docker # 重启docker服务

然后输入命令,可以查看docker版本:

  1. docker -v

配置镜像加速

docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

1.2 CentOS7安装DockerCompose

下载

Linux下需要通过命令下载:

  1. # 安装
  2. curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

修改文件权限

修改文件权限:

  1. # 修改权限
  2. chmod +x /usr/local/bin/docker-compose

Base自动补全命令:

  1. # 补全命令
  2. curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果这里出现错误,需要修改自己的hosts文件:

  1. echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

1.3 Docker镜像仓库

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。
官网地址:https://hub.docker.com/_/registry

简化版镜像仓库

Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
搭建方式比较简单,命令如下:

  1. docker run -d \
  2. --restart=always \
  3. --name registry \
  4. -p 5000:5000 \
  5. -v registry-data:/var/lib/registry \
  6. registry

命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。
访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像

带有图形化界面版本

使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

  1. version: '3.0'
  2. services:
  3. registry:
  4. image: registry
  5. volumes:
  6. - ./registry-data:/var/lib/registry
  7. ui:
  8. image: joxit/docker-registry-ui:static
  9. ports:
  10. - 8080:80
  11. environment:
  12. - REGISTRY_TITLE=传智教育私有仓库
  13. - REGISTRY_URL=http://registry:5000
  14. depends_on:
  15. - registry

配置Docker信任地址

我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

  1. # 打开要修改的文件
  2. vi /etc/docker/daemon.json
  3. # 添加内容:
  4. "insecure-registries":["http://192.168.150.101:8080"]
  5. # 重加载
  6. systemctl daemon-reload
  7. # 重启docker
  8. systemctl restart docker

2. Docker架构

镜像和容器

Docker中有几个重要的概念:
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。

一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。
镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。
容器,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。
image.png

DockerHub

开源应用程序非常多,打包这些应用往往是重复的劳动。为了避免这些重复劳动,人们就会将自己打包的应用镜像,例如Redis、MySQL镜像放到网络上,共享使用,就像GitHub的代码共享一样。

  • DockerHub:DockerHub是一个官方的Docker镜像的托管平台。这样的平台称为Docker Registry。
  • 国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务阿里云镜像库等。

我们一方面可以将自己的镜像共享到DockerHub,另一方面也可以从DockerHub拉取镜像:
image.png

Docker架构

我们要使用Docker来操作镜像、容器,就必须要安装Docker。
Docker是一个CS架构的程序,由两部分组成:

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。

如图:
image.png

3. Docker的基本操作

3.1 镜像操作

3.1.1 镜像名称

首先来看下镜像的名称组成:

  • 镜名称一般分两部分组成:[repository]:[tag]。
  • 在没有指定tag时,默认是latest,代表最新版本的镜像

如图:
image.png
这里的mysql就是repository,5.7就是tag,合一起就是镜像名称,代表5.7版本的MySQL镜像。

3.1.2 镜像命令

常见的镜像操作命令如图:
image.png

nginx镜像为例

  1. docker pull nginx #拉取镜像,没有tag默认latest最新版
  2. docker images #查看本地镜像
  3. docker save -o nginx.tar nginx:latest #使用docker save导出nginx镜像到磁盘
  4. docker rmi nginx:latest #删除本地nginx镜像
  5. docker load -i nginx.tar #加载本地磁盘nginx镜像文件

3.2 容器操作

image.png
容器保护三个状态:

  • 运行:进程正常运行
  • 暂停:进程暂停,CPU不再运行,并不释放内存
  • 停止:进程终止,回收进程占用的内存、CPU等资源 ```shell docker run #创建并运行

docker pause #暂停容器 docker unpause #取消暂停 docker stop #停止容器 docer start #运行容器

docker ps #查看所有运行的容器及状态 docker logs #查看容器运行日志 docker exec #进入容器执行命令

  1. **nignx容器为例**<br />**创建并运行nginx容器的命令:**<br />`**docker run --name containerName -p 80:80 -d nginx**`<br />命令解读:
  2. - docker run :创建并运行一个容器
  3. - --name : 给容器起一个名字,比如叫做mn
  4. - -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
  5. - -d:后台运行容器
  6. - nginx:镜像名称,例如nginx
  7. 这里的`-p`参数,是将容器端口映射到宿主机端口。<br />默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。<br />现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx了:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/25966321/1657027549117-3309ef78-d79c-4851-8b29-0996a914d929.png#clientId=u2ebd582d-d3ee-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=495&id=u80fcc4a8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=544&originWidth=1089&originalType=binary&ratio=1&rotation=0&showTitle=false&size=108627&status=done&style=none&taskId=u0ea6fc13-62ef-407c-add2-e2f9ad136ad&title=&width=989.9999785423283)
  8. **进入我们刚刚创建的nginx容器的命令为:**<br />`**docker exec -it mn bash**`<br />命令解读:
  9. - docker exec :进入容器内部,执行一个命令
  10. - -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
  11. - mn :要进入的容器的名称
  12. - bash:进入容器后执行的命令,bash是一个linux终端交互命令
  13. <a name="h1jWA"></a>
  14. ## 3.3 数据卷
  15. **数据卷(volume)**是一个虚拟目录,指向宿主机文件系统中的某个目录。<br />一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/25966321/1657029488799-d80c73ec-51dc-45e2-8fa1-86a0a599e8c0.png#clientId=u61bc92a7-9964-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=455&id=u64d6800d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=501&originWidth=1087&originalType=binary&ratio=1&rotation=0&showTitle=false&size=120812&status=done&style=none&taskId=ub138da9d-a75a-4e1d-a5dd-140de5eacfb&title=&width=988.1817967635545)
  16. <a name="uP45K"></a>
  17. ### 3.3.1 数据卷命令
  18. 数据卷操作的基本语法如下:<br />`**docker volume [COMMAND]**`<br />docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
  19. - **create **创建一个volume
  20. - **inspect **显示一个或多个volume的信息
  21. - **ls** 列出所有的volume
  22. - **prune **删除未使用的volume
  23. - **rm **删除一个或多个指定的volume
  24. <a name="ljwkk"></a>
  25. ### 3.3.2 挂载数据卷
  26. 我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:
  27. ```shell
  28. docker run \
  29. --name mn \
  30. -v html:/root/html \
  31. -p 8080:80
  32. nginx \

这里的-v就是挂载数据卷的命令:

  • -v html:/root/htm :把html数据卷挂载到容器内的/root/html这个目录中

    4. Dockerfile自定义镜像

    5. Docker-Compose