1.Docker简介
1.1虚拟化技术
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,比如服务器、网络、内存及存储等,一起抽象、转换后呈现出来。打破实体结构间的不可切割的障碍,使用户可以更好应用这些资源。虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用
1.2Docker容器技术
Docker是一种容器化平台,可以将应用程序及其依赖项打包到一个独立的容器中。以便在不同的环境中进行部署和运行
1.3docker的特点
- 上手快 :安装使用简单,使用命令即可
- 职责分类:程序员关心容器中的程序怎么写,运维关心怎么管理docker容器
- 快速部署:快速高效的开发生命周期
- 鼓励使用面向服务的架构: 为微服务而生
- 解决环境不一致的问题 :docker可以把项目需要的环境一起打包到镜像中,同一个镜像启动的多个容器环境就是一致的
2.Docker工作思想
2.1docker容器 (运行的镜像)
Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务构建成镜像,然后将镜像运行为容器,可以运行多个容器。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。 容器中运行的是项目或者软件,容器中必须有一个迷你的centos(小的Linux虚拟机),容器需要镜像才能运行;
2.2镜像
镜像是构建Docker容器的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分,我们可以将不同服务打成对应镜像,然后运行为容器。镜像就是一个centos系统,在这个系统中我们可以安装一个或多个技术。
2.3镜像仓库
2.3.1本地镜像仓库(images)
从远程中央仓库拉取的镜像是存放在本地镜像仓库中
2.3.2中央镜像仓库(Registery)
Docker官方提供的管理所有镜像的地方,我们可以通过docker pull 镜像名称进行拉取
2.4容器与宿主机的关系
2.4.1端口映射
容器通过与宿主机端口进行映射,当我们访问宿主机时,就能通过宿主机端口映射关系找到对应的docker容器。
2.4.2文件映射
docker容器文件与宿主机文件进行映射,当操作宿主机文件时,docker容器中文件也会发生改变,反之亦然。
3.Docker安装
3.1下载Docker
第一步:添加docker 的yum库(yum在线安装)
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
第二步:安装docker
sudo yum -y install docker-ce
3.2启动docker
sudo systemctl start docker
3.3配置国内镜像仓库
vi /etc/docker/daemon.json
加入下面的内容
{
"registry-mirrors": ["https://5pfmrxk8.mirror.aliyuncs.com"]
}
4.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
5.docker镜像操作
5.1拉取/下载镜像
注意:我们也可以通过https://hub-stage.docker.com/ 去查找镜像以及版本
国情的原因,国内下载 Docker HUB 官方的相关镜像比较慢,可以使用国内(docker.io)的一些镜像加速器,镜像保持和官方一致,关键是速度块,推荐使用
docker pull 镜像名:版本
docker pull redis #不写版本号默认最新版
5.2推送镜像到远程仓库
docker push 是将本地仓库的镜像推送到远程。
例如: docker push starb/webapp:v1.1
5.3查看本地镜像
docker images
- REPOSITORY:镜像所在的仓库名称
- TAG:镜像标签
- IMAGE ID:镜像ID
- CREATED:镜像的创建日期(不是获取该镜像的日期)
- SIZE:镜像大小
这些镜像都是存储在Docker宿主机的/var/lib/docker目录下
5.4删除镜像
docker rmi 镜像id/镜像名:版本
- docker rmi id:删除指定镜像
- docker rmi `docker images -q`:删除所有镜像
5.5搜索镜像
docker search 镜像名
docker search redis
- NAME:仓库名称
- DESCRIPTION:镜像描述
- STARS:用户评价,反应一个镜像的受欢迎程度
- OFFICIAL:是否官方
- AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的63.4拉取镜像
6.docker容器操作
6.1创建容器
docker run -i -t/-d --name=redis
-p=6379:6379 -v=/xx:/yy --restart=always -m 2048M redis:7.0
创建容器常用的参数说明:
- 创建容器命令:docker run
- -i:表示运行容器
- -t:表示容器启动后会进入容器命令行(交互式)。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。注意:在交互式容器中如果执行 “exit”会结束容器,如果使用“ctrl + p + q”就不会退出容器
- -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器),后台容器退出依然是运行的
- --name :为创建的容器命名。
- -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射 。例如:docker run -id --name=redis3 -p=6379:6379 redis:7.0
- -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,让宿主机上的目录与容器中的目录做映射,同步增删改操作。例如:docker run -id --name=nginx -p=80:80 -v=/data/nginx:/usr/share/nginx/html nginx(注意docker容器中的目录层级是固定的,使用时百度)
- --restart : 指定容器异常退出时的重启模式, always 总是重启, no 不重启, on-failure - 只有在非0状态退出时才从新启动容器
- -m :指定容器的总分配内存,比如:-m 2048m ,容器最大可用2G内存
6.1.1创建交互式容器
docker run -i -t --name=容器名字 -v=/外面目录:/里面目录 镜像:版本 /bin/bash
6.1.2创建后台容器(守护式容器)
docker run -i -d --name=容器名字 -v=/外面目录:/里面目录 镜像:版本
6.2查看容器
6.2.1查看运行的容器
docker ps
6.2.2查看所有的容器
docker ps -a
6.2.3查看退出的容器
docker ps -f status=exited
6.3进入容器
docker exec -i -t 容器名字 /bin/bash
6.4退出容器
exit
6.5停止容器
docker stop 容器名/容器id 或 docker kill 容器名/容器id
6.6容器启动
docker start 容器名/容器id
6.7删除容器
docker rm 容器名/容器id 容器名/容器id
6.8查看容器日志
docker logs 容器名称/容器Id
6.9拷贝
拷贝进去
docker cp 需要拷贝的文件或目录 容器名称:容器目录
拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
7.创建软件容器
7.1创建mysql容器
docker run -i -d --name=mysql -p=3306:3306
-e MYSQL_ROOT_PASSWORD=itsource123456 mysql:5.7
- -e MYSQL_ROOT_PASSWORD : 是指定root用户的密码
- 注意:如果没有mysql:5.7,docker会自动去下载或拉取镜像
7.2创建Nginx容器
docker run -i -d --name=nginx -p=80:80
-v=/usr/local/nginx/html:/usr/share/nginx/html nginx
-v=/usr/local/nginx/html:/usr/share/nginx/html : 目录映射,我们只需往 /usr/local/nginx/html 放html页面就会自动同步到容器中
7.3创建redis容器
docker run -di --name=redis -p=6379:6379 redis --requirepass "123456"
8.构建镜像
8.1基于已有容器构建镜像
docker commit 容器名 新的镜像名:版本
8.2基于dockerfile构建
8.2.1创建一个目录/root/dockerfile
mkdir /root/dockerfile
cd /root/dockerfile
8.2.2拉取一个Centos镜像
docker pull centos:7
8.2.3将镜像需要的资源放入/root/dockerfile目录
8.2.4/root/dockerfile目录创建Dockerfile文件,并添加脚本内容
FROM centos:7
MAINTAINER itsource
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
- FROM : 把centos:7作为基础镜像
- 创建了一个/usr/local/java 目录
- ADD:把jdk安装包(资源)拷贝到该目录中并自动解压
- 配置Java的环境变量
8.2.5执行构建镜像命令
.在Dockerfile文件夹路径执行:docker build -t="jdk:1.8" ./
//docker build -t="openjdk:17-jdk-alpine" ./
- docker build :构建镜像
- -t :指定镜像的名字
8.3项目打包镜像
使用Maven的Docker插件构建镜像的本质就是使用Dockerfile构建镜像,只不过Docker插件会自动帮我们创建Dockerfile脚本文件,它通过脚本命令,基于一个基础镜像,将我们的项目(项目.jar)拷贝进去打包形成一个新的镜像。
8.3.1下载依赖镜像
在docker中提前准备好项目需要的环境容
列如下载jdk17: docker pull openjdk:17-jdk-alpine
列如下载mysql8: docker pull mysql:8.0.16
8.3.2开启docker的远程连接
第一步打开docker.service文件
vi /lib/systemd/system/docker.service
第二步:ExecStart=后添加配置 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
第三步:重新加载配置,重启Docker
systemctl daemon-reload //重新加载docker配置
systemctl restart docker //重启docker
8.3.3把项目中的所需要的技术连接地址改为容器地址
8.3.4项目安装docker插件
8.3.4.1安装插件
把docker打包插件复制到要生成镜像的项目的pom中
<build>
<finalName>blog</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--docker的maven插件,官网: https://github.com/spotify/docker‐maven‐plugin-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!--镜像名 blog-server:1.0.0-->
<imageName>${project.artifactId}:${project.version}</imageName>
<!--基础镜像:在虚拟机中要准备一个jdk:17的镜像-->
<baseImage>openjdk:17-jdk-alpine</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}
</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!--docker远程主机-->
<dockerHost>http://172.168.30.192:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>
8.3.4.2maven打包
在项目根目录将项目达成jar包
8.3.4.3docker插件打包
maven/plugines/docker/docker:build
也可以通过idea控制台命令
mvn clean package -Dmaven.test.skip=true docker:build
运行完后,就会将jar包打成镜像推送到服务器本地仓库中
8.3.4.4使用docker run命令启动项目
9.容器通信
9.1通过宿主机ip+端口号通信
端口映射把docker暴露到外部,外网通过ip:映射的端口进行访问。有些应用是不应该暴露到外网的,比如: redis ,mysql就不应该暴露,但是为了操作方便也可以暴露,方便导入sql
例如:docker run -di --name=redis -p=6379:6379 redis --requirepass "123456"
9.2通过容器ip通信
容器之间默认可以使用容器的ip(容器本身也有ip)进行通信,但是重启docker,ip会变化,一般不用。查看ip如下:
docker inspect 容器 | grep IPAddress
9.3通过link进行通信
启动容器的时候,给要通信的目标容器使用link指定一"链接名",在容器中就可以使用"链接名"和目标容器通信。格式: --link 目标容器:别名 ,例如: 某容器想要链接名字为mysql 的容器,如下配置:
创建Mysql容器,名字为: mysql
Docker run -id --name=mysql -p=3306:3306 mysql:5.7
创建项目容器,名字为:blog,
- 通过link链接mysql 容器,链接名也是:mysql
- 通过link链接redis 容器,链接名也是:redis
docker run -di --name=blog
--link mysql:mysql --link redis:redis -p=8080:8080 pethome:1.0-SNAPSHOT
# --link mysql:mysql 表示 -link链接 容器名:别名,代码中就可以不用写ip就用别名即可
项目配置连接更改为对应link
url: jdbc:mysql://mysql:3306/drive-order?serverTimezone=Asia/Shanghai&characterEncoding=utf8
9.4创建bridge网络
创建一个公用的网络,将容器都放入公网中,就可以通信了
9.4.1创建桥接公网
docker network create -d bridge mybridge #创建自己的bridge
9.4.2容器加入网络
docker run -d --name box5 --network mybridge busybox /bin/sh -c "while true;do sleep 3600;done"
docker run -d --name box6 --network mybridge busybox /bin/sh -c "while true;do sleep 3600;done"
10.Dockerfile
10.1Dockerfile内容基础知识
- 每条保留字指令都必须为大写字母切后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层并对镜像进行提交
10.2Dockerfile执行Dockerfile执行流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker.commit的操作提交一个新的镜像
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有指令完成
10.3常用的保留字指令
- FROM:基础镜像,当前新镜像是基于那个镜像的,指定一个已经存在的镜像作为模板
- MAINTAINER:镜像维护者的姓名和邮箱地址
- RUN:容器构建时需要运行的命令(RUN是在docker bulid时运行)
-
- shell格式
- exec格式
- EXPOSE:当前容器对外暴露端口号
- WORKDIR:指定容器创建后,登录进容器默认的落脚点(默认文件位置)
- USER:指定该镜像以什么样的用户去执行(默认root)
- ENV:构建过程中定义环境变量,可以在后续指令中引用
- COPY: 将宿主机指定文件复制到容器中
- ADD:复制并解压
- VOLUME:容器和宿主机文件目录映射(-v)
- CMD:在容器构建完成后,执行的命令,只有最后一个生效(会被docker run中的命令覆盖)
- ENTRYPOINT:也是用来指定一个容器启动时要运行的命令,类似于CMD指令,但是不会被docker run覆盖。配合CMD使用时,CMD会变成参数,传递给ENTRYPOINT