尚硅谷Docker实战教程基础篇(学习笔记)

学习参考视频:https://www.bilibili.com/video/BV1gr4y1U7CY/?spm_id_from=333.337.search-card.all.click&vd_source=09e3f81b9f7ed8ee4306bb2e0ecd5538

基础篇

Docker 简介

概述

背景:企业拥有标准化的测试和生产环境,开发人员拥有开发环境,可以尽可能地模拟标准化的环境,但是仍不可保证应用在不同环境可顺利的运行,常常出现在开发环境运行正常,在测试环境或生产环境因环境配置等问题,导致启动失败。
注:这里指的环境可以是 Redis、MySQL和 MQ 等配置。

这使得应用的移植不够平滑,给开发和运维带来较大的问题,生产效率。

因此,为了解决上述问题,Docker 问世。Dokcer 给出了一个标准化的解决方案——系统平滑移植,使用容器虚拟化技术。

Docker 是基于 Go 语言实现的云开源项目,Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,一次镜像,处处运行。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

Docker 与 虚拟机对比

虚拟机

虚拟机(virtual machine)就是带环境安装的一种解决方案。

它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样。

原来:传统虚拟机技术基于主操作系统上的虚拟机管理系统(VirtualBox 和 VMWare等),创建虚拟机(虚拟出各种硬件)。在虚拟机上安装从操作系统,在从操作系统种安装部署各种应用。
image.png
缺点:资源占用多,冗余步骤多,启动慢

Docker

—> Linux 容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。

Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统
image.png
Docker 容器是在操作系统层面上实现虚拟技术,直接复用本地主机操作系统,虚拟机则是在硬件层面实现实现虚拟化。这使得 Dokcer 占用体积小、启动速度快。

Docker 容器虚拟机(VM)
操作系统与宿主机共享OS在宿主机OS运行虚拟OS
存储大小镜像小,便于存储和传输镜像庞大(vmdk、vdi)
运行性能几乎无额外性能损失操作系统额外的CPU、内存消耗
移植性轻便灵活,适应于Linux笨重,与虚拟化技术耦合度高
硬件亲和性面向开发者面向硬件运维者
部署速度快速,秒级较慢,10s 以上

Docker 来了什么变化?

  • 一次构建,随处运行
  • 更快速的应用交付和部署,通过加载镜像运行即可
  • 更便捷的扩容和缩容,使应用扩容由原来的天级变为分钟级甚至秒级
  • 更简单的系统运维,运维同学不再受环境配置的困扰
  • 更高效的计算资源利用,一台物理机可以运行多个容器实例,大大提升物理服务器的 CPU 和内存的利用率。

Docker 安装

前言

Docker 依赖运行的 Linux 内核环境,Docker实质上是在运行的 Linux 制造一个隔离的文件环境,因此,其效率几乎等同于所部署的 Linux 主机。因此,Docker 必须部署在 Linux 内核的系统上。

注:若想在 Windows 等环境部署 Docker ,需要先安转一个虚拟机,并在 Linux 系统的虚拟机种运行 Docker。

目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上,要求系统为64位、Linux系统内核版本为 3.8以上,这里选用Centos7.x 。

命令:

# 查看操作系统版本
$ cat /etc/redhat - release

# 查看系统内核版本
$ uname -r

Docker 的基本组成

  • 镜像:一个只读的模板,镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。类似 Java 类,可以创建对象实例。
  • 容器:Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。
  • 仓库:是集中存放镜像文件的场所。类似于 Maven 仓库,存放各种 jar 包的地方; github仓库,存放各种 git 项目的地方;仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),国内的公开仓库包括阿里云、网易云等。

Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。
image.png

安装步骤

·	yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 更新yum软件包索引:yum makecache fast
  • 安装DOCKER CE:yum -y install docker-ce docker-ce-cli containerd.io
  • 启动docker:systemctl start docker
  • 测试:docker version
  • 卸载:systemctl stop docker;yum remove docker-ce docker-ce-cli containerd.io;rm -rf /var/lib/docker;rm -rf /var/lib/containerd

阿里云镜像加速

使用加速器可以提升获取 Docker 官方镜像的速度

地址:https://promotion.aliyun.com/ntms/act/kubernetes.html

  • 注册一个属于自己的阿里云账号
  • 获得加速器地址->控制台->产品于服务->弹性计算->容器镜像服务
  • 镜像工具->镜像加速器->加速器地址
  • 配置
$ mkdir -p /etc/docker
$ tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"]
}
EOF

$ cat /etc/docker/daemo.json
  • 重启服务器
$ systemctl daemon-reload
$ systemctl restart docker

Docker Run 命令执行流程

启动镜像 hello-world 的一个实例

  • docker run hello-world

image.png

Docker 常用命令

帮助启动类命令

· 启动docker: systemctl start docker
· 停止docker: systemctl stop docker
· 重启docker: systemctl restart docker
· 查看docker状态: systemctl status docker
· 开机启动: systemctl enable docker
· 查看docker概要信息: docker info
· 查看docker总体帮助文档: docker --help
· 查看docker命令帮助文档: docker 具体命令 --help

镜像命令

  • docker images

列出本地主机上的镜像,-a:列出本地所有镜像(含历史映像层);-q:只现实镜像id。
说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签版本号
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小

  • docker search (image REPOSITORY)

查询镜像信息,–limit : 只列出N个镜像,默认25个;–limit : 只列出N个镜像,默认25个

  • docker pull (image REPOSITORY) [:TAG]

下载镜像,若无 TAG,为最新版本:latest

  • docker system df

查看镜像/容器/数据卷所占的空间

  • docker rmi [image]

删除镜像,docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部,docker rmi -f $(docker images -qa)

什么是悬挂镜像?
仓库名、标签都是的镜像。
image.png

容器命令

只有镜像才能创建容器
image.png

新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
OPTIONS说明:
–name=“容器别名”
-d:后台运行容器并返回容器 ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p
image.png

举例:docker run -it centos /bin/bash 。使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。退出终端,直接输入 exit。

列出当前所有正在运行的容器

  • docker ps [OPTIONS]

-a: 列出当前所有正在运行的容器和历是运行过的
-l:显示最近创建的容器
-n:显示最近创建的n个容器
-q:静默模式,只显示容器编号

退出容器

  • exit,退出后容器停止
  • ctrl+p+q,容器不停止

启动已停止运行的容器

  • docker start 容器id或容器名

重启容器

  • docker restart 容器id或容器名

停止容器

  • docker stop 容器id或容器名

强制停止容器

  • docker kill 容器id或容器名

删除已停止容器

  • docker rm 容器id
  • docker rm -f $(docker ps -a -q)

后台运行容器

  • docker run -d 容器名:版本

有的容器后台启动后,会立即自杀,因为他觉得没有事可做,例如:centos、nginx.
解决方式:命令行模式,交互操作。

除此,可以后台运行的容器有:
前台运行:docker run -it redis:6.0.8
后台运行:docker run -d redis:6.0.8

查看容器日志:

  • docker logs 容器id

查看容器内运行的进程

  • docker top 容器id

查看容器内部细节

  • docker inspect 容器id

进入正在运行的容器,并以命令行交互
docker exec -it 容器id /bin/shell
exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。【推荐】

重新进入
docker attach 容器id
直接进入容器启动命令终端,不会启动新的进程,用exit退出,会导致容器的停止。

从容器内拷贝文件到主机上

docker cp 容器ID:容器内路径 目的主机路径

导出和导入容器
导出:export 导出容器的内容留作为一个 tar 归档文件
docker export 容器ID > 文件名.tar

导入:从tar包中的内容创建一个新的文件系统再导入为镜像
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

总结:
image.png

Docker 镜像

镜像是什么?

镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

UnionFS(联合文件系统)

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker 镜像加载原理:

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

image.png

为什么 docker 这么小(几百兆),而CentOS都是好几个G?

一个精简的OS,rootfs 可以很小,只需要最基本的命令、工具和程序库就可以了,因为底层直接用Host 的 kernel,自己只需要提供 rootfs 就行了。

为什么 Docker 镜像要采用这种分层结构呢?

优点是共享资源,方便复制迁移,为了复用。
比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

注意:Docker镜像层都是只读的,容器层是可写的。

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。
image.png

Docker 镜像 commit 操作案例

docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]

以 Ubuntu 举例,在 Ubuntu 增加 vim 命令。

# 容器内更新包管理工具
apt-get update
# 安装 vim
apt-get -y install vim

# 完成后,commit新镜像
docker commit -m"add vim cmd" -a"username" 容器id atguigu/myubuntu:1.1

# 启动新的镜像
docker run -it imageId

本地镜像发布到阿里云

image.png

阿里云开发者平台配置

https://promotion.aliyun.com/ntms/act/kubernetes.html

登录后,点击镜像搜索

创建仓库镜像
image.png

选择控制台->云服务器ECS->容器镜像服务

选择个人实例
image.png

命令空间
image.png

创建命令空间

仓库名称
image.png

image.png
image.png
进入管理界面获得脚本
image.png

将镜像推送到阿里云

image.png

将阿里云上的镜像下载到本地
docker pull registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1
image.png

Docker 容器数据卷

问题:Docker挂载主机目录访问如果出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可

docker 容器数据卷是什么?

卷是目录或文件,存在于一个或多个容器中,docker 挂载到容器,但不属于联合文件系统,卷的设计目的就是数据持久化,完全独立于容器的生存周期,因为docker 不会在容器删除时删除其挂在的数据卷。

即将docker 容器内的数据保存到宿主机的磁盘中,可以备份容器的数据;
运行一个带有容器卷存储功能的容器实例:

  • docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

特点:

  • 数据卷可以在容器之间共享或重用数据;
  • 卷中的更改可以直接实时生效;
  • 数据卷中的更改不会包含在镜像的更新中;
  • 数据卷的生命周期一直持续到没有容器使用它为止。

查看数据卷是否挂在成功:
docker inspect 容器 id

读写规则映射:

  • docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
  • /容器目录:ro 镜像名 ,就能完成功能,此时容器自己只能读取不能写

容器的继承和共享:

  • docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu
  • docker run -it --privileged=true --volumes-from u1(父类) --name u2 ubuntu

Docker 常规安装简介

  • 搜索镜像
  • 拉取镜像
  • 查看镜像
  • 启动镜像,服务端口映射
  • 停止容器
  • 移除容器

安装 tomcat

  1. docker hub 上查找 tomcat 镜像:docker search tomcat
  2. 从docker hub 上拉取 tomcat 镜像到本地:docker pull tomcat
  3. 查看是否有拉取到tomcat 镜像:docker images
  4. 使用tomcat 镜像创建容器实例:docker run -it -p 8080:8080 tomcat

如果出现 404 的问题,可能是映射端口或者没有关闭防火墙
解决:webapps.dist目录换成webapps

也可以下载其他版本:
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

安装mysql

  • docker pull mysql:5.7
  • docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
  • docker ps
  • docker exec -it 容器ID /bin/bash.
  • mysql -uroot -p

检查docker mysql 上默认字符编码:
SHOW VARIABLES LIKW ‘character%’
image.png

删除容器后,数据如何备份?
docker run -d -p 3306:3306 --privileged=true -v
/zzyyuse/mysql/log:/var/log/mysql -v
/zzyyuse/mysql/data:/var/lib/mysql -v
/zzyyuse/mysql/conf:/etc/mysql/conf.d -e

修改配置:

# 进入宿主机挂载mysql容器的配置文件路径
cd /zzyyuse/mysql/conf/

# 新建 my.cnf
vim my.cnf
cat my.cnf

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

# 重新启动mysql容器实例再重新进入并查看字符编码
docker restart mysql
docker exec -it mysql bash

安装 redis

  1. 从 docker hub 拉取redis镜像到本地:docker pull redis:6.0.8
  2. 启动:docker run -d -p 6379:6379 redis:6.0.8
  3. 进入启动的redis:docker exec -it 容器id /bin/bash
  4. redis -cli

在 cent os宿主机下新建目录 /app/redis
mkdir -p /app/redis/
将redis.conf 文件模板拷贝进 /app/redis/
cp /myredis/redis.conf /app/reids/

修改配置文件 /app/reids/redis.conf

  • 注释掉 # bind 127.0.0.1
  • 将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值