笔记参考:https://blog.youkuaiyun.com/qq_21197507/article/details/115071715
Docker安装脚本
#!/bin/bash
# 卸载旧版本的 Docker
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安装 Docker 依赖的软件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加阿里云镜像源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新 yum 软件包索引
sudo yum makecache fast
# 安装 Docker
sudo yum install docker-ce docker-ce-cli containerd.io
# 启动 Docker 服务
sudo systemctl start docker
#设置开机自启动
sudo systemctl enable docker
# 验证 Docker 是否成功安装
sudo docker run hello-world
#copy上述脚本到.sh文件
vi docker.sh
#设置脚本权限
chmod +x docker.sh
#启动脚本
./docker.sh
run命令的执行流程
底层原理
Docker 是怎么工作的
Docker是一个Client-Server的结构系统,Docker是守护进程运行在主机行,通过Socket从客户端连接
DockerServer接受到Docker-Client的指令,就会执行命令
Docker为什么比VM(虚拟机)快?
1、Docker有着比VM更少的抽象层
VM是完成的虚拟器
Docker只是一个容器
2、docker利用的宿主机的内核,VM需要Guest OS
所以说新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。
虚拟机是加载Guest OS,启动是分钟级别的。而docker 是利用宿主机的操作系统,省略了很多步骤,启动级别是秒级的
Docker常用命令
帮助命令
docker --help
docker info
docker version
官网命令文档
https://docs.docker.com/reference/
镜像命令
docker images
docker search mysql
docker search mysql --filter=stars=5000
下载镜像
docker pull
删除镜像
docker rmi sadaop1
docker rmi -f $(docker images -ap)
容器命令
前提:有了镜像才可以创建容器,下载centos镜像来学习
docker pull centos
容器数据卷
数据不应该放在容器中,因为容器删除,数据也会删除
MySQL,容器删除了,数据也会没了。需求:MYSQL数据可以存储在本地
容器之间可以有一个数据共享的技术。Docker容器中产生的数据,同步到本地
卷技术,目录的挂载,将我们容器的内的目录挂载到Linux上面
总结一句话:容器的持久化和同步操作,容器间也是可以数据共享
方式一
直接命令方式挂载
docker run -it -v 主机目录:容器目录
## 当在centos里面的/home创建文件的时候,主机上的ceshi目录下也会有
docker run -it -v /home/ceshi:/home centos /bin/bash
docker inspect 741e899d0cc0
安装MySQL
docker run -d -p 3700:3306
-v /home/mysql/conf:/etc/mysql/conf.d
-v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
--name=mysql01
mysql
##### 说明
-v 挂载mysql的配置到主机的/home/mysql/conf目录下
-v 挂载mysql的数据到/home/mysql/data目录下
-e 设置MySQL的登录密码
--name 设置容器名字
mysql 启动的镜像
具体挂载和匿名挂载
所有docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxx/_data
# 如何确定是匿名挂载还是具名挂载,还是指定路径挂载
-v 容器内路径 # 匿名挂载,如 -v /etc/nginx nginx
-v 卷名:容器内路径 # 具名挂载,卷名没有路径/,如 -v juming-nginx:/etc/nginx
-v 宿主机路径:容器内路径 # 指定路径挂载,一般/开头,如 -v /home/mysql/data:/var/lib/mysql
1234
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一旦设置了这个容器权限,容器对我们挂载出来的内容就有了限定了
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法进行操作的
Dockerfile
用来构建docker镜像的构建文件
docker run -it --name docker1 centos
docker run -it --name docker02 --volumes-from docker1 centos
docker run -it --name docker03 --volumes-from docker1 centos
docker2,3都挂载在docker1上,删除docker1时候,docker2,3数据都有,且同步
这是因为docker1,2,3本质都是挂载在主机上某个目录的
MySQL数据同步
docker run -d -p 3310:3306
-v /etc/mysql/conf.d
-v /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=338218
--name mysql01 mysql:5.7
docker run -d -p 3311:3306
-e MYSQL_ROOT_PASSWORD=338218
--name mysql02
--volumes-from mysql01 mysql:5.7
# 这个时候可以实现两个容器数据同步
- 容器之间配置信息的传递,数据卷容器的生命周期这一直持续到没有容器使用为止
- 但是一旦持久化到了本地,这个时候,本地的数据不会被删除
Dockerfile构建步骤
- 编写一个dockerfile文件
vi Dockerfile
FROM centos:7
VOLUME ["volume01","volume02"]
CMD echo "-----------end-------------"
CMD /bin/bash
- docker build构建为一个镜像
docker build -f Dockerfile -t centos-test20220527:0.2 .
-f 文件名字
-t 镜像标签
- docker run 运行镜像
docker run -it 3bb636778c29 /bin/bash
## 3bb636778c29 自己构建镜像的ID
- docker push发布镜像(DockerHub、阿里云镜像仓库)
Dockerfile命令
FROM # 基础镜像,一切从这里开始
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:往里面加东西:tomcat镜像,这个tomcat压缩包,添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置
CMD # 指定容器运行时的shell命令,只有最后一个生效,可被替代
ENTRYPOINT # 指定容器运行时的shell命令,可以追加命令
ONBUILD # 当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令,触发指令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量
构建属于自己的centos
# 1./home下新建dockerfile目录
mkdir dockerfile
# 2. dockerfile目录下新建mydockerfile-centos文件
vim mydockerfile-centos
# 3.编写Dockerfile配置文件
FROM centos # 基础镜像是官方原生的centos
MAINTAINER liaobh<7758258@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.出现一下文字则构建成功
Successful built xxxxxx
Successful tagged xxxxx
Docker部署Spring Boot应用
- mvn package 打Jar包
- 编辑Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
- 将Dockerfile跟jar包上传到服务器上
- 构建镜像并启动(注意最后有个 . )
docker build -t xxxxx:xx .
docker run -it -p:8080:8080 --name=xxx01 xxxxx
实际项目中一般是用gitLab+jenkins自动化部署