Docker学习

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和传统的区别

虚拟机技术:

image-20210407123415155

虚拟机技术缺点

1、 资源占用十分多

2、 冗余步骤多

3、 启动很慢!

容器化技术:

image-20210407123601212

区别:

  • 传统主机 都要配置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)


镜像操作

  1. 拉取镜像到本地

​ docker pull 镜像名称[:tag]

​ docker pull daocloud.io/library/tomcat:8.5.14-jre8

  1. 查看本地镜像目录

​ docker images

  1. 删除镜像

docker rmi 镜像的 ID

容器操作

  1. 运行容器
运行容器需要定制具体镜像,如果镜像不存在,会直接下载
#简单操作
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/

  1. 查看正在运行的容器
#查看全部正在运行的容器信息
docker ps [-qa]
#-a 查看全部的容器,包括没有运行
#-q 只查看容器的标识

  1. 查看容器日志
#查看容器日志,以查看容器运行的信息
docker logs -f 容器id
#-f:可以滚动查看日志的最后几行

  1. 进入容器内部
#可以进入容器的内部进行操作
docker exec -it 容器id bash

  1. 复制容器到另一个容器
#将宿主机的文件复制到容器内部的指定目录
docker cp 文件名称 容器id:容器内部路径

  1. 重启 启动 停止 删除容器
#容器的启动,停止,删除等操作,后续会经常使用到
#重新启动容器
docker restart 容器id
#启动停止运行的容器
docker start 容器id
#停止指定的容器
docker stop 容器id
#停止全部容器
docker stop $(docker ps -qa)
#删除指定容器(删除容器前,需要先停止容器)
docker rm 容器id
#删除全部容器
docker rm $(docker ps -qa)

命令小结

image-20210408104258035

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镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!

这一层就是我们通常所说的容器层,容器之下的都叫镜像层

image-20210408115614547

数据卷

什么是数据集

  • 如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
  • MySQL,容器删除了,删库跑路!需求:MySQL数据可以存储在本地!
  • 容器之间可以有数据共享
  • 将我们容器内的目录,挂载到Linux上面!

总结:容器的数据在本地备份一份 容器删除了本地还有 容器之间也能共享数据

方式一 :直接使用命令挂载 -v

方式二 :Dockerfile 经常用

  1. 创建一个dockerfile文件,名字可以随便 建议Dockerfile1 vim Dockerfile1
  2. 编写dockerfile1文件
$ vim dockerfile1
    FROM centos 					# 当前这个镜像是以centos为基础的

    VOLUME ["volume01","volume02"] 	# 挂载卷的卷目录列表(多个目录)

    CMD echo "-----end-----"		# 输出一下用于测试
    CMD /bin/bash					# 默认走bash控制台

# 这里的每个命令,就是镜像的一层!
  1. 生成这个镜像 : -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
  1. 启动镜像
$ docker run -it f4a6b0d4d948 /bin/bash	# 运行自己写的镜像
$ ls -l 								# 查看目录
  1. 查看一下卷挂载
# docker inspect 容器id
$ docker inspect ca3b45913df5

img

  1. 至此 ,数据卷挂载成功 本地和容器共享了两个数据集文件 “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微服务项目

  1. 创建简单的springboot项目 本地运行:http://localhost:8080/HelloDocker
@RestController
public class HelloDocker {

    @RequestMapping("/HelloDocker")
    public String helloDocker(){
        return "HelloDocker";
    }
}
  1. maven打包 :demo-0.0.1-SNAPSHOT.jar

  2. 编写Dockerfile文件

FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8081
ENTRYPOINT ["java","-jar","app.jar"]
  1. 将jar包和Dockerfile拉到服务器同一文件夹下

image-20210410003505430

  1. 该文件夹目录下 进行打包 生成镜像
docker build -t 镜像名 .
  1. 运行镜像
docker docker run -d -p 8081:8080 --name 发布名 镜像名       //对应Dockerfile的 8081
  1. 查看运行结果
curl localhost:8081/HelloDocker

DockerCompose

作用:

  1. 之前运行一个镜像,需要添加大量的参数
  2. 可以通过Docker-Compose编写这些参数
  3. Docker-Compose可以帮助我们批量管理容器
  4. 只需要通过一个docker-compose.yml文件去维护即可

安装DockerCompose

  1. 下载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
  1. 设置权限
chmod +x /usr/local/bin/docker-compose
  1. 执行
docker-compose version

部署springboot项目

  1. 首先确保可以在本地运行并访问到数据库 :连接本地数据库测试
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)]

连接成功

  1. 在虚拟机中安装数据库镜像
docker pull mysql:5.7
  1. 查看本地镜像
docker images
  1. 运行数据库
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root ID
  1. Navicat 连接docker数据库 便于在本地操作

  2. 修改项目配置文件 --> 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
  1. 测试本地运行 通过docker数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qycb4BEP-1622529762656)(C:\Users\Usount\AppData\Roaming\Typora\typora-user-images\image-20210412093726142.png)]

  1. 打包项目 – jar包

  2. 编写Dockerfile文件

FROM java:8
COPY *jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
  1. 虚拟机创建一个文件夹docker-mysql 将jar包和Dockerfile复制进去

  2. 进入docker-mysql 创建容器

docker build -t 镜像名 .
  1. 运行该容器
docker run -d -p 8080:8080 --name 容器名 镜像名
  1. 运行成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OWWJKDpa-1622529762657)(C:\Users\Usount\AppData\Roaming\Typora\typora-user-images\image-20210412095341495.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值