Docker详细讲解

一 . 基础知识

部署模式的演变

Docker详细讲解_第1张图片

 在部署应用程序的方式上 , 主要经历了三个时代

  • 传统部署 : 互联网时代 , 会直接将应用程序部署到物理机上
    • 优点 : 简单 , 不需要其他技术的参与
    • 缺点 : 不能为应用程序定义资源使用边界 , 很难合理的分配计算机资源 , 而且程序之间容易产生影响
  • 虚拟化部署 : 可以在一台机器上运行多个虚拟机 , 每个虚拟机都是独立的一个环境
    • 优点 : 程序环境不会相互产生影响 , 提供了一定程度的安全性
    • 增加了操作系统 , 浪费了部分资源
  • 容器化部署 : 与虚拟化类似 , 但是共享了操作系统
    • 优点 : 可以保证每个容器拥有自己的文文件系统 , CPU ,内存 , 进程空间等
    • 原型应用程序所需要的资源都被容器包装 , 并和底层基础架构解耦
    • 容器化的应用程序可以跨云服务上, 跨Linux操作系统发行版进行部署

二 . Docker是什么

Docker就是一个用来装应用程序的容器 , 就好比被子用来装水 , 笔筒用来装笔 , 书包用来装书 , 你也可以把Hello World放到Docker里 , 你可以把网站放在Docker里 , 你可以把你想的到的任何程序放到Docker里

Docker详细讲解_第2张图片

 Docker能帮我们解决什么 ?

  1. 组织有序性
    1. 以传统的方式部署你的应用 , 可能会出现由于多个应用程序的依赖不用 ,导应用之间的依赖变得非常混乱 , 若此时出现两个应用依赖同一程序但却依赖不同版本 , 便会出现让人头疼的问题 , 使用Docker便可以很方便的帮我们管理各个应用程序的依赖 , 并以容器为基础将应用的运行环境独立开来 , 从而不会互相影响 , 还能提高资源利用率
  2. 便携性
    1. 另一个问题就是 , 以传统的方式部署你的应用 , 如果我们应用后期需要迁移(这里的迁移包括相同操作系统的迁移),还是需要做大规模的集群 , 都是一件工作量非常大的操作 , 而容器化了的应用 , 对这些操作都是非常方便的
  3. 安全性
    1. 最后一个不得不提的问题就是安全 , 以传统的方式部署你的应用 , 如果该应用被攻击者攻击 , 或者因为程序自身的bug , 又或是运行环境多个应用间混乱的依赖关系导致的问题 , 这样的话 , 你的服务器系统安全危险级别会很高 , 因为这些问题将直接影响你的系统安全 , 但如果你的应用是运行在Docker容器中 , 那么一切的危害都会别隔离在容器中 , 因为容器的资源跟系统是隔离的 , 危害将被降到最低

三 . Docker的基本概念

Docker又是那个重要的概念 : 仓库 , 镜像 , 容器

3.1 仓库(Repository)

仓库使用来存放镜像的地方 , 类似于Maven仓库 , Git仓库等用途 , 仓库之上还有注册服务器(Registry)的概念 ,上面存放着多个仓库 , 每个仓库中又有多个镜像 , 而每个镜像又可以有多个标签(tag) , 目前最大的公开仓库是Docker Hub , 我们可以使用类似Git命令的方式去pull/push镜像

3.2 镜像(Image)

可以理解为一个只读的模板 , 镜像可以用来创建容器 , 一个镜像可以创建多个容器 , 你可以直接从官方仓库(docker hub) 或者其他私服仓库拉取(pull)想要的镜像 , 或通过Dockerfile来构建属于你自己的镜像 ,这一切的操作都是非常简单的

3.3 容器(Container)

容器是由镜像创建的实例 , 他可以被启动 , 停止 , 运行 , 删除 , 每个容器之间是互相隔离的 , 保证安全的平台 , 可以把容器看做为一个简单的Linux环境

Docker详细讲解_第3张图片

 四 . 安装Docker

在虚拟机上安装Docker 使用CentOS7来安装Docker , 不过Docker官方要求CentOS操作系统内核必须在3.10以上

基于CentOS安装Docker :

# 0.安装yum-utils工具
yum -y install yum-utils
# 1.设置 yum 源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 2.安装 docker
yum install -y docker-ce
# 3.启动 docker 服务端
systemctl start docker 
# 4.设置docker服务开机自启
systemctl enable docker 
# 5.校验 docker 是否启动成功
docker version

当出现下面这种情况就代表Docker安装成功 : 

Docker详细讲解_第4张图片

镜像加速器

Docker默认的镜像仓库在国外,我们进行镜像拉取的时候,速度会比较慢,所以我们需要设置镜像加速器,像阿里云、腾讯云都提供了镜像加速器免费服务.

步骤 :

  1. 登录阿里云 , 点击控制台
  2. Docker详细讲解_第5张图片
  3. 在导航页面中搜索容器镜像服务
  4. Docker详细讲解_第6张图片
  5. 在镜像工具中---->镜像加速器找到相应的命令 , 执行如下的命令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://eqa6sci6.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart dock

 五 . 容器的基本操作

5.1 启动容器

命令格式: docker run IMAGE [COMMAND] [ARGS...]

命令解释.

  1. 命令会检测当前要运行的镜像在本地存不存在,若不存在他会自动 pull 下来再运行

  2. 运行后会启动一个容器, 并且开启一个文件系统, 你可以直接在容器内创建文件夹. 运行一个指定的程序, 当程序退出后, 容器也就退出了

示例:

docker run centos echo 'hello docker'

5.2 查看容器

命令格式: docker ps [-a] [-l]

参数解释:

-a:表示列举所有的容器 ​

-l :表示列举最近创建的容器.

默认情况容器在运行之后就停止了,ps只是显示正在运行的容器.

 5.3 启动守护式容器

命令格式: docker run -i -t IMAGE /bin/bash

参数解释:

-i --interactive=true|false 默认是false:允许你对容器内的标准输入 (STDIN) 进行交互 ​ -t --tty=true|false 默认是false:在新容器内指定一个伪终端或终端

示例:

docker run -it centos /bin/bash

 5.4 退出容器

  • 在容器中输入exit退出容器
  • Ctrl + P和Ctrl + Q退出容器

5.5 进入容器

docker exec -it 容器ID/容器名 /bin/bash

5.6 查看容器详情

docker inspect 容器ID/容器名

5.7 关闭容器

  • docker stop 容器ID/容器名 :发送一个信号给容器,等待容器的关闭.
  • docker kill 容器ID/容器名 :直接停止容器.

5.8 启动容器

  • docker start 容器ID/容器名: 启动已关闭的容器
  • docker restart 容器ID/容器名: 重启容器

5.9 删除容器

  • docker rm 容器ID/容器名: 删除已关闭的容器,但是不能删除正在运行中的容器
  • docker rm -f 容器ID/容器名: 强制删除容器
  • docker rm -f $(docker ps -aq) 批量删除

    • 查询所有的容器ID: docker ps -aq

5.10 自定义容器名称

要查看容器的详细信息 , 需要输入很长的字母 , docker允许用户可以自定义容器的名字

命令格式 : docker run --name = 自定义名称 -it IMAGE /bin/bash

docker run --name=mycontainer -it IMAGE /bin/bash`

 5.11 其他命令

查询所有容器的ID , 命令格式 :

docker ps -aq

删除所有容器 , 命令格式 : 

docker rm -f $(docker ps -aq)

 查看容器内的进程 , 命令格式 :

docker top 容器ID/容器名

 拷贝文件到容器内部 , 命令格式 :

# 命令格式: docker cp 文件 容器ID:容器目录
docker cp index.html cff96db0cd78:/usr/share/nginx/

六. 部署静态网站(Nginx)

通常我们在docker中部署中间件或者程序的时候 , 这些程序需要开放端口才可以访问 , 比如Nginx要开放80端口 , MySQL需要开放3306端口 , 所以我们现在需要部署Nginx的话 , 需要对容器的端口进行映射

# 宿主机会随机选择一个端口和容器内的80端口进行映射
docker run -d -p 80 nginx:1.17.1
# 宿主机会选择8080端口和容器内的80端口进行映射
docker run -d -p 8080:80 nginx:1.17.1

 Nginx的部署流程

# 创建容器
docker run --name nginx-test -p 8080:80 -d nginx:1.17.1

通过地址栏进行访问:http://宿主机IP:8080

编写index.html,内容如下:


       
                hello docker nginx
       
 

拷贝index.html到容器的指定目录

docker cp index.html nginx-test:/usr/share/nginx/html 

通过地址栏进行访问:http://宿主机IP:8080

Nginx的配置文件在这个目录下: /etc/nginx/nginx.conf

七 . 容器的数据管理

1 . 数据卷DataVolume

我们都知道Docker其中一个理念就是应用和环境打包 , 通常docker容器的生命周期都是和容器中的应用是一致的 , 如果删除了容器 , 那么容器内产生的数据也会一并被删除

对于有些容器(比如MySQL) , 我们可能会有持续化数据的需求 , 也就是容器启动时需要加载已有的数据 , 容器销毁时希望保留产生数据 , 这个就需要用到Docker的Data Vloume存储机制

Docker数据卷设计的目的 , 在于数据的永久化 , 他完全独立于容器的生存周期 , 因此 , Docker不会再容器删除时删除其挂载的数据卷 , 也不会存在类似的垃圾回收机制 , 对容器引用的数据卷进行处理

Docker详细讲解_第7张图片

 通过上面这张图 :

  1. 数据卷是独立于容器的存在 , 它存在与宿主主机中 , 和容器时分离的
  2. docker数据卷可以是文件或者目录
  3. docker容器可以使用数据卷和宿主机进行数据的共享
  4. 同一个文件或者目录支持多个容器的访问 , 实现了容器间的数据共享和交换

 2. 安装MySQL

操作步骤 :

# -e参数表示给容器设置环境变量,MySQL在容器安装的时候默认将环境变量MYSQL_ROOT_PASSWORD作为登录密码
docker run --name mysql-5.7 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.35
# 此时通过Navicat连接访问容器中的MySQL,然后新建test数据库
# 此时删除掉该容器
docker rm -f mysql-5.7
# 再次启动容器,发现前面创建的test数据库不见了,说明数据并没有持久化
docker run --name mysql-5.7 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.35

 数据卷操作步骤

# 先删除掉前面创建的MySQL容器
docker rm -f mysql-5.7
# -v 宿主机目录:容器目录 ---> 表示数据卷的映射
docker run --name mysql-5.7 -v /mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.35
# 此时通过Navicat连接访问容器中的MySQL,然后新建test数据库
# 此时删除掉该容器
docker rm -f mysql-5.7
# 再次启动容器,发现前面创建的test数据库依然存在,说明数据实现了持久化的功能.
docker run --name mysql-5.7 -v /mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.35

 3. 配置文件目录映射

我们在前面的Nginx案例中,我们是将index.html页面内容拷贝到容器内部,这样就可以替换默认的首页了。假如我们在启动容器之后需要修改index.html的内容怎么办呢? 或者我们需要对nginx.conf的内容做修改怎么办呢? 进入容器修改?但是容器内部并没有安装vi或者vim的工具。这个需求我们也可以通过数据卷来解决,让宿主机的目录和容器内的目录做映射,我们需要修改index.html或者nginx.conf的时候,就不需要进入容器内部,直接在宿主机修改即可.

步骤如下:

第一步: 创建nginx的html存储目录

# 创建目录
mkdir -p /nginx/html
# 新建index.html文件
vi /nginx/html/index.html

 第二步: 在/nginx/html目录中创建index.html文件,内容如下


       
                hello docker DataVolume
       

 第三步: 创建容器

docker run --name nginx-dv -v /nginx/html:/usr/share/nginx/html -p 8080:80 -d nginx:1.17.1

 第四步: 修改宿主机index.html内容

vi /nginx/html/index.html

访问浏览器 , 可以看到内容也同步进行修改了

你可能感兴趣的:(docker,容器,运维)