当前位置: 首页 > news >正文

Docker安装到入门

文章目录

  • Docker安装到入门
    • 一、概述
      • 1、 简介
      • 2、 优点
      • 3、 基本组成
    • 二、 Docker安装
      • 1、 环境准备
      • 2 、安装
        • 2.1 使用官方脚本
        • 2.2 手动安装
          • 2.2.1 卸载旧版本
          • 2.2.2 需要的安装包
          • 2.2.3 设置仓库
          • 2.2.4 安装docker依赖
          • 2.2.5 安装特定版本的引擎
          • 2.2.6 测试docker
      • 3、 卸载
        • 3.1 删除依赖
        • 3.2 删除资源
      • 4、 阿里云镜像加速
    • 三、 Docker原理
      • 1、 运行流程
      • 2、 底层原理
    • 四、 Docker常用命令
      • 1、 帮助命令
      • 2、 镜像命令
        • 2.1 docker images
        • 2.2 docker search
        • 2.3 docker pull
        • 2.4 docker rmi
      • 3、 容器命令
        • 3.1 创建容器并启动
        • 3.2 常用其他命令
      • 4、 docker全部命令
    • 五、 Docker练习
      • 1、 部署Nginx
      • 2、 部署Tomcat
      • 3、 部署 es + kibana
      • 4、 镜像可视化
    • 六、 Docker镜像详解
      • 1、 什么是镜像
      • 2、 联合文件系统
      • 3、 提交镜像
    • 七、 容器数据卷
      • 1、 什么是数据卷
      • 2、 使用数据卷
      • 3、 安装MYSQL
      • 4、 具名挂载和匿名挂载
        • 4.1 具名挂载
        • 4.2 匿名挂载
        • 4.3 查看卷路径
        • 4.4 小结
    • 八、 DockerFile
      • 1、 第一个dockerfile
      • 2、 多容器共享卷
      • 3、 dockerfile构建过程
      • 4、 dockerfile构建命令
      • 5、 命令详解
        • 5.1 ENTRYPOINT
        • 5.2 ENV
        • 5.3 LABEL
      • 6、 实战:Tomcat镜像
      • 7、 发布镜像
        • 7.1 DockerHub
        • 7.2 阿里云
        • 7.3 保存传输

Docker安装到入门

一、概述

1、 简介

一款产品:开发 – 上线 两套环境!应用环境,应用配置

开发····运维。那么:环境的配置是非常麻烦的,每一个机器都要部署环境(Redis、ES、Hadoop···)费时费力。

发布一个项目(jar + (Redis、MySQL、jdk···)),项目能不能都带上环境打包

之前在服务器配置一个应用环境Redis、MySQL,配置麻烦,不能够跨平台

传统:开发jar,运维部署

现在:开发打包上线,一套流程做完

Java – jar (环境) – 打包项目带上环境(镜像) – (Docker仓库:商店) – 下载我们发布的镜像 – 直接运行

Docker思想来源于集装箱

隔离:Docker核心思想 | 打包装箱 | 每个箱子都是互相隔离的

仓库地址:https://hub.docker.com/

文档地址:https://docs.docker.com/

2、 优点

  1. 应用更快速的交付和部署
    • 传统:一堆帮助文档,安装程序
    • Docker:打包镜像发布测试,一键运行
  2. 更便捷的升级和扩缩容
    • 使用了Docker之后,我们部署应用就和搭积木一样!项目打包为一个镜像,拓展
  3. 更简单的系统运维
    • 在容器化之后,我们的开发,测试环境都是高度一致的
  4. 更加高效的计算机的资源利用
    • Docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例

3、 基本组成

https://images.cnblogs.com/cnblogs_com/blogs/722174/galleries/2074790/o_220120001840_Snipaste_2022-01-20_08-18-03.png

  • 镜像(image)

    ​ docker镜像好比就是一个模板,可以通过这个模板来创建容器服务,通过这个镜像还可以创建多个容器

  • 容器(container)

    docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。。

    目前可以简单把这个容器理解为一个简易的linux系统。

  • 仓库(repository)

    仓库就是存放镜像的地方,仓库分为公有仓库和私有仓库

https://images.cnblogs.com/cnblogs_com/blogs/722174/galleries/2074790/o_220614050738_cd41e5af929d72c3e5feb90fb92b0da5.jpg

二、 Docker安装

1、 环境准备

  1. 需要会一点点的Linux基础:https://blog.csdn.net/qq_62789540/article/details/125588246
  2. 使用CentOS7系统
  3. 使用远程连接工具连接我们的虚拟机

系统环境:

(base) [root@MyCentOS ~]# uname -r
3.10.0-1160.76.1.el7.x86_64

2 、安装

2.1 使用官方脚本

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun  
curl -sSL https://get.daocloud.io/docker | sh  # 使用国内 daocloud 一键安装命令

2.2 手动安装

2.2.1 卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
2.2.2 需要的安装包

安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
2.2.3 设置仓库
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo  # 使用官方源安装
    
sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  # 使用阿里云安装

sudo yum-config-manager \
    --add-repo \
    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo  # 使用清华大学源安装 
2.2.4 安装docker依赖
yum makecache fast  # 更新yum软件包索引
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin  # 安装docker-ce社区版  ee企业版
2.2.5 安装特定版本的引擎

如果不想使用最新版本的docker,可以安装指定版本的引擎

1、列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。

yum list docker-ce --showduplicates | sort -r

# docker-ce.x86_64            3:20.10.9-3.el7                    docker-ce-stable 
# docker-ce.x86_64            3:20.10.8-3.el7                    docker-ce-stable 

2、通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。

例如:安装20.10.9的引擎:docker-ce-20.10.9。

sudo yum install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io
2.2.6 测试docker
systemctl status docker  # 查看docker的状态
ststemctl start docker  # 启动docker
systemctl enable docker  # 是docker可以自启动
docker version  # 如果安装成功,则会返回docker的版本信息
docker run hello-world  # 运行hello-world镜像
docker images  # 查看安装好的镜像

3、 卸载

3.1 删除依赖

yum remove docker-ce docker-ce-cli containerd.io

3.2 删除资源

rm -rf /var/lib/docker  # docker 的默认工作路径

4、 阿里云镜像加速

链接地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

在里面获取到加速链接

运行脚本:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://asdjksd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

三、 Docker原理

1、 运行流程

run流程图

2、 底层原理

Docker是怎么工作的?

  • Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问

Docker为什么比虚拟机快?

  • Docker有着更少的抽象层

  • Docker利用的是宿主机的内核,vm需要Guest OS

所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,是秒级的!

四、 Docker常用命令

1、 帮助命令

docker version  # 显示docker的版本信息
docker info  # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help  # 帮助命令

Docker全部命令帮助文档地址: https://docs.docker.com/engine/reference/commandline/docker/

2、 镜像命令

2.1 docker images

(base) [root@MyCentOS ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    feb5d9fea6a5   11 months ago   13.3kB

解释:

  • REPOSITORY:镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像的id
  • CREATED:镜像创建的时间
  • SIZE:镜像的大小

可选项:

名字默认值描述
--all , -a显示所有镜像(默认隐藏中间镜像)
--quiet , -q只显示镜像的ID

2.2 docker search

搜索镜像

(base) [root@MyCentOS ~]# docker search mysql 
NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                           MySQL is a widely used, open-source relation…   13234     [OK]       
mariadb                         MariaDB Server is a high performing open sou…   5062      [OK]       

解释:

  • NAME:镜像名称
  • DESCRIPTION:镜像描述
  • STARS:镜像的星数(可以使用docker search -f STARS=10000 mysql来筛选比较热门的镜像)
  • OFFICIAL:是否是官方镜像
  • AUTOMATED:是否自动构建

可选项:

名字默认值描述
--filter , -f根据提供的条件筛选输出
--limit25限制最大的输出结果

2.3 docker pull

镜像的拉取

docker pull 镜像名[:tag]

  • 如果不写版本,默认下载最新版的
docker pull mysql:5.7  # 指定5.7下载

2.4 docker rmi

docker rmi -f [IMAGE ID | NAME:TAG]:使用名字加版本号删除,或者使用镜像ID删除,-f参数强制删除

docker rmi -f hello-world:latest  # 删除hello-world镜像
docker rmi -f $(docker images -aq)  # 删除全部的镜像,传入容器ID
docker images -aq | xargs docker rmi -f  # 使用管道符进行递归删除

3、 容器命令

说明,我们有了镜像才可以创建容器,linux,下载一个CentOS来测试学习

docker pull centos  # 下载最新版本的centos

3.1 创建容器并启动

docker run [options] image  

参数说明:

  • --name="name":容器名字,用来区分这个容器
  • -d:后台方式运行
  • -it:使用交互方式运行,进入容器查看内容
  • -p:指定容器的端口 主机端口:容器端口 | -p 80800:8080
# 比如:启动并进入容器,基础版本,很多命令都是不完善的
docker run -it centos /bin/bash 

查看容器:

docker ps  # 列出当前正在运行的容器

参数:

  • -a: 显示所有容器(默认显示正在运行)
  • -n=?:显示最近创建的容器
  • -q:只显示容器的编号

退出容器:

exit  # 直接退出并停止容器
ctrl + p + q  # 容器不停止退出

删除容器:

docker rm 容器id  # 根据容器id删除容器
docker rm -f ${docker ps -aq}  # 删除所有的容器
docker ps -aq | xargs docker rm -f  # 使用管道符进行递归删除

启动和停止容器的操作:

docker start 容器id  # 启动容器
docker restart 容器id  # 重启容器
docker stop 容器id  # 停止当前正在运行的容器
docker kill 容器id  # 强制停止当前正在运行的容器

3.2 常用其他命令

后台启动容器

# docker run -d 镜像名
docker run -d centos

# 问题docker:发现centos停止了
# 常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了!

查看日志

docker logs --help  # 获取帮助信息
docker logs -tf --tail n 容器id  # 显示后n行的日志,会一直监听
docker logs -tf 容器id  # 显示全部日志

查看容器中进程信息

docker top 容器id  # 查看容器中进程信息,没有其余的参数

查看镜像原数据

docker inspect --help  # 查看镜像的信息,查看容器的信息
dcoker inspect 容器id  # 查看对应容器的原数据

进入当前正在运行的容器

# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令1
docker exec -it 容器id /bin/bash  # 进入一个新的终端中

# 命令2
docker attach 容器id  # 进入正在运行的终端中

从容器内拷贝文件到主机上

docker cp 容器id:容器路径 主机路径
# 拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现

注意,上面的容器id也可以是我们设置的容器名称,其都可以标识一个容器

4、 docker全部命令

[root@192 ~]# docker --help 

Usage:  docker [OPTIONS] COMMAND
// docker [选项] 命令

A self-sufficient runtime for containers //翻译:容器的自给自足运行时


Options:【选项】
      --config string      //客户端配置文件的位置 (default "/root/.docker")
  -c, --context string    //用于连接到守护进程的上下文的名称(覆盖DOCKER_HOST env变量和默认上下文设置 "docker context use")
  -D, --debug              //启用调试模式
  -H, --host list          //守护进程 socket(s) 连接
  -l, --log-level string   //设置日志级别 ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --tls                //使用 TLS; 隐含 --tlsverify
      --tlscacert string   //仅由此CA签名的信任证书(default "/root/.docker/ca.pem")
      --tlscert string     //TLS证书文件路径 (default "/root/.docker/cert.pem")
      --tlskey string      //TLS密钥文件的路径  (default "/root/.docker/key.pem")
      --tlsverify          //使用TLS并验证远端
  -v, --version            //打印版本信息并退出

Management Commands:【管理命令】
  app*        Docker App (Docker Inc., v0.9.1-beta3)
  builder     Manage(管理) builds
  buildx*     Docker Buildx (Docker Inc., v0.7.1-docker)
  config      Manage Docker configs
  container   Manage containers //containers:容器
  context     Manage contexts
  image       Manage images
  manifest    Manage Docker image manifests and manifest lists //管理Docker镜像清单和清单列表
  network     Manage networks
  node        Manage Swarm nodes //群节点
  plugin      Manage plugins //插件
  scan*       Docker Scan (Docker Inc., v0.12.0) //Scan:扫描
  secret      Manage Docker secrets //密码
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm //群
  system      Manage Docker
  trust       Manage trust on Docker images // trust:信任
  volume      Manage volumes //卷

Commands:【命令】
  attach      //将本地标准输入、输出和错误流附加到运行的容器 attach:附加
  build       //从Dockerfile构建一个映像
  commit      //根据容器的更改创建一个新镜像
  cp          //在容器和本地文件系统之间复制文件/文件夹
  create      //创建一个新容器
  diff        //检查容器文件系统中文件或目录的更改
  events      //从服务器获取实时事件 events:事件
  exec        //在运行的容器中运行命令 exec:执行
  export      //将容器的文件系统导出为tar存档文件 export:导出
  history     //显示一个镜像的历史
  images      //镜像的列表
  import      //从tarball文件中导入内容以创建文件系统映像
  info        //显示整个系统的信息
  inspect     //返回Docker对象的底层信息 inspect:检查
  kill        //杀死一个或多个正在运行的容器
  load        //从tar存档文件或STDIN加载镜像
  login       //登录到Docker注册表
  logout      //从Docker注册表注销
  logs        //获取容器的日志
  pause       //暂停一个或多个容器中的所有进程 pause:暂停
  port        //列出容器的端口映射或特定映射
  ps          //容器的列表
  pull        //从仓库(registry)中拉取镜像或存储库
  push        //将镜像或存储库推送到仓库(registry)
  rename      //重命名一个容器
  restart     //重新启动一个或多个容器
  rm          //移除一个或多个容器
  rmi         //移除一个或多个镜像
  run         //在新容器中运行命令
  save        //将一个或多个镜像保存到tar存档文件(默认情况下流到STDOUT)
  search      //在Docker Hub搜索镜像
  start       //启动一个或多个停止的容器
  stats       //显示容器资源使用统计的实时流
  stop        //停止一个或多个正在运行的容器
  tag         //创建引用SOURCE_IMAGE的标记TARGET_IMAGE
  top         //显示容器的运行进程
  unpause     //取消暂停一个或多个容器中的所有进程 unpause:不暂停
  update      //更新一个或多个容器的配置
  version     //查看Docker版本信息
  wait        //阻塞直到一个或多个容器停止,然后打印它们的退出代码

Run 'docker COMMAND --help' for more information on a command.

五、 Docker练习

1、 部署Nginx

docker search nginx  # 搜索镜像,建议去官网搜索https://hub.docker.com/
docker pull nginx  # 下载镜像
docker run -d --name "nginx1" -p 3344:80 nginx  # 运行镜像,将容器的80端口映射到3344端口,同时将容器命名为nginx1
curl localhost:3344  # 本机自测,获取返回的内容

docker exec -it nginx1 /bin/bash  # 进入容器
whereis nginx  # 查看Nginx的配置文件位置
cd /etc/nginx/  # 进入配置文件,后面可以修改Nginx的配置文件

exit  # 退出容器
docker stop nginx1  # 停止容器

思考问题:我们每次改动Nginx配置文件,都需要进入容器内部,十分麻烦,我要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内就可以自动修改?

  • 使用容器卷技术

2、 部署Tomcat

官方启动Tomcat的方式

docker run -it --rm tomcat:9.0  # --rm 参数的意思是用完就删除这个镜像,一般用来测试,用完就删,注意删除的是容器

我们自己启动的方式:

docker search tomcat  # 搜索镜像,建议去官网搜索https://hub.docker.com/
docker pull tomcat  # 拉取镜像
docker run -d --name tomcat1 -p 8801:8080 tomcat  # 后台启动Tomcat
docker exec -it tomcat1 /bin/bash  # 进入到容器里面
# 发现问题,linux命令少了,没有webapps。阿里云镜像的原因,默认是最小的镜像,所有不必要的全部删掉,保留最小可运行环境
cp -r webapps.dist/* webapps  # 我们将其输出路径下的内容拷贝到webapps中,然后我们的网站就可以正常显示了

3、 部署 es + kibana

问题:

  • es 需要暴露比较多的端口
  • es 十分耗内存
  • es 的数据一般需要放置到安全目录挂载
docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms128m -Xmx512m" elasticsearch:7.6.2

# 启动了,使用命令 `docker stats 容器id`查看CPU状态
docker stats

# 测试一下es是否成功了!
curl localhost:9200  

4、 镜像可视化

Portaniner是Docker的图形化管理工具,类似的工具还有Rancher(CI/CD再用)

(Portaniner平时比较少用)

1、下载运行Portaniner镜像并运行,设置本机映射端口为8088

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

2、 访问测试

创建用户后,使用管理面板

可视化面板平时不会使用

六、 Docker镜像详解

1、 什么是镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。

所以应用直接打包镜像,就可以用于运行

获得镜像的途径:

- 自己制作镜像DockerFile
- 远程仓库下载
- 别人copy给你

2、 联合文件系统

Docker的镜像实际上由一层一层的文件系统组成(下载镜像时分层下载可印证),这种层级的文件系统是UnionFS联合文件系统。

UnionFS (联合文件系统)是一种分层、轻量级并且高性能的文件系统,它支持对文研系统的修改。作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

  • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到外文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

  • 作用:比如tomcat下载了centos,则mysql就不用下载了。相同层可复用

  • 思考:为什么Docke也像要采用这种分层的结构呢?

    • 最大的好处,莫过于是资源共享了 !比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只高要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享.

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层.
举一个简单的例子,假如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,
就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子).

查看镜像分层的方式可以通过docker image inspect命令!

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!

查看源图像

这一层就是我们通常所说的容器层,容器之下都叫做镜像层!

3、 提交镜像

commit镜像:

docker commit  # 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名[:TAG]

实战测试:

官方默认的webapps中是没有文件的,我们制需要作一个Tomcat镜像,使得webapps里面有内容

docker pull tomcat  # 拉取一个全新的Tomcat镜像
docker run -d --name tomcat1 -p 8801:8080 tomcat  # 后台启动Tomcat
docker exec -it tomcat1 /bin/bash  # 进入到镜像中
cp -r webapps.dist/* webapps  # 将我们的内容拷贝到当前的webapps中,使得Tomcat会显示内容
exit  # 退出容器

docker ps -aq  # 获取我们的容器id
docker commit -a="kun" -m="add webapps app" 72eac48d9a8d tomcat01:1.0  # 提交一个我们的容器

然后,我们就看到了一个新的生成好的docker images

如果你想保存当前容器的状态,就可以通过commit来提交,获得一个镜像。就好比我们以前学习虚拟机的时候的快照。

七、 容器数据卷

1、 什么是数据卷

docker理论回顾

将应用和环境打包成一个镜像

数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

  • 容器之间可以有一个数据共享技术!Docker容器中产生的数据同步到本地!
  • 这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

查看源图像

2、 使用数据卷

  1. 直接使用命令来挂载:-v

    docker run -it -v 主机目录:容器目录
    

    主机目录和容器目录进行映射

    docker run -it -v /root/a:/home --name myCentos centos /bin/bash  # 进行目录的映射
    mkdir /home/test  # 在容器的home目录下创建一个test目录
    exit  # 退出容器
    ls /root/a  # 查看a目录下是否有test文件夹
    
    # 启动之后,我们可以通过`docker inspect 容器id`查看容器挂载信息,如果没有挂载,则说明挂载失败
    docker inspect myCentos
    

    好处:我们以后修改只需要在本地修改,容器内会自动同步

3、 安装MYSQL

docker pull mysql:5.7  # 获取镜像

# 运行容器,进行mysql的数据挂载
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql1 mysql:5.7

-e:mysql运行时的环境配置

-p:端口映射

-v:卷映射

  • /var/lib/mysql 数据库存放所有的mysql表数据的路径
  • /etc/mysql/conf.d:数据库的配置文件路径

-d:后台运行

然后,我们使用本地的Navicat来测试连接,显示连接成功:

4、 具名挂载和匿名挂载

4.1 具名挂载

具名挂载就是指定了主机目录进行挂载(有给卷(主机目录)起名就是具名(有具体的名))

docker run -d -P --name nginx01 -v jumin:/etc/nginx nginx  

查看所有的volume(卷)的情况

docker volume ls
DRIVER    VOLUME NAME
local     72582b6850fefbc4d29bea559fddc970b09d269584cc7c8c96d7fbb0add45c7d
local     85546f7af3394bd26f5cc66f53eaa56014cfced5db744676dd382c6558543444
local     f9c60d7eb8150c82dc591c86d49ac4d2c69bcad0a96840ff3d23838777b87a2c
local     jumin  # 这个是具名挂载的卷

4.2 匿名挂载

匿名挂载就是不指定主机目录进行挂载(没有给卷(主机目录)起名就是匿名)

docker run -d -P --name nginx01 -v /etc/nginx nginx

随机端口映射启动,同时匿名挂载目录/etc/nginx

查看挂载的卷的情况:

docker volume ls
# DRIVER    VOLUME NAME
# local     72582b6850fefbc4d29bea559fddc970b09d269584cc7c8c96d7fbb0add45c7d
# local     85546f7af3394bd26f5cc66f53eaa56014cfced5db744676dd382c6558543444
# local     f9c60d7eb8150c82dc591c86d49ac4d2c69bcad0a96840ff3d23838777b87a2c
# 这些字符串就代表匿名卷(目录),是匿名挂载

4.3 查看卷路径

指定卷来查看挂载

docker volume inspect VOLUME NAME

通过VOLUME NAME来查看挂载的目录

所有的docker容器内的卷,没有指定绝对路径的目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data下的,如果指定了目录,docker volume ls 是查看不到的。

4.4 小结

# 三种挂载: 匿名挂载、具名挂载、指定路径挂载
-v 容器内路径				#匿名挂载
-v 卷名:容器内路径			  #具名挂载
-v /宿主机路径:容器内路径 	#指定路径挂载 docker volume ls 是查看不到的

我们通过具名挂载可以很方便的找到我们的一个卷,大多数情况都使用具名挂载

拓展

ro #readonly 只读
rw #readwrite 可读可写

# 一旦设置了这个权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx

ro:只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

默认是使用rw来挂载的

八、 DockerFile

1、 第一个dockerfile

我们先来自己写一个简单的DockerFIle来实操一下,先体验一下

  1. 创建工作目录

    mkdir test 
    cd test 
    vim centos-dockerfile  # 编辑我们的docker-file文件
    
  2. 编辑dockerfile文件

    FROM centos  # 拉取一个官方的centos镜像
    MAINTAINER root<350051500050@qq.com>
    
    ENV MYPATH /usr/local # 设置环境变量
    WORKDIR $MYPATH # 镜像的工作目录,进入镜像的初始目录
    
    # volume 挂载卷,在创建容器时会自动挂载这些卷,匿名挂载
    VOLUME ["volume01", "volume02"]
     
    # RUN: 镜像构建的时候需要运行的命令 
    RUN yum -y install vim      # 新增 vim 工具
    RUN yum -y install net-tools # 新增 网络 工具 有ifconfig命令
    
    EXPOSE 80 # 开放的端口
    
    CMD echo $MYPATH # CMD:容器启动的时候要运行的命令
    CMD echo "-----end----"
    CMD /bin/bash 
    

    注意,在dockerfile中不能有注释,这里只是为了更好理解

  3. 编译

    语法:

    docker build -f "/root/test/centos-dockerfile" -t mycentos:1.0 .
    

    注意,命令后面还有一个点,说明是当前目录下,其为上下文路径, 是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

    发现出现了一个问题,这个问题是centos版本不匹配,可以拉取centos7,就可以运行成功了

  4. 启动容器

    docker run -it mycentos /bin/bash  
    

    这两个卷是生成容器的时候自动挂载的

    docker inspect 19104cb135e2  # 查看我们的容器的信息
    

    这种方式未来使用的十分多,因为我们通常会构建自己的镜像!假设构建镜像的时候,没有挂载卷,需要手动挂载!

2、 多容器共享卷

docker run -it --name docker_share --volumes-from 19104cb135e2 mycentos:1.0

--volumes-from :其为从指定容器装入卷 ,或者说指定一个容器,共享卷

我们使用:

docker inspect docker_share  # 查看挂载卷的位置

发现两个挂载卷的主机挂载路径是一样的

其原理就是,多个容器,共享宿主机文件夹,可以使得多容器间数据的同步

多个mysql实现数据共享

docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql1 mysql:5.7  # 第一个mysql

docker run -d -p 3311:3306 --volumes-from mysql1 -e MYSQL_ROOT_PASSWORD=123456 --name mysql2 mysql:5.7  # 第二个mysql

可以不使用--volumes-from这个参数,也可以直接挂载同一个主机目录下,但是这样效率较低

结论:容器之间配置信息的传递,数据卷的生命周期,一直持续到没有容器为止

但是,一旦持久化到了本地,这个时候,本地的数据是不会删除的!

3、 dockerfile构建过程

dockerfile编写步骤:

  • 编写一个dockerfile文件
  • docker build 构建成为一个镜像
  • docker run 运行镜像
  • docker push 发布镜像(DockerHub,阿里云镜像仓库)

我们先来查看一下官方镜像是如何构建的:

很多官方镜像都是基础包,很多功能没有,我们通常会自己构建自己的镜像,实现相应的功能!

4、 dockerfile构建命令

基础知识

  1. 每个保留关键字都必须是大写字母
  2. 执行顺序从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交

dockerfile是面向开发的,我们以后需要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单

开发部署的步骤:

  • DockerFile:构建文件,定义了一切步骤,源代码
  • DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
  • DockerContainer:容器就是镜像运行起来提供服务的

构建常用指令

比较通俗的讲解

常用命令:

查看源图像

5、 命令详解

DockerHub中99%的镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置进行构建

5.1 ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

格式:ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

其可以配合CMD命令使用

FROM nginx

ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参 

可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到

docker run  nginx:test -> nginx -c /etc/nginx/nginx.conf
docker run  nginx:test -c /etc/nginx/new.conf -> nginx -c /etc/nginx/new.conf

当不传入参数时,会以默认参数启动

5.2 ENV

置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

5.3 LABEL

LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:

LABEL <key>=<value> <key>=<value> <key>=<value> ...
# 比如添加作者
LABEL org.opencontainers.image.authors="kun"

6、 实战:Tomcat镜像

  1. 准备镜像文件,Tomcat压缩包,jdk压缩包

    cd test
    wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat-9.0.67.tar.gz
    wget https://download.oracle.com/java/19/latest/jdk-19_linux-x64_bin.tar.gz
    
  2. 编写dockerfile文件

    可以先创建一个readme.md文件

    touch readme.md
    

    创建Dockerfile其为官方命名,build会自动寻找这个文件,就不需要-f指定了

    vim Dockerfile
    

    编写文件

    FROM centos:7  # 安装基础centos
    
    MAINTAINER kun<3500515050@qq.com>  # 可以使用label标明
    
    COPY readme.md /usr/local/readme.md  # 复制帮助文档
    
    ADD jdk-19_linux-x64_bin.tar.gz /usr/local/  # 添加压缩包,其会自动解压
    ADD apache-tomcat-9.0.67.tar.gz /usr/local/
    
    RUN yum -y install vim  # 安装vim
    
    ENV MYPATH /usr/local  # 配置工作目录
    
    WORKDIR $MYPATH
    
    ENV JAVA_HOME /usr/local/jdk-19  # 配置java环境
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.67  # 配置Tomcat环境
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    
    EXPOSE 8080  # 暴露8080端口
    
    CMD /usr/local/apache-tomcat-9.0.67/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.67/bin/logs/catalina.out  # 启动Tomcat的命令
    
  3. 构建镜像

    docketr build -t diytomacat:test .   # 创建镜像,dockerfile名字为官方规定的名字,不需要使用`-f`参数
    docker images  # 查看我们创建的镜像
    
  4. 启动镜像

    docker run -d -p 8888:8080 --name mytomcat -v /root/build/tomcat/test:/usr/local/apache-tomcat-9.0.6/webapps/test -v /root/build/logs:/usr/local/apache-tomcat-9.0.6/logs diytomcat:test
    

    使用数据卷进行日志文件和代码文件的同步

    项目部署成功,可以直接访问就OK!

    我们以后的开发步骤:

    • 需要掌握Dockerfile的编写
    • 我们之后都是使用docker镜像来发布运行的

7、 发布镜像

7.1 DockerHub

发布到DockerHub上面

  1. 首先我们需要去官网注册我们自己的DockerHub账号

  2. 确定这个账号可以登录

  3. 在我们的服务器上提交我们的镜像

    • 登录账号

      docker login -u user -p pwd
      # Login Succeeded
      
    • 提交我们的镜像

      # docker tag 镜像id 你的账户名/镜像仓库名:tag名
      docker tag 3a12f3d5b2a5 kun/diycomcat:0.1  # 打开标签
      # docker push 作者/镜像:TAG(版本)
      docker push kun/diycomcat:0.1
      

      自己发布的镜像,尽量带有版本号

7.2 阿里云

发布到阿里云仓库里面

  1. 首先,我们需要登录阿里云进入容器镜像服务

  2. 然后创建个人实例空间

  3. 然后创建个人仓库

  4. 创建完成后,提交我们的镜像

    在我们注册好仓库后,会出现一个帮助文档,根据帮助文档操作就可以了

7.3 保存传输

还有一种docker发布的方式,就是打包发到通过文件进行传输

打包的方式:

# docker save 镜像 -o 文件名
docker save redis -o backup.tar 

加载镜像的方式:

# docker load -i 文件名
docker load -i backup.tar

docker打包发布的全流程,其运行流程

查看源图像

相关文章:

  • 安卓-文件读写
  • Kali Linux 基于Easy File Sharing Web Server 6.9 编写漏洞渗透模块 (上)
  • 【MM32F5270开发板试用】播放TF卡WAV格式音乐,I2S驱动CS4344
  • 基于KT6368A的ibeacon版本蓝牙电子标签说明书_V2
  • springcloud利用feign调用接口案例
  • 力扣 777. 在LR字符串中交换相邻字符
  • java培训技术ModelAttribute注解
  • Unity接入TopOn聚合广告平台SDK【聚合了穿山甲,优量汇(腾讯广告),快手,Mintegral,sigmob等各大广告平台SDK】
  • 深度神经网络如何训练,深度神经网络怎么用
  • 详解欧拉计划第108题:丢番图倒数
  • 神经网络识别图片文字,训练图像识别神经网络
  • 隧道应用(一)netsh端口映射内网
  • 【数据挖掘】3. 线性分类 感知器
  • MQTT通讯协议之MQTTnet
  • Rust入门教程(七):生命周期
  • 公众号网课查题题库系统-网课查题接口
  • 秋招-致谢
  • 【vendor】Go 包依赖管理工具govendor
  • java计算机毕业设计精准扶贫管理系统源程序+mysql+系统+lw文档+远程调试
  • 常用智能小车电机驱动模块选型