Docker
Docker概述
以前:
-
一款产品: 开发–上线 两套环境!应用环境,应用配置! {本地配置了环境(mysql redis…) 部署项目上线到服务器 服务器又要配置环境(mysql redis…)}
-
环境配置是十分的麻烦,每一个服务器都要根据项目部署环境(集群Redis、ES、Hadoop…) !费事费力。
-
之前在服务器配置一个应用的环境 Redis MySQL JDK ES Hadoop 配置超麻烦了,不能够跨平台。
开发环境Windows,最后发布到Linux!
现在:
-
发布一个项目( jar + (Redis MySQL JDK ES) ),项目带上环境一起打包!
-
安卓流程:java — apk —发布(应用商店)一 张三下载apk安装即可用!(docker同理)
-
docker流程: java–jar(环境) — 打包项目帯上环境(镜像就是环境 比如mysql jdk…) — ( Docker仓库:商店)别人要用你的项目 直接去Docker仓库下载这个项目的镜像(环境)就行----- 直接运行即可
-
window系统安装好会携带一些软件(我的电脑 回收站) 这些软件就是window的镜像
-
Docker的思想就来自于集装箱! 隔离:Docker核心思想!打包装箱!每个箱子是互相隔离的。 以前两个应用会同时用8080端口导致端口冲突 现在Docker通过隔离机制将每个应用彻底隔离开–>两个8080也不会冲突了
-
比如: 搬运 水果 海鲜 以前担心全部放一条船上水果会被海鲜吃掉 所以要两条船 ----- 现在 一条船上用两个集装箱(docker)分开装 可以将资源利用到极致 == 可以将服务器利用到极致
Docker和传统的区别
虚拟机技术:
虚拟机技术缺点:
1、 资源占用十分多
2、 冗余步骤多
3、 启动很慢!
容器化技术:
区别:
- 传统主机 都要配置Lib环境 —>jdk mysql…的环境变量
- 容器技术:每一个app自带一份Lib环境
- 传统虚拟机,虚拟出一台硬件主机,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机上,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
- 虚拟机同时启动三个就卡了 Docker同时启动30个都不卡
Docker安装
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7au6aXeP-1622529762646)(https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fupload-images.jianshu.io%2Fupload_images%2F12607376-e769c302be7a6088.png&refer=http%3A%2F%2Fupload-images.jianshu.io&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1620366388&t=85607d509c4dd7e508ae3c8df68ede17)]
镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像==>run==>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的.
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个简易的 Linux系统。
仓库(repository):
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库。(很类似git)
Docker Hub是国外的。
阿里云…都有容器服务器(配置镜像加速!)
安装步骤:
1.卸载原本的docker(首次安装可以跳过)
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
2.安装Docker依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3.添加阿里云镜像加速
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新yum缓存
sudo yum makecache fast
5.安装Docker(Docker版本分为CE(社区免费版)和EE(企业版,安全CE)
sudo yum -y install docker-ce
6.启动Docker
sudo systemctl start docker
7.查看是否安装成功
docker info
安装完成
8.设置开机自启动
sudo systemctl enable docker
9.移除Docker-ce服务
sudo yum remove docker-ce
10.删除镜像
docker rmi 镜像id
Docker中央仓库
1.Docker官网 :Dockerhub
2.网易云:[https://c.163yun.com/hub](https://c.163yun.com/hub)
3.daocloud:[hub.daocloud.io](https://c.163yun.com/hub)
镜像操作
- 拉取镜像到本地
docker pull 镜像名称[:tag]
docker pull daocloud.io/library/tomcat:8.5.14-jre8
- 查看本地镜像目录
docker images
- 删除镜像
docker rmi 镜像的 ID
容器操作
- 运行容器
运行容器需要定制具体镜像,如果镜像不存在,会直接下载
#简单操作
docker run 镜像的标识|镜像的名称[:tag]
#常用的参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
#-d:代表后台运行容器 如果不加-d,缺点是会占据你当前terminal窗口,想执行其他操作只有停止或者新开窗口
#-p 宿主机端口:容器端口:为了映射当前Linux的端口和容器的端口
#--name 容器名称:指定容器的名称(自己编)
#docker run -d -p 8080:8080 --name tomcat a0
#寄主浏览器访问 http://192.168.237.128:8080/
- 查看正在运行的容器
#查看全部正在运行的容器信息
docker ps [-qa]
#-a 查看全部的容器,包括没有运行
#-q 只查看容器的标识
- 查看容器日志
#查看容器日志,以查看容器运行的信息
docker logs -f 容器id
#-f:可以滚动查看日志的最后几行
- 进入容器内部
#可以进入容器的内部进行操作
docker exec -it 容器id bash
- 复制容器到另一个容器
#将宿主机的文件复制到容器内部的指定目录
docker cp 文件名称 容器id:容器内部路径
- 重启 启动 停止 删除容器
#容器的启动,停止,删除等操作,后续会经常使用到
#重新启动容器
docker restart 容器id
#启动停止运行的容器
docker start 容器id
#停止指定的容器
docker stop 容器id
#停止全部容器
docker stop $(docker ps -qa)
#删除指定容器(删除容器前,需要先停止容器)
docker rm 容器id
#删除全部容器
docker rm $(docker ps -qa)
命令小结
Docker部署应用
1.docker运行tomcat
# 如果docker外有tomcat正在运行,先关闭docker外的tomcat容器
#cd到tomcat目录/bin 运行
./shutdown.sh
#运行Tomcat容器,为部署war包工程做准备
docker run -d -p 8080:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8
#或者已经下载了tomcat镜像
docker run -d -p 8080:8080 --name tomcat 镜像的标识id
2.docker运行MySQL容器
# 关闭docker之外的mysql服务
systemctl stop mysqld
#禁止docker之外的mysql开机自动启动
systemctl disable mysqld
#运行MySQL容器,
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4
#或者已经下载了mysql镜像
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root 镜像的标识id
#注意这里没有密码的健壮性校验 : MYSQL_ROOT_PASSWORD=root
#本地windows上使用 navicat 新建连接,主机名为ip 端口 3306
Docker镜像讲解
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常所说的容器层,容器之下的都叫镜像层
数据卷
什么是数据集
- 如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
- MySQL,容器删除了,删库跑路!需求:MySQL数据可以存储在本地!
- 容器之间可以有数据共享
- 将我们容器内的目录,挂载到Linux上面!
总结:容器的数据在本地备份一份 容器删除了本地还有 容器之间也能共享数据
方式一 :直接使用命令挂载 -v
方式二 :Dockerfile 经常用
- 创建一个dockerfile文件,名字可以随便 建议Dockerfile1 vim Dockerfile1
- 编写dockerfile1文件
$ vim dockerfile1
FROM centos # 当前这个镜像是以centos为基础的
VOLUME ["volume01","volume02"] # 挂载卷的卷目录列表(多个目录)
CMD echo "-----end-----" # 输出一下用于测试
CMD /bin/bash # 默认走bash控制台
# 这里的每个命令,就是镜像的一层!
- 生成这个镜像 : -f 文件名 -t 镜像名
$ docker build -f dockerfile1 -t caoshipeng/centos .
# 查看自己构建的镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
caoshipeng/centos latest f4a6b0d4d948 About a minute ago 237MB
- 启动镜像
$ docker run -it f4a6b0d4d948 /bin/bash # 运行自己写的镜像
$ ls -l # 查看目录
- 查看一下卷挂载
# docker inspect 容器id
$ docker inspect ca3b45913df5
- 至此 ,数据卷挂载成功 本地和容器共享了两个数据集文件 “volume01”,“volume02”
容器间挂载
- 几个容器间实现数据共享
- 其中一个容器删除了 其他容器的数据依旧存在
# 测试 启动3个容器,通过刚才自己写的镜像启动
# 创建docker01:
$ docker run -it --name docker01 caoshipeng/centos:latest
# 查看容器docekr01内容
$ ls
bin home lost+found opt run sys var
dev lib media proc sbin tmp volume01
etc lib64 mnt root srv usr volume02
# 不关闭该容器退出
CTRL + Q + P
# 创建docker02: 并且让docker02 继承 docker01
$ docker run -it --name docker02 --volumes-from docker01 caoshipeng/centos:latest
# 查看容器docker02内容
$ ls
bin home lost+found opt run sys var
dev lib media proc sbin tmp volume01
etc lib64 mnt root srv usr volume02
DockerFile
DockerFile介绍
dockerfile
是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、 编写一个dockerfile文件
2、 docker build 构建称为一个镜像
3、 docker run运行镜像
4、 docker push发布镜像(DockerHub 、阿里云仓库)
作用:
- Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
- Docker镜像逐渐成企业交付的标准,必须要掌握!
- DockerFile:构建文件,定义了一切的步骤,源代码
- DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
- Docker容器:容器就是镜像运行起来提供服务。
DockerFile的指令
FROM # from:基础镜像,一切从这里开始构建
MAINTAINER # maintainer:镜像是谁写的, 姓名+邮箱
RUN # run:镜像构建的时候需要运行的命令
ADD # add:步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR # workdir:镜像的工作目录
VOLUME # volume:挂载的目录
EXPOSE # expose:保留端口配置
CMD # cmd:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # entrypoint:指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # onbuild:当构建一个被继承DockerFile这个时候就会运行onbuild的指令,触发指令
COPY # copy:类似ADD,将我们文件拷贝到镜像中
ENV # env:构建的时候设置环境变量!
创建一个自己的cento
# 1./home下新建dockerfile目录
$ mkdir dockerfile
# 2. dockerfile目录下新建mydockerfile-centos文件
$ vim mydockerfile-centos
# 3.编写Dockerfile配置文件
FROM centos # 基础镜像是官方原生的centos
MAINTAINER cao<1165680007@qq.com> # 作者
ENV MYPATH /usr/local # 配置环境变量的目录
WORKDIR $MYPATH # 将工作目录设置为 MYPATH
RUN yum -y install vim # 给官方原生的centos 增加 vim指令
RUN yum -y install net-tools # 给官方原生的centos 增加 ifconfig命令
EXPOSE 80 # 暴露端口号为80
CMD echo $MYPATH # 输出下 MYPATH 路径
CMD echo "-----end----"
CMD /bin/bash # 启动后进入 /bin/bash
# 4.通过这个文件构建镜像
# 命令: docker build -f 文件路径 -t 镜像名:[tag] .
$ docker build -f mydockerfile-centos -t mycentos:0.1 .
# 5.出现下图后则构建成功
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 cbf5110a646d 2 minutes ago 311MB
# 6.测试运行
$ docker run -it mycentos:0.1 # 注意带上版本号,否则每次都回去找最新版latest
$ pwd
/usr/local # 与Dockerfile文件中 WORKDIR 设置的 MYPATH 一致
$ vim # vim 指令可以使用
$ ifconfig # ifconfig 指令可以使用
# docker history 镜像id 查看镜像构建历史步骤
$ docker history 镜像id
CMD 和 ENTRYPOINT区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试cmd
# 编写dockerfile文件
$ vim dockerfile-test-cmd
FROM centos
CMD ["ls","-a"] # 启动后执行 ls -a 命令
# 构建镜像
$ docker build -f dockerfile-test-cmd -t cmd-test:0.1 .
# 运行镜像
$ docker run cmd-test:0.1 # 由结果可得,运行后就执行了 ls -a 命令
.
..
.dockerenv
bin
dev
etc
home
# 想追加一个命令 -l 成为ls -al:展示列表详细数据
$ docker run cmd-test:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\":
executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled
# cmd的情况下 -l 替换了CMD["ls","-l"] 而 -l 不是命令所以报错
测试ENTRYPOINT
# 编写dockerfile文件
$ vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
# 构建镜像
$ docker build -f dockerfile-test-entrypoint -t cmd-test:0.1 .
# 运行镜像
$ docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found ...
# 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的
$ docker run entrypoint-test:0.1 -l
total 56
drwxr-xr-x 1 root root 4096 May 16 06:32 .
drwxr-xr-x 1 root root 4096 May 16 06:32 ..
-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 May 16 06:32 dev
drwxr-xr-x 1 root root 4096 May 16 06:32 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ....
部署Springboot微服务项目
- 创建简单的springboot项目 本地运行:http://localhost:8080/HelloDocker
@RestController
public class HelloDocker {
@RequestMapping("/HelloDocker")
public String helloDocker(){
return "HelloDocker";
}
}
-
maven打包 :demo-0.0.1-SNAPSHOT.jar
-
编写Dockerfile文件
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8081
ENTRYPOINT ["java","-jar","app.jar"]
- 将jar包和Dockerfile拉到服务器同一文件夹下
- 该文件夹目录下 进行打包 生成镜像
docker build -t 镜像名 .
- 运行镜像
docker docker run -d -p 8081:8080 --name 发布名 镜像名 //对应Dockerfile的 8081
- 查看运行结果
curl localhost:8081/HelloDocker
DockerCompose
作用:
- 之前运行一个镜像,需要添加大量的参数
- 可以通过Docker-Compose编写这些参数
- Docker-Compose可以帮助我们批量管理容器
- 只需要通过一个docker-compose.yml文件去维护即可
安装DockerCompose
- 下载Docker-Compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- 设置权限
chmod +x /usr/local/bin/docker-compose
- 执行
docker-compose version
部署springboot项目
- 首先确保可以在本地运行并访问到数据库 :连接本地数据库测试
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/library?serverTimezone=GMT
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
check-config-location: true
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b8zQOpXE-1622529762655)(C:\Users\Usount\AppData\Roaming\Typora\typora-user-images\image-20210412085245629.png)]
连接成功
- 在虚拟机中安装数据库镜像
docker pull mysql:5.7
- 查看本地镜像
docker images
- 运行数据库
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root ID
-
Navicat 连接docker数据库 便于在本地操作
-
修改项目配置文件 --> 192.168.237.128 : 虚拟机ip ssm:docker数据库 库名
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.237.128:3306/ssm?serverTimezone=GMT
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
check-config-location: true
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 测试本地运行 通过docker数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qycb4BEP-1622529762656)(C:\Users\Usount\AppData\Roaming\Typora\typora-user-images\image-20210412093726142.png)]
-
打包项目 – jar包
-
编写Dockerfile文件
FROM java:8
COPY *jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
-
虚拟机创建一个文件夹docker-mysql 将jar包和Dockerfile复制进去
-
进入docker-mysql 创建容器
docker build -t 镜像名 .
- 运行该容器
docker run -d -p 8080:8080 --name 容器名 镜像名
- 运行成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OWWJKDpa-1622529762657)(C:\Users\Usount\AppData\Roaming\Typora\typora-user-images\image-20210412095341495.png)]