目录
一、Docker。
(1)认识Docker。
(1.1)什么是Docker。
(1.2)Docker和虚拟机的区别。
(2)镜像、容器、DockerHub、Docker架构。
(3)安装Docker(CentOS中安装)。
(3.1)CentOS安装Docker的前提。
(3.2)卸载(可选)。
(3.3)安装docker。
(3.3.1)首先需要大家虚拟机联网,安装yum工具:
(3.3.3)下载docker。
(3.4)启动docker。
(3.4.1) 关闭防火墙(这里是练习才关)。
(3.4.2)通过命令启动docker。
(3.5)镜像加速器。
(3.6) docker-ce.repo 文件和 daemon.json 文件的区别。
(4)Docker基本操作。
(4.1)镜像操作。
(4.1.1)镜像名称。
(4.1.2)镜像操作命令。
(4.1.3)案例—拉取nginx镜像。
(4.1.4)案例—save与load。
(4.1.5) 案例—拉取Redis镜像。
(4.1.6)总结。
(4.2)容器操作。
(4.2.1)容器相关命令。
(4.2.2)案例—创建运行Nginx容器。
(4.2.3)案例—修改Nginx容器的HTML文件内容。
(4.2.4)案例—创建并运行Redis容器,在Redis容器文件添加内容。
(4.2.5)总结。
(4.3)数据卷(容器数据管理)。
(4.3.1)数据卷命令。
(4.3.2)数据卷挂载。
(4.3.3)目录挂载、文件挂载。
(4.3.4)案例—创建nginx容器,修改容器内的html目录的文件内容。
(4.3.5)总结。
(4.3.6) 三种挂载的区别。
(4.3.6.1) 数据卷挂载 或 目录挂载。
(4.3.6.2)文件挂载。
(5)Dockerfile自定义镜像。
(5.1)镜像结构。
(5.2)Dockerfile语法。
(5.3)案例—构建新镜像(运行一个java项目的镜像)。
(5.4)案例—基于镜像创建新镜像。
(5.5)总结。
(6)DockerCompose。
(6.1)CentOS7安装DockerCompose。
(6.1.1)安装 docker-compose 需要以下3个步骤:
(6.1.2)Base自动补全命令(使用时有提示)。
(6.1.3)案例。
(6.1.4)总结。
(7)Docker镜像仓库。
(7.1)简化版镜像仓库。
(7.2)带有图形化界面版本。
(7.3)配置Docker信任地址。
(7.4)在私有镜像仓库推送或拉取镜像。
(7.5)docker pull registry拉取镜像超时的原因。
一、Docker。
(1)认识Docker。
(1.1)什么是Docker。
1、Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包,Docker运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行,从而跨平台运行。
2、系统应用:封装内核指令为函数,便于程序员调用用户程序基于系统函数库实现功能
3、内核:提供访问计算机硬件的指令。
4、不同发行版本系统:函数库可能有所差异,但都是基于linux内核。
(1.2)Docker和虚拟机的区别。
(2)镜像、容器、DockerHub、Docker架构。
(3)安装Docker(CentOS中安装)。
企业部署一般都是采用Linux操作系统,而其中又数CentOS发行版占比最多,因此我们在CentOS下安装Docker。 Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
Docker CE 分为 stable
test
和 nightly
三个更新频道。
官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 CentOS上的安装。
(3.1)CentOS安装Docker的前提。
Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。
(3.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.3)安装docker。
(3.3.1)首先需要大家虚拟机联网,安装yum工具:
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
注意:yum-utils
:这是一个实用工具集,提供了一些扩展的 yum
命令和功能,例如 yum-config-manager
等,可以用于仓库管理、软件包清理等操作。
(3.3.2)更改本地镜像源。
yum makecache fast:命令是将软件包信息提前在本地索引缓存,用来提高搜索安装软件的速度,建议执行这个命令可以提升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
sed
命令和 yum-config-manager
命令的组合用法是对 Docker 的 YUM 仓库进行配置更改,具体如下:
第一条命令:
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
在这个命令中,--add-repo
参数用于指示 yum-config-manager
添加一个新的仓库。后面跟着的 URL https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
是要添加的仓库文件的地址。
通过执行这个命令,系统将会在 /etc/yum.repos.d/
目录下创建一个名为 docker-ce.repo
的新文件,并将指定的仓库文件内容添加到该文件中。这个仓库文件包含了 Docker 相关的软件包和官方更新的信息。
添加仓库后,你就可以使用 YUM 命令来安装、更新和管理 Docker 相关的软件包。YUM 将会根据仓库文件中的配置信息,从指定的镜像源服务器上下载所需的软件包,并进行安装或更新操作。
第二条命令:
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
- 命令使用 sed 工具在
/etc/yum.repos.d/docker-ce.repo
文件中替换所有出现的download.docker.com
地址为mirrors.aliyun.com/docker-ce
地址。
(3.3.3)下载docker。
输入下载命令:稍等片刻,docker即可安装成功。
yum install -y docker-ce
-y:不需要向用户询问,所有询问都选yes。
docker-ce:ce为社区免费版本。
(3.4)启动docker。
(3.4.1) 关闭防火墙(这里是练习才关)。
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
# 查看防火墙状态
systemctl status firewalld
(3.4.2)通过命令启动docker。
查看是否启动成功:
1、systemctl status docker
2、docker -v(查看docker版本)
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
(3.5)镜像加速器。
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
配置镜像加速器:针对Docker客户端版本大于 1.10.0 的用户
通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://s7nqdrcs.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
提示:
sudo
命令,代表 "superuser do"(超级用户操作)。总共有四条命令:
第一条:创建docker目录。
第二条:创建daemon.json文件,并写入镜像仓库地址。
第三条:重新加载daemon.json文件。
第四条:重启docker。
daemon.json文件:(参考,并非复制系统的,这里只是展示书写格式)
{
"registry-mirrors" : [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://cr.console.aliyun.com",
"https://mirror.ccs.tencentyun.com"
]
}
当使用镜像加速器时,下载镜像的流程如下:如果有镜像加速器,那么不需要配置镜像源。
1、用户发起下载镜像的请求。
2、请求被发送到配置好的镜像加速器地址。
3、镜像加速器会首先检查自己的缓存中是否存在所需的镜像。如果存在,则直接从缓存中返回该镜像给用户。
4、如果镜像加速器的缓存中不存在所需的镜像,它会将请求转发到原始的镜像源(Registry)。
5、镜像源接收到请求后,会将相应的镜像发送给镜像加速器。
6、镜像加速器将镜像保存到自己的缓存中,并将镜像返回给用户。
(3.6) docker-ce.repo
文件和 daemon.json
文件的区别。
注意:镜像源与镜像加速器只需要配置其中一个即可(两种都配也行)。
docker-ce.repo
文件和 daemon.json
文件都与 Docker 相关,但它们在功能和用途上有所区别。
-
docker-ce.repo
文件:配置镜像源的地方。docker-ce.repo
是针对使用基于 Red Hat 兼容发行版(如 CentOS、Fedora)的系统而设计的。- 它是一个仓库配置文件,用于指定 Docker 的软件仓库源,即从哪里下载 Docker 软件包。
- 在这个文件中,可以定义 Docker 的仓库 URL 和其他相关选项。
- 该文件一般位于
/etc/yum.repos.d/
目录下。
-
daemon.json
文件:配置镜像加速器的地方。daemon.json
是 Docker 守护进程的配置文件。- 它包含了一系列的配置选项,用于控制 Docker 守护进程的行为。
- 在
daemon.json
文件中,可以配置各种选项,如镜像加速器、存储驱动、网络设置等。 - 该文件一般位于
/etc/docker/
目录下。
总结:
docker-ce.repo
文件是用来指定 Docker 软件仓库源的配置文件,用于安装和更新 Docker 软件包。daemon.json
文件是用来配置 Docker 守护进程的配置文件,用于控制 Docker 运行时的行为和设置。
需要注意的是,docker-ce.repo
文件只在基于 Red Hat 兼容发行版的系统上使用,而 daemon.json
文件在所有支持的操作系统上均可使用。
(4)Docker基本操作。
(4.1)镜像操作。
(4.1.1)镜像名称。
(4.1.2)镜像操作命令。
(4.1.3)案例—拉取nginx镜像。
docker pull nginx
(4.1.4)案例—save与load。
注意:docker save --help(使用哪个命令,就查看文档使用)
docker save -o nginx.tar nginx:latest
docker rmi nginx:latest (删除镜像后,把压缩包镜像加载进来)
docker load -i nginx.tar
(4.1.5) 案例—拉取Redis镜像。
docker pull redis
docker images(查看镜像是否已经拉取成功)
docker save -o redis.tar redis:latest
docker rmi redis:latest
docker load -i redis.tar
(4.1.6)总结。
(4.2)容器操作。
(4.2.1)容器相关命令。
(4.2.2)案例—创建运行Nginx容器。
docker run --name mn -p 80:80 -d nginx
docker ps
(4.2.3)案例—修改Nginx容器的HTML文件内容。
docker exec -it mn bash
cd /usr/share/nginx/html
sed -i 's#Welcome to nginx#传智教育欢迎您#g' index.html(替换文档的内容)
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html(替换文档的内容)
exit(退出容器 )
docker ps(查看运行中的容器)
docker ps -a(all,查看所有容器)
docker rm mn (删除非运行中的容器)
docker rm mn -f (连运行中的容器也可以删除)
(4.2.4)案例—创建并运行Redis容器,在Redis容器文件添加内容。
docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes
注:redis-server(启动服务端)
docker ps -a
然后去redis图形化界面远程连接这个redis服务器。
docker exec -it mr bash (docker exec -it mr redis-cli(这个直接进入redis-cli客户端))
redis-cli(进入客户端)
keys *(查看有没有记录)
set num 666(记录字符串数据)
exit(这次,退出客户端)
exit(再一次,退出redis)
(4.2.5)总结。
(4.3)数据卷(容器数据管理)。
(4.3.1)数据卷命令。
docker volume --help(查看命令使用)
docker volume create html(创建html数据卷)
docker volume ls(查看数据卷)
docker volume inspect html(查看数据卷在宿主机的具体位置)
docker volume prune -a(删除全部未使用的数据卷)
docker volume rm html(删除html数据卷)
(4.3.2)数据卷挂载。
注意:如果数据卷不存在,则自动创建。
(4.3.3)目录挂载、文件挂载。
注意:挂载可以一次挂载多个目录或文件,-v参数是可以多次使用的。
docker run --name mysql -e MYSQL_ROOT_PASSWORD=tan -p 3366:3306 -v /tem/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /tem/mysql/data:/var/lib/mysql -d mysql:latest
-e : 环境
-v :挂载
(4.3.4)案例—创建nginx容器,修改容器内的html目录的文件内容。
docker run --name mn -p 80:80 -v html:/usr/share/nginx/html -d nginx(创建容器时挂载)
docker ps -a
docker inspect html(效果与docker volume inspect html一样的,不清楚原因,html是数据卷)
cd /var/lib/docker/volumes/html/_data(切换到挂载点(与容器某个目录交互的目录))
cat index.html
vim index.html(改写文件内容)
cat index.html
最后一步:在浏览器访问,查看效果。
(4.3.5)总结。
(4.3.6) 三种挂载的区别。
注意:如果映射的容器目录没有,则会自动创建目录,完成挂载。
1、目录与数据卷很相似。
2、挂载目录与容器目录只是目录内的变化,双方目录的名称都不会改变。
3、文件也是一样,改变的是内容,不是文件名称。
(4.3.6.1) 数据卷挂载 或 目录挂载。
提示:但是在使用doker-compose构建容器的时候却可以挂载成功(有目录文件),不清楚原因。
数据卷挂载 或 目录挂载(前提:挂载的路径):
1.数据卷没有目录文件时:容器的目录文件,数据卷目录都有。
2.数据卷有目录文件时:创建容器是exited状态(错误)。
* 还未挂载过:不允许有目录文件,删了重新创建容器并挂载。(可能是系统原因吧)
* 挂载过的目录,可以有目录文件,名字相同会覆盖内容。创建容器并挂载,就OK了。(容器已经删除的也算)
挂载过与未挂载过的区别:
(用户/用户组)root/root>>> polkitd/root(da/data/data1都是挂载过的目录)。
(4.3.6.2)文件挂载。
文件挂载:
1.容器没有同名文件:文件添加到容器内。(前提:挂载的路径)
2.容器有同名文件:文件名不变,内容被挂载文件内容覆盖。(前提:挂载的路径)
(5)Dockerfile自定义镜像。
(5.1)镜像结构。
(5.2)Dockerfile语法。
(5.3)案例—构建新镜像(运行一个java项目的镜像)。
Dockerfile文件内容:
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar(/tmp/app.jar 是镜像内部的路径,./docker-demo.jar是宿主机的路径)# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
1、构建新镜像。
docker build -t javaweb:1.0 .
解析:
docker build
:这是 Docker 命令的一部分,用于构建 Docker 镜像。-t javaweb:1.0
:即tag,这是构建镜像时为镜像指定的标签信息。-t
选项用于指定镜像的名称和标签,javaweb
是镜像的名称,1.0
是镜像的版本号或标签。.
:这是构建镜像的上下文路径。在此例中,.
表示当前目录(即 Dockerfile 所在的目录),Docker 将会在当前目录中查找 Dockerfile 文件并使用它来构建镜像。
2、基于这个镜像创建容器,即可访问。
docker run --name web -p 8090:8090 -d javaweb:1.0
(5.4)案例—基于镜像创建新镜像。
Dockerfile文件内容:
# 指定基础镜像
FROM java:8-alpine
# 拷贝java项目的包
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
1、构建新镜像。
docker build -t javaweb:1.0 .
2、基于这个镜像创建容器,即可访问。
docker run --name web -p 8090:8090 -d javaweb:1.0
(5.5)总结。
(6)DockerCompose。
•DockerCompose的详细语法参考官网:Overview | Docker Documentation
(6.1)CentOS7安装DockerCompose。
(6.1.1)安装 docker-compose 需要以下3个步骤:
1、下载 docker-compose 的可执行文件,从官方网站或者其他适合你操作系统的渠道获取。
# 安装
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、将下载的可执行文件移动到一个系统路径可访问的目录下,例如 /usr/local/bin/docker-compose(如果不在这个路径,就需要执行这个步骤)。
3、赋予 docker-compose 可执行权限,可以使用命令 chmod +x /usr/local/bin/docker-compose 来实现。
# 修改权限
chmod +x /usr/local/bin/docker-compose
4、验证安装是否成功,可以运行 docker-compose version 命令来检查版本信息,并且确认没有报错。
(6.1.2)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
(6.1.3)案例。
注意:
1、使用DockerCompose部署时,所有服务之间都可以用服务名互相访问。
2、ip地址都用服务名代替:我的理解是,创建容器的时候自动获取(当前主机)IP地址,然后再把服务名代替。
1.上传cloud-demo多微服务到虚拟机。
2. cd /tmp/cloud-demo
3.docker-compose --help(查看帮助文档)
4.docker-compose up -d (up:创建并启动容器 -d:后台运行)
5.docker-compose logs -f(查看日志)
6.docker-compose logs -f userservice(查看某个服务日志)
7.到浏览器进行访问
注意:如果其他服务先启动成功,而nacos还未启动成功,那么其他服务去nacos注册的时候就会报错。
docker-compose restart gateway userservice orderservice(重启服务,多个服务之间空格)
$PWD
命令:它会返回当前所在的工作目录的完整路径 。
docker-compose.yml文件:
version: "3.2"
services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"
(6.1.4)总结。
DockerCompose有什么作用?
注意:services下面,mysql与web都是微服务,即配置了两个微服务的指令,可配置多个。
(7)Docker镜像仓库。
搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。
官网地址:https://hub.docker.com/_/registry
(7.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 可以查看当前私有镜像服务中包含的镜像
(7.2)带有图形化界面版本。
注意:下面的内容需要放到docker-compose.yaml文件里面,然后执行该文件。
使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:
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
(7.3)配置Docker信任地址。
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
注意:如果不止一个,需要用“,”隔开,里面的IP地址要改成自己的ip地址。
(7.4)在私有镜像仓库推送或拉取镜像。
(7.5)docker pull registry拉取镜像超时的原因。
修改DNS:很重要的一步,因为大部分 pull 失败的原因都是这个
vim /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
/etc/resolv.conf
是一个配置文件,用于指定要用于域名解析的 DNS 服务器。在这个文件中,nameserver
关键字后面的 IP 地址表示要使用的 DNS 服务器。
具体来说:
nameserver 8.8.8.8
表示要使用 IP 地址为 8.8.8.8 的 DNS 服务器。nameserver 8.8.4.4
表示要使用 IP 地址为 8.8.4.4 的 DNS 服务器。
当你在浏览器中输入一个域名时,操作系统会查询 /etc/resolv.conf
文件以确定要使用哪个 DNS 服务器进行解析。当 /etc/resolv.conf
文件中指定了多个 nameserver
时,系统将按照顺序逐个尝试这些 DNS 服务器进行域名解析。系统会从第一个 nameserver
开始尝试解析域名,如果无法连接或没有响应,则会继续尝试下一个 nameserver
,直到找到可用的 DNS 服务器或尝试完所有的服务器。