Docker与微服务实战------基础篇
- [第一章 Docker 简介](#第一章 Docker 简介)
-
- [1.1 docker 理念](#1.1 docker 理念)
- [1.2 容器与虚拟机比较](#1.2 容器与虚拟机比较)
- [第二章 Docker 安装](#第二章 Docker 安装)
-
- [2.1 前提说明](#2.1 前提说明)
- [2.2 Docker的基本组成](#2.2 Docker的基本组成)
-
- [2.2.1 镜像(image)](#2.2.1 镜像(image))
- [2.2.2 容器(container)](#2.2.2 容器(container))
- [2.2.3 仓库(repository)](#2.2.3 仓库(repository))
- [2.2.4 小结](#2.2.4 小结)
- [2.3 Docker 工作原理](#2.3 Docker 工作原理)
- [2.4 Docker运行的基本流程](#2.4 Docker运行的基本流程)
- [2.5 CentOS 7 安装 Docker](#2.5 CentOS 7 安装 Docker)
- [2.6 阿里云镜像加速](#2.6 阿里云镜像加速)
- [第三章 Docker 常用命令](#第三章 Docker 常用命令)
-
- [3.1 帮助启动类命令](#3.1 帮助启动类命令)
- [3.2 镜像命令](#3.2 镜像命令)
-
- [3.2.1 docker images------列出本地主机上的镜像](#3.2.1 docker images——列出本地主机上的镜像)
- [3.2.2 docker search------搜索镜像](#3.2.2 docker search——搜索镜像)
- [3.2.3 docker pull------下载镜像](#3.2.3 docker pull——下载镜像)
- [3.2.4 docker system df ------查看镜像/容器/数据卷所占的空间](#3.2.4 docker system df ——查看镜像/容器/数据卷所占的空间)
- [3.2.5 docker rmi ------ 删除镜像](#3.2.5 docker rmi —— 删除镜像)
- [3.3 容器命令](#3.3 容器命令)
-
- [3.3.1 新建+启动容器](#3.3.1 新建+启动容器)
- [3.3.2 列出当前所有正在运行的容器](#3.3.2 列出当前所有正在运行的容器)
- [3.3.3 退出容器](#3.3.3 退出容器)
- [3.3.4 启动已停止运行的容器](#3.3.4 启动已停止运行的容器)
- [3.3.5 停止容器](#3.3.5 停止容器)
- [3.3.6 强制停止容器](#3.3.6 强制停止容器)
- [3.3.7 删除已停止的容器](#3.3.7 删除已停止的容器)
- [3.3.8 启动守护式容器(后台服务器)***](#3.3.8 启动守护式容器(后台服务器)***)
- [3.3.9 查看容器日志](#3.3.9 查看容器日志)
- [3.3.10 查看容器内运行的进程](#3.3.10 查看容器内运行的进程)
- [3.3.11 进入正在运行的容器并以命令行交互](#3.3.11 进入正在运行的容器并以命令行交互)
- [3.3.12 从容器内拷贝文件到主机上](#3.3.12 从容器内拷贝文件到主机上)
- [3.3.13 导入和导出容器](#3.3.13 导入和导出容器)
- [第四章 Docker 镜像](#第四章 Docker 镜像)
-
- [4.1 镜像是什么](#4.1 镜像是什么)
- [4.2 分层的镜像](#4.2 分层的镜像)
- [4.3 UnionFS(联合文件系统)](#4.3 UnionFS(联合文件系统))
- [4.4 docker 镜像加载原理](#4.4 docker 镜像加载原理)
- [4.5 为什么 docker 镜像要采用这种分层结构](#4.5 为什么 docker 镜像要采用这种分层结构)
- [4.6 Docker镜像commit操作命令](#4.6 Docker镜像commit操作命令)
- [第五章 本地镜像发布到阿里云](#第五章 本地镜像发布到阿里云)
-
- [5.1 将本地镜像推送到阿里云](#5.1 将本地镜像推送到阿里云)
- [5.2 将阿里云上的镜像下载到本地](#5.2 将阿里云上的镜像下载到本地)
- [第六章 本地镜像发布到私有库](#第六章 本地镜像发布到私有库)
- [第七章 Docker容器数据卷](#第七章 Docker容器数据卷)
-
- [7.1 容器数据卷的含义](#7.1 容器数据卷的含义)
- [7.2 容器数据卷的功能](#7.2 容器数据卷的功能)
- [7.3 数据卷的案例](#7.3 数据卷的案例)
-
- [7.3.1 宿主和容器之间映射添加容器卷](#7.3.1 宿主和容器之间映射添加容器卷)
- [7.3.2 读写规则映射添加说明](#7.3.2 读写规则映射添加说明)
- [7.3.3 卷的继承和共享](#7.3.3 卷的继承和共享)
- [第八章 Docker常规安装简介](#第八章 Docker常规安装简介)
-
- [8.1 安装tomcat](#8.1 安装tomcat)
- [8.2 安装mysql](#8.2 安装mysql)
- [8.3 安装redis](#8.3 安装redis)
第一章 Docker 简介
1.1 docker 理念
Docker是内核级虚拟化
。
Docker是基于Go语言实现的云开源项目。
Docker是一个C/S模式的架构,后端是一个松耦合架构,众多模块各司其职。
Docker解决了运行环境和配置问题
的软件容器
,方便做持续集成并有助于整体发布的容器虚拟化技术。
1.2 容器与虚拟机比较
虚拟机(VM) | Docker容器 | |
---|---|---|
操作系统 | 宿主机OS上运行虚拟机OS | 与宿主机共享OS |
存储大小 | 镜像庞大(vmdk、vid等) | 镜像小,便于存储与传输 |
运行性能 | 操作系统额外的CPU、内存消耗 | 几乎无额外性能损失 |
移植性 | 笨重,与虚拟化技术耦合度高 | 轻便、灵活,适应于Linux |
硬件亲和性 | 面向硬件运维者 | 面向软件开发者 |
部署速度 | 较慢,10s以上 | 快速,秒级 |
第二章 Docker 安装
2.1 前提说明
Docker 必须部署在Linux内核的系统上。
前提条件 :
目前,CentOS仅发行版本中的内核支持Docker。Docker运行在CentOS 7(64-bit),要求系统为64位、Linux系统内核版本为3.8以上,这里选用CentOS7.x
查看自己的内核
uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)
2.2 Docker的基本组成
2.2.1 镜像(image)
Docker 镜像(image)就是一个只读
的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器
。
它也相当于是一个root文件系统。比如官方镜像 centos:7 就包括了完整的一套 centos:7最小系统的root文件系统。
相当于容器的"源代码",docker镜像文件类似于Java的类模板,而docker容器实例类似于Java中new出来的实例对象
。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
2.2.2 容器(container)
1)从面向对象角度
Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的环境,容器是用镜像创建的运行实例
。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
2)从镜像容器角度
可以把容器看做是一个简易版的Linux环境
(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
2.2.3 仓库(repository)
仓库(Repository)是集中存放镜像
文件的场所。
类似于
Maven仓库,存放各种jar包的地方;
github仓库,存放各种git项目的地方;
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是Docker Hub(https://hub.docker.com/)
,存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等。
2.2.4 小结
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似java中new出来一个对象)
image文件可以看作是容器的模板。Docker 根据image文件生成容器的实例。同一个image 文件,可以生成多个同时运行的容器实例。
镜像文件: image文件生成的容器实例,本身也是一个文件,称为镜像文件。
容器实例: 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
仓库: 就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。
2.3 Docker 工作原理
Docker是一个Client-Server结构的系统
,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。容器,是一个运行时环境。
2.4 Docker运行的基本流程
- 用户是使用 Docker Client(命令行窗口)与Docker Daemon(后台守护进程)建立通信,并发送请求给后者。
- Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。
- Docer Engine(引擎)执行 Docker 内部的一系列工作,每一项工作都是以一个Job的形式的存在。
- Job 的运行过程中,当需要容器镜像时,则从Docker Registry 中下载镜像,并通过镜像管理驱动 Graph driver 将下载镜像以Graph的形式存储。
- 当需要为Docker创建网络环境时,通过网络管理驱动 Network driver创建并配置 Docker 来完成。
- 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Exec driver(执行驱动)来完成。
- Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。
2.5 CentOS 7 安装 Docker
安装地址:https://docs.docker.com/engine/install/centos
1)确定你是CentOS7及以上版本
2)卸载旧版本
3)yum 安装 gcc相关
首先要保证CentOS7能上外网,再执行以下操作:
bash
[root@localhost ~]# yum -y install gcc
[root@localhost ~]# yum -y install gcc-c++
4)安装需要的软件包
bash
[root@localhost ~]# yum -y install yum-utils
5)设置 stable 镜像仓库
bash
[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
6)更新 yum 软件包索引
bash
[root@localhost ~]# yum makecache fast
7)安装DOCKER CE
bash
[root@localhost ~]# yum -y install docker-ce docker-ce-cli containerd.io
8)启动 docker
bash
[root@localhost ~]# systemctl start docker
[root@localhost ~]# ps -ef | grep docker
root 83592 1 0 11:06 ? 00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root 84314 2819 0 11:07 pts/0 00:00:00 grep --color=auto docker
9)测试
bash
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 24.0.7
API version: 1.43
Go version: go1.20.10
Git commit: afdd53b
Built: Thu Oct 26 09:11:35 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 24.0.7
API version: 1.43 (minimum version 1.12)
Go version: go1.20.10
Git commit: 311b9ff
Built: Thu Oct 26 09:10:36 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.24
GitCommit: 61f9fd88f79f081d64d6fa3bb1a0dc71ec870523
runc:
Version: 1.1.9
GitCommit: v1.1.9-0-gccaecfc
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@localhost ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
719385e32844: Pull complete
Digest: sha256:88ec0acaa3ec199d3b7eaf73588f4518c25f9d34f58ce9a0df68429c5af48e8d
Status: Downloaded newer image for hello-world:latest
Hello from Docker! // 如果能看见这句话就代表安装成功
10)卸载
bash
[root@localhost ~]# systemcl stop docker
[root@localhost ~]# yum remove docker-ce docker-ce-cli containerd.io
[root@localhost ~]# rm -rf /var/lib/docker
[root@localhost ~]# rm -rf /var/lib/containerd
2.6 阿里云镜像加速
https://promotion.aliyun.com/ntms/act/kubernetes.html
- 注册一个属于自己的阿里云账户(可复用淘宝账号)
- 登陆阿里云开发者平台
- 点击控制台
- 选择容器镜像服务
- 获取加速器地址
- 粘贴脚本直接执行
bash
[root@localhost ~]# mkdir -p /etc/docker
[root@localhost ~]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://axlh76es.mirror.aliyuncs.com"]
> }
> EOF
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
- 测试运行 hello-world
bash
[root@localhost ~]# docker run hello-world
Hello from Docker! // 能打印出这句话证明运行成功
第三章 Docker 常用命令
3.1 帮助启动类命令
1)启动docker:
bash
[root@localhost ~]# systemctl start docker
2)停止docker:
bash
[root@localhost ~]# systemctl stop docker
3)重启docker:
bash
[root@localhost ~]# systemctl restart docker
4)查看docker状态:
bash
[root@localhost ~]# systemctl status docker
5)开机启动:
bash
[root@localhost ~]# systemctl enable docker
6)查看docker概要信息:
bash
[root@localhost ~]# docker info
7)查看docker总体帮助文档:
bash
[root@localhost ~]# docker --help
8)查看docker命令帮助文档:
bash
[root@localhost ~]# docker cp --help
3.2 镜像命令
3.2.1 docker images------列出本地主机上的镜像
1)命令
docker images [参数]
2)显示说明
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签版本号
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
3)参数说明
参数 | 功能 |
---|---|
-a | 列出本地所有的镜像(含历史映像层) |
-q | 只显示镜像ID |
4)案例实操
bash
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 9c7a54a9a43c 5 months ago 13.3kB
3.2.2 docker search------搜索镜像
一般在dockerhub网站中搜索
1)命令
docker search [options] 镜像名字
2)显示说明
NAME:镜像名称
DESCRIPTION:镜像说明
STARS:点赞数量
OFFICIAL:是否是官方的
AUTOMATED:是否是自动构建的
3)参数说明
选项 | 功能 |
---|---|
- -limit | 只列出N个镜像,默认25个 |
4)案例实操
bash
[root@localhost ~]# docker search redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that... 12438 [OK]
// 只显示用的最多的默认前五条命令
[root@localhost ~]# docker search --limit 5 redis
3.2.3 docker pull------下载镜像
1)命令
1. docker pull 镜像名字[:TAG]
2. docker pull 镜像名字
没有TAG就是最新版
等价于
docker pull 镜像名字:latest
2)案例实操
bash
[root@localhost ~]# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
7b1a6ab2e44d: Pull complete
Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
3.2.4 docker system df ------查看镜像/容器/数据卷所占的空间
1)案例实操
bash
[root@localhost ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 2 1 72.79MB 72.78MB (99%)
Containers 2 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
3.2.5 docker rmi ------ 删除镜像
1)命令
docker rmi [options] <某个XXX镜像名字ID>
docker rmi -f 镜像ID 删除单个
docker rmi -f 镜像名1:TAG 镜像名2:TAG 删除多个
docker rmi -f $(docker images -qa) 删除全部
2)案例实操
bash
删除单个
[root@localhost ~]# docker rmi -f 9c7a54a9a43c
删除多个
[root@localhost ~]# docker rmi -f ubuntu hello-world
3.3 容器命令
3.3.1 新建+启动容器
1)命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
2)参数说明
参数 | 功能 |
---|---|
--name="容器新名字" | 为容器指定一个名称 |
-d | 后台运行容器并返回容器ID,也即启动守护式容器(后台运行) |
-i | 以交互模式运行容器,通常与-t同时使用 |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用 也即启动交互式容器(前台有伪终端,等待交互) |
-P | 随机端口映射,大写P |
-p | 指定端口映射,小写p |
参数说明:
-i:交互式操作。
-t:终端。
3)启动交互式容器(前台命令行)
4)指定容器名字
3.3.2 列出当前所有正在运行的容器
1)命令
docker ps [OPTIONS]
2)参数说明
参数 | 功能 |
---|---|
-a | 列出当前所有在正在运行的容器+历史上运行过的 |
-l | 显示最近创建的容器 |
-n | 显示最近n个创建的容器 |
-q | 静默模式,只显示容器编号 |
3)案例实操
bash
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9931fe1e7230 ubuntu "/bin/bash" 5 minutes ago Up 5 minutes sleepy_feistel
[root@localhost ~]# docker ps -a
3.3.3 退出容器
exit run进去容器,exit退出,容器停止
ctrl+p+q run进去容器,ctrl+p+q退出,容器不停止
3.3.4 启动已停止运行的容器
1)命令
docker start 容器ID或者容器名
2)案例实操
bash
[root@localhost ~]# docker ps -n 2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e0b5de73965 ubuntu "/bin/bash" 2 hours ago Up 2 hours dazzling_wilson
722e5fcce992 ubuntu "bash" 2 hours ago Exited (0) About an hour ago myu1
[root@localhost ~]# docker start 722e5fcce992
722e5fcce992
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e0b5de73965 ubuntu "/bin/bash" 2 hours ago Up 2 hours dazzling_wilson
722e5fcce992 ubuntu "bash" 2 hours ago Up 4 seconds myu1
3.3.5 停止容器
1)命令
docker stop 容器ID 或者容器名
3.3.6 强制停止容器
1)命令
docker kill 容器ID或者容器名
3.3.7 删除已停止的容器
1)命令
docker rm 容器ID
一次性删除多个容器实例
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
3.3.8 启动守护式容器(后台服务器)***
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以通过-d 指定容器的后台运行模式。
1)命令
docker run -d 容器名
docker 容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令,就是会自动退出
2)redis 前后台启动演示
(1)前台交互式启动
bash
[root@localhost ~]# docker run -it redis:6.0.8
(2)后台守护式启动
bash
[root@localhost ~]# docker run -d redis:6.0.8
3.3.9 查看容器日志
1)命令
docker logs 容器ID
3.3.10 查看容器内运行的进程
1)命令
docker inspect 容器ID
3.3.11 进入正在运行的容器并以命令行交互
1)命令
docker exec -it 容器ID bin/bash
docker attach 容器ID(重新进入)
2)两个命令的区别
attach
直接进入容器启动命令的终端,不会启动新的进程
用exit退出,会导致容器的停止。
exec
是在容器中打开新的终端,并且可以启动新的进程
用exit退出,不会导致容器的停止。
推荐使用 docker exec命令,因为退出容器终端,不会导致容器的停止。
3.3.12 从容器内拷贝文件到主机上
1)命令
docker cp 容器ID:容器内路径 目的主机路径
3.3.13 导入和导出容器
1)命令
docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
export 导出容器的内容流作为一个tar归档文件[对应 import 命令]
import 从tar 包中的内容创建一个新的文件系统再导入镜像[对应 export]
2)案例实操
bash
[root@localhost ~]# docker cp 0176a29ea86d > a.tar
[root@localhost ~]# ls
a.tar
[root@localhost ~]# docker rm -f 0176a29ea86d
0176a29ea86d
[root@localhost ~]# cat a.tar | docker import - ubuntu/ubuntu:6.3
sha256:fc49059e80ad15fca9852d26ce0ef4ee8d628a0e855802fde4c5a970910784c1
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu/ubuntu 6.3 fc49059e80ad About a minute ago 0B
第四章 Docker 镜像
4.1 镜像是什么
镜像
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是 image 镜像文件。
只有通过这个镜像文件才能生成 docker容器实例
4.2 分层的镜像
4.3 UnionFS(联合文件系统)
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,
同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承
,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
4.4 docker 镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
boofts(boot system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,linux刚启动会加载bootfs文件系统,在docker镜像的最底层是引导文件系统bootfs。
这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root system),在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etx 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,CentOS等等。
4.5 为什么 docker 镜像要采用这种分层结构
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
Docker 镜像分层都是只读的,容器层是可写的
当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作"容器层","容器层"之下的都叫"镜像层"。
4.6 Docker镜像commit操作命令
docker commit 提交容器副本使之成为一个新的镜像
1)命令说明
docker commit -m="提交的描述信息"-a"作者"容器ID要创建的目标镜像名:[标签名]
2)案例演示ubuntu安装vim
bash
(1)原始的默认ubuntu镜像是不带着vim命令的
[root@localhost ~]# docker run -it ubuntu
root@e6602cb72a30:/# vim a.txt
bash: vim: command not found
(2)外网连通的情况下,安装vim
# 先更新我们的包管理工具
root@e6602cb72a30:/# apt-get update
# 然后安装我们需要的vim
root@e6602cb72a30:/# apt-get -y install vim
(3)安装完成后,commit我们自己的新镜像
[root@localhost ~]# docker commit -m="vim cmd add ok" -a="abc" e6602cb72a30 root/ubuntu:1.3
sha256:8b0e2010528a276b0fa0309b07d7bad3425b9e8c1fc5dc9e570c92791208dc80
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
root/ubuntu 1.3 8b0e2010528a About a minute ago 162MB
(4)启动我们的新镜像并和原来的对比
[root@localhost ~]# docker run -it ubuntu /bin/bash
root@10209ad51630:/# vim a.txt
bash: vim: command not found
root@10209ad51630:/# exit
exit
[root@localhost ~]# docker run -it 8b0e2010528a /bin/bash
root@c98544b2ae0c:/# vim a.txt
root@c98544b2ae0c:/# cat a.txt
hello docker
docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像
。类似java继承于一个base基础类,自己再按需扩展。
新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。
第五章 本地镜像发布到阿里云
本地镜像发布到阿里云流程,如下图:
5.1 将本地镜像推送到阿里云
1)本地镜像素材原型
2)阿里云开发者平台
https://promotion.aliyun.com/ntms/act/kubernetes.html
3)创建仓库镜像
(1)选择控制台,进入容器镜像服务
(2)选择个人实例
(3)命名空间
(4)仓库名称
(5)进入管理界面获得脚本
4)将镜像推送到阿里云
将镜像推送到阿里云registry
(1)管理脚本界面
(2)脚本实例
bash
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
root/ubuntu 1.3 8b0e2010528a 44 minutes ago 162MB
tomcat latest fb5657adc892 22 months ago 680MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
hello-world latest feb5d9fea6a5 2 years ago 13.3kB
redis 6.0.8 16ecd2772934 3 years ago 104MB
[root@localhost ~]# docker login --username=aliyun5432219780 registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@localhost ~]# docker tag 8b0e2010528a registry.cn-hangzhou.aliyuncs.com/aafd/myubuntu:1.3
[root@localhost ~]# docker push registry.cn-hangzhou.aliyuncs.com/aafd/myubuntu:1.3
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/aafd/myubuntu]
bfa7aa9aef0f: Pushed
9f54eef41275: Pushed
1.3: digest: sha256:e12d91342719d1593beeb7d76db23bd44cf17911db2ebb9b0e0503695fd0fae8 size: 741
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/aafd/myubuntu 1.3 8b0e2010528a 54 minutes ago 162MB
root/ubuntu 1.3 8b0e2010528a 54 minutes ago 162MB
tomcat latest fb5657adc892 22 months ago 680MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
hello-world latest feb5d9fea6a5 2 years ago 13.3kB
redis 6.0.8 16ecd2772934 3 years ago 104MB
5.2 将阿里云上的镜像下载到本地
bash
(1)登录阿里云docker registry
[root@localhost ~]# docker login --username=aliyun5432219780 registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
(2)从registry中拉取镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/aafd/myubuntu 1.3 8b0e2010528a 54 minutes ago 162MB
root/ubuntu 1.3 8b0e2010528a 54 minutes ago 162MB
tomcat latest fb5657adc892 22 months ago 680MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
hello-world latest feb5d9fea6a5 2 years ago 13.3kB
redis 6.0.8 16ecd2772934 3 years ago 104MB
[root@localhost ~]# docker rmi -f 8b0e2010528a
Untagged: root/ubuntu:1.3
Untagged: registry.cn-hangzhou.aliyuncs.com/aafd/myubuntu:1.3
Untagged: registry.cn-hangzhou.aliyuncs.com/aafd/myubuntu@sha256:e12d91342719d1593beeb7d76db23bd44cf17911db2ebb9b0e0503695fd0fae8
Deleted: sha256:8b0e2010528a276b0fa0309b07d7bad3425b9e8c1fc5dc9e570c92791208dc80
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest fb5657adc892 22 months ago 680MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
hello-world latest feb5d9fea6a5 2 years ago 13.3kB
redis 6.0.8 16ecd2772934 3 years ago 104MB
[root@localhost ~]# docker pull registry.cn-hangzhou.aliyuncs.com/aafd/myubuntu:1.3
1.3: Pulling from aafd/myubuntu
7b1a6ab2e44d: Already exists
09ba0e50a073: Already exists
Digest: sha256:e12d91342719d1593beeb7d76db23bd44cf17911db2ebb9b0e0503695fd0fae8
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/aafd/myubuntu:1.3
registry.cn-hangzhou.aliyuncs.com/aafd/myubuntu:1.3
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/aafd/myubuntu 1.3 8b0e2010528a 57 minutes ago 162MB
tomcat latest fb5657adc892 22 months ago 680MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
hello-world latest feb5d9fea6a5 2 years ago 13.3kB
redis 6.0.8 16ecd2772934 3 years ago 104MB
[root@localhost ~]# docker run -it 8b0e2010528a /bin/bash
root@0d8aeb3b883a:/# vim a.txt
root@0d8aeb3b883a:/# exit
exit
第六章 本地镜像发布到私有库
docker registry是官方提供的工具,可以用于构建私有镜像仓库。
1)下载镜像docker registry
bash
[root@localhost ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
79e9f2f55bf5: Pull complete
0d96da54f60b: Pull complete
5b27040df4a2: Pull complete
e2ead8259a04: Pull complete
3790aef225b9: Pull complete
Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest b8604a3fe854 23 months ago 26.2MB
2)运行私有库registry,相当于本地有个私有docker hub
bash
[root@localhost ~]# docker run -d -p 5000:5000 registry
fd0fa916bf1ff9677fd60f3e85e44cb319bdb43aa1e03d0936361c74edc2cdb4
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd0fa916bf1f registry "/entrypoint.sh /etc..." 8 seconds ago Up 7 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp cranky_archimedes
3)案例演示创建一个新镜像,ubuntu安装ifconfig命令
bash
(1)原始的ubuntu镜像是不带着ifconfig命令的
[root@localhost ~]# docker run -it ubuntu /bin/bash
root@6f49d88a0556:/# ifconfig
bash: ifconfig: command not found
(2)外网连通的情况下,安装ifconfig命令并测试通过
root@6f49d88a0556:/# apt-get update
root@6f49d88a0556:/# apt-get install net-tools
root@6f49d88a0556:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 1995 bytes 21100770 (21.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1393 bytes 78212 (78.2 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
(3)安装完成后,commit我们自己的新镜像
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f49d88a0556 ubuntu "/bin/bash" 6 minutes ago Up 6 minutes pensive_turing
fd0fa916bf1f registry "/entrypoint.sh /etc..." 8 minutes ago Up 8 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp cranky_archimedes
[root@localhost ~]# docker commit -m="ifconfig cmd add" -a="ahx" 6f49d88a0556 myubuntu:1.2
sha256:b35d6629da55eb92acc004e17bba9b8563108c55dbd1737941214e7deb28cef0
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu 1.2 b35d6629da55 5 seconds ago 108MB
registry latest b8604a3fe854 24 months ago 26.2MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
hello-world latest feb5d9fea6a5 2 years ago 13.3kB
redis 6.0.8 16ecd2772934 3 years ago 104MB
(4)启动我们的新镜像并和原来的对比
[root@localhost ~]# docker stop 6f49d88a0556
6f49d88a0556
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu 1.2 b35d6629da55 About a minute ago 108MB
registry latest b8604a3fe854 24 months ago 26.2MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
hello-world latest feb5d9fea6a5 2 years ago 13.3kB
redis 6.0.8 16ecd2772934 3 years ago 104MB
[root@localhost ~]# docker run -it b35d6629da55 /bin/bash
root@331eb9b604a9:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 6 bytes 508 (508.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@331eb9b604a9:/# exit
exit
4)curl验证私服库上有什么镜像
bash
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd0fa916bf1f registry "/entrypoint.sh /etc..." 25 hours ago Up 25 hours 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp cranky_archimedes
[root@localhost ~]# curl -XGET http://192.168.47.199:5000/v2/_catalog
{"repositories":[]}
5)将新镜像myubuntu:1.2修改符合私服规范的Tag
bash
[root@localhost ~]# docker tag myubuntu:1.2 192.168.47.199:5000/myubuntu:1.2
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.47.199:5000/myubuntu 1.2 b35d6629da55 25 hours ago 108MB
myubuntu 1.2 b35d6629da55 25 hours ago 108MB
6)修改配置文件使之支持http
2个配置中间有个逗号','别漏了
,这个配置是json格式的。
bash
[root@localhost ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://axlh76es.mirror.aliyuncs.com"],
"insecure-registries":["192.168.47.199:5000"]
}
修改完后如果不生效,建议重启docker服务。
[root@localhost ~]# systemctl restart docker
重启成功之后,再运行一下私有库
[root@localhost ~]# docker run -d -p 5000:5000 registry
a82ffb8bee06ad2b63fb615e1a55c2bb8e1776c44573a64be3ff63f6b1472938
7)push推送到私服库
bash
[root@localhost ~]# docker push 192.168.47.199:5000/myubuntu:1.2
The push refers to repository [192.168.47.199:5000/myubuntu]
c97b0ab9299d: Pushed
9f54eef41275: Pushed
1.2: digest: sha256:7a01caa8f3614e982bd2571866ec100eee2b265c9ed579fb66042dfbc0076d11 size: 741
8)curl验证私服库上有什么镜像
bash
[root@localhost ~]# curl -XGET http://192.168.47.199:5000/v2/_catalog
{"repositories":["myubuntu"]}
9)pull到本地并运行
bash
[root@localhost ~]# docker rmi -f 192.168.47.199:5000/myubuntu:1.2
[root@localhost ~]# docker rmi -f myubuntu:1.2
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest b8604a3fe854 24 months ago 26.2MB
ubuntu latest ba6acccedd29 2 years ago 72.8MB
hello-world latest feb5d9fea6a5 2 years ago 13.3kB
redis 6.0.8 16ecd2772934 3 years ago 104MB
[root@localhost ~]# curl -XGET http://192.168.47.199:5000/v2/_catalog
{"repositories":["myubuntu"]}
[root@localhost ~]# docker pull 192.168.47.199:5000/myubuntu:1.2
1.2: Pulling from myubuntu
7b1a6ab2e44d: Already exists
e0855fb5fc2d: Already exists
Digest: sha256:7a01caa8f3614e982bd2571866ec100eee2b265c9ed579fb66042dfbc0076d11
Status: Downloaded newer image for 192.168.47.199:5000/myubuntu:1.2
192.168.47.199:5000/myubuntu:1.2
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.47.199:5000/myubuntu 1.2 b35d6629da55 26 hours ago 108MB
[root@localhost ~]# docker run -it 192.168.47.199:5000/myubuntu:1.2 /bin/bash
root@90b582e9b77a:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 7 bytes 578 (578.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
第七章 Docker容器数据卷
7.1 容器数据卷的含义
卷就是目录或文件,存在于一个或多个容器中,有docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。
卷的设计目的就是数据的持久化
,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
将docker容器内的数据保存进宿主机的磁盘中,以达到数据持久化和敏感重要的数据备份。
1)命令
--privileged=true
Docker挂载主机目录访问如果出现cannot open directory .:Permission denied
解决方法:在挂载目录后多加一个--privileged=true参数即可。
2)参数说明
参数 | 功能 |
---|---|
-v | 添加自定义的容器卷 |
3)运行一个带有容器卷存储功能的容器实例
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
7.2 容器数据卷的功能
将运用与运行的环境打包镜像,run后形成容器实例运行,但是我们对数据的要求希望是持久化的
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
7.3 数据卷的案例
7.3.1 宿主和容器之间映射添加容器卷
1)命令
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
bash
# 将docker容器内的数据保存进宿主机的磁盘中
[root@localhost ~]# docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu //这里的host_data和docker_data目录是自动创建的
root@037178ca7174:/# cd /tmp/docker_data/
root@037178ca7174:/tmp/docker_data# ls
root@037178ca7174:/tmp/docker_data# touch dockerin.txt
root@037178ca7174:/tmp/docker_data# ls
dockerin.txt
# 在主机上去查看,并创建一个新的文件
[root@localhost ~]# cd /tmp/host_data/
[root@localhost host_data]# ls
dockerin.txt
[root@localhost host_data]# touch hostin.txt
# docker上查看是否有新建的文件
root@037178ca7174:/tmp/docker_data# ls
dockerin.txt hostin.txt
2)查看数据卷是否挂载成功
bash
[root@localhost ~]# docker inspect 037178ca7174
......
"Mounts": [
{
"Type": "bind",
"Source": "/tmp/host_data",
"Destination": "/tmp/docker_data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
.......
3)容器和宿主机之间数据共享
- docker修改,主机同步获得
- 主机修改,docker同步获得
- docker容器stop,主机修改,docker容器重启看数据是否同步。
bash
[root@localhost host_data]# touch c.txt
[root@localhost ~]# docker stop 037178ca7174
037178ca7174
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker start 037178ca7174
037178ca7174
[root@localhost ~]# docker exec -it 037178ca7174 /bin/bash
root@037178ca7174:/# cd /tmp/docker_data/
root@037178ca7174:/tmp/docker_data# ls
c.txt dockerin.txt hostin.txt
7.3.2 读写规则映射添加说明
1)读写(默认)
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
默认同上案例,默认就是rw
2)只读
容器实例内部被限制,只能读取不能写
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
bash
[root@localhost ~]# docker run -it --privileged=true -v /mydocker/u:/tmp/u:ro --name u2 ubuntu
root@b4ecac69f23a:/# cd /tmp/u/
root@b4ecac69f23a:/tmp/u# ls
root@b4ecac69f23a:/tmp/u# pwd
/tmp/u
# 在主机的/mydocker/u/目录下创建a.txt并写入内容
[root@localhost ~]# cd /mydocker/u/
[root@localhost u]# touch a.txt
[root@localhost u]# vim a.txt
# 在u2容器实例内部去查看
root@b4ecac69f23a:/tmp/u# ls
a.txt
root@b4ecac69f23a:/tmp/u# cat a.txt
dabs
cdb
# 容器自己只能读取不能写
root@b4ecac69f23a:/tmp/u# touch b.txt
touch: cannot touch 'b.txt': Read-only file system
# 如果宿主机写入内容,可以同步给容器内,容器可以读取到。
7.3.3 卷的继承和共享
1)容器1完成和宿主机的映射
bash
# 容器实例
[root@localhost ~]# docker run -it --privileged=true -v /mydocker/u:/tmp/u --name u1 ubuntu /bin/bash
root@cd788caa15dc:/# cd /tmp/u
root@cd788caa15dc:/tmp/u# ll
total 4
drwxr-xr-x. 2 root root 19 Nov 4 08:36 ./
drwxrwxrwt. 1 root root 15 Nov 4 08:44 ../
-rw-r--r--. 1 root root 9 Nov 4 08:36 a.txt
root@cd788caa15dc:/tmp/u# touch u1data.txt
root@cd788caa15dc:/tmp/u# ls
u1data.txt
# 主机
[root@localhost u]# touch host.txt
# 容器实例
root@cd788caa15dc:/tmp/u# ls
host.txt u1data.txt
2)容器2继承容器1的卷规则
bash
[root@localhost ~]# docker run -it --privileged=true --volumes-from u1 --name u3 ubuntu
root@2ba4fdfc72c4:/# cd /tmp/u/
root@2ba4fdfc72c4:/tmp/u# ll
total 0
drwxr-xr-x. 2 root root 40 Nov 4 08:45 ./
drwxrwxrwt. 1 root root 15 Nov 4 08:49 ../
-rw-r--r--. 1 root root 0 Nov 4 08:45 host.txt
-rw-r--r--. 1 root root 0 Nov 4 08:44 u1data.txt
root@2ba4fdfc72c4:/tmp/u# touch u2data.txt
root@2ba4fdfc72c4:/tmp/u# ls
host.txt u1data.txt u2data.txt
root@2ba4fdfc72c4:/tmp/u# ll
total 0
drwxr-xr-x. 2 root root 58 Nov 4 08:50 ./
drwxrwxrwt. 1 root root 15 Nov 4 08:49 ../
-rw-r--r--. 1 root root 0 Nov 4 08:45 host.txt
-rw-r--r--. 1 root root 0 Nov 4 08:44 u1data.txt
-rw-r--r--. 1 root root 0 Nov 4 08:50 u2data.txt
第八章 Docker常规安装简介
总体步骤:搜索镜像→拉取镜像→查看镜像→启动镜像(服务端口映射)→停止容器→移除容器
8.1 安装tomcat
1)docker hub上面查找tomcat镜像
2)从docker hub上拉取tomcat镜像到本地
3)docker images查看是否有拉取到的tomcat
4)使用tomcat镜像创建容器实例(也叫运行镜像)
bash
[root@localhost ~]# docker run -d -p 8080:8080 --name ti tomcat
712f1fd1edc9bbddad1db1e23f9eb7f3b9b6c6ee4a6e86da41527a58482a08dc
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
712f1fd1edc9 tomcat "catalina.sh run" 33 seconds ago Up 32 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp ti
5)访问猫首页
bash
[root@localhost ~]# docker exec -it 712f1fd1edc9 /bin/bash
root@712f1fd1edc9:/usr/local/tomcat# ls -l
total 132
-rw-r--r--. 1 root root 18994 Dec 2 2021 BUILDING.txt
-rw-r--r--. 1 root root 6210 Dec 2 2021 CONTRIBUTING.md
-rw-r--r--. 1 root root 60269 Dec 2 2021 LICENSE
-rw-r--r--. 1 root root 2333 Dec 2 2021 NOTICE
-rw-r--r--. 1 root root 3378 Dec 2 2021 README.md
-rw-r--r--. 1 root root 6905 Dec 2 2021 RELEASE-NOTES
-rw-r--r--. 1 root root 16517 Dec 2 2021 RUNNING.txt
drwxr-xr-x. 2 root root 4096 Dec 22 2021 bin
drwxr-xr-x. 1 root root 22 Nov 4 09:29 conf
drwxr-xr-x. 2 root root 4096 Dec 22 2021 lib
drwxrwxrwx. 1 root root 80 Nov 4 09:29 logs
drwxr-xr-x. 2 root root 159 Dec 22 2021 native-jni-lib
drwxrwxrwx. 2 root root 30 Dec 22 2021 temp
drwxr-xr-x. 2 root root 6 Dec 22 2021 webapps
drwxr-xr-x. 7 root root 81 Dec 2 2021 webapps.dist
drwxrwxrwx. 2 root root 6 Dec 2 2021 work
root@712f1fd1edc9:/usr/local/tomcat# rm -r webapps
root@712f1fd1edc9:/usr/local/tomcat# ls -l
total 132
-rw-r--r--. 1 root root 18994 Dec 2 2021 BUILDING.txt
-rw-r--r--. 1 root root 6210 Dec 2 2021 CONTRIBUTING.md
-rw-r--r--. 1 root root 60269 Dec 2 2021 LICENSE
-rw-r--r--. 1 root root 2333 Dec 2 2021 NOTICE
-rw-r--r--. 1 root root 3378 Dec 2 2021 README.md
-rw-r--r--. 1 root root 6905 Dec 2 2021 RELEASE-NOTES
-rw-r--r--. 1 root root 16517 Dec 2 2021 RUNNING.txt
drwxr-xr-x. 2 root root 4096 Dec 22 2021 bin
drwxr-xr-x. 1 root root 22 Nov 4 09:29 conf
drwxr-xr-x. 2 root root 4096 Dec 22 2021 lib
drwxrwxrwx. 1 root root 80 Nov 4 09:29 logs
drwxr-xr-x. 2 root root 159 Dec 22 2021 native-jni-lib
drwxrwxrwx. 2 root root 30 Dec 22 2021 temp
drwxr-xr-x. 7 root root 81 Dec 2 2021 webapps.dist
drwxrwxrwx. 2 root root 6 Dec 2 2021 work
root@712f1fd1edc9:/usr/local/tomcat# mv webapps.dist webapps
root@712f1fd1edc9:/usr/local/tomcat# ls -l
total 132
-rw-r--r--. 1 root root 18994 Dec 2 2021 BUILDING.txt
-rw-r--r--. 1 root root 6210 Dec 2 2021 CONTRIBUTING.md
-rw-r--r--. 1 root root 60269 Dec 2 2021 LICENSE
-rw-r--r--. 1 root root 2333 Dec 2 2021 NOTICE
-rw-r--r--. 1 root root 3378 Dec 2 2021 README.md
-rw-r--r--. 1 root root 6905 Dec 2 2021 RELEASE-NOTES
-rw-r--r--. 1 root root 16517 Dec 2 2021 RUNNING.txt
drwxr-xr-x. 2 root root 4096 Dec 22 2021 bin
drwxr-xr-x. 1 root root 22 Nov 4 09:29 conf
drwxr-xr-x. 2 root root 4096 Dec 22 2021 lib
drwxrwxrwx. 1 root root 80 Nov 4 09:29 logs
drwxr-xr-x. 2 root root 159 Dec 22 2021 native-jni-lib
drwxrwxrwx. 2 root root 30 Dec 22 2021 temp
drwxr-xr-x. 7 root root 81 Dec 2 2021 webapps
drwxrwxrwx. 1 root root 22 Nov 4 09:35 work
6)免修改版说明
bash
[root@localhost ~]# docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
Unable to find image 'billygoo/tomcat8-jdk8:latest' locally
latest: Pulling from billygoo/tomcat8-jdk8
55cbf04beb70: Pull complete
1607093a898c: Pull complete
9a8ea045c926: Pull complete
1290813abd9d: Pull complete
8a6b982ad6d7: Pull complete
abb029e68402: Pull complete
8cd067dc06dc: Pull complete
1b9ce2097b98: Pull complete
d6db5874b692: Pull complete
25b4aa3d52c5: Pull complete
d26b86f009c9: Pull complete
e54998e5e699: Pull complete
4a1e415a3c2e: Pull complete
Digest: sha256:4e21f52d29e3a0baafc18979da2f9725449b54652db69d4cdaef9ba807097e11
Status: Downloaded newer image for billygoo/tomcat8-jdk8:latest
9e448debe4178455e46efe60300c866476907b31a91804e9c28d005952c453f4
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e448debe417 billygoo/tomcat8-jdk8 "catalina.sh run" 32 seconds ago Up 30 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp mytomcat8
8.2 安装mysql
1)docker hub上面查找mysql镜像
2)从docker hub上(阿里云加速器)拉取mysql镜像到本地标签为5.7
3)使用mysql5.7镜像创建容器(也叫运行镜像)
(1)简单版
bash
[root@localhost ~]# docker images mysql:5.7
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 22 months ago 448MB
# 确保linux服务器上没有mysql端口被启用,以免被占用
[root@localhost ~]# ps -ef |grep mysql
root 71326 3018 0 14:54 pts/0 00:00:00 grep --color=auto mysql
# 使用mysql镜像
[root@localhost ~]# docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
46b5cc68b471e280d3ea10d52034b4f19e282ee0237b6ef69991c571ce1bc2b8
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46b5cc68b471 mysql:5.7 "docker-entrypoint.s..." 2 seconds ago Up 1 second 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp modest_hamilton
[root@localhost ~]# docker exec -it 46b5cc68b471 /bin/bash
root@46b5cc68b471:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
# 建库建表插数据
mysql> create database db01;
Query OK, 1 row affected (0.00 sec)
mysql> use db01;
Database changed
mysql> create table t1(id int,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t1 values(1,'xx');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 1 | xx |
+------+------+
1 row in set (0.00 sec)
(2)实战版
bash
# 新建mysql容器实例
[root@localhost ~]# docker run -d -p 3306:3306 --privileged=true -v /mydocker/mysql/log:/var/log/mysql -v /mydocker/mysql/data:/var/lib/mysql -v /mydocker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
2f65e6007e58d5fc61a89a7581c5c3b5a662c360eb406c3b4de4b1c0a1768d0f
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f65e6007e58 mysql:5.7 "docker-entrypoint.s..." 6 seconds ago Up 5 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
# 新建my.cnf
[root@localhost ~]# cd /mydocker/mysql/conf/
[root@localhost conf]# ls
[root@localhost conf]# vim my.cnf
[root@localhost conf]# cat my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
# 重新启动mysql容器实例再重新进入并查看字符编码
[root@localhost ~]# docker restart mysql
mysql
[root@localhost ~]# docker exec -it mysql /bin/bash
root@2f65e6007e58:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
# 再新建库新建表再插入中文测试
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> create database db01;
Query OK, 1 row affected (0.00 sec)
mysql> use db01;
Database changed
mysql> create table t1(id int,name varchar(20));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t1 values(1,'sson');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 1 | sson |
+------+------+
1 row in set (0.00 sec)
3)结论:
docker安装完mysql并run出容器后,建议请先修改完字符集编码后再新建mysql库-表-插数据。
8.3 安装redis
bash
(1)从docker hub上(阿里云加速器)拉取redis镜像到本地标签为6.0.8
[root@localhost ~]# docker pull redis:6.0.8
6.0.8: Pulling from library/redis
Digest: sha256:21db12e5ab3cc343e9376d655e8eabbdbe5516801373e95a8a9e66010c5b8819
Status: Image is up to date for redis:6.0.8
docker.io/library/redis:6.0.8
[root@localhost ~]# docker images redis:6.0.8
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 6.0.8 16ecd2772934 3 years ago 104MB
(2)在centos宿主机下新建目录/app/redis
[root@localhost ~]# mkdir -p /app/redis
(3)先在宿主机上下载一个redis,再将redis.conf文件模板拷贝进/app/redis目录下
[root@localhost myrides]# wget https://download.redis.io/releases/redis-6.0.8.tar.gz
[root@localhost myrides]# tar -zxvf redis-6.0.8.tar.gz
[root@localhost myrides]# cd redis-6.0.8/
[root@localhost redis-6.0.8]# make
[root@localhost ~]# cp /myrides/redis-6.0.8/redis.conf /app/redis/
[root@localhost ~]# cd /app/redis/
[root@localhost redis]# ll
总用量 84
drwxr-xr-x. 2 polkitd root 6 11月 5 16:08 data
-rw-r--r--. 1 root root 84642 11月 5 16:15 redis.conf
(4)/app/redis目录下修改redis.conf文件
[root@localhost redis]# vim redis.conf
// 允许redis外地连接,必须注释掉bind 127.0.0.1
# bind 127.0.0.1
// 将daemonize yes注释起来或者daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
# When Redis is supervised by upstart or systemd, this parameter has no impact.
daemonize no
(5)使用redis6.0.8镜像创建容器(也叫运行镜像)
[root@localhost redis]# docker run -d -p 6379:6379 --name myr2 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
1299c3a046e1ecb6837655ee856e77f6af2757e775acd6a5e2eddc03ade7ee5a
[root@localhost redis]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1299c3a046e1 redis:6.0.8 "docker-entrypoint.s..." 4 seconds ago Up 3 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp myr2
(6)测试redis-cli连接上来
[root@localhost redis]# docker exec -it myr2 /bin/bash
root@1299c3a046e1:/data# redis-cli
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
(7)请证明docker启动使用了我们自己指定的配置文件
// 修改配置文件前
[root@localhost redis]# docker exec -it myr2 /bin/bash
root@1299c3a046e1:/data# redis-cli
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]> select 18
(error) ERR DB index is out of range
127.0.0.1:6379[15]> exit
(8)测试redis-cli连接上来第2次
// 修改配置文件后
[root@localhost redis]# vim redis.conf
......
# dbid is a number between 0 and 'databases'-1
databases 10
......
// 重启服务
[root@localhost redis]# docker restart myr2
myr2
[root@localhost redis]# docker exec -it myr2 /bin/bash
root@1299c3a046e1:/data# redis-cli
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> select 15
(error) ERR DB index is out of range