> 文档中心 > docker学习

docker学习


一、docker背景介绍

  • 之前的虚拟机技术
    在这里插入图片描述
  • 容器技术
    在这里插入图片描述
  • 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
  • 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
  • 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响

二、docker组成

在这里插入图片描述

从仓库中拉取镜像,运行镜像来创建容器,一个镜像可创建多个容器

三、安装docker

  • 帮助文档
https://docs.docker.com/engine/install/
  • 安装步骤
#1.卸载旧版本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#上述方法默认是从国外的,不推荐#推荐使用国内的yum-config-manager \    --add-repo \    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo    #更新yum软件包索引yum makecache fast#4.安装docker相关的 docker-ce 社区版 而ee是企业版yum install docker-ce docker-ce-cli containerd.io # 这里我们使用社区版即可#5.启动dockersystemctl start docker#6. 使用docker version查看是否按照成功docker version#7. 测试docker run hello-world
  • 卸载步骤
#1. 卸载依赖yum remove docker-ce docker-ce-cli containerd.io#2. 删除资源rm -rf /var/lib/docker

四、docker创建容器流程

在这里插入图片描述

五、docker常用命令

  • 基本命令
docker logs -t --tail n 容器id #查看n行日志docker version    #显示docker的版本信息。docker info#显示docker的系统信息,包括镜像和容器的数量docker 命令 --help #帮助命令
  • 镜像命令
docker images #查看所有本地主机上的镜像 docker search [镜像名] #搜索镜像docker pull [镜像名]  #下载镜像 docker rmi [镜像名]  #删除镜像 
  • 容器命令
docker run 镜像名 #新建容器并启动docker run -d 镜像名 #后台启动命令docker run -it centos /bin/bash #启动并进入容器docker exec -it 容器id /bin/bash #后台启动后通过容器id进入容器docker ps 列出所有运行的容器docker start 容器id#启动容器docker restart 容器id#重启容器docker stop 容器id#停止当前正在运行的容器docker kill 容器id#强制停止当前容器docker inspect 容器id #查看容器信息exit #容器直接退出ctrl +P +Q  #容器不停止退出 ---注意:这个很有用的操作docker rm 容器id   #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -fdocker rm -f $(docker ps -aq)   #删除所有的容器docker cp b2552adaeb74:/home/test.java /usr/local #将dockers的文件拷贝到本机usr/local下面
  • dockers命令可爱图
    在这里插入图片描述

六、安装nginx示例

  • 搜索nginx镜像
docker search nginx
  • 拉取nginx镜像
docker pull nginx
  • 查看是否拉取成功
docker images
  • 运行nginx镜像创建容器
注意这里的端口映射需要在linux防火墙中开放对应的端口
# -d 后台启动# --name 重命名# 3344:80 端口映射,本机3344端口映射到docker容器的80端口docker run -d -p 3344:80 --name nginx01 nginx
  • 进入后台启动的nginx
docker exec -it nginxTest /bin/bash #进入
  • 端口映射图解
    在这里插入图片描述

七、安装tomcat示例

  • 运行镜像创建容器
docker run -d -p 3355:8080 --name tomcat01 tomcat
  • 进入容器查看
docker exec -it tomcat /bin/bash
  • 发现webapps下面没有任何文件
    docker学习
  • 此时打开tomcat页面,发现404,原因就是webapps下面没有对应文件
    在这里插入图片描述
  • webapps.list存在webapps对应的文件,把所有文件复制过来即可
    docker学习
  • 此时打开网页可以查看到tomcat启动
    在这里插入图片描述

八、安装elasticsearch

  • es非常消耗内存,启动需要增加内存的限制
  • 查看docker资源
docker stats

docker学习

  • 限制内存运行docker
docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" --name es elasticsearch:7.6.2
  • docker容器内部互相隔离,kibana连接es需要通过linux内网ip
    在这里插入图片描述

九、portainer可视化面板

  • 安装
docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
  • 打开界面
    在这里插入图片描述
  • 选择local连接,进入可查看
    在这里插入图片描述

十、镜像讲解

  • 用来打包软件运行环境和基于运行环境开发的软件,包含运行某个项目所需的所有内容,包括代码,运行时库,环境变量和配置文件
  • 打包镜像
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

十一、容器数据卷

容器之间数据共享,数据可以持久化到本地。就是目录的挂载,将容器的目录挂载到linux服务器上面
  1. 方式一:利用命令挂载
  # -v 挂载     linux服务器目录:/usr/test/dockertest => centos目录:home  # 并且dockertest目录不存在,挂载的时候自动创建的docker run -it -v /usr/test/dockertest:/home centos /bin/bash# 现在linux虚拟机目录和docker容器目录一一对应,不论在那个目录下进行修改,都会同步操作# 即便容器关闭之后,改变linux目录,dockers容器重启之后照样会同步(相同的docker容器id)# 查看容器状态,可以看到容器挂载信息docker inspect 容器id
查看挂载信息

在这里插入图片描述

启动mysql并挂载,注意是后台启动
# 需要连接密码,设置为123456  -e为环境配置docker run -d -p 9002:3306 -v /home/test/mysqltest/conf:/etc/mysql/conf.d -v /home/test/mysqltest/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql# 此时可以使用linux的9002端口连接上docker容器里面的mysql,并且修改挂载的文件目录是双向的# 将容器rm删除并不会删除挂载目录的持久化
  • 匿名挂载和具名挂载
 # 查看所有数据卷 docker volume ls
 [root@iZwz9bbmlfbm8e53rmdyldZ data]# docker volume lsDRIVER    VOLUME NAMElocal     6bed29f75b9e01f5bb0c863d4eee619aa8cc9094e784a3e432ad372d51bf45f8local     418ccd4bf694edc60e8311a18faf43b57b6f32ec2a7ebeccd63eba196ca0328alocal     876d80eb1f2f2964fcac3b7f3ab9cd1cf877f74298a14b4c4f541c86e40eb6f1local     bdced74445397950156218d690b9ea09359f74d6928b619d486f65b6ff8c37e2local     e16b1d001cbb62a81105f993a0c4dab610c88320d1b08fde4f1511e6420d6fdb
 # 以上都是匿名的挂载,可以使用docker volume inspect [卷名] 查看数据卷的信息
 [root@iZwz9bbmlfbm8e53rmdyldZ data]# docker volume inspect e16b1d001cbb62a81105f993a0c4dab610c88320d1b08fde4f1511e6420d6fdb[    { "CreatedAt": "2022-03-23T11:41:50+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/e16b1d001cbb62a81105f993a0c4dab610c88320d1b08fde4f1511e6420d6fdb/_data", "Name": "e16b1d001cbb62a81105f993a0c4dab610c88320d1b08fde4f1511e6420d6fdb", "Options": null, "Scope": "local"    }]
 # 可以看到以上数据卷的数据存在/var/lib/docker/volumes/XXX 下面 # 只要没有指定挂载目录,都是放在/var/lib/docker/volumes/XXX 下面的 # 可以使用下面的具名挂载    docker run -d -v juming-nginx:/etc/nginx nginx
[root@iZwz9bbmlfbm8e53rmdyldZ mysql]# docker volume lsDRIVER    VOLUME NAMElocal     6bed29f75b9e01f5bb0c863d4eee619aa8cc9094e784a3e432ad372d51bf45f8local     418ccd4bf694edc60e8311a18faf43b57b6f32ec2a7ebeccd63eba196ca0328alocal     876d80eb1f2f2964fcac3b7f3ab9cd1cf877f74298a14b4c4f541c86e40eb6f1local     bdced74445397950156218d690b9ea09359f74d6928b619d486f65b6ff8c37e2local     e16b1d001cbb62a81105f993a0c4dab610c88320d1b08fde4f1511e6420d6fdblocal     juming-nginx

在这里插入图片描述

  • 区分是匿名、具名还是指定路径挂载
-v 容器内路径  匿名挂载-v 卷名:容器内路径  具名挂载-v /宿主机路径:/容器内路径  指定路径挂载
  1. dockerfile命令脚本挂载
dockerfile是用来构建dockers镜像的文件,命令脚本通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层# 下面来一个demo
# 首先创建一个文件,建议名称为dockerfile[root@iZwz9bbmlfbm8e53rmdyldZ dockertest]# touch dockerfile.txt# 进入dockerfile文件,输入命令,此方法是匿名挂载,生成镜像的时候自动挂载volume1和volume2数据卷,和外部有一个目录进行同步FROM centos VOLUME ["volume1","volume2"]CMD echo "-----end------"CMD /bin/bash# 创建镜像,挂载目录[root@iZwz9bbmlfbm8e53rmdyldZ dockertest]# docker build -f dockerfile -t xbj/centos .# 查看刚才的镜像[root@iZwz9bbmlfbm8e53rmdyldZ dockertest]# docker imagesREPOSITORY     TAGIMAGE IDCREATEDSIZExbj/centos     latest    a53f6e729d0e   About a minute ago   231MB<none>  <none>    033c421e4ae2   53 minutes ago231MBtomcattest     1.0f500c9825421   3 days ago    684MB# 查看容器id[root@iZwz9bbmlfbm8e53rmdyldZ dockertest]# docker psCONTAINER ID   IMAGE   COMMAND CREATED   STATUS   PORTS    NAMES1ef7ace106ee   033c421e4ae2   "/bin/bash"    24 minutes ago   Up 24 minutes      # 查看容器信息,可以看到挂载信息[root@iZwz9bbmlfbm8e53rmdyldZ dockertest]# docker inspect 1ef7ace106ee"Mounts": [     {  "Type": "volume",  "Name": "769d8c2a9b8a47b3c9454b851ad44122fc78459d5d15b086bfd7ac2df6d0b4e8",  "Source": "/var/lib/docker/volumes/769d8c2a9b8a47b3c9454b851ad44122fc78459d5d15b086bfd7ac2df6d0b4e8/_data",  "Destination": "volume01",  "Driver": "local",  "Mode": "",  "RW": true,  "Propagation": ""     },     {  "Type": "volume",  "Name": "38413e11b2aedfec9a3653d31bec640a99043e67b60e5ed28d947daa157e9b1c",  "Source": "/var/lib/docker/volumes/38413e11b2aedfec9a3653d31bec640a99043e67b60e5ed28d947daa157e9b1c/_data",  "Destination": "volume02",  "Driver": "local",  "Mode": "",  "RW": true,  "Propagation": ""     } ],

十二、数据卷容器(容器之间共享数据)

在这里插入图片描述

# 首先创建docker01容器[root@iZwz9bbmlfbm8e53rmdyldZ _data]# docker run -it --name docker01 xbj/centos# 再创建docker02容器,继承docker01.此时docker01就叫数据卷容器。docker01和docker02数据共享docker run -it --name docker02 --volumes-from docker01 xbj/centos