Docker入门到上手

Docker

官网:Home - Docker

文档地址:Docker Documentation | Docker Documentation

仓库地址:Docker Hub

Docker 概述

Docker 是一个用于开发、发布和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分离,以便您可以快速交付软件。使用 Docker,您可以像管理应用程序一样管理基础设施。通过利用 Docker 快速交付、测试和部署代码的方法,您可以显着减少编写代码和在生产环境中运行之间的延迟。

Docker 平台

Docker 提供了在称为容器的松散隔离环境中打包和运行应用程序的能力。隔离和安全性允许您在给定主机上同时运行多个容器。容器是轻量级的,包含运行应用程序所需的一切,因此您无需依赖主机上当前安装的内容。您可以在工作时轻松共享容器,并确保与您共享的每个人都获得以相同方式工作的同一个容器。

Docker 提供工具和平台来管理容器的生命周期:

  • 使用容器开发您的应用程序及其支持组件。
  • 容器成为分发和测试应用程序的单元。
  • 准备就绪后,将应用程序部署到生产环境中,作为容器或编排的服务。无论您的生产环境是本地数据中心、云提供商还是两者的混合,这都是一样的。

我可以使用 Docker 做什么?

快速、一致地交付您的应用程序

Docker 通过允许开发人员使用提供应用程序和服务的本地容器在标准化环境中工作来简化开发生命周期。容器非常适合持续集成和持续交付 (CI/CD) 工作流程。

考虑以下示例场景:

  • 您的开发人员在本地编写代码并使用 Docker 容器与同事分享他们的工作。
  • 他们使用 Docker 将他们的应用程序推送到测试环境中并执行自动化和手动测试。
  • 当开发者发现bug时,可以在开发环境中修复,重新部署到测试环境中进行测试和验证。
  • 测试完成后,将修复程序提供给客户就像将更新的映像推送到生产环境一样简单。

响应式部署和扩展

Docker 基于容器的平台允许高度可移植的工作负载。Docker 容器可以在开发人员的本地笔记本电脑、数据中心的物理或虚拟机、云提供商或混合环境中运行。

Docker 的可移植性和轻量级特性还使得动态管理工作负载、根据业务需求近乎实时地扩展或拆除应用程序和服务变得容易。

在相同硬件上运行更多工作负载

Docker 是轻量级和快速的。它为基于管理程序的虚拟机提供了一种可行且经济高效的替代方案,因此您可以使用更多计算容量来实现业务目标。Docker 非常适合高密度环境以及需要用更少资源完成更多工作的中小型部署。

Docker 架构

Docker 使用客户端-服务器架构。Docker客户端与 Docker守护进程对话,后者负责构建、运行和分发 Docker 容器的繁重工作。Docker 客户端和守护程序可以在同一系统上运行,或者您可以将 Docker 客户端连接到远程 Docker 守护程序。Docker 客户端和守护程序使用 REST API,通过 UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许您使用由一组容器组成的应用程序。
在这里插入图片描述

Docker 守护进程

Docker 守护程序 ( dockerd) 侦听 Docker API 请求并管理 Docker 对象,例如图像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。

Docker 客户端

Docker 客户端 ( docker) 是许多 Docker 用户与 Docker 交互的主要方式。当您使用诸如docker run之类的命令时,客户端会将这些命令发送到dockerd执行它们。该docker命令使用 Docker API。Docker 客户端可以与多个守护进程通信。

  • 容器
    • Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建
    • 启动,停止、删除,基本命令
  • 镜像
    • 镜像好比是一个模板,可以通过这个模板来创建容器服务,如Tomcat镜像–》run–》tomcat01容器,通过这个镜像可以创建多个容器
  • 仓库
    • 存放镜像的地方
    • Docker Hub默认是国外的

Docker安装

在这里插入图片描述

环境查看

#系统内核
[root@iZwz94i94ei3is8a1vnrdjZ ~]# uname -r
3.10.0-1127.19.1.el7.x86_64
#系统版本
[root@iZwz94i94ei3is8a1vnrdjZ ~]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

安装

帮助文档

 #1、卸载旧版本
 sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
#2、下载需要的安装包             
 sudo yum install -y yum-utils
 
#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#推荐使用阿里云的

#更新yum软件包索引
yum makecache fast

#4、安装docker相关的 docker-ce社区	ee企业版
sudo yum install docker-ce docker-ce-cli containerd.io

#5、启动docker
sudo systemctl start docker

#6、使用docker version是否安装成功
docker version

#7、sudo docker run hello-world

卸载docker

#1、卸载依赖
sudo yum remove docker-ce docker-ce-cli containerd.io
#2、删除资源
sudo rm -rf /var/lib/docker
 sudo rm -rf /var/lib/containerd

#	/var/lib/docker	docker的默认工作路径
配置镜像加速器

在这里插入图片描述

Docker命令

  • 帮助命令

docker version #docker版本命令
docker info #详细信息
docker help #帮助命令

官方文档地址:https://docs.docker.com/engine/reference/commandline/docker/

  • 镜像命令

docker images
docker images#查看主机上所有镜像

在这里插入图片描述

字段含义

REPOSITORY:镜像的仓库员

TAG:镜像标签

IMAGE ID:镜像id

CREATED:镜像创建时间

SIZE:镜像大小

options

[root@centos7 ~]# docker images --help

Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]

List images

Options:
  -a, --all             Show all images 显示所有镜像
  -q, --quiet           Only show image IDs显示镜像ID
docker search

查看命令

[root@centos7 ~]# docker search --help

Usage:  docker search [OPTIONS] TERM

Search the Docker Hub for images

Options:
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output
--filter=stars=3500	#搜索出镜像starts大于3500
[root@centos7 ~]# docker search mysql --filter=stars=3500
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   12343     [OK]       
mariadb   MariaDB Server is a high performing open sou…   4748      [OK]

用法

docker search mysql #查找mysql镜像

在这里插入图片描述

docker pull

用法

docker pull mysql #下载mysql镜像
#指定版本下载
[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
f003217c5aae: Pull complete 
65d94f01a09f: Pull complete 
43d78aaa6078: Pull complete 
a0f91ffbdf69: Pull complete 
59ee9e07e12f: Pull complete 
04d82978082c: Pull complete 
70f46ebb971a: Pull complete 
ba61822c65c2: Pull complete 
dec59acdf78a: Pull complete 
0a05235a6981: Pull complete 
c87d621d6916: Pull complete 
Digest: sha256:1a73b6a8f507639a8f91ed01ace28965f4f74bb62a9d9b9e7378d5f07fab79dc
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi

用法

docker rmi -f 镜像id
  • 容器命令

新建容器并启动
docker run [可选参数] images

#参数说明
--name=“Name”	容器名称	区分容器
-d				后台运行
-it				使用交互方式运行,进入容器查看内容
-p				指定容器端口,-p 8000:8000 和主机映射
-P				随机指定端口
  • 操作命令

练习

Docker安装Nginx

#1、搜索镜像 	docker search nginx (建议去docker hub网页查看)
#2、下载镜像		docker pull nginx
#3、运行测试
[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
mysql         5.7       f26e21ddd20d   3 days ago     450MB
nginx         latest    605c77e624dd   3 months ago   141MB
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB
#运行
#-d	后天运行
#--name	容器名
#-p	宿主机端口:容器内部端口
[root@iZwz94i94ei3is8a1vnrdjZ docker]# docker run -d --name nginx01 -p 4433:80 nginx
d5229563ee7a7c90cdc8bb7debd1d26423d3d96e095cb258d4b4fd342ad14b59

[root@iZwz94i94ei3is8a1vnrdjZ ~]# curl localhost:4433

在这里插入图片描述

#进入容器
[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
d5229563ee7a   nginx     "/docker-entrypoint.…"   8 minutes ago   Up 8 minutes   0.0.0.0:4433->80/tcp, :::4433->80/tcp   nginx01
[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker exec -it nginx01 /bin/bash
root@d5229563ee7a:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@d5229563ee7a:/# cd /etc/nginx/
root@d5229563ee7a:/etc/nginx# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params
root@d5229563ee7a:/etc/nginx#

Docker安装tomcat

#官方的使用
docker run -it --rm tomcat:9.0
#我们之前的启动都是后台,停止了容器之后,容器还是可以看到的
docker run --it --rm,一般都是用来测试的,用完就删除

#下载再启动
docker pull tomcat

#启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat

#测试访问

在这里插入图片描述

#进入容器
[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker exec -it tomcat01 /bin/bash

#发现问题:1、linux命令少了;2、没有webapps。
#阿里云镜像的原因,默认是最小的镜像,所有不必要的都剔除了,保证最小可运行的环境
root@3165529707d3:/usr/local/tomcat# cd webapps.dist/
root@3165529707d3:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager
#将webapps.dist拷贝到webapps下
root@3165529707d3:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@3165529707d3:/usr/local/tomcat# cd webapps
root@3165529707d3:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager

在这里插入图片描述

Docker安装ES+kibana

#启动elasticSearch
 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

#测试一下es是否成功了
[root@iZwz94i94ei3is8a1vnrdjZ /]# curl localhost:9200
{
  "name" : "1accdc519f93",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "Q7I8JRChS--BIegeCy1PMQ",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
#docker stats查看cpu的状态
[root@iZwz94i94ei3is8a1vnrdjZ /]# docker stats
增加内存的限制,修改配置文件 -e 环境配置修改
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

可视化

Portainer是一个可视化的Docker操作界面,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。

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

访问测试:http://120.24.244.228:8088/(阿里云安全组记得打开8088端口)
在这里插入图片描述

在这里插入图片描述

Docker镜像详解

镜像是什么

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

所有的应用,直接可以打包成docker镜像,然后直接运行!

获取镜像:

  • 从远程仓库获取
  • 自己制作一个镜像DockerFile
  • 拷贝获取

Docker镜像加载原理

UnionFS(联合文件系统)

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

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

镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统称为UnionFS。
BootFS(Boot File System)主要包含BootLoader和kernel,BootLoader主要是引导加载kernel,Linux刚启动时会加载BootFS文件系统,在Docker镜像的最底层是BootFS。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由BootFS转交给内核,此时系统也会卸载BootFS。

RootFS,在BootFS之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。RootFS就是各种不同的操作系统发行版,比如Ubuntu,CentOS等。

对于一个精简的操作系统,RootFS可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接使用主机的内核,自己只需要提供RootFS即可。由此可见对于不同的Linux发行版,BootFS基本是一致的,RootFS会有差别,因此不同的发行版可以公用BootFS。

虚拟机是分钟级别,而容器是秒级!

分层理解

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
例如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。

该镜像当前已经包含3个镜像层,如下图所示。
在这里插入图片描述

在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要!下图举例一个简单例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
在这里插入图片描述

上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。

下图展示一个稍微复杂一点的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版本。
在这里插入图片描述

这种情况下,上层镜像中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。

Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。

Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。

Docker在Windows上仅支持windowsfilter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和Cow。

下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
在这里插入图片描述

[root@iZwz94i94ei3is8a1vnrdjZ /]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Already exists 
c7a4e4382001: Pull complete 
4044b9ba67c9: Pull complete 
c8388a79482f: Pull complete 
413c8bb60be2: Pull complete 
1abfd3011519: Pull complete 
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
#
[root@iZwz94i94ei3is8a1vnrdjZ /]# docker image inspect redis
[
    {
        "Id": "sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631",
        "RepoTags": [
            "redis:latest"
        ],
        "RepoDigests": [
            "redis@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-12-21T12:42:49.755107412Z",
        "Container": "13d25f53410417c5220c8dfe8bd49f06abdbcd69faa62a9b877de02464bb04a3",
        "ContainerConfig": {
            "Hostname": "13d25f534104",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "6379/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.12",
                "REDIS_VERSION=6.2.6",
                "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz",
                "REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"redis-server\"]"
            ],
            "Image": "sha256:e093f59d716c95cfce82c676f099b960cc700432ab531388fcedf79932fc81ec",
            "Volumes": {
                "/data": {}
            },
            "WorkingDir": "/data",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "20.10.7",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "6379/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.12",
                "REDIS_VERSION=6.2.6",
                "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz",
                "REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab"
            ],
            "Cmd": [
                "redis-server"
            ],
            "Image": "sha256:e093f59d716c95cfce82c676f099b960cc700432ab531388fcedf79932fc81ec",
            "Volumes": {
                "/data": {}
            },
            "WorkingDir": "/data",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 112691373,
        "VirtualSize": 112691373,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/bcd4ad0357fb50c2ac21b7b918af3932f22f3f4436461a5dc32164f63dde9b3b/diff:/var/lib/docker/overlay2/a3eab50d0c7057c32ac7669c995629e23f993cfc98622b9df1dab9d7719e1681/diff:/var/lib/docker/overlay2/03a7af564ca89727ea3390f26efcbebea82030db4b14f0105d995aad3d21e01a/diff:/var/lib/docker/overlay2/10847e08f28583f0b5af8896012f75e3a7f0ab954afeefb709a75f06050568be/diff:/var/lib/docker/overlay2/f0963def93ee61204663e5b7422ece581e479f3bd6005017f7087c72787779af/diff",
                "MergedDir": "/var/lib/docker/overlay2/df09c8797f35dd9f85ec9cf475482f12b78e177c49a51d1ded030e80add9d2a3/merged",
                "UpperDir": "/var/lib/docker/overlay2/df09c8797f35dd9f85ec9cf475482f12b78e177c49a51d1ded030e80add9d2a3/diff",
                "WorkDir": "/var/lib/docker/overlay2/df09c8797f35dd9f85ec9cf475482f12b78e177c49a51d1ded030e80add9d2a3/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
                "sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb",
                "sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1",
                "sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372",
                "sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed",
                "sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

特点

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

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

commit镜像

#docker commit 提交容器称为一个新的副本

docker commit -m="提交的描述信息” -a="作者" 容器id 目标镜像名:[TAG]

实战测试

#启动一个默认的tomcat
#发现这个默认的tomcat是没有webapps应用,官方的镜像默认webapps下面是没有文件的
#可以自己拷贝基本文件进去
[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                       NAMES
63980fa4e748   tomcat    "catalina.sh run"   14 minutes ago   Up 14 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   stoic_torvalds
[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker exec -it 63980fa4e748 /bin/bash
root@63980fa4e748:/usr/local/tomcat# cp -r webapps.dist/* webapps
#将我们操作过的容器通过commit提交为一个镜像
[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                       NAMES
63980fa4e748   tomcat    "catalina.sh run"   14 minutes ago   Up 14 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   stoic_torvalds
[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker commit -a="hzx" -m="add webapps" 63980fa4e748 tomcat02:1.0
sha256:aa0bb55054103b049c6a5f625a40059826ff8ef511c978d0275567fcf38596a3
[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
tomcat02              1.0       aa0bb5505410   29 seconds ago   684MB
mysql                 5.7       f26e21ddd20d   3 days ago       450MB
nginx                 latest    605c77e624dd   3 months ago     141MB
tomcat                9.0       b8e65a4d736d   3 months ago     680MB

Docker容器数据卷

当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。

通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

特点:

  1. 数据卷可以在容器之间共享或重用数据
  2. 数据卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

容器的持久化和同步操作,容器间也是可以数据同步的

使用数据卷

方式一:直接使用命令来挂载 -v

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

#测试
[root@iZwz94i94ei3is8a1vnrdjZ home]# ls /home/
[root@iZwz94i94ei3is8a1vnrdjZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
[root@69ed194100af /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
#查看容器元数据
[root@iZwz94i94ei3is8a1vnrdjZ home]# docker inspect 69ed194100af

在这里插入图片描述

测试文件的同步
在这里插入图片描述

再来测试

  1. 停止容器
  2. 宿主机上修改文件
  3. 启动容器
  4. 容器内的数据依旧是同步的
    在这里插入图片描述

实战:安装MySQL

#获取镜像
[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker pull mysql:5.7

#运行容器,需要做数据挂载
#官方测试(在Docker Hub上找):docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

[root@iZwz94i94ei3is8a1vnrdjZ ~]docker run -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql  --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

假设我们将容器删除,发现我们挂在到本地的数据局那依旧没有丢

[root@iZwz94i94ei3is8a1vnrdjZ home]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED             STATUS             PORTS                                                  NAMES
8c2ec0fb5254   mysql:5.7   "docker-entrypoint.s…"   About an hour ago   Up About an hour   33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql02
[root@iZwz94i94ei3is8a1vnrdjZ home]# docker rm -f 8c2ec0fb5254
8c2ec0fb5254
[root@iZwz94i94ei3is8a1vnrdjZ home]# cd /home/
[root@iZwz94i94ei3is8a1vnrdjZ home]# ls
ceshi  mysql
[root@iZwz94i94ei3is8a1vnrdjZ home]# cd mysql/
[root@iZwz94i94ei3is8a1vnrdjZ mysql]# ls
conf  data

具名和匿名挂载

#匿名挂载
-v 容器内路径
docker run -d -P --name ngnix01 -v /etc/nginx nginx

#查看所有的volume的情况
[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker volume ls
DRIVER    VOLUME NAME
local     0a5f490bb983298e2628e734017cf3b0291571bdcb6de79d56f6e72add3b6cda
#匿名挂载,我们再-v只写了容器内的路径,没有写容器外的路径


#具名挂载
[root@iZwz94i94ei3is8a1vnrdjZ home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
95429fb2406dcf3edbc9995126e4b594a15a1eecba6b49b092cba999ed421dee
[root@iZwz94i94ei3is8a1vnrdjZ home]# docker volume ls
DRIVER    VOLUME NAME
local     0a5f490bb983298e2628e734017cf3b0291571bdcb6de79d56f6e72add3b6cda
local     68dfbcbe84aaebd6517208e01a71b6df0bb30f1630ce459a4268d4b670657c07
local     6874518ab4da5fc232418e9fb4958cb126a5a678b72a0a06a816f4c4a3504786
local     juming-nginx


# 通过 -v 卷名:容器内路径
#查看一下这个卷
[root@iZwz94i94ei3is8a1vnrdjZ home]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2022-04-02T23:52:08+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_

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

如何确定是具名挂在还是匿名挂载,还是指定路径挂在?
-v 容器内路径		#匿名挂载
-v 卷名:容器内路径		#具名挂载
-v 宿主机路径:容器内路径	#指定路径挂在

拓展:

# 通过 -v 容器内路径:ro rw 改变读写权限
ro	readonly #只读
rw	readwrite	#可读可写

#一旦设置了容器权限,容器对我们挂载出来的内容就有限定了
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 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的!

初始DockerFile

DockerFile就是用来构建docker镜像的构建文件,命令脚本

通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层

#创建一个DockerFile文件
#文件中的内容 指令(大写)
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---------end----------"
CMD /bin/bash
#这里的每个命令,就是镜像的一层
[root@iZwz94i94ei3is8a1vnrdjZ docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t hzx/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 9360d8e98a41
Removing intermediate container 9360d8e98a41
 ---> abe25a5f9ba0
Step 3/4 : CMD echo "---------end----------"
 ---> Running in 8b675acf88d0
Removing intermediate container 8b675acf88d0
 ---> d2132f81473a
Step 4/4 : CMD /bin/bash
 ---> Running in 585874d914fd
Removing intermediate container 585874d914fd
 ---> 4bf6334d2243
Successfully built 4bf6334d2243
Successfully tagged hzx/centos:1.0

在这里插入图片描述

这个卷和外部一定有一个同步的目录,因为只写了容器内路径,所以这个是匿名挂载

#查看挂载位置

[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
8b9f4020a738   4bf6334d2243   "/bin/bash"              4 minutes ago    Up 4 minutes                                                           youthful_shaw
95429fb2406d   nginx          "/docker-entrypoint.…"   33 minutes ago   Up 33 minutes   0.0.0.0:49155->80/tcp, :::49155->80/tcp                nginx02
bfc708a38483   nginx          "/docker-entrypoint.…"   38 minutes ago   Up 38 minutes   0.0.0.0:49153->80/tcp, :::49153->80/tcp                ngnix01
83235af1b462   mysql:5.7      "docker-entrypoint.s…"   48 minutes ago   Up 48 minutes   33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql01
[root@iZwz94i94ei3is8a1vnrdjZ ~]# docker inspect 8b9f4020a738

在这里插入图片描述

测试是否挂载成功
在这里插入图片描述

这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像

假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷民:容器内路径

数据卷容器

启动3个容器,通过我们刚才自己写的镜像启动
在这里插入图片描述

启动docker02,将docker01作为数据卷容器
在这里插入图片描述

启动docker03,将docker01作为数据卷容器

[root@iZwz94i94ei3is8a1vnrdjZ /]# docker run -it --name docker03 --volumes-from docker01 hzx/centos:1.0
[root@43e5753b67b6 /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  360 Apr  2 17:02 dev
drwxr-xr-x   1 root root 4096 Apr  2 17:02 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 120 root root    0 Apr  2 17:02 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Apr  2 16:20 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var
drwxr-xr-x   2 root root 4096 Apr  2 16:57 volume01
drwxr-xr-x   2 root root 4096 Apr  2 16:51 volume02
[root@43e5753b67b6 /]# cd volume01/
[root@43e5753b67b6 volume01]# ls
docker01.txt

测试,删除docker01,看docker02和docker03中的数据是否还存在

[root@iZwz94i94ei3is8a1vnrdjZ docker-test-volume]# docker rm -f 34331676b000
34331676b000
[root@iZwz94i94ei3is8a1vnrdjZ docker-test-volume]# docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED             STATUS                     PORTS                                                  NAMES
43e5753b67b6   hzx/centos:1.0        "/bin/sh -c /bin/bash"   3 minutes ago       Up 3 minutes                                                                      docker03
37fbaffae447   4bf6334d2243          "/bin/bash"              9 minutes ago       Exited (0) 8 minutes ago                                                          dreamy_satoshi
7aa0a813a62e   hzx/centos:1.0        "/bin/sh -c /bin/bash"   10 minutes ago      Up 10 minutes                                                                     docker02
8b9f4020a738   4bf6334d2243          "/bin/bash"              44 minutes ago      Up 44 minutes                                                                     youthful_shaw
95429fb2406d   nginx                 "/docker-entrypoint.…"   About an hour ago   Up About an hour           0.0.0.0:49155->80/tcp, :::49155->80/tcp                nginx02

查看docker02和docker03中的数据依然存在

[root@iZwz94i94ei3is8a1vnrdjZ /]# docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED             STATUS             PORTS                                                  NAMES
43e5753b67b6   hzx/centos:1.0   "/bin/sh -c /bin/bash"   5 minutes ago       Up 5 minutes                                                              docker03
7aa0a813a62e   hzx/centos:1.0   "/bin/sh -c /bin/bash"   12 minutes ago      Up 12 minutes                                                             docker02
8b9f4020a738   4bf6334d2243     "/bin/bash"              46 minutes ago      Up 46 minutes                                                             youthful_shaw
95429fb2406d   nginx            "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:49155->80/tcp, :::49155->80/tcp                nginx02
bfc708a38483   nginx            "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:49153->80/tcp, :::49153->80/tcp                ngnix01
83235af1b462   mysql:5.7        "docker-entrypoint.s…"   About an hour ago   Up About an hour   33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql01
[root@iZwz94i94ei3is8a1vnrdjZ /]# docker attach 43e5753b67b6
[root@43e5753b67b6 /]# ls volume01/
docker01.txt

应用:多个mysql实现数据共享

[root@iZwz94i94ei3is8a1vnrdjZ /]docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql  --name mysql01 -e MYSQL_ROOT_PASSWORD=123456  mysql:5.7

[root@iZwz94i94ei3is8a1vnrdjZ /]docker run -d -p 3310:3306  --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -volumes-from mysql01 mysql:5.7

DockerFile

DockerFile介绍

DockerFile就是用来构建docker镜像的构建文件,命令脚本

通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层

DockerFile构建过程

在这里插入图片描述

DockerFile的指令

FROM	#基础镜像
MAINTARINER	#镜像是谁写的,姓名+邮箱
RUN		#镜像构建的时候需要运行的命令
ADD		#需要添加的压缩包,比如构建tomcat就需要FROM centos然后add tomcat
WORKDIR	#镜像的工作目录
VULUME	#挂载卷的位置
EXPOSE	#指定暴露的端口
CMD		#容器启动后需要做的事
ENTRYPOINT	#用于配置容器启动后执行的命令,这些命令不会被docker run提供的参数覆盖
ONBUILD		#该配置指定当所创建的镜像作为其他新建镜像的基础镜像时所执行的指令
COPY	#格式为:COPY src desc 复制本地src目录或文件到容器的的desc目录,desc不存在时会自动创建
ENV		#构建的时候设置环境变量
CMD和ENTRYPOINT区别
CMD		#容器启动后需要做的事
ENTRYPOINT	#用于配置容器启动后执行的命令,这些命令不会被docker run提供的参数覆盖

CMD

#编写Dockerfile文件
[root@hzx docker-build]# vi Dockerfile
[root@hzx docker-build]# cat Dockerfile 
FrOM centos
CMD ["ls","-a"]

#构建镜像
[root@hzx docker-build]# docker build -f Dockerfile  -t cmd-test:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FrOM centos
 ---> 5d0da3dc9764
Step 2/2 : CMD ["ls","-a"]
 ---> Running in 01c968d7bafc
Removing intermediate container 01c968d7bafc
 ---> 10eeb3e23f8d
Successfully built 10eeb3e23f8d
Successfully tagged cmd-test:1.0

#创建容器
[root@hzx docker-build]# docker run cmd-test:1.0
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

#追加命令会覆盖cmd命令
[root@hzx docker-build]# docker run cmd-test:1.0 -l
docker: Error response from daemon: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled

ENTRYPOINT

#编写Dockerfile
[root@hzx docker-build]# vi Dockerfile 
[root@hzx docker-build]# cat Dockerfile 
FrOM centos
ENTRYPOINT ["ls","-a"]
#构建镜像
[root@hzx docker-build]# docker build -t entrypoint-test .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FrOM centos
 ---> 5d0da3dc9764
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in 50e497b9c500
Removing intermediate container 50e497b9c500
 ---> 708495b0564a
Successfully built 708495b0564a
Successfully tagged entrypoint-test:latest

#创建容器
[root@hzx docker-build]# docker run entrypoint-test
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

#追加命令
[root@hzx docker-build]# docker run entrypoint-test -l
total 56
drwxr-xr-x   1 root root 4096 Apr  3 06:28 .
drwxr-xr-x   1 root root 4096 Apr  3 06:28 ..
-rwxr-xr-x   1 root root    0 Apr  3 06:28 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  340 Apr  3 06:28 dev
drwxr-xr-x   1 root root 4096 Apr  3 06:28 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 111 root root    0 Apr  3 06:28 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Apr  3 06:26 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var

实战:Tomcat镜像

1、准备镜像文件,tomcat压缩包,jdk压缩包

[root@hzx mycentos]# ls
apache-tomcat-9.0.62.tar.gz jdk-8u301-linux-x64.tar.gz 

2、编写dockerfile文件

FROM centos
MAINTAINER hzx<1285180855@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u301-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.62.tar.gz /usr/local/


ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_301
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_NAME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.62/bin/catalina.out

3、构建镜像

[root@hzx mycentos]# docker build -t hzxtomcat:1.0 .
Sending build context to Docker daemon  157.1MB
Step 1/14 : FROM centos
 ---> 5d0da3dc9764
Step 2/14 : MAINTAINER hzx<1285180855@qq.com>
 ---> Using cache
 ---> 95fa0d0121e7
Step 3/14 : COPY readme.txt /usr/local/readme.txt
 ---> Using cache
 ---> 03bfc7c5dc92
Step 4/14 : ADD jdk-8u301-linux-x64.tar.gz /usr/local/
 ---> Using cache
 ---> 26d14412eae3
Step 5/14 : ADD apache-tomcat-9.0.62.tar.gz /usr/local/
 ---> Using cache
 ---> fe1f2b15521b
Step 6/14 : ENV MYPATH /usr/local
 ---> Running in 9d6222a82ed9
Removing intermediate container 9d6222a82ed9
 ---> b6d6f340c6f3
Step 7/14 : WORKDIR $MYPATH
 ---> Running in 726d98812885
Removing intermediate container 726d98812885
 ---> 88ce637ff29f
Step 8/14 : ENV JAVA_HOME /usr/local/jdk1.8.0_301
 ---> Running in 2d172eeb99b1
Removing intermediate container 2d172eeb99b1
 ---> 440d3218e748
Step 9/14 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 ---> Running in d89cfd62e26a
Removing intermediate container d89cfd62e26a
 ---> 16509c5385b0
Step 10/14 : ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
 ---> Running in 3cd69a74c723
Removing intermediate container 3cd69a74c723
 ---> 40b0f7607a59
Step 11/14 : ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
 ---> Running in 7d45e05374d3
Removing intermediate container 7d45e05374d3
 ---> 45bbcea0b0cd
Step 12/14 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_NAME/lib:$CATALINA_HOME/bin
 ---> Running in d8e4197da9a9
Removing intermediate container d8e4197da9a9
 ---> d79626aa637a
Step 13/14 : EXPOSE 8080
 ---> Running in 694bb08e2914
Removing intermediate container 694bb08e2914
 ---> 8a386a5f8b85
Step 14/14 : CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.62/bin/catalina.out
 ---> Running in b16fafa0eced
Removing intermediate container b16fafa0eced
 ---> 73104819262f
Successfully built 73104819262f
Successfully tagged hzxtomcat:1.0
[root@hzx mycentos]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
hzxtomcat    1.0       73104819262f   3 seconds ago   608MB
centos       latest    5d0da3dc9764   6 months ago    231MB
#查看变更历史
docker history 镜像id

在这里插入图片描述

4、测试

[root@hzx mycentos]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
hzxtomcat    1.0       73104819262f   6 minutes ago   608MB
centos       latest    5d0da3dc9764   6 months ago    231MB
[root@hzx mycentos]# docker run -d -p 8080:8080 --name hzxtomcat01 -v /opt/docker/volume/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test -v /opt/docker/volume/tomcat/logs:/usr/local/apache-tomcat-9.0.62/logs hzxtomcat:1.0

在这里插入图片描述

看看是否挂载成功


[root@hzx mycentos]# pwd
/home/mycentos
[root@hzx mycentos]# ls
apache-tomcat-9.0.62.tar.gz  Dockerfile  jdk-8u301-linux-x64.tar.gz  readme.txt
[root@hzx mycentos]# cd /opt/docker/volume/
[root@hzx volume]# cd tomcat/
[root@hzx tomcat]# ls
logs  test
[root@hzx tomcat]# cd logs/
[root@hzx logs]# ls
catalina.2022-04-03.log  catalina.out  host-manager.2022-04-03.log  localhost.2022-04-03.log  localhost_access_log.2022-04-03.txt  manager.2022-04-03.log
[root@hzx logs]# cat catalina.2022-04-03.log 
03-Apr-2022 05:57:19.051 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/9.0.62
03-Apr-2022 05:57:19.053 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Mar 31 2022 14:34:15 UTC
03-Apr-2022 05:57:19.053 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 9.0.62.0
03-Apr-2022 05:57:19.053 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
03-Apr-2022 05:57:19.053 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-1127.19.1.el7.x86_64
03-Apr-2022 05:57:19.053 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
03-Apr-2022 05:57:19.053 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/jdk1.8.0_301/jre

发布镜像到Docker Hub

1、访问https://hub.docker.com/

2.注册账号

3、登录

[root@hzx docker-build]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

#登录账号
[root@hzx docker-build]# docker login -u zhixionghuang
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

4、push镜像


[root@hzx docker-build]# docker images
REPOSITORY                                             TAG       IMAGE ID       CREATED          SIZE
entrypoint-test                                        latest    708495b0564a   7 minutes ago    231MB
cmd-test                                               1.0       10eeb3e23f8d   12 minutes ago   231MB
hzxtomcat                                              1.0       73104819262f   48 minutes ago   608MB
centos                                                 latest    5d0da3dc9764   6 months ago     231MB
#tag修改镜像名称
[root@hzx docker-build]# docker tag 73104819262f hzx/hzxtomcat:1.0 
[root@hzx docker-build]# docker images
REPOSITORY                                             TAG       IMAGE ID       CREATED          SIZE
entrypoint-test                                        latest    708495b0564a   9 minutes ago    231MB
cmd-test                                               1.0       10eeb3e23f8d   13 minutes ago   231MB
hzx/hzxtomcat                                          1.0       73104819262f   49 minutes ago   608MB
hzxtomcat                                              1.0       73104819262f   49 minutes ago   608MB
centos                                                 latest    5d0da3dc9764   6 months ago     231MB
#push 上传镜像
[root@hzx docker-build]# docker push hzx/hzxtomcat:1.0
The push refers to repository [docker.io/hzx/hzxtomcat]

阿里云镜像服务

1、登陆阿里云

2、找到容器镜像服务

3、创建命名空间
在这里插入图片描述

4、创建容器镜像
在这里插入图片描述

5、镜像推送到Registry
在这里插入图片描述

[root@hzx mycentos]# docker login --username=zxhuangaly registry.cn-shenzhen.aliyuncs.com
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@hzx mycentos]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
hzxtomcat    1.0       73104819262f   21 minutes ago   608MB
centos       latest    5d0da3dc9764   6 months ago     231MB
[root@hzx mycentos]# docker tag 73104819262f registry.cn-shenzhen.aliyuncs.com/hzx_test/hzxtomcat:1.0                                                     [root@hzx mycentos]# docker images
REPOSITORY                                             TAG       IMAGE ID       CREATED          SIZE
hzxtomcat                                              1.0       73104819262f   22 minutes ago   608MB
registry.cn-shenzhen.aliyuncs.com/hzx_test/hzxtomcat   1.0       73104819262f   22 minutes ago   608MB
centos                                                 latest    5d0da3dc9764   6 months ago     231MB
[root@hzx mycentos]# docker push registry.cn-shenzhen.aliyuncs.com/hzx_test/hzxtomcat:1.0
The push refers to repository [registry.cn-shenzhen.aliyuncs.com/hzx_test/hzxtomcat]
961105b626e7: Pushed 
4b303017dc92: Pushing [==========>                                        ]  74.82MB/361.2MB
7e7a8e773412: Pushed 
74ddd0ec08fa: Pushing [=================>                                 ]  79.41MB/231.3MB

在这里插入图片描述

小结
在这里插入图片描述

Docker网络原理

自定义网络

#查看所有的docker网络
docker network ls
#创建自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#查看网络详情
docker network inspect mynet
#发布容器到自己的网络中
docker run -d -P --name tomcat01 --net mynet tomcat

网络互通

打通两个独立的网络


[root@centos7 ~]# docker network connect --help

Usage:  docker network connect [OPTIONS] NETWORK CONTAINER

Connect a container to a network

Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., 172.30.100.104)
      --ip6 string              IPv6 address (e.g., 2001:db8::33)
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container
      
docker network connect mynet tomcat02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值