Docker
1、什么是docker?
- 是一个C/S架构的承载应用运行的平台软件
2、为什么用docker
- 解决应用运行环境配置的复杂性
- 轻量级,内存占用低
- 扩容方便,使用镜像部署效率高,只需要将程序及其所依赖的环境打包成镜像,即可在服务器上将程序及其运行环境一站式部署
3、docker与虚拟机之间的区别
4、docker核心架构
- 镜像:一个镜像代表一个应用环境,他是一个只读的文件,如mysql镜像,tomcat镜像,nginx镜像等
- 容器:镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写
- 仓库:用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置
- dockerFile:docker生成镜像配置文件,用来书写自定义镜像的一些配置
- tar:一个对镜像打包的文件,日后可以还原成镜像
5、Docker安装(CentOS7.X)
Docker官网 下载链接 官方文档 练习play-with-docker
1、卸载CentOS中老旧的Docker
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
2、安装
# 安装docker依赖
sudo yum install -y yum-utils device-mapper-persistent-data 1vm2
# 配置yum依赖设置docker的yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repc
# 安装最新版的docker
sudo yum install docker-ce docker-ce-cli containelrd.io
# 启动docker
sudo systemctl start docker
# 关闭docker
sudo systemctl stop docker
# 测试docker安装
sudo docker run hello-world
# 安装过程中 docker中报错 failure: repodata/repomd.xml from mirrors.aliyun.com_docker-ce_linux_centos_docker-ce.pro
解决方案
https://blog.csdn.net/qq_18948359/article/details/102715729
指定安装版本
yum list docker-ce --showduplicates | sort -r
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd. io
sudo yum install docker-ce-18.09.5-3.e17 docker-ce-cli-18.09.5-3.e17 containerd.io
6、配置阿里云镜像(加速镜像下载)
执行命令添加阿里云镜像加速配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://uz579bhl.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
验证镜像加速是否生效
docker info
# 出现以下信息则配置成功
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://uz579bhl.mirror.aliyuncs.com/
Live Restore Enabled: false
7、docker常用命令
辅助命令
# 查看版本
docker version
# 查看详细信息
docker info
# 指令帮助
docker --help
images镜像命令
# 查看镜像
docker images
docker images -a
docker images -q
# 搜索镜像
docker search [options]
-s 指定值 列出收藏数不少于指定值的镜像
--no-trunce 显示镜像完整信息
# 仓库下载镜像
docker pull 镜像名[:TAG|@DIGEST]
# 删除镜像
docker rmi 镜像名
-f 强制删除
container容器常用命令
基本命令(容器外直接执行)
# 运行一个容器
docker run 镜像
--name 为容器起一个别名
-p 端口映射
-d 守护进程的方式启动
例如:
docker run -it --name myNginx -p 80:80 nginx
docker run -d --name myNginx -P nginx
# 查看运行中的docker容器
docker ps
-a 所有已运行过的容器
-q 静默方式,只显示容器编号
# 停止|关闭|重启容器
docker start 容器名字或者容器id
docker restart 容器名或者容器id
docker stop 容器名或者容器id
docker kill 容器名或者容器id
# 删除一个容器
docker rm -f 容器id或name
# 删除所有容器
docker rm -f $(docker ps -aq)
# 查看容器内进程
docker top 容器id或name
# 查看容器内部细节
docker inspect 容器id
# 查看容器的运行日志
docker logs [OPTIONS] 容器id或容器名
-t 加入时间戳
-f 跟随最新的日志打印
--tail 数字显示最后多少条
容器内数据交互命令
# 1.进入容器内部
docker exec [options] 容器id 容器内命令
-i 以交互模式运行容器,通常与-t一起使用
-t分配一个伪终端
docker exec -it 容器id /bin/bash
# 2.容器内安装软件
apt-get update
apt-get install 安装包名称
# 3.修改容器内文件
修改文件内容使用 echo "内容" > 文件名
# 4.退出容器
exit退出容器
# 5.将容器打包为新的镜像
docker commit -a="作者名称" -m="描述信息" 容器ID 目标镜像名称:TAG
# 6.从容器内复制文件到外部宿主机文件系统中
docker cp 容器id:容器内资源文件全路径 宿主机目标路径
# 7.设置容器和宿主机共享目录(数据卷valueme)
docker run -it -v /宿主机的路径:/容器内的路径:ro(只读) 镜像名
注意:宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容
运行 docker inspect 容器id 命令检查json串里有没有以下内容,如果有则证明卷挂载成功。
例如:docker run -d -p 80:80 -v /root/test/:/usr/share/nginx/html:ro nginx
"Mounts": [
{
"Type": "bind",
"Source": "/root/test", // 主机数据源全路径
"Destination": "/usr/share/nginx/html", // 容器内目标路径
"Mode": "ro", // only read 只读
"RW": false,
"Propagation": "rprivate"
}
]
# 8.打包镜像
docker save 镜像名 -o 名称.tar
# 9.载入镜像
docker load -i 名称.tar
8、docker镜像原理
镜像是什么?
镜像是一种轻量级的,能够独立执行的软件包,用来打包软件运行环境和基于运行环境开发的软件,包含软件运行所需要的所有内容,包括代码,库,环境变量以及配置文件。
- UnionFS(联合文件系统):
Union文件系统是一种分层,轻量级并具高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。这种文件系统特性:就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
镜像原理
docker的镜像实际是由一层一层的文件系统组成
- bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs这一层与Linux/Unix系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
- rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。
- 我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的os,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。
为什么docker镜像要采用这种分层结构呢?
最大的一个好处就是资源共享
- 比如:有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也
只需要加载一份base镜像
,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。
Docker中安装常用软件
Docker与集群管理工具Swarm
引言
Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。
☆docker可视化工具Portainer部署与汉化
# 1、搜索镜像
docker search portainer
# 2、下载最高start
docker pull portainer/portainer
# 3、部署单机版仅本机能访问,命令如下
docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --name prtainer-test portainer/portainer
下载portainer汉化包 (提取码:6vjr)
# 解压
tar -xvf public.tar
# 将public移动到根目录
mv public /
# 部署汉化版portainer
docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data -v /public:/public --name prtainer-test portainer/portainer
安装mysql数据库
# 1、安装mysql
docker pull mysql:TAG
# 2、启动mysql
docker run --name 命名 -e MYSQL_ROOT_PASSWORD=密码 -d -p 3306:3306 mysql:TAG(版本)
可能出现的问题
# 3.进入mysq1容器
docker exec -it 容器名称|容器id bash
# 4.外部查看mysq1日志
docker logs 容器名称|容器id
# 5.使用自定义配置参数
docker run --name mysql -v /root/mysql/conf.d:/etc/mysq1/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysq1:TAG
# 6.将容器数据位置与宿主机位置挂载保证数据安全
docker run --name mysql -p 3306:3306 -d -v /root/mysq1/data:/var/lib/mysql
-v /root/mysq1/conf.d:/etc/mysq1/conf.d -e MYSQL_PASSWOT_PASSWORD=root mysql:TAG
# 7.通过其他客户端访问如在window系统|macos系统使用客户端工具访问数据库
# 8.将mysq1数据库备份为sq1文件
# 导出全部数据
docker exec 容器名|容器id sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sq1
# 导出指定库的数据
docker exec 容器名|容器id sh -c 'exec mysqldump --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
# 导出指定库数据不要
docker exec 容器名|容器id sh -c 'exec mysqldump --no-data --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
# 9.执行sq1文件到mysq1中
docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /root/文件名.sq1
springboot中使用docker容器中的mysql数据库与正常使用无差别
安装redis服务
# 1、搜索镜像
docker search redis
# 2、拉取下载
docker pull redis:TAG
# 3、启动
docker -d -p 3306:3306 --name redis redis:TAG
# 4、查看启动日志
docker logs -t -f 容器名|容器id
# 5、进入容易内部操作
docker exec -it 容器名 /bin/bash
# 5.挂载外部自定义配置启动redis容器
默认情况下redis官方镜像中没有redis.conf配置文件需要去官网下载指定版本的配置文件
1.wgethttp://download.redis.io/releases/redis-5.0.8.tar.gz下载官方安装包
2.将官方安装包中配置文件进行复制到宿主机指定目录中如/root/redis/redis.conf文件
3.修改需要自定义的配置
bind0.0.0.0开启远程权限
默认是rdb持久化模式
appenonly yes开启aof持久化,每秒同步一次
4.挂载自定义配置启动redis
docker run -v /root/myredis/conf:/usr/local/etc/redis --name myredis -d -p 6379:6379 redis redis-server /usr/local/etc/redis/redis.conf
# 6.将数据目录挂载宿主机保证数据安全
docker run --name myredis -v /root/redis/data:/data -v /root/myredis/conf:/usr/local/etc/redis -d -p 6379:6379 redis redis-server /usr/local/etc/redis/redis.conf
# 7、redis生成rdb快照指令:save
springboot中使用redis
1、引入操作redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、通过上述导入的依赖提供的RedisTemplete(操作对象)或者StringRedisTemplete(主要操作字符串)操作redis数据库,使用了模板方法设计模式。
3、application.xml配置redis数据库,主机、端口、数据库
4、注意点
- RedisTemplete持久化对象时,目标对象需实现序列化接口
- 设置键的序列化方式为Stirng的方式
- 值的序列化方式一般设置为json序列化
安装tomcat应用服务器
# 搜索镜像
docker search
# 拉取镜像
docker pull
# 以用完即删的方式运行
docker run --rm
# 挂载tomcat的webapps目录到宿主机中运行
docker run --rm -d -p 8888:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:9.0
# 复制docker容器中文件到宿主机
docker cp 容器id:容器中源路径 宿主机目标路径
安装Mongo
- 注意身份验证的问题
安装ElasticSearch分布式搜索引擎
-
拉取镜像
-
配置linux虚拟机:配置JVM
-
启动ElasticSearch
-
安装IK分词器
-
安装Kibana
DockerFile
什么是DockerFile?
- 是Docker镜像的描述文件,是有一系列命令及参数构成的脚本,用来自定义镜像的构建文件。
DockerFile文件解析过程
注意:使用dockerfile构建自定义镜像时,最好在一个空目录下构建。
构建指令
# 指定路径
docker build -f /path/to/a/Dockerfile .
# 当前路径
docker build -t shykes/myapp .
DockerFile保留指令集
构建第一个DockerFile
# 1、创建DockerFile
touch Dockerfile
# 2、编辑,保存,退出
vim Dockerfile
FROM centos
# 3、构建
docker build -t 镜像命名 .
# 4、查看
docker images
指令语法
FROM命令
- 基于哪个镜像进行构建新的镜像,构建时都会自动从docker hub拉取base镜像作为Dockerfile的第一个指令出现
- 语法:
1 FROM <image>
2 FROM <image>[:<tag>] 使用版本不写为latest
3 FROM <image>[@<digest>] 使用摘要
RUN命令
- RUN指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步
- 语法:
1 RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
2 RUN echo hello
3
4 RUN ["executable","param1","param2"](exec form)
5 RUN ["/bin/bash","-c","echo hello"] # 指定bash执行命令
RUN yum install vim
RUN ["yum","install","vim"]
EXPOSE命令(重要:外部与容器通信的通道)
- 用来指定构建的镜像在运行为容器时对外暴露的端口
- 语法:
1 EXPOSE 80/tcp # 不则默认使用tcp
2 EXPOSE 80/udp
CMD命令
- 用来为启动的容器指定执行的命令,
注意:在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。
- 语法:
1 CMD ["executable","param1","param2"](exec form, this is the preferred form)
2 CMD ["param1","param2"](as default parameters to ENTRYPOINT)
3 CMD command param1 param2(shell form)
WORKDIR命令
- 用来为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。
- 语法:
1 WORKDIR /path/to/workdir
2
3 WORKDIR /a
4 WORKDIR b
5 WORKDIR C
6 # 注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对
ENV命令
- 用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。
- 语法:
1 ENV <key> <value>
2 ENV <key>=<value> ...
ADD命令(支持通配符)
- 用来从context上下文复制新文件、目录或远程文件url,并将它们添加到位于指定路径的映像文件系统中。
- 语法:
1 ADD hom* /mydir/ #通配符添加多个文件
2 ADD hom?.txt /mydir/ #通配符添加
3 ADD test.txt relativeDir/ #可以指定相对路径
4 ADD test.txt /absoluteDir/ #也可以指定绝对路径
5 ADD url
COPY命令
- 用来将context目录中指定文件复制到镜像的指定目录中
- 语法:
1 COPY src dest
2 COPY ["<src>", ... "<dest>"]
VOLUME命令
- 用来定义容器运行时可以挂在到宿主机的目录,如果构建的时候没写,则不允许任何容器内数据被挂载
- 语法:
1 VOLUME ["/data"]
Dockerfile构建springboot项目部署
-
找一个能正常运行的springboot项目,使用maven的打包工具达成jar包
-
将可运行的jar包上传到服务器中
-
在Dockerfile中构建jar包的运行环境
-
在服务器中编写Dockerfile
-
FROM openjdk:8 WORKDIR /testspring ADD testspring.jar /testspring EXPOSE 8989 ENTRYPOINT ["java","-jar"] CMD ["testspring.jar"]
-
-
构建镜像
- docker build 名称 .
-
运行镜像
- docker run -d -p 8989:8989 --name test testspring:lastes
- 注意:原项目中数据库连接地址url由localhost变更为指定路径,容器与容器之间是隔离的,使用localhost访问不到彼此之间的容器。
- 解决方案:可以尝试把mysql构建在springboot程序运行环境中一同构建成为自定义镜像,避免更改所有数据库连接地址
-
访问项目