python---自动化运维之Docker容器

一、Docker容器学习目标:

  • 掌握Docker基础知识,能够理解Docker镜像和容器之间的概念
  • 完成Docker的安装与启动掌握Docker镜像与容器相关命令
  • 掌握Tomcat、Nginx等软件的常用应用的安装
  • 掌握Docker迁移与备份相关命令
  • 能够运用Dockerfifile编写创建容器的脚本
  • 能够搭建与使用Docker私有仓库

二、Docker简介

1. 什么是虚拟化

  • 在计算机中,虚拟化(英文: Virtualization)是一种资源管理技术,是将计算机的各种实体资源(如: 服务器、网络、内存及存储等)予以抽象、转化后呈现出来, 打破实体间不可切割的障碍,使用户可以通过更好的方式来应用这些资源。
  • 在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件,对资源充分利用。
  • 虚拟化的种类有很多,例如:
    1.软件虚拟化:Vmware软件、KVM软件、VirtualBox软件等
    2.硬件虚拟化: 磁盘阵列RAID、逻辑卷LVM、
    3.内存虚拟化、网络虚拟化、桌面虚拟化、服务虚拟化、虚拟机等。

2 .什么是Docker
Docker是一个开源的应用容器引擎,Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在2018年之前是不支持在Windows系统部署Docker的。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。
个人理解Docker: 集装箱 把东西封装到集装箱中,别人需要就直接给集装箱。
3.为什么选择Docker?
1)上手快

  • Docker依赖于"写时复制"(copy-onwrite)模型,使修改应用程序也非常迅速,可以说达到"随心所欲,代码即改"的境界。
    随后,就可以创建容器来运行应用程序了。大多数Docker容器只需要不到1秒即可启动。
  • 由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更 多的容器,使用户尽可能的充分利用系统资源。
    2)职责的逻辑分类
  • 使用Docker,开发人员只需要关心容器中优秀的应用程序,而运维人员只需要关心如何管理容器。
  • Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。
  • 从而降低那种"开发时一切正常,肯定时运维的问题(测试环境都是正常的, 上线后出了问题就归结为肯定是运维的问题)"。
    3) 快速高效的开发生命周期
  • Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。
  • (通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从盒子里一件一件的取)。

4. 容器与虚拟化的比较
下面的图片比较了Docker和传统的虚拟化方式的不同之处,可见容器在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统的虚拟化则是在硬件层面实现。
在这里插入图片描述总结一下就是: Docker没有独立的操作系统,使用真机的内存与操作系统。与传统的虚拟机相比,Docker的优势体现为启动速度快、占用体积小。
借用知乎上一个很形象的例子就是:

  • 物理机
    在这里插入图片描述

  • 虚拟机

在这里插入图片描述

  • 容器在这里插入图片描述

5.Docker组件

  • Docker服务器与客户端
    Docker是一个客户端/服务器(C/S)架构的程序。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。

  • Docker提供了一个命令行工具docker以及一整套RESTful API来与守护进程交互。

  • 用户可以在同一台宿主机上运行Docker守护进程和客户端。
    在这里插入图片描述

  • Docker镜像与容器
    仓库:每个仓库存放某一类镜像。
    镜像:类似虚拟机镜像(eg:xxx.iso)。 eg: MySQL镜像、Redis镜像、2048镜像。
    容器:从官方仓库中拿取镜像,进行操作使镜像可以运行之后称为容器。类似linux系统环境,运行和隔离应用。容器从镜像启动的时候,docker会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。对镜像改变时相当于做快照,删除容器,相当于删除镜像修改的部分,镜像不变。

  • Registry(注册中心)
    Docker用Registry来保存用户构建的镜像。Registry分为公有和私有两种。

    公有仓库 :所有人可以访问下载镜像的仓库。Docker公司运营公共的Registry叫做Docker Hub。
    私有仓库: 规定范围内可以访使用的库。用户可以构建私有的Registry。

三、 Docker的安装与启动

最简便的方法:

阿里云安装docker(yum仓库使用阿里云的仓库很方便)

  • git bash中:ssh @47.92.233.236 输入密码
  • yum install docker
  • systemctl start docker

方法一: 直接使用docker光盘镜像源安装docker最新版本
(1) yum包更新到最新

# 阿里安装软件镜像源下载 
$ wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
$ yum makecache # 生成缓存 
$ yum update # yum包更新

(2) 配置yum仓库安装Docker

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

(3) 安装Docker

$ yum install docker-ce -y

(4) 安装后查看Docker版本

$ docker -v

方法二: 官网下载软件包, 自行安装

$ yum install * -y 
$ docker version

四、Docker的基本操作

Docker基础命令

  • 启动Docker:$ systemctl start docker

  • 停止Docker:systemctl stop docker

  • 重启Docker:systemctl restart docker

  • 查看Docker状态: systemctl status docker

  • 开机启动Docker:systemctl enable docker

  • 查看Docker概要信息:docker info

  • 查看Docker帮助文档:docker --help

镜像相关命令

  • 查看镜像 docker images
    在这里插入图片描述

REPOSITORY: 镜像名称
TAG: 镜像标签
IMAGE ID: 镜像ID
CREATED: 镜像创建的时间(不是获取该镜像的日期)
SIZE: 镜像大小

这些镜像都是存储在Docker宿主机的/var/lib/docker目录下。

  • 搜索镜像 docker search 镜像名称
  • 拉取镜像docker pull 镜像名称
    拉取仓库就是从镜像仓库中下载镜像到本地。
  • 删除镜像

按ID删除镜像 docker rmi 镜像ID

删除所有镜像(注意:是反向单引号)

 docker rmi `docker images -q` 

在这里插入图片描述

容器相关命令

  • 查看所有正在运行的容器docker ps

  • 查看所有容器(即无论是否运行中)docker ps -a

  • 查看最后一次运行的容器docker ps -l

  • 查看停止的容器docker ps -f status=exited
    创建与启动容器
    创建容器常用参数说明: docker run

  • -i, --interactive : 表示运行容器

  • -t, --tty : 表示容器启动后进入其命令行(分配一个伪终端)

  • –name : 指定容器名称

  • -v, --volume list : 表示一个/多个目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录)

  • -d, --detach : 创建一个守护进程在后台运行

  • -p, --publish list : 表示一个/多个端口映射,前者是宿主机端口,后者是容器内的映射端口。

(1) 交互式创建容器

$ docker load -i ubuntu.tar # 加载镜像
$ docker run -it --name=myubuntu ubuntu /bin/bash # 创建容器, exit退出当前容器
$ docker ps -a

(2) 守护方式创建容器

$ docker run -di --name=容器名称 镜像名称:标签 # 创建容器
$ docker exec -it 容器名称/容器ID /bin/bash # 登录守护容器交互环境的方式

(3) 删除容器
删除指定的容器,如果删除容器时,容器正在运行中,则先停止容器。

    docker stop myubuntu1
    docker rm myubuntu1

(4)停止与启动容器

  • 停止容器:
    $ docker stop 容器名称(或者容器ID)
  • 启动容器:
    $ docker start 容器名称(或者容器ID)

(5)查看容器IP地址

  • 我们可以通过以下命令查看容器运行的各种数据,myubuntu1是容器的名称。
    docker inspect myubuntu1
  • 也可以执行下面的命令直接输出IP地址,myubuntu1是容器的名称。
    docker inspect --format='{{.NetworkSettings.IPAddress}}' myubuntu1

文件拷贝

  • 容器的文件拷贝到真机上
    docker cp 容器名称:容器目录 需要拷贝的文件或者目录
  1. docker --help | less 查看容器命令
  2. docker exec -it 2048 /bin/bash 交互环境进入2048项目
  3. hostname > hostname.txt 容器内产生一个文件
  4. cat hostname.txt
  5. ctrl + p +q 退出交互式环境不关闭容器
  6. docker cp 2048容器id:/hostname.txt /mnt/ 将容器的文件拷贝到真机/mnt/
  7. cat /mnt/hostname.txt
  • 如果我们需要将文件拷贝到容器内可以使用cp命令
    $ docker cp 需要拷贝的文件或者目录 容器名称:容器目录
  1. docker cp /etc/passwd 容器id:/tmp/ 将真机/etc/passwd 拷贝到容器/tmp下
  2. docker exec -it 2048 /bin/bash 重新进入交互式环境
  3. head -3 /tmp/passwd 查看从真机拷贝到容器下的文件

目录挂载

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主主机某个目录的文件从而影响容器。也就是通过修改真机目录来修改容器内的目录。

创建容器 添加-v参数 后面为 宿主机目录: 容器目录
例如:

  • docker run -di -v /usr/share/Project1: /usr/share/Project1 --name my_2048 docker.io/blackicebird/2048
    对镜像创建一个容器,容器中/usr/share/Project1映射到真机下 /usr/share/Project1 (目录可以不相同)

  • docker exec -it my_2048 /bin/bash 进入这个容器的交互式环境

  • cd /usr/share/Project1 进入容器下的目录创建文件

  • touch file{1..10}

  • ctrl +p +q 退出容器

  • ls /usr/share/Project1 真机下查看在虚拟机下创建的文件

迁移与备份

1.1 容器保存为镜像

如果把设置好的容器封装成镜像,每次使用这个容器时就把这个镜像启动成新的容器而无需设置。对于一个每次使用都需设置的容器,可以进行封装保存为一个镜像。commit会把所有指令都集成为一个文件,启动容器的时候就执行这个文件。

小例子: 对mysql设置登陆密码、指定用户远程连接和授权的操作,将设置好的mysql封装为镜像:

  • docker commit 要封装的容器名称 新的镜像名称例如mysql:remote_login
  • docker images 查看镜像
  • docker run -d -p 0.0.0.0:3306:3306 6 --name test_mysql mysql:remote_login 镜像创建容器
  • docker ps 查看运行的容器
    注意:由于版本导致密码加密的问题在封装后的镜像仍需要再次设置
1.2 镜像备份

如果pull镜像很慢的话可以将容器打包镜像,每次load即可

步骤如下:

  • docker save -o mysqlRemoteLogin.tar 要打包的镜像mysql:remote_login
  • docker load -i mysqlRemoteLogin.tar 镜像恢复
  • docker images 查看镜像

Dockerfile

  • 什么是Dockerfifile

Dockerfifile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
对于开发人员:可以为开发团队提供一个完全一致的开发环境。
对于测试人员: 可以直接拿开发时所构建的镜像或者通过Dockerfifile文件构建一个新的镜像开始工作了。
对于运维人员: 在部署时,可以实现应用的无缝移植。

  • 常用命令

-

  • Dkckerflie应用:将 hell0.txt 文件拷贝到容器中
  • vim docjer_file
  • mkdir dockertest
  • mv docker_file dockertest/dockerfile
  • cd dockertest
  • touch hell0.txt 将这个文件拷贝到容器中
  • docker build --no-cache -t “ubantu:test” .
    执行写好的dockerfile,. 表示对当前执行操作 -t加入标签
  • docker run -id --name ubantu_test -p 82:80 ubantu:test 对封装的镜像创建容器
  • docker exec -it ubantu_test /bin/bash
  • cd /mnt
  • ls
    可以看到hello.txt

vim docjer_file后内容如下:
在这里插入图片描述

五、案例实战:Docker的2048部署

背景

  1. 云服务器47.92.233.236
  2. git bash

步骤

  • docker search 2048
  • docker pull docker.io/blackicebird/2048
  • docker images 查看镜像
  • docker run -d --name 2048 -p 0.0.0.0:80:80 docker.io/blackicebird/2048 对docker.io/blackicebird/2048 镜像创建容器,-d在后台运行 -p映射:将2048游戏放到容器的80端口,真机80端口映射到容器80端口,用户访问云服务器80端口时就会访问容器的80端口来访问2048这个游戏
  • docker ps 查看运行的容器
  • docker ps -a 查看所有的容器

部署遇到的问题

  • 问题一: 如果通过云服务器:80无法访问,则需要设置端口号对应的安全组。

  • 问题二:有时候阿里云版本下的镜像与操作系统配置版本不兼容,可以提升操作系统配置:yum update 更新所有软件包括系统内核版本。

六、案例实战:Docker的MySQL部署

背景:

  1. 项目端装mysql:yum install mysql
  2. 理解:数据库 主机一部署 ,项目 主机二部署

知识扩展:

hub.docker.com: 搜索关于镜像设置拉取的信息

操作步骤:

项目所在的主机二远程连接主机一的数据库,数据库所在的主机一需要设置用户可以远程连接

  • 拉取MySQL镜像
  • docker search mysql
  • docker pull docker.io/mysql
  • docker images
  • 创建容器
  • docker run -d -p 0.0.0.0:3306:3306 6 -e MYSQL_ROOT_PASSWORD=‘123’ --name remote_mysql docker.io/mysql
  • docker inspect --format=’{{.NetworkSettings.IPAddress}}’ mysql
    查看容器IP,IP: 172.17.0.3
  • docker ps 查看开启的容器

-p 代表端口映射,格式为 宿主机映射端口:容器运行端口。
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登录密码。

  • 进入MySQL容器并登录MySQL
  • docker exec -it remote_mysql /bin/bash
    进入docker的remote_sql 容器命令行 对数据库需要设置用户可以远程连接
  • mysql -uroot -p123
  • create user lvah@’%’ identified by ‘123’;
    创建用户lvah,允许任意主机(%)远程登陆,登陆密码为123.
  • grant all privileges on . to ‘lvah’@’%’;
    授权lvah@%用户, 允许操作任意数据库和任意数据表(.).

此时退出容器外部登录MySQL会报错是因为版本加密方式不一致

  • 修改账户密码加密规则并更新用户密码。
  • alter user ‘lvah’@’%’ identified with mysql_native_password by ‘123’;
    flush privileges;
    重新加载用户授权表。
  • ctrl +p +q
  • 退出容器测试:mysql -ulavh -p123 -h172.17.0.3

报错处理:
用户在连接MySQL数据库时会出现Authentication plugin ‘caching_sha2_password’ cannot be loaded的错误。

mysql -ulvah -p123 -h172.17.0.2 -p3307
ERROR 2059 (HY000): Authentication plugin ‘caching_sha2_password’ cannot be
loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared
object file: No such file or directory

报错原因:

mysql8 之前的版本中加密规则是 mysql_native_password,
而在mysql8之后,加密规则是 caching_sha2_password

解决方法: 修改账户密码加密规则并更新用户密码

修改加密规则
ALTER USER ‘user’@‘localhost’ IDENTIFIED BY ‘password’ PASSWORD EXPIRE
NEVER;
# 更新一下用户的密码
ALTER USER ‘user’@‘localhost’ IDENTIFIED WITH mysql_native_password BY
‘password’;

项目部署总结

docker部署基本流程:

  • search
  • pull
  • run
  • commit 容器变为镜像
  • save 镜像打包
  • load
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章