第一章:Docker快速入门

Docker介绍

Docker 是一个开源的容器运行时软件(容器运行时是负责运行容器的软件),基于 Go 语言编写,并遵从 Apache2.0 协议开源。

Docker可以让开发者打包自己的应用以及依赖到一个轻量的容器中,然后发布到任何流行的Linux系统上(docker主要理念:一次封装随处运行)

Docker的思想来源于集装箱,让容器与容器之间相互隔离,与系统相互隔离提高程序之间的安全,更重要的是容器性能开销极低。

docker官网:www.docker.com

Docker 部署及应用___个人学习笔记记录_nginx

Docker组成部分

镜像(images):用来创建容器的模板文件,一个镜像可以创建多个容器(容器动态)

容器(container): 程序的载体,程序运行在容器中,每个容器相互隔离,互不影响,但可以相互通讯

仓库(Repository):集中存放镜像的场所,仓库分为公开仓库(public)和私有仓库(private)两种

容器应用场景

容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:

  • 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
  • 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
  • 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
  • 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。

Docker资源汇总

Kubernetes为什么放弃Docker

Kubernetes 是今天容器编排领域的执行标准(我说的算),而 Docker 从诞生之日到今天都在容器中扮演着举足轻重的地位,也都是 Kubernetes 中的默认容器运行时(容器运行时是负责运行容器的软件)

而在 2020 年 12 月,Kubernetes 社区决定着手移除仓库中 Dockershim 相关代码,这对于 Kubernetes 和 Docker 两个社区来说都意义重大。

我们可以使用 Kubernetes 管理 Docker 容器,但是可能没有听说过 Dockershim,即 Docker 垫片。

如上图所示,Kubernetes 中的节点代理 Kubelet 为了访问 Docker 提供的服务需要先经过社区维护的 Dockershim,Dockershim 会将请求转发给管理容器的 Docker 服务。

容器运行时接口(Container Runtime Interface、CRI)是 Kubernetes 在 1.5 中引入的新接口,Kubelet 可以通过这个新接口使用各种各样的容器运行时。

Docker 没有支持也不打算支持 Kubernetes 的 CRI 接口,这样我们就能猜测出 Kubernetes 社区从代码仓库移除 Dockershim 的原因。

你Docker当初火的时候,我为了妥协你,我在自己官方代码里增加一个Dockershim(垫片)来支持你Docker,但是今天我已经是容器编排领域的执行标准,而你不支持我的CRI接口(不给我面子)那我就不在需要你了!!!

kubernetes在1.20版本以后真正移除的是Docker的容器运行时,但是并没有移除Dockershim(垫片),但是在Kubernetes 1.24版本中,连Dockershim也彻底移除了,这也就代表着kubernets版本1.24以后彻底与Docker进行了剥离。

Kubernetes 支持使用的几种通用容器运行时软件:

  • Podman
  • containerd
  • CRI-O
  • Docker

还有必要学习Docker嘛?

  • 从目前市场分析来看,Docker的市场占有率还是非常的高。

Docker版本介绍

Docker 从 1.17.03 版本之后分为:

  • CE(Community Edition: 社区版) 功能有限,没有官方技术支持服务。
  • EE(Enterprise Edition: 企业版)功能全面,提供官方技术支持服务。

官方安装文档:​​https://docs.docker.com/engine/installation/linux/centos/​

环境规划

主机名称

IP地址

操作系统

硬件配置

docker01

自定义

CentOS 7.6

2C/4G

二、Docker 安装步骤

安装docker软件包

在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,方便您可以从仓库安装和更新 Docker:

yum install -y yum-utils

使用以下命令来设置稳定的仓库(阿里仓库):

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce-20.10.9-3.el7

卸载Docker方式:删除安装包, 删除镜像、容器、配置文件内容

yum remove docker-ce
rm -rf /var/lib/docker

配置镜像加速器

默认情况下镜像从docker hub下载,由于docker hub服务器在国外,由于网络原因镜像下载速度较慢,一般会配置镜像加速器进行下载

国内镜像加速器有阿里云、网易云、腾讯云、中科大等,本实验配置阿里云镜像加速器,速度较快

阿里云镜像加速器地址:​​https://www.aliyun.com/​

Docker命令介绍

查看docker可用命令:

docker

Docker命令根据Docker官方案例分为以下几种:

  • Docker环境信息: docker [info|version]
  • 容器生命周期管理:docker [create|exec|run|start|stop|restart|kill|rm|pause|unpause]
  • 容器操作命令: docker [ps|inspect|top|attach|wait|export|port|rename|stat]
  • 镜像仓库命令: docker [login|pull|push|search]
  • 本地镜像管理: docker [build|images|rmi|tag|save|import|load]
  • 容器资源管理: docker [volume|network]
  • 系统日志信息: docker [events|history|logs]

镜像常用管理命令

命令

作用

docker images

列出本地镜像

docker search 镜像名

搜索镜像

docker pull 镜像名:版本

拉取镜像

docker rmi 镜像名:版本

删除镜像

列出本地镜像:docker images

常用选项:-q 只显示镜像ID

docker images

输出详情介绍:

REPOSITORY 镜像仓库源 TAG 镜像的标签 IMAGE ID 镜像的ID CREATED 镜像更新时间 SIZE 镜像大小

搜索镜像:docker search

常用选项:

  • **--no-trunc :**显示完整的镜像描述

docker search centos

输出详情介绍:

NAME 镜像仓库源的名称 DESCRIPTION 镜像的描述 STARS 点赞数量,表示喜欢的意思 OFFICIAL 是否 docker 官方发布 AUTOMATED 自动构建(表示个人发布)

下载镜像:docker pull

docker pull nginx:1.22.0

提示:下载镜像如果不指定镜像版本则是最新版本,如需指定版本可从docker hub查看对应版本信息在进行下载

查看镜像:docker images

docker images

容器常用管理命令

命令

作用

docker ps

查看正在运行容器

docker ps -a

查看所有容器

docker run 参数

创建容器

docker exec 容器ID/容器名

进入容器

docker stop 容器名/容器ID

停止容器

docker rm 容器名/容器ID

删除容器

docker start 容器名/容器ID

启动被停止的容器

docker restart 容器名/容器ID

重启容器

docker kill 容器名/容器ID

强制停止正在运行的容器(一般不用,除非卡了)

docker inspect 容器名称

查看容器元数据信息

--restart=always

启动容器时设置容器随机自启

docker update --restart=always 容器名/容器ID

容器启动后设置容器随机自启

docker logs 容器名/容器ID

查看容器日志信息

创建容器:​​docker run 选项...​

常用选项:

  • -id :创建容器并指定容器在后台运行
  • **--name="名称" :**为容器指定一个名称
  • **-p :**指定端口映射,格式为:宿主机端口:容器端口
  • **--dns 8.8.8.8 :**指定容器使用的DNS服务器,默认和宿主一致
  • **-h "名称" :**指定容器的hostname
  • **-e username="ritchie" :**设置环境变量
  • **-m :**设置容器使用内存最大值
  • **--net="bridge" :**指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型
  • **--link=[] :**添加链接到另一个容器
  • --expose=[]: 开放一个端口或一组端口
  • **--volume , -v :**绑定一个数据卷

创建容器:docker run 参数

docker run -id --name=nginx nginx:1.22.0

查看容器信息:

docker ps        通过-it创建的容器退出后自动关闭
docker ps -a 查看所有容器,包括未运行的

查看容器元数据信息

docker inspect nginx

进入容器:docker exec -it 容器ID/容器名

docker exec -it nginx /bin/bash

停止容器:docker stop 容器名/容器ID

docker  stop  nginx

启动被停止的容器:docker start 容器名/容器ID

docker start nginx

启动被停止的所有容器:ps -aq 获取所有容器ID

docker start `docker ps -aq`

删除容器:docker rm 容器名/容器ID

常用选项: -f 强制删除(无需停止容器)

docker  rm  nginx

删除所有容器:ps -aq 获取所有容器ID

docker rm `docker ps -aq`

练习:通过Docker部署Nginx的web应用并实现浏览器访问:

创建容器并实现端口映射(默认容器无法被外网访问)

docker run -d --name=ngx_v1 --restart=always -p 81:80  nginx:1.22.0

**-p :**指定端口映射,格式为:宿主机端口:容器端口

--restart=always #容器退出后,自动启动容器(一直)

浏览器访问:http://server_ip:port

三、Docker容器数据卷

数据卷概述

容器数据卷可以是宿主机中的一个目录或文件,通过将目录或文件挂载到容器中,可解决容器中的数据与宿主机之间立刻同步

数据卷可以间接的将外部主机文件传输到宿主机数据卷目录,可解决容器与外部主机之间文件交换的问题

一个数据卷目录可以同时挂载多个容器,解决多容器之间文件交换的问题

数据卷可以解决容器删除后容器数据丢失的问题,实现数据持久化

配置容器数据卷

  • 在创建启动容器时,使用-v参数设置数据卷
  • docker run 参数 -v 宿主机目录/文件:容器内目录/文件...
  • 目录必须是绝对路径
  • 如果目录不存在,会自动创建

Docker部署MySQL

案例:在Docker容器中部署MySQL数据库,并通过外部MySQL客户端管理MySQL数据库。

步骤:

  1. 下载MySQL5.7镜像文件
  2. 准备所需的数据卷目录
  3. 拷贝容器中数据到宿主机数据卷目录
  4. 创建MySQL并挂载数据卷

下载MySQL镜像文件

docker pull mysql:5.7

创建数据卷目录

mkdir -p /docker_mysql/

创建容器拷贝配置文件目录到/docker_mysql目录

  • 格式1:docker cp 容器名:目录/文件 宿主机目录 #将容器中文件或目录拷贝到宿主机
  • 格式2:docker cp 宿主机目录/文件 容器名:目录 #将宿主机文件/目录拷贝到容器中

docker run -id --name=mysql  -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
docker cp mysql:/etc/mysql/ /docker_mysql

删除MySQL容器

docker rm -f mysql

创建MySQL容器并挂载数据卷

docker run -id --name=lnmp_mysql -p 3306:3306 \
-v /docker_mysql/mysql/:/etc/mysql \
-v /docker_mysql/data/mysql:/var/lib/mysql \
-v /docker_mysql/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7

进入数据库授权远程连接用户访问

docker exec -it lnmp_mysql /bin/bash

root@9c8c0dccccee:/# mysql -uroot -p123456

mysql> grant all on *.* to root@"%" identified by "123456";

Docker部署Nginx

案例:在Docker容器中部署Nginx的web服务,并通过外部浏览器访问Nginx。

下载Nginx镜像

docker pull nginx:1.22.0

创建数据卷目录

mkdir -p /docker_nginx/conf

创建容器拷贝配置文件目录到/docker_nginx目录

docker run -id --name=nginx -p 80:80 nginx:1.20.2
docker cp nginx:/etc/nginx /docker_nginx/conf

删除nginx容器

docker rm -f nginx

创建nginx容器并挂载数据卷

docker run -id --name=lnmp_nginx -p 80:80 \
-v /docker_nginx/conf/nginx:/etc/nginx \
-v /docker_nginx/html:/usr/share/nginx/html \
-v /docker_nginx/logs/:/var/log/nginx \
nginx:1.20.2

浏览器访问容器Nginx服务:http://server_ip

Docker部署tomcat

案例:在Docker容器中部署tomcat,并通过外部浏览器访问tomcat。

下载tomcat镜像文件

docker pull tomcat:8.5-jre10-slim

创建数据卷目录

mkdir /docker_tomcat

拷贝容器数据

docker run -id --name=tomcat tomcat:8.5-jre10-slim /bin/bash
docker cp tomcat:/usr/local/tomcat /tomcat

#停止tomcat容器并删除
docker stop tomcat && docker rm tomcat

创建容器挂载数据卷

docker run -id --name=tomcat -p 8080:8080 \
-v /tomcat/tomcat:/usr/local/tomcat \
tomcat:8.5-jre10-slim

浏览器访问容器tomcat服务:http://server_ip:8080