1. 容器简介在这里插入图片描述

1.1 虚拟化技术

Hypervisor——一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。也可叫做 VMM( virtual machine monitor ),即虚拟机监视器。

被 Hypervisor 用来执行一个或多个虚拟机器的电脑称为主体机器(host machine),这些虚拟机器则称为客体机器(guest machine)。hypervisor 提供虚拟的作业平台来执行客体操作系统(guest operating systems),负责管理其他客体操作系统的执行阶段;这些客体操作系统,共同分享虚拟化后的硬件资源。

起初,大家普遍认为基于 hypervisor 的方式可以在最大程度上提供灵活性。所有虚拟机实例都能够运行任何其所支持的操作系统,而不受其他实例的影响。然而,越来越多的用户发现 hypervisor 提供这样一种广泛支持的特性其实是在给自己制造麻烦。对于 hypervisor 环境来说,每个虚拟机实例都需要运行客户端操作系统的完整副本以及其中包含的大量应用程序。从实际运行的角度来说,由此产生的沉重负载将会影响其工作效率及性能表现。

1.2 容器

因此出现了一种称为容器(Container)的新型虚拟化技术来帮助解决这些问题。
操作系统层虚拟化(英语:Operating system–level virtualization),亦称容器化(英语:Containerization),是一种虚拟化技术,这种技术将操作系统内核虚拟化,可以允许用户空间软件实例(instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。

1.3 虚拟机与容器的对比

项目 虚拟机 容器
启动时间 分钟级启动 秒级启动
体积 以 G 为单位 容器镜像大小通常以 M 为单位
性能 需要 Hypervisor 层,需要虚拟化硬件设备,具有完整的 Guest OS,开销大,性能较容器差 共享宿主机内核,系统级虚拟化,没有 Hypervisor 层开销,性能基本接近物理机
安全性 具有完成的 Guset OS,隔离性,稳定性好 因为共享了宿主机内核,只是进程级的隔离,因此隔离性和稳定性不如虚拟机。且容器有权限访问宿主机内核,存在一定的安全隐患
要求 基于硬件虚拟化,需要 CPU 支持虚拟化技术 不用考虑 CPU 是否支持虚拟化

2. docker 是什么

Docker 是一个开源的应用容器引擎,使用 GO 语言开发,并利用 Linux 内核的几个特性来提供其功能。Docker 使应用程序与基础设施分开,以便可以快速交付软件。

2.1 应用场景

  • 快速、一致地交付您的应用程序
    Docker 允许开发人员使用提供应用程序和服务的本地容器在标准化环境中工作,从而简化了开发生命周期。容器非常适合持续集成和持续交付 (CI/CD) 工作流。
  • 响应式部署和扩展
    Docker 的可移植性和轻量级特性还使动态管理工作负载、根据业务需求几乎实时地扩展或拆除应用程序和服务变得容易。
  • 在相同硬件上运行更多工作负载
    Docker 是轻量级和快速的。它为基于管理程序的虚拟机提供了一种可行且经济高效的替代方案,因此您可以使用更多的计算能力来实现您的业务目标。Docker 非常适合高密度环境以及需要以更少资源完成更多任务的中小型部署。

3. docker 架构

Docker 使用客户端-服务器架构。Docker 客户端与 Docker 守护进程对话,后者负责构建、运行和分发 Docker 容器的繁重工作。Docker 客户端和守护程序可以 在同一系统上运行,或者您可以将 Docker 客户端连接到远程 Docker 守护程序。Docker 客户端和守护进程使用 REST API、UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许您使用由一组容器组成的应用程序
在这里插入图片描述

Docker 守护进程

Docker 守护进程 ( dockerd) 监听 Docker API 请求并管理 Docker 对象,例如镜像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。

Docker 客户端

Docker 客户端 ( docker) 是许多 Docker 用户与 Docker 交互的主要方式。当您使用诸如 之类的命令时 docker run,客户端会将这些命令发送到 dockerd,从而执行它们。该 docker 命令使用 Docker API。Docker 客户端可以与多个守护进程通信。

Docker 仓库

Docker 仓库用来存储 Docker 镜像。Docker Hub 是一个任何人都可以使用的公共仓库平台,Docker 默认配置在 Docker Hub 上查找镜像。也可以配置自己的私有仓库。

4. 安装 docker

4.1 Linux 上安装

在各种 Linux 系统上安装 docker 最简单的方法是使用官方脚本自动安装。
安装命如下:

#默认安装最新版,此方式不建议用于生产
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

各种 Linux 系统的手动安装步骤见官方文档
安装好 docker 服务后还应该把 docker 服务设置为开机启动命令如下:

# 查看是否设置开机启动
systemctl list-unit-files | grep docker.service.*enabled

# 设置开机启动
systemctl enable docker.service

# 关闭开机启动
systemctl disable docker.service

4.2 mac 上安装

1.下载 Docker Desktop for Mac

2.双击 Docker.dmg 打开安装程序,然后将 Docker 图标拖到 Applications 文件夹中。
在这里插入图片描述

Docker Desktop 安装包括 Docker Engine、Docker CLI 客户端、 Docker Compose、Docker Content Trust、Kubernetes 和 Credential Helper。

4.3 windows 上安装

注意 dokcer 只支持 win10;并且对电脑配置要求比较高。
1.下载 Docker Desktop for windows

2.安装和开启 Hyper-V
3.双击下载安装包按照提示进行安装

5. 镜像加速

国内从 DockerHub 拉取镜像会比较慢,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

5.1 Linux 系统

修改/etc/docker/daemon.json 文件,如果没有先建一个即可。

sudo vim /etc/docker/daemon.json

修改配置文件内如下:

{
"registry-mirrors": ["https://registry.docker-cn.com"]
}

然后重启服务

sudo systemctl daemon-reload
sudo systemctl restart docker

5.2 windows 系统

对于使用 Windows 10 的系统,在系统右下角托盘 Docker 图标内右键菜单选择 Settings,打开配置窗口后左侧导航菜单选择 Daemon。在 Registrymirrors 一栏中填写加速器地址 https://docker.mirrors.ustc.edu.cn/ ,之后点击 Apply 保存后 Docker 就会重启并应用配置的镜像地址了。

5.3 Mac 系统

对于使用 Mac OS X 的用户,在任务栏点击 Docker for mac 应用图标-> Perferences…-> Daemon-> Registrymirrors。在列表中填写加速器地址 https://docker.mirrors.ustc.edu.cn/ 。修改完成之后,点击 Apply&Restart 按钮,Docker 就会重启并应用配置的镜像地址了。

配置好后运行下面的命令检查配置是否生效:

$ docker info
Registry Mirrors:
    https://docker.mirrors.ustc.edu.cn/

6.镜像操作

6.1 什么是镜像

Docker 镜像可以理解为一个精简的 Linux 操作系统安装包。通过镜像可以快速的启动容器。

6.2 镜像常用命令

  • 下载镜像
    docker hub 是由 docker 官方负责维护的公共仓库,包含大量的容器镜像。
    在 hub.docker.com 上搜索你要的镜像,然后根据页面提示下载,命令格式:
    sudo docker pull 镜像名
    
  • 查看镜像列表
    # docker images
    # docker images -a
    sudo docker image ls
    
  • 删除镜像
    sudo docker image rm 镜像名
    
  • 推送镜像
    推送一个镜像到镜像仓库
    sudo docker push 镜像名
    
  • 保存镜像
    保存一个或多个镜像到一个 tar 归档文件
    sudo docker image save 镜像名 -o xxx.tar
    
  • 加载镜像
    从 tar 归档或者标准输入来加载镜像
    sudo docker image load 镜像名 -i xxx.tar
    
  • 构建镜像
    从 Dockerfile 构建一个镜像
    sudo docker build -t name:tag path
    

7. 容器操作

7.1 什么是容器

容器就是根据镜像启动的一个进程,它是一个运行的系统。

  • 创建容器
    根据镜像创建一个容器
    sudo docker container run [OPTIONS] image [command]
    
    例如:
    sudo docker run ubuntu:lastest /bin/echo "Hello world"
    
    表示通过镜像 unbuntu:lastest 启动一个容器,运行 /bin/echo “hello world” 命令,如果本地没有 unbuntu:lastest 镜像,会自动去仓库下载。
  • 创建容器的常用参数
    参数 描述
    -i 交互式创建容器
    -t 分配一个伪终端
    -d 运行容器到后台
    -e 设置环境变量
    -p 映射容器端口到主机
    -h 设置容器主机名
    –link 添加连接到另一个容器
    –network 连接容器到一个网络
    -v 挂载宿主机目录到容器
    –restart 容器退出后的重启策略,默认 no[always,failure]
    –name 给容器命名
  • 启动容器
    启动一个停止的容器
    sudo docker container start 容器名/ID
    
  • 停止容器
    停止一个运行的容器
    sudo docker container stop 容器名/ID
    
  • 查看日志
    查看运行的容器的日志
    sudo docker container logs 容器名/ID
    
  • 执行命令
    在运行的容器中执行命令
    sudo docker container exec -it 容器名/ID command
    
  • 查看容器列表
    sudo docker container ls
    
  • 删除一个容器
    sudo docker container rm 容器名/ID
    
  • 进入在运行的容器
    sudo docker exec -it 容器名/ID /bin/bash
    

设置重启启动;务必在验证容器能正常启动后再添加此参数

#启动容器时 加入参数--restart=always
docker run --restart=always
#如果创建时未指定 --restart=always,可通过update命令追加:
#已经启动的容器,使用此指令 + 容器id
docker update --restart=always <CONTAINER ID>

restart参数值说明如下:

  • no - 容器不自动重启
  • on-failure - 容器退出状态不为0时自动重启
  • on-failure:[n] - 容器退出状态不为0时自动重启,最大尝试n次
  • always - 始终尝试自动重启

使用 docker 安装 jenkins

  • 下载镜像
    在 hub.docker.com 中搜索 jenkins,可以找到官方镜像,但是已经弃用,推荐使用社区维护的镜像,地址为:https://hub.docker.com/r/jenkins/jenkins。选择一个合适的版本下载,例如:

    sudo docker pull jenkins/jenkins:alpine
    
  • 创建容器
    创建命令如下:

    docker run -d -u root --restart=always --name jenkins-server -v /var/jenkins_home:/var/jenkins_home -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -p 8181:8080 -p 50000:50000 jenkins/jenkins:alpine
    

    参数说明:

    • -d: 后台运行容器
    • -u root:使用 root 用户登录
    • -v jenkins_home:/var/jenkins_home:创建卷 jenkins_home 持久化 workhome
    • -v $(which docker):/usr/bin/docker: 映射宿主机中的 docker 客户端到容器中
    • -v /var/run/docker.sock:/var/run/docker.sock: 映射 docker 守护进程的 unix socket 程序到容器中
    • -p 8181:8080: 映射容器的 8080 端口到宿主机的 8181 端口
  • 访问 jenkins
    容器创建成功后,在宿主机上访问 http://127.0.0.1:8181 即可访问容器中的 jenkins。
    如果是在云服务器则需要添加安全组(开发访问端口)。
    在这里插入图片描述
    这如果没有映射到宿主机需要进入jenkins容器查看,如果做了映射直接在宿主机查看即可。
    安装插件,选择推荐即可。
    在这里插入图片描述
    创建账号或选择使用admin账户继续
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

使用 docker 安装 mariadb 数据库

下载与创建容器
如果没有镜像文件则下载并创建容器,有镜像文件则直接创建容器。

# docker run -d --name mariadb-10.7 -v testdb:/var/lib/mysql -p 13306:3306 --env MARIADB_USER=pyck --env MARIADB_PASSWORD=pyck123 --env MARIADB_ROOT_PASSWORD=wangwang --env MARIADB_DATABASE=pycktestdb mariadb:10.7 --lower_case_table_names=1

docker run -d --name test-mariadb -v testdb:/var/lib/mysql -p 13306:3306 --env MARIADB_USER=testuser --env MARIADB_PASSWORD=123456 --env MARIADB_ROOT_PASSWORD=root123456 --env MARIADB_DATABASE=mytestdb mariadb:latest --lower_case_table_names=1

参数说明:

  • -d: 后台运行容器
  • –name test-mariadb 指定容器名称
  • -v testdb:/var/lib/mysql 创建卷 testdb持久化 /var/lib/mysql
  • -p 13306:3306: 映射容器的 3306 端口到宿主机的 13306 端口
  • –env MARIADB_USER=testuser 创建数据库用户
  • –env MARIADB_PASSWORD=123456 创建数据库用户对应的密码
  • –env MARIADB_ROOT_PASSWORD=root123456 数据库root用户的密码,必须设置
  • –env MARIADB_DATABASE=mytestdb 创建的数据库的名称
    • mariadb:latest 指定安装mariadb的版本,latest为最新版本
  • –lower_case_table_names=1 设置表名参数名等忽略大小写;必须放在后面

当安装多个数据库容器时,有点无法启动问?可能需要进入容器中修改端口,待解决

使用 docker 安装 mysql 数据库

docker run -d --name mysql-8.0.26 -v testdb:/var/lib/mysql -p 23306:3306 --env MARIADB_USER=wwxb --env MARIADB_PASSWORD=wwxb123 --env MARIADB_ROOT_PASSWORD=wwxb123 --env MARIADB_DATABASE=testdb mysql:8.0.26 --lower_case_table_names=1

原文参考:http://testingpai.com/article/1631792673644

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐