1、需求:进入docker的nn容器之后,我们知道我们的例子演示是修改HTML文件内容
2、vi修改文件时出现 vi:command not found 错误问题:
3、docker stop/start 停止/启动容器命令演示
2.1、基于java:8-alpine镜像,将一个java项目构建为镜像
一、什么是Docker
总结:(面试用)
二、Docker与虚拟机区别
总结:(面试用)
三、Docker架构(*****)
注1:镜像运行起来就是容器,一个镜像可以有多个容器。
注2:镜像对外只开放读的操作,那么就避免了镜像不会被干扰影响了。
现在有这么一个问题:镜像如何才能共享自己呢然后就可以被其他操作者或者容器来拷贝使用进行写操作了呢:(就需要使用一个托管平台:DockerHub)
Docker架构(Docker的使用过程 *****)
Docker整体部署项目流程(重点理解,面试宝典):
比如说我们想创建一个镜像,那么直接通过一个Docker bulid命令,这个命令到达DockerServer以后,会被Docker的守护进程docker daemon接收和处理,这个守护进程会利用客户端client提供的数据然后构造出一个镜像
除了这种方式以外,我们客户端client还可以通过输入命令docker pull,这个命令到达DockerServer以后,也会被Docker的守护进程docker daemon接收和处理,然后我们这个守护进程就会去Registry中拉取指定的镜像了(Registry当中封装了大量的镜像),那么也相当于说构造出了一个镜像了
镜像有了之后,我们就可以运行镜像创建容器了,我们可以使用一个docker run命令,他会告诉服务端要创建一个容器了,因此我们守护进程就会帮我们完成容器的创建了,最终我们的项目部署就完成了
总结:
四、安装Docker
Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
Docker CE 分为
stable
test
和nightly
三个更新频道。官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 CentOS上的安装
1、CentOS安装Docker
Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。
2、卸载旧版本Docker
如果之前安装过旧版本的Docker,可以使用下面命令卸载:(如果确定没有安装过的话,那么就无需使用该命令)
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
3、安装docker
首先需要先虚拟机联网,安装yum工具,命令如下所示:
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
最终出现完毕,说明yum工具安装成功。
然后更新本地镜像源:
也就是说我们下载安装Docker的话,默认是去国外的网站进行下载和安装的,那么速度就会很慢,因此我们这里通过yum工具配置一个阿里云的仓库(国内),那么配置好之后我们在安装Docker的话,速度就会快很多了
命令如下所示:
命令:yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo命令:yum makecache fast
然后输入命令:
命令:yum install -y docker-ce
docker-ce为社区免费版本。稍等片刻看到完毕!后,就说明docker安装成功了。
4、启动Docker
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!
注:企业级的话,就不能直接关闭防火墙了(不安全)。
命令如下所示:
# 关闭防火墙
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld# 查看防火墙是否关闭
systemctl status firewalld
然后输入命令,可以查看docker版本:
docker -v
5、配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
五、镜像命令
1、常用的命令:
docker build 构建镜像
docker images 查看镜像
docker rmi 删除镜像
docker push 推送镜像到镜像服务器中
docker pull 从镜像服务器中拉取镜像
docker save 保存镜像为一个压缩包
docker load 加载压缩包为镜像
我们只需要记住这几个基本的命令即可,具体的使用方式我们比如说删除镜像命令 ,我们可以直接 docker rmi --help 帮助文档来查看一下该删除镜像的具体使用方式,其他的命令都是如此。
2、镜像命令分析:
如果想把镜像分享给别人的话该怎么办:
注:我们的虚拟机就能充当本地 (也就是说Docker部署在谁身上了那么谁就是本地,我们这里是部署到虚拟机上了,因此虚拟机就是本地)
3、例子演示镜像命令的使用1
这个例子演示的是从镜像服务器(镜像仓库)中拉取nginx镜像资源(nginx镜像:也就是说nginx资源数据)的命令和在本地查看镜像的命令。
例子演示了下面两个命令的使用方式:
docker pull 从服务拉取镜像
docker images 查看镜像
镜像仓库地址:
Docker Hubhttps://hub.docker.com/
我们刚才上面知道,镜像的话我们有两种方式进行构建,第一种就是客户端通过写docker build命令向服务端通过守护进程的方式进行构建, 第二种就是从镜像服务器(镜像仓库)通过docker pull命令进行拉取构建镜像。
我们现在这个例子演示就是第二种方式通过命令在DockerHub镜像仓库中拉取Nginx镜像(也就是说拉取nginx资源而已)
我们从镜像仓库(镜像服务器)中知道了拉取nginx镜像资源的docker命令之后,我们就可以复制这个命令在Shell工具中输入该docker命令进行拉取nginx镜像到我们本地当中了:
4、例子演示镜像命令的使用2
例子演示了下面几个命令的使用方式:
docker images 查看镜像
docker save命令具体使用方式演示:
docker load 命令具体使用方式演示:
我们知道这个docker load命令是把别人分享过来的镜像压缩包加载成为镜像资源的。
5、镜像命令练习
和上面的命令操作过程是一样的,可以那这个练习一下即可。
六、容器命令
注: docker ps 命令查看的是运行中的容器,如果查看所有状态下的容器的话(包括没有运行中的容器)那么就需要使用 docker ps -a命令
面试宝典(*****):
暂停命令和停止命令的区别:
如果容器通过docker pause命令处于暂停状态,操作系统会将容器内的进程挂起,容器关联的内存暂存起来,然后cpu不再执行这个进程,但是如果再通过docker unpause命令恢复的话,那么cpu就继续执行这个进程。
如果容器通过docker stop停止命令的话,操作系统会直接把这个容器的进程给杀死,容器所占的内存直接回收,保留下来的只剩容器的文件系统了,也就是说静态的东西,所以一旦被停止的话,就没办法再恢复了。
6.1、容器命令例子演示1(*****)
首先我们在Docker架构中知道,镜像运行起来后就是容器,并且Docker是会给容器通过沙箱机制做隔离的,也可以理解为与世隔绝了,不需要任何人来访问打扰我这个容器!!!!
注: -p 80:80 -d nginx (nginx没写版本的话,就默认是最新版本的nginx镜像)
例子命令演示操作如下所示:
通过 docker logs命令查看一下日志:
然后我们还可以docker logs命令查看一下客户端访问的记录日志信息
我们知道刚才客户端访问了mn为名的容器了,那么我们就可以通过docker logs命令查看一下访问的日志信息:
当我们日志信息过多的时候,我们就可以使用一个日志命令来持续的查看输入日志信息:
docker logs -f 容器名
退出持续监控输出日志信息状态的话:CTRL + c即可退出。
6.2、容器命令 docker exec 例子演示
============== 补充知识 =======================
补充知识:
首先区分 docker ps 和 docker ps -a命令的区别
======================================
命令:docker exec -it nn bash
首先我们通过docker ps命令可以查看出现在运行状态下的容器有一个,名称为nn的容器,那么我们通过命令:docker exec -it nn bash命令就可以进入到该nn容器内部中去:
1、需求:进入docker的nn容器之后,我们知道我们的例子演示是修改HTML文件内容
思考:HTML文件到底在容器内部的哪个位置啊(就需要我们在镜像服务器当中查看了,就是下面的这个目录位置上)
然后我们找到该HTML文件后,就能修改该HTML文件了(index.html文件),通过vi命令修改该文件时也会出现一些问题:
2、vi修改文件时出现 vi:command not found 错误问题:
那现在的话我们不能通过vi进行修改该文件的话,还能用哪种方式进行修改呢:
sed -i 's#Welcome to nginx#传智教育欢迎您#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html
通过该种方式修改好之后,我们再打开浏览器访问该nn容器:
补充:最终通过exit命令退出容器内部即可:
3、docker stop/start 停止/启动容器命令演示
4、docker rm 删除容器命令演示
6.3、容器命令练习
练习1:
步骤一:
步骤二:把redis镜像拉取下来
步骤三:利用docker run命令运行一个redis容器,并且支持数据持久化(也就是不乱码)
命令:docker run --name mr 6379:6379 -d redis redis-server --appendonly yes
解读上述命令:
mr为运行的容器名、6379为redis端口号、--appendonly yes为支持持久化
最终会发现redis确实能连接成功了:
练习2:
七、数据卷
1、什么是数据卷
那么如何解决上面的三个问题呢:
通过上面的方式,那么我们第一个不便于修改问题就能解决了:
1、不便于修改问题的解决思路
解决思路:我们以后直接不用再进入到nginx容器内部进行修改html文件数据了,我们直接在宿主机中的html文件中修改数据,那么nginx容器内部的html文件数据也会自动被修改了,因此就解决了不便于修改的问题。
2、数据不可复用问题的解决思路
注:把指向两个字修改成挂载。
3、升级维护困难问题的解决思路
2、操作数据卷(命令演示)
数据卷所有命令演示:
3、挂载数据卷
也就是说刚才上面的命令演示中,我们已经可以创建出数据卷了,但是我们知道我们数据卷创建好之后,怎么挂载到容器当中的呢(也就是说怎么和容器相关联呢,比如说容器的html文件指向html为名的数据卷,就是刚才讲解决三个问题的时候那个地方)。
数据卷有了,肯定就要挂载容器了(比如挂载到nginx容器上),要不然数据卷怎么当容器和宿主机系统的桥梁。
数据卷挂载例子演示1(挂载nginx ******):
我们的例子需求是:
创建一个nginx容器,进入到容器内部修改html目录内的index.html内容数据。
我们知道在没有学习数据卷的时候,我们是通过先进入到nginx容器的内部,然后找到html目录下的index.html文件进行修改该文件中的数据的,这样的话上面的笔记我们也说过了,会出现三个问题,为了解决这三个问题我们就用到了数据卷挂载的方式,这样的话我们就不用进入到容器内部然后才能修改文件中的数据了,我们可以直接通过操作数据卷来修改容器内部的文件中所对应的数据了。
具体演示如下所示:
注1:首先我们知道我们挂载数据卷的时候是在创建容器的时候挂载的,因此我们可以先把以前没有挂载数据卷的容器删除掉。
注2:我们挂载数据卷的时候,我们知道是有了数据卷之后把该数据卷挂载到容器上的。
因此首先先保证两个前提(后面会推翻):
1、以前的nginx容器删除掉
2、数据卷存在(先创建出数据卷)
推翻总结:
其实xxxx为名的数据卷就算不存在的情况下(没创建的情况下),当我们docker run 运行创建容器的时候(创建运行容器时会 -v一个xxxx为名的数据卷),同样docker会帮我们自动创建好xxxx为名的数据卷,其和我们手动创建的xxxx为名的数据卷的意义和效果是一样的。
把以前的nginx容器删除掉后并且保证html为名的数据卷创建好的情况下,我们就可以重新创建nginx容器了(此时再创建nginx容器的时候,把html数据卷挂载到该nginx容器上):
第一步:
第二步:
html数据卷挂载到容器的html文件上后,我们就不用再像以前进入到容器内部然后修改该html文件中的数据了,我们直接就可以在html数据卷上进行修改文件数据了,那么修改之后也会给我们同步到容器内部的html文件上(也就相当于进入到容器内部修改html文件中的数据了)
直接在html数据卷上修改文件数据操作方式:
最终打开客户端访问的结果:
会发现我们在没有进入容器内部修改文件的前提下,我们同样通过操作数据卷的形式修改文件中的内容数据,同样可以达到和进入到容器内部修改文件的数据形式一样。
数据卷挂载例子演示2 (挂载mysql*******):
我们在演示1中,是将html数据卷挂载到容器的html文件当中的,其实不仅仅是数据卷,我们的宿主机系统也可以直接与容器进行挂载操作(也就是说没有通过数据卷来搭建桥梁,直接是宿主机系统和容器之间的搭建/联系。)。
首先我们先完成前三步:手动创建mysql镜像(不再是从镜像服务器中直接拉取,其实和在镜像服务器中直接通过docker pull命令拉取下来的意义是一样的):
步骤演示如下所示:
然后再在tmp目录下创建mysql目录再创建两个目录:data和conf目录
目录创建好之后,把资料中的hmy.conf配置文件数据放入到conf目录中去:
上面的步骤搞完之后,我们就可以通过docker load命令加载mysql.tar压缩包成mysql镜像了:
通过上面的步骤后,我们的mysql镜像就创建成功了:
mysql镜像创建好之后,我们就可以基于这个mysql镜像运行创建这个mysql容器了。
注:因为我们知道,运行容器的时候是必须要基于镜像的,也就是说没有镜像就没有容器。
并且我们在运行创建这个mysql容器的时候,把宿主机系统直接挂载到这个mysql容器上(挂载上之后就不用我们再进入到mysql容器内部然后找到相对应的文件进行修改数据了,我们可以直接在宿主机对应的文件中修改,一样可以同步到mysql容器相对应的文件当中):
重点: mysql需要挂载的东西:
就是把刚才我们创建的宿主机的两个目录(也就是tmp目录下的那个data和conf目录)挂载到mysql容器内部对应的data目录和conf目录即可。 那么我们直接在宿主机的目录中操作修改数据也会直接同步修改到我们mysql容器内部对应的该目录当中了。
我们上面创建的时候知道了宿主机的data和conf对应的目录层次是:tmp/mysql/data和tmp/mysql/conf。
那么mysql容器内部对应的data和conf目录层次是在哪呢: 我们可以去镜像服务器中查看:
因此上面知道目录层次之后,我们在运行这个mysql容器的时候,直接把宿主机对应的data和conf目录挂载到mysql容器内部data和conf所在的目录位置上即可,那么就代表了以后修改宿主机中的data文件就相当于修改mysql容器内部的data文件了,也就不用再进入到mysql容器内部进行修改操作数据了。
运行容器挂载命令如下所示:
docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d mysql:5.7.25
挂载好之后,我们就会发现我们宿主机data文件当中本来什么都没有的,但是挂载之后却有了数据了(因为mysql容器内部的data同步/备份到宿主机的data文件当中了):
测试:
会发现我们用可视化工具也可以连接上这个mysql:
八、Dockerfile自定义镜像
我们前面学过了,我们的镜像都是从镜像服务器当中拉取下来的,现在呢我们该如何自定义镜像呢(也就是说不再从镜像服务器当中拉取),那么就要学习Dcokerfile自定义镜像了。
一、 镜像的结构
二、什么是Dockerfile
例子演示:将java项目部署到Docker中
2.1、基于java:8-alpine镜像,将一个java项目构建为镜像
第一步:
第二步:
第三步:
注意:这里暴露的端口为8090 (等会会用到)
第四步:
第五步:
访问项目测试:
九、DockerCompose
1、初始DockerCompose
简单一点说:
也就是以前我们想要运行一个容器的时候,需要我们先输入docker build命令构建镜像,然后再通过docker run命令基于该镜像运行容器。 现在DockerCompose的作用就是说可以让我们不再手动一个一个写构建镜像和运行容器等的命令了,DockerCompose可以直接打开文本文件写文件中的配置也就相当于写了构建镜像和运行容器的命令了。
通过上面的这个和yml相似的配置文件:那么就直接把构建镜像和基于该镜像运行容器的操作一次性操作完了(比我们一个一个手写命令快的多),这就是DockerCompose带来的作用
2、安装DockerCompose
2.1、下载
Linux下需要通过命令下载:
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
如果下载速度较慢,或者下载失败,可以使用课前资料提供的docker-compose文件:
上传到/usr/local/bin/
目录也可以。
2.2、修改文件权限
修改文件权限命令:
# 修改权限
chmod +x /usr/local/bin/docker-compose
通过上面的两个步骤,那么DockerCompose就已经安装成功了。
2.3、Base自动补全命令:
安装成功了,我们也可以设定一下自动补全:
自动补全命令:
# 补全命令:
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
如果这里出现错误,需要修改自己的hosts文件:
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
3、重点:部署微服务集群(*****)
先省略,用到再补充。
十、Docker镜像仓库
1、搭建私有镜像仓库
1.1、搭建简化版镜像仓库(不推荐使用)
Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面,因此不推荐使用这种搭建方式。
搭建方式比较简单,命令如下:
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。
访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像。
1.2、搭建带有图形化版的私有镜像仓库(推荐使用)
首先第一步:配置Docker信任地址
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
# 打开要修改的文件命令
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.91.138:8080"]
# 重加载命令
systemctl daemon-reload
# 重启docker命令
systemctl restart docker
注意: 添加内容命令中 192.168.... 要写自己服务器的ip地址,端口号设为8080即可。
Docker信任地址配置好之后,我们就新建一个文件夹(该文件夹代表docker镜像仓库的ui界面):
docker-compose.yml文件新建好之后,把下面的这个内容放入到该yml文件中即可:
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=传智教育私有仓库
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
注:这个8080端口就是外界客户端访问我们这个私有镜像仓库的端口(这个8080端口最好和我们配置Docker信任地址的时候添加的内容那个8080端口一致)
添加完之后输入以下命令:
docker-compose up -d
到这里我们的私有镜像仓库就创建成功了,那么我们就可以打开浏览器访问我们的私有镜像仓库了(访问方式:服务器ip+开放访问端口号):
2、向私有镜像仓库推送/拉取镜像
也就是说刚才上面我们搭建好了私有镜像仓库了,现在我们如何向镜像仓库当中推送/拉取镜像呢,下面就是推送/拉取的方式:
修改: tar修改成tag
那么如何从私有镜像仓库中拉取镜像到本地呢: