参考: https://www.bilibili.com/video/BV1og4y1q7M4?p=4
概览
docker出现原因:
- 镜像解决开发与运维环境问题
- 容器隔离解决应用冲突以及性能问题
docker与传统虚拟机的区别;
- 传统虚拟机, 虚拟出硬件, 运行一个完整的操作系统, 然后在这个系统上安装和运行软件
- 容器内的应用是直接运行在宿主机的内容, 容器是没有自己的内核的, 也没有虚拟硬件, 因此轻便
- 每个容器互相隔离, 有属于自己的文件系统, 互不影响
docker在DevOps上的优势:
- 应用更快速的交付和部署
- 更便捷的升级和扩缩容
- 更简单的系统运维
- 更高效的计算资源利用
安装使用
docker概念
- 镜像(image): 模板, 可以通过镜像来创建多个容器服务
- 容器(container): Docker利用容器技术, 来独立运行一个或者一组应用
- 仓库(repository): 存放镜像的地方, 分为公有仓库和私有仓库
安装步骤: https://docs.docker.com/engine/install/centos/
1. 卸载旧版本$ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2. 安装需要的安装包yum install -y yum-utils3. 设置镜像的仓库yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo# 查看仓库配置cat /etc/docker/daemon.conf# 配置阿里云镜像加速登录阿里云-->容器镜像服务-->镜像加速器# 默认是国外的, 这是补充:Docker中国区官方镜像https://registry.docker-cn.com网易http://hub-mirror.c.163.comustchttps://docker.mirrors.ustc.edu.cn中国科技大学https://docker.mirrors.ustc.edu.cn4. 更新yum软件包索引yum makecache fast5. 安装相关依赖yum install docker-ce docker-ce-cli containerd.io6. 启动systemctl start docker7. 验证docker versiondocker run hello-world8. 卸载yum remove docker-ce docker-ce-cli containerd.iorm -rf /var/lib/docker
Docker的常用命令
帮助命令
docker --versiondocker info # 显示docker的系统信息, 包括镜像和容器的数量docker --help
镜像命令
docker images # 查看所有镜像参数:-a # 显示所有-q # 只显示镜像的iddocker search [镜像名] # 搜索镜像示例: docker search mysql -f=stars=3000 # 搜索星数>3000的mysql镜像docker pull [镜像名] [tag] # 下载镜像, 通过tag指定版本, 不然下载的是lastest最新版的示例: docker pull mysql:5.7docker rmi -f [镜像id或名称] # 删除镜像docker rmi -f $(docker images -aq) # 删除所有的镜像示例: docker rmi -f mysql:5.7提交镜像docker commit -m="描述信息" -a="作者" [容器id] [目标镜像名]:[tag]示例: docker commit -a="xinzhang" -m="20210228test" e6f290b2784b test-centos:1.0通过dockerfile来构建镜像docker build -f [dockerfile路径] -t [生成的镜像名]:[版本] [存放镜像的位置]示例: docker build -f /opt/test/dockerfile1 -t test2-centos:1.0 .
容器命令
docker run [参数] [镜像]参数:--name="Name" 指定容器名-d 指定后台方式运行-it 使用交互方式运行, 进入容器查看内容-p 指定容器的端口-p 主机端口:容器端口(常用)-p 容器端口-P 随机指定端口--net 指定自定义网络示例:docker run -it centos /bin/bash 运行centos容器并进入命令行docker run -d -P --name tomcat-net-01 --net mynet tomcatdocker ps 查看运行中的容器参数:-a 查看容器运行记录(当前的+历史)-n=? 显示最近创建的容器-q 只显示容器的编号示例:docker ps -a -n=1 显示最近创建的一个容器exit # 退出容器ctrl+p+q # 容器不停止退出docker rm [容器id] # 删除容器, 不能删除正在运行的容器, 强制删除-fdocker rm -f $(docker ps -aq) # 删除所有的容器docker ps -a|xargs docker rm # 删除所有的容器启动和停止容器的操作docker start [容器id]docker restart [容器id]docker stop [容器id]docker kill [容器id] # 强制停止当前容器- 运行容器时挂载目录docker run -it -v [主机目录]:[容器内目录] [镜像名]:[版本]示例: docker run -it -v /test:/test centos /bin/bash- 具名挂载, 这里的卷名不带路径/, 注意区分指定路径挂载docker run -v [卷名]:[容器内目录] [镜像名]:[版本]示例: docker run -it -v testMount:/opt centos /bin/bash- 匿名挂载docker run -v [容器内目录] [镜像名]:[版本]示例: docker run -it -v /opt -name=centos2 centos /bin/bash- 查看所有的卷的情况docker volume ls- 查看某一个卷的详细情况docker volume inspect [卷名]
其他命令
- 查看容器内存使用情况docker stats- 后台启动容器docker run -d [镜像名]注意: 使用后台运行必须要有一个前台进程, docker发现没有应用会自动停止示例: docker run -d centos 启动后容器会自动关闭- 查看最近的10条日志docker logs -tf --tail 10 [容器id]- 查看容器内部的进程信息docker top [容器id]- 查看容器的元信息docker inspect [容器id]- 进入当前正在运行的容器方式一: 开启一个新的终端docker exec -it [容器id] [命令]示例: docker exec -it xxx /bin/bash方式二: 进入正在执行的终端docker attach [容器id]- 从容器内拷贝文件到宿主机上docker cp [容器id]:[容器目录] [主机目录]示例: docker cp 01346b32fc96:/a.txt /

docker安装软件示例
安装nginx
- 安装nginxdocker pull nginxdocker run -d --name nginx01 -p 3344:80 nginx测试: curl localhost:3344- 安装tomcatdocker pull tomcat:9.0docker run -d --name tomcat01 -p 3355:8080 tomcat
可视化
rancher
portainer, 图形化界面管理工具
docker run -d -p 30009:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
访问: http://39.106.55.179:30009/
Docker概念详解
镜像是一种轻量级, 可执行的独立软件包, 用来打包软件运行环境和基于运行环境开发的软件, 它包含运行某个软件所需的所有内容, 包括代码, 运行时库, 环境变量和配置文件.

docker镜像加载原理
笔记没做完, 这个..百度吧…
容器数据卷
将容器内的目录挂载到宿主机上, 以实现容器数据的持久化和同步操作, 且容器间的数据共享.
注意: 同步始终是双向的
挂载方式一: 运行容器时挂载
挂载到主机目录
- 运行容器时挂载目录docker run -it -v [主机目录]:[容器内目录] [镜像名]:[版本]示例: docker run -it -v /test:/test centos /bin/bash
示例: mysql将数据盘挂载到主机上, 这样容器关闭或者删除后, 数据依然保存在主机上
docker pull mysql:5.7docker run -d -p30009:3306 -v /opt/test/mysql/conf:/etc/mysql/conf.d -v /opt/test/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7注: 其中-e MYSQL_ROOT_PASSWORD=123456设置mysql密码, 详见dockerhub的镜像的帮助文档
具名和匿名挂载
- 具名挂载, 这里的卷名不带路径/, 注意区分指定路径挂载docker run -v [卷名]:[容器内目录] [镜像名]:[版本]示例: docker run -it -v testMount:/opt centos /bin/bash- 匿名挂载docker run -v [容器内目录] [镜像名]:[版本]示例: docker run -it -v /opt -name=centos2 centos /bin/bash- 查看所有的卷的情况docker volume ls- 查看某一个卷的详细情况docker volume inspect [卷名]
docker容器内的卷, 没有指定目录的情况下都是在: /var/lib/docker/volumes/[卷名]/_data 下
通过具名挂载方便找到卷, 因此多数情况下使用具名挂载!
**
拓展
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginxdocker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx注意: ro表示readOnly, rw表示readWrite设置了ro, 则这个路径只能通过宿主机来操作, 容器内部无法操作!
挂载方式二: 通过DockerFile构建镜像时挂载
DockerFile就是用来构建镜像的命令脚本
先编写dockerfile------------FROM centosVOLUME ["volume1","volume2"]CMD echo "-----success-----"CMD /bin/bash---------------通过dockerfile来构建镜像docker build -f [dockerfile路径] -t [生成的镜像名]:[版本] [存放镜像的位置]示例: docker build -f /opt/test/dockerfile1 -t test2-centos:1.0 .
通过test2-centos构建的容器, 由于配置了匿名挂载, 因此在/文件夹下会生成挂载的目录
通过 docker inspect [容器id] 也能查看到卷的挂载情况
多容器间数据同步
如下图, 通过—volumes-from 创建的容器会相互绑定, 数据互通
示例: 
DockerFile
使用dockerfile构建步骤:
- 编写dockerfile文件
docker build 构建成为一个镜像
通过dockerfile来构建镜像docker build -f [dockerfile路径] -t [生成的镜像名]:[版本] [存放镜像的位置]示例: docker build -f /opt/test/dockerfile1 -t test2-centos:1.0 .
docker run 运行镜像
- docker push 发布镜像(dockerhub, 阿里云)
dockerfile指令基础:
FROM # 基础镜像MAINTAINER # 作者, 一般为姓名+邮箱RUN # 镜像构建是要运行的脚本ADD # 步骤WORKDIR # 工作目录VOLUME # 工作目录EXPOST # 暴露端口CMD # 指定容器启动时要运行的命令, 只有最后一个会生效, 可被替代ENTRYPOINT # 指定容器启动时要运行的命令, 可以追加命令ONBUILD # 当构建一个被继承 dockerfile 时运行的指令COPY # 将文件拷贝到镜像中ENV # 构建时设置环境变量
![【读书笔记】[狂神说Java]Docker - 图8](/uploads/projects/xinzhang0618@xinzhang/0467e1cb4486dc5db514188942a0c4f9.png)
示例:
FROM centosMAINTAINER xinzhangENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATHCMD echo "----end----"CMD /bin/bash
可以通过docker history [镜像id] 来查看镜像构建的历史步骤
CMD与ENTRYPOINT的区别:
构建的镜像运行时添加命令, 则会覆盖CMD的命令; ENTRYPOINT则是追加命令后面
示例: $vim dockerfile-cmd-demo----------------FROM centosCMD ["ls"]----------------$docker build -f dockerfile-cmd-demo -t cmd-demo .$docker run cmd-demo -a=================报错如下, 因为-a无法追加到"ls"后面, -a会直接替换"ls"; ENTRYPOINT则可以追加docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
示例: 创建tomcat的Dockerfile
下面示例添加的压缩包会在构建镜像时自动解压, 但是我加的是rpm包不行, 镜像构建成功, 容器运行补起来, dockerfile这部分后续还需要补充学习
发布镜像
- 在dockerhub注册账号, 先登录docker login -u [dockerhub用户名]- 输入密码后, 显示登录成功- 更改镜像名以及标签docker tag [镜像名]:[tag] [新镜像名]:[tag]- 推送镜像, 一般镜像名为 作者名/镜像名docker push [镜像名]:[版本号]阿里云的直接找镜像容器服务, 创建命名空间, 基本信息里面有步骤讲的特清楚, 此处略
Docker网络
首先宿主机内的各个容器都是互通的, 原理是利用宿主机进行桥接, 但是原生的桥接只能通过ip连通, 无法通过容器名连通
容器启动时使用自定义网络, 则容器间直接用容器名可以互相连通, 可以应用在比如搭建redis集群, mysql集群
网络模式
- bridge: 桥接模式(docker默认)
- none: 不配置网络
- host: 和宿主机共享网络
- container: 容器内网络连通(一般不用)
查看所有的docker网络docker network ls创建一个自定义网络docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet参数:--driver bridge 指定网络模式--subnet 192.168.0.0/16 子网--gateway 192.168.0.1 网关mynet 自定义的网络的名称查看自定义网络详情docker network inspect mynet启动容器使用自定义网络docker run -d -P --name tomcat-net-01 --net mynet tomcatdocker run -d -P --name tomcat-net-02 --net mynet tomcat此时能直接通过容器名连通docker exec -it tomcat-net-01 ping tomcat-net-02===========================连接容器与自定义网络docker network connect mynet tomcat01连通后即将tomcat01放到mynet下
示例: 部署redis集群, 3分片, 3备份

springboot微服务打包docker镜像
idea下载docker插件, 在项目文件夹下编写Dockerfile
将jar包以及dockerfile上传至服务器, 并构建镜像, 启动容器
后续补充: docker compose, docker swarm jenkins, 我jio得还有launcher啥的
