参考: 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-engine
2. 安装需要的安装包
yum install -y yum-utils
3. 设置镜像的仓库
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.com
ustc
https://docker.mirrors.ustc.edu.cn
中国科技大学
https://docker.mirrors.ustc.edu.cn
4. 更新yum软件包索引
yum makecache fast
5. 安装相关依赖
yum install docker-ce docker-ce-cli containerd.io
6. 启动
systemctl start docker
7. 验证
docker version
docker run hello-world
8. 卸载
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
Docker的常用命令
帮助命令
docker --version
docker info # 显示docker的系统信息, 包括镜像和容器的数量
docker --help
镜像命令
docker images # 查看所有镜像
参数:
-a # 显示所有
-q # 只显示镜像的id
docker search [镜像名] # 搜索镜像
示例: docker search mysql -f=stars=3000 # 搜索星数>3000的mysql镜像
docker pull [镜像名] [tag] # 下载镜像, 通过tag指定版本, 不然下载的是lastest最新版的
示例: docker pull mysql:5.7
docker 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 tomcat
docker ps 查看运行中的容器
参数:
-a 查看容器运行记录(当前的+历史)
-n=? 显示最近创建的容器
-q 只显示容器的编号
示例:
docker ps -a -n=1 显示最近创建的一个容器
exit # 退出容器
ctrl+p+q # 容器不停止退出
docker rm [容器id] # 删除容器, 不能删除正在运行的容器, 强制删除-f
docker 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
- 安装nginx
docker pull nginx
docker run -d --name nginx01 -p 3344:80 nginx
测试: curl localhost:3344
- 安装tomcat
docker pull tomcat:9.0
docker 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.7
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
注: 其中-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 nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
注意: ro表示readOnly, rw表示readWrite
设置了ro, 则这个路径只能通过宿主机来操作, 容器内部无法操作!
挂载方式二: 通过DockerFile构建镜像时挂载
DockerFile就是用来构建镜像的命令脚本
先编写dockerfile
------------
FROM centos
VOLUME ["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 # 构建时设置环境变量
示例:
FROM centos
MAINTAINER xinzhang
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
可以通过docker history [镜像id] 来查看镜像构建的历史步骤
CMD与ENTRYPOINT的区别:
构建的镜像运行时添加命令, 则会覆盖CMD的命令; ENTRYPOINT则是追加命令后面
示例: $vim dockerfile-cmd-demo
----------------
FROM centos
CMD ["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 tomcat
docker 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啥的