参考: https://www.bilibili.com/video/BV1og4y1q7M4?p=4

概览

docker出现原因:

  • 镜像解决开发与运维环境问题
  • 容器隔离解决应用冲突以及性能问题

docker与传统虚拟机的区别;

  • 传统虚拟机, 虚拟出硬件, 运行一个完整的操作系统, 然后在这个系统上安装和运行软件
  • 容器内的应用是直接运行在宿主机的内容, 容器是没有自己的内核的, 也没有虚拟硬件, 因此轻便
  • 每个容器互相隔离, 有属于自己的文件系统, 互不影响

docker在DevOps上的优势:

  1. 应用更快速的交付和部署
  2. 更便捷的升级和扩缩容
  3. 更简单的系统运维
  4. 更高效的计算资源利用

安装使用

docker概念

  • 镜像(image): 模板, 可以通过镜像来创建多个容器服务
  • 容器(container): Docker利用容器技术, 来独立运行一个或者一组应用
  • 仓库(repository): 存放镜像的地方, 分为公有仓库和私有仓库

安装步骤: https://docs.docker.com/engine/install/centos/

  1. 1. 卸载旧版本
  2. $ sudo yum remove docker \
  3. docker-client \
  4. docker-client-latest \
  5. docker-common \
  6. docker-latest \
  7. docker-latest-logrotate \
  8. docker-logrotate \
  9. docker-engine
  10. 2. 安装需要的安装包
  11. yum install -y yum-utils
  12. 3. 设置镜像的仓库
  13. yum-config-manager \
  14. --add-repo \
  15. https://download.docker.com/linux/centos/docker-ce.repo
  16. # 查看仓库配置
  17. cat /etc/docker/daemon.conf
  18. # 配置阿里云镜像加速
  19. 登录阿里云-->容器镜像服务-->镜像加速器
  20. # 默认是国外的, 这是补充:
  21. Docker中国区官方镜像
  22. https://registry.docker-cn.com
  23. 网易
  24. http://hub-mirror.c.163.com
  25. ustc
  26. https://docker.mirrors.ustc.edu.cn
  27. 中国科技大学
  28. https://docker.mirrors.ustc.edu.cn
  29. 4. 更新yum软件包索引
  30. yum makecache fast
  31. 5. 安装相关依赖
  32. yum install docker-ce docker-ce-cli containerd.io
  33. 6. 启动
  34. systemctl start docker
  35. 7. 验证
  36. docker version
  37. docker run hello-world
  38. 8. 卸载
  39. yum remove docker-ce docker-ce-cli containerd.io
  40. rm -rf /var/lib/docker

Docker的常用命令

帮助命令

  1. docker --version
  2. docker info # 显示docker的系统信息, 包括镜像和容器的数量
  3. docker --help

镜像命令

  1. docker images # 查看所有镜像
  2. 参数:
  3. -a # 显示所有
  4. -q # 只显示镜像的id
  5. docker search [镜像名] # 搜索镜像
  6. 示例: docker search mysql -f=stars=3000 # 搜索星数>3000的mysql镜像
  7. docker pull [镜像名] [tag] # 下载镜像, 通过tag指定版本, 不然下载的是lastest最新版的
  8. 示例: docker pull mysql:5.7
  9. docker rmi -f [镜像id或名称] # 删除镜像
  10. docker rmi -f $(docker images -aq) # 删除所有的镜像
  11. 示例: docker rmi -f mysql:5.7
  12. 提交镜像
  13. docker commit -m="描述信息" -a="作者" [容器id] [目标镜像名]:[tag]
  14. 示例: docker commit -a="xinzhang" -m="20210228test" e6f290b2784b test-centos:1.0
  15. 通过dockerfile来构建镜像
  16. docker build -f [dockerfile路径] -t [生成的镜像名]:[版本] [存放镜像的位置]
  17. 示例: docker build -f /opt/test/dockerfile1 -t test2-centos:1.0 .

容器命令

  1. docker run [参数] [镜像]
  2. 参数:
  3. --name="Name" 指定容器名
  4. -d 指定后台方式运行
  5. -it 使用交互方式运行, 进入容器查看内容
  6. -p 指定容器的端口
  7. -p 主机端口:容器端口(常用)
  8. -p 容器端口
  9. -P 随机指定端口
  10. --net 指定自定义网络
  11. 示例:
  12. docker run -it centos /bin/bash 运行centos容器并进入命令行
  13. docker run -d -P --name tomcat-net-01 --net mynet tomcat
  14. docker ps 查看运行中的容器
  15. 参数:
  16. -a 查看容器运行记录(当前的+历史)
  17. -n=? 显示最近创建的容器
  18. -q 只显示容器的编号
  19. 示例:
  20. docker ps -a -n=1 显示最近创建的一个容器
  21. exit # 退出容器
  22. ctrl+p+q # 容器不停止退出
  23. docker rm [容器id] # 删除容器, 不能删除正在运行的容器, 强制删除-f
  24. docker rm -f $(docker ps -aq) # 删除所有的容器
  25. docker ps -a|xargs docker rm # 删除所有的容器
  26. 启动和停止容器的操作
  27. docker start [容器id]
  28. docker restart [容器id]
  29. docker stop [容器id]
  30. docker kill [容器id] # 强制停止当前容器
  31. - 运行容器时挂载目录
  32. docker run -it -v [主机目录]:[容器内目录] [镜像名]:[版本]
  33. 示例: docker run -it -v /test:/test centos /bin/bash
  34. - 具名挂载, 这里的卷名不带路径/, 注意区分指定路径挂载
  35. docker run -v [卷名]:[容器内目录] [镜像名]:[版本]
  36. 示例: docker run -it -v testMount:/opt centos /bin/bash
  37. - 匿名挂载
  38. docker run -v [容器内目录] [镜像名]:[版本]
  39. 示例: docker run -it -v /opt -name=centos2 centos /bin/bash
  40. - 查看所有的卷的情况
  41. docker volume ls
  42. - 查看某一个卷的详细情况
  43. docker volume inspect [卷名]

其他命令

  1. - 查看容器内存使用情况
  2. docker stats
  3. - 后台启动容器
  4. docker run -d [镜像名]
  5. 注意: 使用后台运行必须要有一个前台进程, docker发现没有应用会自动停止
  6. 示例: docker run -d centos 启动后容器会自动关闭
  7. - 查看最近的10条日志
  8. docker logs -tf --tail 10 [容器id]
  9. - 查看容器内部的进程信息
  10. docker top [容器id]
  11. - 查看容器的元信息
  12. docker inspect [容器id]
  13. - 进入当前正在运行的容器
  14. 方式一: 开启一个新的终端
  15. docker exec -it [容器id] [命令]
  16. 示例: docker exec -it xxx /bin/bash
  17. 方式二: 进入正在执行的终端
  18. docker attach [容器id]
  19. - 从容器内拷贝文件到宿主机上
  20. docker cp [容器id]:[容器目录] [主机目录]
  21. 示例: docker cp 01346b32fc96:/a.txt /

image.png

docker安装软件示例

安装nginx

  1. - 安装nginx
  2. docker pull nginx
  3. docker run -d --name nginx01 -p 3344:80 nginx
  4. 测试: curl localhost:3344
  5. - 安装tomcat
  6. docker pull tomcat:9.0
  7. docker run -d --name tomcat01 -p 3355:8080 tomcat

可视化

rancher
portainer, 图形化界面管理工具

  1. 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概念详解

镜像是一种轻量级, 可执行的独立软件包, 用来打包软件运行环境和基于运行环境开发的软件, 它包含运行某个软件所需的所有内容, 包括代码, 运行时库, 环境变量和配置文件.

image.png
docker镜像加载原理
笔记没做完, 这个..百度吧…

容器数据卷

将容器内的目录挂载到宿主机上, 以实现容器数据的持久化和同步操作, 且容器间的数据共享.
注意: 同步始终是双向的

挂载方式一: 运行容器时挂载

挂载到主机目录

  1. - 运行容器时挂载目录
  2. docker run -it -v [主机目录]:[容器内目录] [镜像名]:[版本]
  3. 示例: docker run -it -v /test:/test centos /bin/bash

示例: mysql将数据盘挂载到主机上, 这样容器关闭或者删除后, 数据依然保存在主机上

  1. docker pull mysql:5.7
  2. docker 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
  3. 注: 其中-e MYSQL_ROOT_PASSWORD=123456设置mysql密码, 详见dockerhub的镜像的帮助文档

具名和匿名挂载

  1. - 具名挂载, 这里的卷名不带路径/, 注意区分指定路径挂载
  2. docker run -v [卷名]:[容器内目录] [镜像名]:[版本]
  3. 示例: docker run -it -v testMount:/opt centos /bin/bash
  4. - 匿名挂载
  5. docker run -v [容器内目录] [镜像名]:[版本]
  6. 示例: docker run -it -v /opt -name=centos2 centos /bin/bash
  7. - 查看所有的卷的情况
  8. docker volume ls
  9. - 查看某一个卷的详细情况
  10. docker volume inspect [卷名]

docker容器内的卷, 没有指定目录的情况下都是在: /var/lib/docker/volumes/[卷名]/_data 下
image.png
通过具名挂载方便找到卷, 因此多数情况下使用具名挂载!
**
拓展

  1. docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
  2. docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
  3. 注意: ro表示readOnly, rw表示readWrite
  4. 设置了ro, 则这个路径只能通过宿主机来操作, 容器内部无法操作!

挂载方式二: 通过DockerFile构建镜像时挂载

DockerFile就是用来构建镜像的命令脚本

  1. 先编写dockerfile
  2. ------------
  3. FROM centos
  4. VOLUME ["volume1","volume2"]
  5. CMD echo "-----success-----"
  6. CMD /bin/bash
  7. ---------------
  8. 通过dockerfile来构建镜像
  9. docker build -f [dockerfile路径] -t [生成的镜像名]:[版本] [存放镜像的位置]
  10. 示例: docker build -f /opt/test/dockerfile1 -t test2-centos:1.0 .

通过test2-centos构建的容器, 由于配置了匿名挂载, 因此在/文件夹下会生成挂载的目录
image.png
通过 docker inspect [容器id] 也能查看到卷的挂载情况
image.png

多容器间数据同步

如下图, 通过—volumes-from 创建的容器会相互绑定, 数据互通
image.png
示例:
image.png

DockerFile

使用dockerfile构建步骤:

  1. 编写dockerfile文件
  2. docker build 构建成为一个镜像

    1. 通过dockerfile来构建镜像
    2. docker build -f [dockerfile路径] -t [生成的镜像名]:[版本] [存放镜像的位置]
    3. 示例: docker build -f /opt/test/dockerfile1 -t test2-centos:1.0 .
  3. docker run 运行镜像

  4. docker push 发布镜像(dockerhub, 阿里云)

dockerfile指令基础:

  • 每个保留关键字(指令)都必须是大写单词
  • 从上到下执行
  • 表示注释

  • 每一个指令都会创建提交一个新的镜像层并提交
  1. FROM # 基础镜像
  2. MAINTAINER # 作者, 一般为姓名+邮箱
  3. RUN # 镜像构建是要运行的脚本
  4. ADD # 步骤
  5. WORKDIR # 工作目录
  6. VOLUME # 工作目录
  7. EXPOST # 暴露端口
  8. CMD # 指定容器启动时要运行的命令, 只有最后一个会生效, 可被替代
  9. ENTRYPOINT # 指定容器启动时要运行的命令, 可以追加命令
  10. ONBUILD # 当构建一个被继承 dockerfile 时运行的指令
  11. COPY # 将文件拷贝到镜像中
  12. ENV # 构建时设置环境变量

【读书笔记】[狂神说Java]Docker - 图8

示例:

  1. FROM centos
  2. MAINTAINER xinzhang
  3. ENV MYPATH /usr/local
  4. WORKDIR $MYPATH
  5. RUN yum -y install vim
  6. RUN yum -y install net-tools
  7. EXPOSE 80
  8. CMD echo $MYPATH
  9. CMD echo "----end----"
  10. CMD /bin/bash

可以通过docker history [镜像id] 来查看镜像构建的历史步骤

CMD与ENTRYPOINT的区别:
构建的镜像运行时添加命令, 则会覆盖CMD的命令; ENTRYPOINT则是追加命令后面

  1. 示例: $vim dockerfile-cmd-demo
  2. ----------------
  3. FROM centos
  4. CMD ["ls"]
  5. ----------------
  6. $docker build -f dockerfile-cmd-demo -t cmd-demo .
  7. $docker run cmd-demo -a
  8. =================报错如下, 因为-a无法追加到"ls"后面, -a会直接替换"ls"; ENTRYPOINT则可以追加
  9. 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这部分后续还需要补充学习
image.png

发布镜像

  1. - dockerhub注册账号, 先登录
  2. docker login -u [dockerhub用户名]
  3. - 输入密码后, 显示登录成功
  4. - 更改镜像名以及标签
  5. docker tag [镜像名]:[tag] [新镜像名]:[tag]
  6. - 推送镜像, 一般镜像名为 作者名/镜像名
  7. docker push [镜像名]:[版本号]
  8. 阿里云的直接找镜像容器服务, 创建命名空间, 基本信息里面有步骤讲的特清楚, 此处略

Docker网络

  • 首先宿主机内的各个容器都是互通的, 原理是利用宿主机进行桥接, 但是原生的桥接只能通过ip连通, 无法通过容器名连通

  • 容器启动时使用自定义网络, 则容器间直接用容器名可以互相连通, 可以应用在比如搭建redis集群, mysql集群

网络模式

  • bridge: 桥接模式(docker默认)
  • none: 不配置网络
  • host: 和宿主机共享网络
  • container: 容器内网络连通(一般不用)
  1. 查看所有的docker网络
  2. docker network ls
  3. 创建一个自定义网络
  4. docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
  5. 参数:
  6. --driver bridge 指定网络模式
  7. --subnet 192.168.0.0/16 子网
  8. --gateway 192.168.0.1 网关
  9. mynet 自定义的网络的名称
  10. 查看自定义网络详情
  11. docker network inspect mynet
  12. 启动容器使用自定义网络
  13. docker run -d -P --name tomcat-net-01 --net mynet tomcat
  14. docker run -d -P --name tomcat-net-02 --net mynet tomcat
  15. 此时能直接通过容器名连通
  16. docker exec -it tomcat-net-01 ping tomcat-net-02
  17. ===========================
  18. 连接容器与自定义网络
  19. docker network connect mynet tomcat01
  20. 连通后即将tomcat01放到mynet

示例: 部署redis集群, 3分片, 3备份
image.png
image.png

springboot微服务打包docker镜像

idea下载docker插件, 在项目文件夹下编写Dockerfile
image.png
将jar包以及dockerfile上传至服务器, 并构建镜像, 启动容器

后续补充: docker compose, docker swarm jenkins, 我jio得还有launcher啥的