Docker(入门)_rm -rf [email protected]:/data/webserver/dist-程序员宅基地

技术标签: Docker  linux  centos  docker  

Docker 官网:http://www.docker.com

Docker 官网文档: https://docs.docker.com/get-started

Docker Hub官网: https://hub.docker.com

Docker 概述

- Docker 历史

2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司。这家公司主要提供基于PaaS的云计算技术服务。具体来说,是和LXC有关的容器技术。后来,dotCloud公司将自己的容器技术进行了简化和标准化,并命名为——Docker

2013年3月,dotCloud公司的创始人之一,Docker之父,28岁的Solomon Hykes正式决定,将Docker项目开源。

当月,Docker 0.1 版本发布。此后的每一个月,Docker都会发布一个版本。到2014年6月9日,Docker 1.0 版本正式发布

- Docker 基本介绍

Docker是基于Go语言实现的云开源项目。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)

- Docker 容器化 与 虚拟化

虚拟化

虚拟机(virtual machine)就是带环境安装的一种解决方案。

它可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统里面运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。

虚拟化技术特点:1.资源占用多 2.冗余步骤多 3.启动很慢

容器化 Linux 容器(Linux Containers,缩写为 LXC)

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

不同

  • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。
  • 而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
  • 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

- Docker 基本组成

Docker的架构图
在这里插入图片描述

  • 镜像(image):
    1. Docker 镜像(Image)就是一个只读的模板。
    2. 镜像可以用来创建 Docker 容器,一个镜像可以创建很 多容器。 就好似 Java 中的 类和对象,类就是镜像,容器就是对象!
  • 容器(container):
    1. Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。
    2. 容器可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
    3. 把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等) 和运行在其中的应用程序。
    4. 容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
  • 仓库(repository):
    1. 仓库(Repository)是集中存放镜像文件的场所。
    2. 仓库 (Repository) 和仓库注册服务器 (Registry) 是有区别的。仓库注册服务器上往往存放着多个仓 库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
    3. 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
    4. 最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。 国内的公开仓库包括阿里云 、网易云 等。

:

需要正确的理解仓储/镜像/容器这几个概念 :

  • Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。
    同一个 image 文件,可以生成多个同时运行的容器实例。

  • image 文件生成的容器实例,本身也是一个文件,称为镜像文件。

  • 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器

  • 至于仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库中拉下来
    就可以了。

- Docker 容器运行原理

Docker是怎么工作的

在这里插入图片描述

为什么Docker比较 VM 快

  • Docker有着比虚拟机更少的抽象层。
    由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
  • docker利用的是宿主机的内核,而不需要Guest OS。
    当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。

Docker和VM的对比如下:在这里插入图片描述

Docker 安装

- Docker 安装

环境说明 :CentOS 7 (64-bit) CentOS 7 与 8 的命令有些许不同

查看CentOS版本:cat /etc/redhat-release

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

查看内核信息:uname -r

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# uname -r
3.10.0-1160.53.1.el7.x86_64

查看版本信息:cat /etc/os-release

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# 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"

官网安装手册:https://docs.docker.com/engine/install/centos

yum安装gcc相关环境:
yum -y install gcc
yum -y install gcc-c++

Docker的安装与卸载:

  1. 卸载旧版本:
yum remove docker\
				  docker-client \
	 			  docker-client-latest \ 
	 			  docker-common \ 
	 			  docker-latest \ 
	 			  docker-latest-logrotate \ 
	 			  docker-logrotate \ 
	 			  docker-engine
  1. 安装yum软件包:
yum install -y yum-utils
  1. 设置镜像的仓库:
# 国外
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo  #国外的地址
    
# 设置阿里云的Docker镜像仓库
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #国外的地址
  1. 更新yum软件包索引:
yum makecache fast
  1. 安装 Docker CE (即 社区版):
yum install docker-ce docker-ce-cli containerd.io
  1. 启动 Docker:
# 启动docker 
systemctl start docker

# 查看当前版本号,是否启动成功
docker version

# 设置开机自启动
systemctl enable docker

# 测试命令---------------------

# 查看版本
docker version 

# 拉去版本
docker run hello-world 

# 查看镜像
docker images
  1. 安装yum软件包:
# 停止 docker
systemctl stop docker 

# 移除docker 引擎
yum -y remove docker-ce docker-ce-cli containerd.io 

# 删除docker默认工作路径文件夹
rm -rf /var/lib/docker

- Docker 阿里云镜像加速

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

在这里插入图片描述

- Docker pull 原理

docker pull hello-world

在这里插入图片描述

Docker 常用命令

- 基本/帮组命令

在这里插入图片描述

帮助文档: https://docs.docker.com/engine/reference/commandline/docker

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

- 镜像命令

docker images

# 列出本地主机上的镜像 
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
# 解释 
REPOSITORY  镜像的仓库源 
TAG 		镜像的标签 
IMAGE ID 	镜像的ID 
CREATED 	镜像创建时间 
SIZE 		镜像大小 
# 同一个仓库源可以有多个 TAG,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG 定义不同 的镜像,如果你不定义镜像的标签版本,docker将默认使用 lastest 镜像! 

# 可选项 
-a: 		列出本地所有镜像 
-q: 		只显示镜像id 
--digests: 显示镜像的摘要信息

docker search

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker search mysql
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                            MySQL is a widely used, open-source relation…   12347     [OK]
mariadb                          MariaDB Server is a high performing open sou…   4751      [OK]
mysql/mysql-server               Optimized MySQL Server Docker images. Create…   916                  [OK]
# docker search 某个镜像的名称 对应DockerHub仓库中的镜像

# 可选项 
--filter=stars=50 : 列出收藏数不小于指定值的镜像

docker pull

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker search mysql
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                            MySQL is a widely used, open-source relation…   12347     [OK]
mariadb                          MariaDB Server is a high performing open sou…   4751      [OK]
mysql/mysql-server               Optimized MySQL Server Docker images. Create…   916                  [OK]
# docker search 某个镜像的名称 对应DockerHub仓库中的镜像

# 可选项 
--filter=stars=50 : 列出收藏数不小于指定值的镜像

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   12347     [OK]
mariadb   MariaDB Server is a high performing open sou…   4751      [OK]

docker pull 镜像名[:tag] 下载镜像

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker pull mysql
Using default tag: latest  #如果不写tag默认就是latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete. #分层下载,docker image的核心-联合文件系统
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
# 签名
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:latest
#下载来源的真实地址  
#docker pull mysql等价于docker pull docker.io/library/mysql:latest
docker.io/library/mysql:latest

指定版本下载

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists
93619dbc5b36: Already exists

docker rmi

# 删除镜像 docker rmi -f 镜像id 
# 删除单个 docker rmi -f 镜像名:tag 
# 删除多个 docker rmi -f 镜像id 镜像id 镜像id
# 删除全部 docker rmi -f $(docker images -qa)

- 容器命令

说明:有镜像才能创建容器,使用 centos 的镜像来测试,就是虚拟一个 centos

docker pull centos

docker run [可选参数] image

# 常用参数说明 
--name="Name" # 给容器指定一个名字 
-d # 后台方式运行容器,并返回容器的id! 
-i # 以交互模式运行容器,通过和 -t 一起使用 
-t # 给容器重新分配一个终端,通常和 -i 一起使用 
-P # 随机端口映射(大写) 
-p # 指定端口映射(小结),一般可以有四种写法
# 四种写法
-p ip:主机端口:容器端口  配置主机端口映射到容器端口
-p ip::容器端口
-p 主机端口:容器端口
-p 容器端口
# 

运行并进入容器centos

# 使用centos进行用交互模式启动容器,在容器内执行/bin/bash命令!
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]#  docker run -it centos /bin/bash
# 注意地址,已经切换到容器内部了!
[root@9da8dd3ab2ae /]# ls 
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@9da8dd3ab2ae /]#

进入正在运行的容器

# 命令 1 
docker exec -it 容器id /bin/bash 

# 测试1
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker exec -it 246cee67a58b /bin/bash
[root@246cee67a58b /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 13:06 ?        00:00:00 /bin/sh -c while true;do echo hello world;sleep 1;done
root       511     0  0 13:14 pts/0    00:00:00 /bin/bash
root       535     1  0 13:14 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root       536   511  0 13:14 pts/0    00:00:00 ps -ef

# 命令 2 
docker attach 容器id

# 测试 2
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker attach 246cee67a58b
hello world
hello world
hello world

# 区别 
# exec 是在容器中打开新的终端,并且可以启动新的进程 
# attach 直接进入容器启动命令的终端,不会启动新的进程

退出容器

# 使用 exit 退出容器

[root@724be6f8c474 /]# exit
exit
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]#

# windows Ctrl+P+Q  不停止容器退出
# macOS Ctrl+P+Q    不停止容器退出
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]#  docker run -it centos /bin/bash
[root@c1e7c8c3a930 /]# 
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
c1e7c8c3a930   centos    "/bin/bash"   12 seconds ago   Up 11 seconds             compassionate_brahmagupta
17a705d23ec4   centos    "/bin/bash"   39 seconds ago   Up 38 seconds             heuristic_goldberg

列出所有运行的容器

# 命令 docker ps [OPTIONS] 
# 常用参数说明 
-a 		# 列出当前所有正在运行的容器 + 历史运行过的容器 
-l 		# 显示最近创建的容器 
-n=? 	# 显示最近n个创建的容器 
-q 		# 静默模式,只显示容器编号。

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# clear
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
c1e7c8c3a930   centos    "/bin/bash"   2 minutes ago   Up 2 minutes             compassionate_brahmagupta
17a705d23ec4   centos    "/bin/bash"   3 minutes ago   Up 3 minutes             heuristic_goldberg
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND       CREATED         STATUS                     PORTS     NAMES
c1e7c8c3a930   centos        "/bin/bash"   2 minutes ago   Up 2 minutes                         compassionate_brahmagupta
17a705d23ec4   centos        "/bin/bash"   3 minutes ago   Up 3 minutes                         heuristic_goldberg
724be6f8c474   centos        "/bin/bash"   5 minutes ago   Exited (0) 4 minutes ago             hardcore_wing
9da8dd3ab2ae   centos        "/bin/bash"   6 minutes ago   Exited (0) 5 minutes ago             mystifying_chatterjee
8e6321199c1f   hello-world   "/hello"      4 hours ago     Exited (0) 4 hours ago               competent_kalam

启动/停止容器

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

删除容器

docker rm 容器id                 #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq)   #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器

后台启动

# 命令 
docker run -d 容器名 # 例子 
docker run -d centos # 启动centos,使用后台方式启动 
# 问题: 使用docker ps 查看,发现容器已经退出了! 
# 解释:Docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命 令,就会自动退出。 
# 比如,你运行了nginx服务,但是docker前台没有运行应用,这种情况下,容器启动后,会立即自 杀,因为他觉得没有程序了,所以最好的情况是,将你的应用使用前台进程的方式运行启动。

- 日志命令

docker logs

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker logs --help

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
  -n, --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)


# -t 显示时间戳 
# -f 打印最新的日志 
# --tail 数字 显示多少条!

# 常用:
docker logs -f --tail number 容器id  #num为要显示的日志条数
docker logs -tf 容器id
docker logs --tail number 容器id     #num为要显示的日志条数

# 例子:我们启动 centos,并编写一段脚本来测试玩玩!最后查看日志
#	docker容器后台运行,必须要有一个前台的进程,否则会自动停止
#	编写shell脚本循环执行,使得centos容器保持运行状态

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker run -d centos /bin/sh -c "while true;do echo hello world;sleep 1;done"
246cee67a58b62b05dd3a685caebded8d9ae1a87715faae8ee5542c18b6949eb
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]#  docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
246cee67a58b   centos    "/bin/sh -c 'while t…"   6 seconds ago   Up 6 seconds             elastic_varahamihira
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker logs -tf --tail 10 246cee67a58b
2022-04-03T13:06:29.457120379Z hello world
2022-04-03T13:06:30.460928052Z hello world
2022-04-03T13:06:31.463951294Z hello world
2022-04-03T13:06:32.466899120Z hello world

- 常用其他命令

查看容器中运行的进程信息,支持 ps 命令参数。

# 命令 

docker top 容器id 

# 测试
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker top 246cee67a58b
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                1305                1283                0                   21:06               ?                   00:00:00            /bin/sh -c while true;do echo hello world;sleep 1;done
root                1650                1305                0                   21:08               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1	

查看容器的元数据

# 命令 

docker inspect 容器id 

# 测试
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker inspect 246cee67a58b
[
    {
    
    	# 完整的id,这里上面的容器id,就是截取的这个id前几位!
        "Id": "246cee67a58b62b05dd3a685caebded8d9ae1a87715faae8ee5542c18b6949eb",
        "Created": "2022-04-03T13:06:07.076243539Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true;do echo hello world;sleep 1;done"
        ],
        # 状态
        "State": {
    
            "Status": "running",
            "Running": true,
           ......
]           

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

#拷贝容器的文件到主机中
docker cp 容器id:容器内路径 目的主机路径

#拷贝宿主机的文件到容器中
docker cp 目的主机路径 容器id:容器内路径

常用命令

attach   Attach to a running container                                     # 当前 shell 下 attach 连接指定运行镜像 
build    Build an image from a Dockerfile                                  # 通过 Dockerfile 定 制镜像 
commit   Create a new image from a container changes                       # 提交当前容器为新的镜像 
cp Copy  files/folders from the containers filesystem to the host path     # 从容器中拷贝指定文件或者目录到宿主机中 
create   Create a new container                                            # 创建一个新的容器,同 run,但不启动容器 
diff     Inspect changes on a container's filesystem                       # 查看 docker 容器变化 
events   Get real time events from the server                              # 从 docker 服务获取容 器实时事件 
exec     Run a command in an existing container                            # 在已存在的容器上运行命令
export   Stream the contents of a container as a tar archive               # 导出容器的内 容流作为一个 tar 归档文件[对应 import ] 
history  Show the history of an image                                      # 展示一个镜像形成历史 
images   List images                                                       # 列出系统当前镜像 
import   Create a new filesystem image from the contents of a tarball      # 从 tar包中的内容创建一个新的文件系统映像[对应export] 
info     Display system-wide information                                   # 显示系统相关信息 
inspect  Return low-level information on a container                       # 查看容器详细信息 
kill     Kill a running container                                          # kill 指定 docker 容器
load     Load an image from a tar archive                                  # 从一个 tar 包中加载一 个镜像[对应 save] 
login    Register or Login to the docker registry server                   # 注册或者登陆一个 docker 源服务器 
logout   Log out from a Docker registry server                             # 从当前 Docker registry 退出 
logs     Fetch the logs of a container                                     # 输出当前容器日志信息 
port     Lookup the public-facing port which is NAT-ed to PRIVATE_PORT     # 查看映射端口对应的容器内部源端口 
pause    Pause all processes within a container                            # 暂停容器 
ps       List containers                                                   # 列出容器列表 
pull     Pull an image or a repository from the docker registry server     # 从docker镜像源服务器拉取指定镜像或者库镜像 
push     Push an image or a repository to the docker registry server       # 推送指定镜像或者库镜像至docker源服务器 
restart  Restart a running container                                       # 重启运行的容器 
rm       Remove one or more containers                                     # 移除一个或者多个容器 
rmi      Remove one or more images                                         # 移除一个或多个镜像[无容器使用该 镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除] 
run      Run a command in a new container                                  # 创建一个新的容器并运行 一个命令 
save     Save an image to a tar archive                                    # 保存一个镜像为一个 tar 包[对应 load] 
search   Search for an image on the Docker Hub                             # 在 docker hub 中搜 索镜像 
start    Start a stopped containers                                        # 启动容器 
stop     Stop a running containers                                         # 停止容器 
tag      Tag an image into a repository                                    # 给源中镜像打标签 
top      Lookup the running processes of a container                       # 查看容器中运行的进程信息
unpause  Unpause a paused container                                        # 取消暂停容器 
version  Show the docker version information                               # 查看 docker 版本号 
wait     Block until a container stops, then print its exit code           # 截取容 器停止时的退出状态值

- PorTainer 图形化

  • Portainer
# 命令
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

# 测试
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Unable to find image 'portainer/portainer:latest' locally

latest: Pulling from portainer/portainer
94cfa856b2b1: Pull complete
49d59ee0881a: Pull complete
a2300fd28637: Pull complete
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
8cb12edfb5a9bd14fb63eb647c534fb98c3f462ba0b0f6681b9b259605757f74

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS              PORTS                                       NAMES
8cb12edfb5a9   portainer/portainer   "/portainer"   36 minutes ago   Up About a minute   0.0.0.0:8088->9000/tcp, :::8088->9000/tcp   tender_herschel

访问:http://IP:9000

  • Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。
  • 如果仅有一个docker宿主机,则可使用单机版运行,Portainer单机版运行十分简单,只需要一条语句即可启动容器,来管理该机器上的docker镜像、容器等数据。

在这里插入图片描述

Docker 镜像

- 是什么

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

- Docker 镜像加载原理

UnionFS (联合文件系统)

  • UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
  • Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
  • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

Docker镜像加载原理

  • docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
  • bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
  • rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

在这里插入图片描述

思考:平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker images centos
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       latest    5d0da3dc9764   6 months ago   231MB

对于一个精简的OS,rootfs 可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

- 分层理解

分层的镜像

在这里插入图片描述

思考:为什么Docker镜像要采用这种分层的结构呢?

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

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

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker images inspect 7614ae9453d1
"docker images" requires at most 1 argument.
See 'docker images --help'.

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

List images
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker image inspect 7614ae9453d1
[
    {
    
        "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/8b91129e52abd786bcab380801f409e4d3d49be68ebf47844e82b11801ce3dc2/diff:/var/lib/docker/overlay2/c31b9211b5c7916d91c5cbb4ca6c0fe053388550f90588753cddf33e7834c29c/diff:/var/lib/docker/overlay2/c7ba00d38d323875644f5a4fd36467455ed959289e119ba9fe6a422cc29cfc03/diff:/var/lib/docker/overlay2/3c6ae1c6308d3302f84705d350fee7420318752bee4b8788ad2d2d55cb4f735f/diff:/var/lib/docker/overlay2/846a082809f3005a6233c27f7b2606f21853d836dff320c14bf5e804e36e9731/diff",
                "MergedDir": "/var/lib/docker/overlay2/1776242e290b7df2f4630a85fbfd7f53c0c4e84034b2c284baeb607f8155d615/merged",
                "UpperDir": "/var/lib/docker/overlay2/1776242e290b7df2f4630a85fbfd7f53c0c4e84034b2c284baeb607f8155d615/diff",
                "WorkDir": "/var/lib/docker/overlay2/1776242e290b7df2f4630a85fbfd7f53c0c4e84034b2c284baeb607f8155d615/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 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
  • 举一个简单的例子,假如基于 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[1]。
  • 下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

在这里插入图片描述

特点

  • Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
  • 这一层就是我们通常说的容器层,容器之下的都叫镜像层!

- 镜像commit

docker commit 从容器创建一个新的镜像。

docker commit 提交容器副本使之成为一个新的镜像!
 # 语法 
docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]

由于默认的Tomcat镜像的webapps文件夹中没有任何内容,需要从webapps.dist中拷贝文件到webapps文件夹。下面自行制作镜像:就是从webapps.dist中拷贝文件到webapps文件夹下,并提交该镜像作为一个新的镜像。使得该镜像默认的webapps文件夹下就有文件。

#1.复制文件夹

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker run -it tomcat /bin/bash
root@2a3bf3eaa2e4:/usr/local/tomcat# cd webapps
root@2a3bf3eaa2e4:/usr/local/tomcat/webapps# ls
root@2a3bf3eaa2e4:/usr/local/tomcat/webapps# cd ../
root@2a3bf3eaa2e4:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@2a3bf3eaa2e4:/usr/local/tomcat# cd webapps
root@2a3bf3eaa2e4:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED         STATUS         PORTS                    NAMES
2a3bf3eaa2e4   tomcat                "/bin/bash"    4 minutes ago   Up 4 minutes   8080/tcp                 competent_torvalds
7789d4505a00   portainer/portainer   "/portainer"   24 hours ago    Up 24 hours    0.0.0.0:8088->9000/tcp   quirky_sinoussi
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker exec -it 2a3bf3eaa2e4 /bin/bash
root@2a3bf3eaa2e4:/usr/local/tomcat# cd webapps
root@2a3bf3eaa2e4:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@2a3bf3eaa2e4:/usr/local/tomcat/webapps# cd ../
root@2a3bf3eaa2e4:/usr/local/tomcat# read escape sequence
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED         STATUS         PORTS                    NAMES
2a3bf3eaa2e4   tomcat                "/bin/bash"    8 minutes ago   Up 8 minutes   8080/tcp                 competent_torvalds
7789d4505a00   portainer/portainer   "/portainer"   24 hours ago    Up 24 hours    0.0.0.0:8088->9000/tcp   quirky_sinoussi

#2.提交镜像作为一个新的镜像

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker commit -m="add webapps" -a="Ethan" 2a3bf3eaa2e4 mytomcat:1.0
sha256:f189aac861de51087af5bc88a5f1de02d9574e7ee2d163c647dd7503a2d3982b
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
mytomcat              1.0       f189aac861de   7 seconds ago   653MB
mysql                 5.7       f07dfa83b528   6 days ago      448MB
tomcat                latest    feba8d001e3f   10 days ago     649MB
nginx                 latest    ae2feff98a0c   12 days ago     133MB
centos                latest    300e315adb2f   2 weeks ago     209MB
portainer/portainer   latest    62771b0b9b09   5 months ago    79.1MB
elasticsearch         7.6.2     f29a1ee41030   9 months ago    791MB

#3.运行容器

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker run -it mytomcat:1.0 /bin/bash
root@1645774d4605:/usr/local/tomcat# cd webapps
root@1645774d4605:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
wz99sm8v95sckz8bd2c4Z ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
mytomcat              1.0       f189aac861de   7 seconds ago   653MB
mysql                 5.7       f07dfa83b528   6 days ago      448MB
tomcat                latest    feba8d001e3f   10 days ago     649MB
nginx                 latest    ae2feff98a0c   12 days ago     133MB
centos                latest    300e315adb2f   2 weeks ago     209MB
portainer/portainer   latest    62771b0b9b09   5 months ago    79.1MB
elasticsearch         7.6.2     f29a1ee41030   9 months ago    791MB

Nginx 部署

  1. 搜索并下载镜像
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Image is up to date for nginx:latest
docker.io/library/nginx:latest
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
nginx                 latest    605c77e624dd   3 months ago    141MB
  1. 运行测试

-d 			# 后台运行
--name 		# 容器命名
-p 3334:80 	# 将宿主机的端口80映射到该容器的80端口
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker run -d --name nginx01 -p 80:80 nginx
f1275de43e58f082e93766258d6130ad852b460abb0392e6c283f466bf19728c
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED             STATUS             PORTS                                       NAMES
f1275de43e58   nginx                 "/docker-entrypoint.…"   6 seconds ago       Up 5 seconds       0.0.0.0:80->80/tcp, :::80->80/tcp           nginx01

# 运行结果
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker exec -it nginx01 /bin/bash
root@f1275de43e58:/#

# 本地测试
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]#  curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
......
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
  1. 配置文件

进入容器,自定义配置文件

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker exec -it nginx01 /bin/bash
root@f1275de43e58:/#  whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@f1275de43e58:/# cd /etc/nginx
root@f1275de43e58:/etc/nginx# ls
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params
root@f1275de43e58:/etc/nginx# cd /etc/nginx
root@f1275de43e58:/etc/nginx# ls
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params
  1. 安装vim
# Nginx往往需要编写配置文件,但是Nginx官方镜像没有安装vim,
# 需要我们手动进行安装。使用以下命令进行安装:
apt-get install vim
# 如果执行上述命令出现提示
root@f1275de43e58:/etc/nginx# apt-get install vim
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package vim
# 则需要先同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d
# 中列出的源的索引,这样才能获取到最新的软件包。执行以下命令来更新:
apt-get update

# 测试
root@f1275de43e58:/etc/nginx# apt-get update
Get:1 http://security.debian.org/debian-security bullseye-security InRelease [44.1 kB]
Get:2 http://security.debian.org/debian-security bullseye-security/main amd64 Packages [124 kB]
Get:3 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:4 http://deb.debian.org/debian bullseye-updates InRelease [39.4 kB]
Get:5 http://deb.debian.org/debian bullseye/main amd64 Packages [8182 kB]
Get:6 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [2596 B]
Fetched 8508 kB in 1min 12s (118 kB/s)
Reading package lists... Done
  • 更新完毕再安装即可。我们修改了配置文件,只要重新启动容器docker restart 容器id,改动就可以生效了。
  • 解决vim在终端不能复制的问题:在vim 中输入 :set mouse=r。

拓展:启动项目并设置数据卷,为避免nginx因为修改配置文件导致的错误而无法启动容器,我们可以通过cp命令覆盖配置文件,但是设置数据卷会更为方便。启动Nginx容器的同时设置数据卷的命令:

docker run 
--name my_nginx
-d -p 80:80  
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 
-v /data/nginx/log:/var/log/nginx 
-v /data/nginx/html:/usr/share/nginx/html
nginx

参数说明

第一个-v:挂载nginx的主配置文件,以方便在宿主机上直接修改容器的配置文件
第二个-v:挂载容器内nginx的日志,容器运行起来之后,可以直接在宿主机的这
		个目录中查看nginx日志
第三个-v:挂载静态页面目录

- 阿里云服务器配置安全组

在这里插入图片描述

- 端口暴露的概念

在这里插入图片描述

Tomcat 部署

  1. 下载并运行
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
tomcat                latest    fb5657adc892   3 months ago    680MB
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker run -d -p 8080:8080 --name tomcat01 tomcat
d3e4072a3075db6db84ec10e965d6e1f74dad16b4d5b059a6acae3f4068b465d
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# curl localhost:8080
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {
    font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {
    color:white;background-color:#525D76;} h1 {font-size:22px;} 
......
  1. 进入镜像
    阿里云镜像默认下载的是最小的镜像,保证最小的运行环境;
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker exec -it tomcat01 /bin/bash
root@d3e4072a3075:/usr/local/tomcat# ls
BUILDING.txt	 LICENSE  README.md	 RUNNING.txt  conf  logs	    temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin	      lib   native-jni-lib  webapps  work
root@d3e4072a3075:/usr/local/tomcat# cd webapps.dist
root@d3e4072a3075:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager
root@d3e4072a3075:/usr/local/tomcat/webapps.dist# cd ROOT
root@d3e4072a3075:/usr/local/tomcat/webapps.dist/ROOT# ls
RELEASE-NOTES.txt  WEB-INF  asf-logo-wide.svg  bg-button.png  bg-middle.png  bg-nav.png  bg-upper.png  favicon.ico  index.jsp  tomcat.css  tomcat.svg
root@d3e4072a3075:/usr/local/tomcat/webapps.dist/ROOT# cd ../../
root@d3e4072a3075:/usr/local/tomcat# cd webapps
# cp -r /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps/
root@d3e4072a3075:/usr/local/tomcat/webapps# cp -r /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps/
root@d3e4072a3075:/usr/local/tomcat/webapps# exit
exit

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# curl localhost:8080



<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/10.0.14</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
        ......

Es 部署

# 扩展命令 
docker stats 容器id	 # 查看容器的cpu内存和网络状态

增加上内存限制启动

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker stats 00734591c6e7d0
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O       PIDS
00734591c6e7   elasticsearch   0.00%     355.6MiB / 1.694GiB   20.50%    656B / 0B   6.6MB / 733kB   44
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O       PIDS
00734591c6e7   elasticsearch   0.00%     355.6MiB / 1.694GiB   20.50%    656B / 0B   6.6MB / 733kB   44
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O       PIDS

测试

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# curl localhost:9200
{
    
  "name" : "00734591c6e7",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "ldJ2TyX5SZeslXX8CB8BiA",
  "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"
}

Mysql 部署

  1. 下载并运行
docker run -d --name mysql-5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

参数说明:

-p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 默认账号root 用户的密码。
  1. 进入容器查看MySQL服务
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker exec -it 6ef01fe4443e /bin/bash
root@6ef01fe4443e:/# mysql -h localhost -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Docker 容器卷

- 是什么

docker的理念回顾
将应用和运行的环境打包形成容器运行,运行可以伴随着容器,对于数据的要求,是希望能够持久化的!

就好比,你安装一个MySQL,结果你把容器删了,就相当于删库跑路了,这TM也太扯了吧!

所以希望容器之间有可能可以共享数据,Docker容器产生的数据,如果不通过docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了!这样是行不通的!

为了能保存数据在Docker中我们就可以使用卷!让数据挂载到我们本地!这样数据就不会因为容器删除而丢失了!

作用:

  1. 卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System,提供一些用于持续存储或共享数据的特性:

  2. 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

  3. 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

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

总结:
容器的持久化,以及容器间的继承和数据共享!

- 使用数据卷

方式一:容器中直接使用命令来添加

匿名挂载

  • 匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径 /var/lib/docker/volumes/ 中自动生成一个随机命名的文件夹。
# 命令 
docker run -it -v 容器内目录 镜像名 /bin/bash

# 测试nginx
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 测试 centos
docker run -it -v /home centos /bin/bash

# 查看数据卷是否挂载成功
docker inspect 容器id

# 查看所有的数据卷volume的情况, 
# VOLUME NAME这里的值是真实存在的目录。
docker volume ls

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker volume ls
DRIVER    VOLUME NAME
local     0516763dd2e9857203c823a27110a56959b22284583f66f7f9f23e5b54397164

# 查看卷
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# cd /var/lib/docker/volumes/
[root@iZ2zef4kmo4v6a3s72p6qfZ volumes]# ll
drwx-----x 3 root root   4096 44 10:00 0516763dd2e9857203c823a27110a56959b22284583f66f7f9f23e5b54397164

在这里插入图片描述

具名挂载

  • 具名挂载,就是指定文件夹名称,区别于指定路径挂载,这里的指定文件夹名称是在Docker指定的默认数据卷路径下的。通过docker volume ls命令可以查看当前数据卷的目录情况。

# 测试 nginx 
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
eec4acd66805a40bb85634b1c1e6a7fa56ba22fc87285e3e10e197b31d9dcba1

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker volume ls
DRIVER    VOLUME NAME
local     juming-nginx
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                  NAMES
eec4acd66805   nginx                 "/docker-entrypoint.…"   29 seconds ago   Up 28 seconds   0.0.0.0:49153->80/tcp, :::49153->80/tcp                                                nginx02
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker inspect eec4acd66805
......
        "Mounts": [
            {
    
                "Type": "volume",
                # 挂载名字
                "Name": "juming-nginx",
                # 挂载宿主机默认目录
                "Source": "/var/lib/docker/volumes/juming-nginx/_data",
                # 挂载容器目录
                "Destination": "/etc/nginx",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
        .....

指定目录挂载

# 命令 
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名

# 测试
docker run -it -v /home:/home centos /bin/bash

# 查看数据卷是否挂载成功
docker inspect 容器id

在这里插入图片描述

测试容器和宿主机之间数据共享:可以发现,在容器中,创建的会在宿主机中看到!

测试容器停止退出后,主机修改数据是否会同步!

  1. 停止容器
  2. 在宿主机上修改文件,增加些内容
  3. 启动刚才停止的容器
  4. 然后查看对应的文件,发现数据依旧同步!ok

匿名挂载,具名挂载,指定路径挂载的命令区别如下:

-v 容器内路径					    #匿名挂载
-v 卷名:容器内路径 			    #具名挂载
-v /宿主机路径:容器内路径  	 	#指定路径挂载

指定数据卷映射的相关参数:

  • 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

方式二:通过Docker File 来添加

DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本。

# 在宿主机 /home 目录下新建一个 docker-test-volume文件夹
[root@iZ2zef4kmo4v6a3s72p6qfZ home]#  mkdir docker-test-volume

# # 说明:在编写DockerFile文件中使用 VOLUME 指令来给镜像添加一个或多个数据卷
# # 出于可移植和分享的考虑,我们之前使用的 -v 主机目录:容器目录 这种方式不能够直接在 DockerFile中实现。
# # 由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有宿主机上都存在这样的特定目录.

# 2、编写DockerFile文件
[root@iZ2zef4kmo4v6a3s72p6qfZ home]# cd docker-test-volume/
[root@iZ2zef4kmo4v6a3s72p6qfZ docker-test-volume]# pwd
/home/docker-test-volume
[root@iZ2zef4kmo4v6a3s72p6qfZ docker-test-volume]#  vim dockerfile1
[root@iZ2zef4kmo4v6a3s72p6qfZ docker-test-volume]# cat dockerfile1
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "-------end------"
CMD /bin/bash

# 3、build后生成镜像,获得一个新镜像 kuangshen/centos
# docker build -f /home/docker-test-volume/dockerfile1 -t test/centos . 
# 注意最后有个.
[root@iZ2zef4kmo4v6a3s72p6qfZ docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t test/centos .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
 ---> Running in 8efa9f9c97ce
Removing intermediate container 8efa9f9c97ce
 ---> 2385a6a33564
Step 3/4 : CMD echo "-------end------"
 ---> Running in f65d879231cb
Removing intermediate container f65d879231cb
 ---> eaf8031700f0
Step 4/4 : CMD /bin/bash
 ---> Running in fb799ef8ebc3
Removing intermediate container fb799ef8ebc3
 ---> f13190f2b0ff
Successfully built f13190f2b0ff
Successfully tagged test/centos:latest
[root@iZ2zef4kmo4v6a3s72p6qfZ docker-test-volume]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
test/centos           latest    f13190f2b0ff   11 seconds ago   231MB

# 4、启动容器
docker run -it f13190f2b0ff /bin/bash
[root@iZ2zef4kmo4v6a3s72p6qfZ docker-test-volume]# docker run -it f13190f2b0ff /bin/bash
[root@55da60ce1b8b /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
# 数据卷目录
drwxr-xr-x   2 root root 4096 Apr  4 04:58 dataVolumeContainer1
# 数据卷目录
drwxr-xr-x   2 root root 4096 Apr  4 04:58 dataVolumeContainer2
drwxr-xr-x   5 root root  360 Apr  4 04:58 dev
drwxr-xr-x   1 root root 4096 Apr  4 04:58 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 128 root root    0 Apr  4 04:58 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 Mar 17 03:16 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
[root@55da60ce1b8b /]#

# 问题:通过上述步骤,容器内的卷目录地址就已经知道了,但是对应的主机目录地址在哪里呢?

# 5、我们在数据卷中新建一个文件
[root@55da60ce1b8b /]# cd dataVolumeContainer1
[root@55da60ce1b8b dataVolumeContainer1]# ls
[root@55da60ce1b8b dataVolumeContainer1]#  touch container.txt
[root@55da60ce1b8b dataVolumeContainer1]# ls -l
total 0
-rw-r--r-- 1 root root 0 Apr  4 05:01 container.txt

# 6、退出容器,查看下这个容器的信息(注意这里是容器)
# 查看镜像 ID
[root@iZ2zef4kmo4v6a3s72p6qfZ docker-test-volume]# docker inspect f13190f2b0ff
......
                "CMD [\"/bin/sh\" \"-c\" \"/bin/bash\"]"
            ],
            "Image": "sha256:eaf8031700f00b367f754d771195295014385b28bbe9214e0997e2dbb888516c",
            "Volumes": {
    
                "/dataVolumeContainer1": {
    },
                "/dataVolumeContainer2": {
    }
            },
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            ......
# 查看容器ID 
[root@iZ2zef4kmo4v6a3s72p6qfZ docker-test-volume]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                                                  NAMES
55da60ce1b8b   f13190f2b0ff          "/bin/bash"              4 minutes ago   Up 4 minutes                                                                                          modest_burnell
[root@iZ2zef4kmo4v6a3s72p6qfZ docker-test-volume]# docker inspect 55da60ce1b8b

        "Mounts": [
            {
    
                "Type": "volume",
                "Name": "18ccc09ff1de354b2ce70a7d81196c64492209bcd04ceda993f27daa35f73fa9",
                # 容器目录
                "Source": "/var/lib/docker/volumes/18ccc09ff1de354b2ce70a7d81196c64492209bcd04ceda993f27daa35f73fa9/_data",
                # 容器名
                "Destination": "/dataVolumeContainer1",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
    
                "Type": "volume",
                "Name": "646fb3750a889a1ced7f0a27eab479f22ecf1dfca54654168b23cd5aa6ed4204",
                # 容器目录
                "Source": "/var/lib/docker/volumes/646fb3750a889a1ced7f0a27eab479f22ecf1dfca54654168b23cd5aa6ed4204/_data",
                # 容器名
                "Destination": "/dataVolumeContainer2",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
......

# 7、这个卷在主机对应的默认位置
[root@iZ2zef4kmo4v6a3s72p6qfZ docker-test-volume]# cd /var/lib/docker/volumes/18ccc09ff1de354b2ce70a7d81196c64492209bcd04ceda993f27daa35f73fa9/_data
[root@iZ2zef4kmo4v6a3s72p6qfZ _data]# ll
总用量 0
-rw-r--r-- 1 root root 0 44 13:01 container.txt

注意:注意:如果访问出现了 cannot open directory: Permission denied
解决办法:在挂载目录后多加一个 --privileged=true参数即可

- MySQL容器建立数据卷同步数据

  • 在Linux下的MySQL默认的数据文档存储目录为/var/lib/mysql,默认的配置文件的位置/etc/mysql/conf.d,为了确保MySQL镜像或容器删除后,造成的数据丢失。
  • 下面建立数据卷保存MySQL的数据和文件:
# 启动容器 -e 环境变量
# 注意: mysql的数据应该不丢失! -v 挂载卷! 参考官方文档

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

# 测试

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

[root@iZ2zef4kmo4v6a3s72p6qfZ data]# pwd
/home/mysql/data
[root@iZ2zef4kmo4v6a3s72p6qfZ data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem

- 其他命令

  1. 创建数据卷
docker volume create my-vol
  1. 查看所有的数据卷
docker volume ls
  1. 查看指定数据卷的信息
docker volume inspect my-vol
[
	{
    
"Driver": "local",
"Labels": {
    },
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {
    },
"Scope": "local"
	}
]
  1. 删除数据卷 docker volume rm …
docker volume rm my-vol
  1. 删除容器之时删除相关的卷
docker rm -v ...

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷 。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。

无主的数据卷可能会占据很多空间,要清理请使用以下命令

docker volume prune

[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
04d9c8f36362c264e42979f18250d9e7630bae0ee109735fc7c136b8e79f6cc0
10a8ae7e9a243767e553b8de6e39fc55a710b31c5d638f06295ff3f94d3c7654
2ab3eb48357dc8217a6f1f845f97bbeccff1aaad1450dbe1cc3944d282285db8
c7ddda74ba0ffe28a802e814d3d7a812085b894682b7a774d30136ac76849a45
0516763dd2e9857203c823a27110a56959b22284583f66f7f9f23e5b54397164

Total reclaimed space: 132kB
  1. 使用 –mount 创建数据卷

挂载一个主机目录作为数据卷。使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。

 docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp 
python app.py

上面的命令挂载主机的/src/webapp目录到容器的/opt/webapp目录。用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。

Docker 挂载主机目录的默认权限是读写 ,用户也可以通过添加readonly 参数指定为只读 。

docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp:ro \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py
加了readonly之后,就挂载为只读了。如果你在容器内/src/webapp目录新建文件,会显示如下错误
/src/webapp # touch new.txt
touch: new.txt: Read-only file system

- 数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。

在这里插入图片描述

通过镜像 test/centos,启动容器centos01,dataVolumeContainer2、dataVolumeContainer1为挂载目录。

docker run -it --name centos01 test/centos

[root@iZ2zef4kmo4v6a3s72p6qfZ home]# docker run -it --name centos01 test/centos

通过镜像 test/centos,启动容器centos01,通过参数 --volumes-from ,设置容器centos01和centos02卷挂载关系

 --volumes-from
docker run -it --name centos02 --volumes-from centos01 test/centos

[root@iZ2zef4kmo4v6a3s72p6qfZ home]# docker run -it --name centos02 --volumes-from centos01 test/centos

在容器centos02中的dataVolumeContainer2中添加文件 volumeContainer2_centos02.java

[root@025e7375ff26 /]# cd dataVolumeContainer2
[root@025e7375ff26 dataVolumeContainer2]# touch volumeContainer2_centos02.java
[root@025e7375ff26 dataVolumeContainer2]# ls
volumeContainer2_centos02.java

切换到centos01容器中查看 dataVolumeContainer2 文件夹

[root@iZ2zef4kmo4v6a3s72p6qfZ home]# docker exec -it centos01 /bin/bash
[root@95558d4d9a88 /]# ls
bin  dataVolumeContainer1  dataVolumeContainer2  dev  etc  home  lib  lib64  lost+found  media	mnt  opt  proc	root  run  sbin  srv  sys  tmp	usr  var
[root@95558d4d9a88 /]# cd dataVolumeContainer2/
[root@95558d4d9a88 dataVolumeContainer2]# ls
volumeContainer2_centos02.java

容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
存储在本机的文件则会一直保留!

DockerFile

开发应用=>DockerFile=>打包为镜像=>上传到仓库(私有仓库,公有仓库)=> 下载镜像 => 启动运行
在这里插入图片描述

- 是什么

Dockerfile 是用来构建 Docker 镜像的文本文件,也可以说是命令参数脚本。
docker build 命令用于 从 Dockerfile 构建镜像。可以在docker build命令中使用 -f 标志指向文件系统中任何位置的 Dockerfile 。

Docker镜像发布的步骤:

1、编写一个dockerfile文件

2、docker build 构建成为一个镜像

3、docker run 镜像

4、docker push 镜像(发布镜像到DockerHub、阿里云镜像仓库)

在这里插入图片描述

在这里插入图片描述

- 构建过程

  • 基础知识:

1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行
3、# 表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交

  • 流程:

1、docker从基础镜像运行一个容器
2、执行一条指令并对容器做出修改
3、执行类似 docker commit 的操作提交一个新的镜像层
4、Docker再基于刚提交的镜像运行一个新容器
5、执行dockerfile中的下一条指令直到所有指令都执行完成!

在这里插入图片描述

  • 说明:
    从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。
    1、DockerFile 是软件的原材料 (代码)
    2、Docker 镜像则是软件的交付品 (.apk)
    3、Docker 容器则是软件的运行状态 (客户下载安装执行)

- 指令说明

官方文档:https://docs.docker.com/engine/reference/builder

FROM        # 基础镜像,当前新镜像是基于哪个镜像的 
MAINTAINER  # 镜像维护者的姓名混合邮箱地址 
RUN         # 容器构建时需要运行的命令 
EXPOSE      # 当前容器对外保留出的端口 
WORKDIR     # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点 
ENV         # 用来在构建镜像过程中设置环境变量 
ADD         # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 
COPY        # 类似ADD,拷贝文件和目录到镜像中! 
VOLUME      # 容器数据卷,用于数据保存和持久化工作 
CMD         # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最 后一个生效! 
ENTRYPOINT  # 指定一个容器启动时要运行的命令!和CMD一样 
ONBUILD     # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的 ONBUILD被触发

在这里插入图片描述

在这里插入图片描述

- 制作Centos镜像

  1. 编写DockerFile

     下面通过编写 Dockerfile 文件来制作 Centos 镜像,
     并在官方镜像的基础上添加 vim 和 net-tools 工具。
    
[root@iZ2zef4kmo4v6a3s72p6qfZ home]# mkdir dockerfile-test
[root@iZ2zef4kmo4v6a3s72p6qfZ home]# cd dockerfile-test/
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# vim mydockerfile-centos
## 注意 -------------------------
# 宿主机系统是centos7而docker的image中的centos使用的是centos8,
# 一般image中的centos8中的yum默认使用宿主机的yum源,更换镜像到centos7
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# cat mydockerfile-centos
FROM centos:centos7
MAINTAINER fico<1111111@qq.com>

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

  • FROM centos:该image文件继承官方的centos,后面加冒号centos:7,用于指定镜像的版本
  • ENV MYPATH /usr/local:设置环境变量MYPATH ,后面有用到
  • WORKDIR $MYPATH:直接使用上面设置的环境变量,指定/usr/local为工作目录
  • RUN yum -y install vim和RUN yum -y install net-tools:在/usr/local目录下,运行yum -y install vim和yum -y install net-tools命令安装工具,注意安装后的所有依赖和工具都会打包到image文件中
  • EXPOSE 80:将容器80端口暴露出来,允许外部连接这个端口
  • CMD:指定容器启动的时候运行命令

错误记录:

  • 宿主机系统是centos7而docker的image中的centos使用的是centos8;
  • 一般image中的centos8中的yum默认使用宿主机的yum源,更换镜像到centos7;
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# docker build -f mydockerfile-centos -t mycentos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/10 : FROM centos
 ---> 5d0da3dc9764
Step 2/10 : MAINTAINER fico<1111111@qq.com>
 ---> Using cache
 ---> 9aaec32ace87
Step 3/10 : ENV MYPATH /usr/local
 ---> Using cache
 ---> 6307f3bcd010
Step 4/10 : WORKDIR $MYPATH
 ---> Using cache
 ---> ab0f230e97d2
Step 5/10 : RUN yum -y install vim
 ---> Running in c8750c1d68d7
CentOS Linux 8 - AppStream                       18  B/s |  38  B     00:02
## 错误
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
The command '/bin/sh -c yum -y install vim' returned a non-zero code: 1

改为:

## 这里-----------
# 非  FROM centos
FROM centos:centos7
MAINTAINER fico<1111111@qq.com>

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
  1. 构建
# 注意
# -t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。
# 如果不指定,默认的标签就是latest。
# 点 表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点
docker build -f dockerfile文件路径 -t 镜像名[:版本号] .
# 命令
docker build -f mydockerfile-centos -t mycentos-file:1.0 .
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# docker build -f mydockerfile-centos -t mycentos-file:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/10 : FROM centos:centos7
centos7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:centos7
 ---> eeb6ee3f44bd
Step 2/10 : MAINTAINER fico<1111111@qq.com>
 ---> Running in d6682335948e
Removing intermediate container d6682335948e
 ---> 329ed2d5f69b
Step 3/10 : ENV MYPATH /usr/local
 ---> Running in 9d9ffeeb0339
Removing intermediate container 9d9ffeeb0339
 ---> 669dccfc4948
Step 4/10 : WORKDIR $MYPATH
 ---> Running in 189720bd246c
Removing intermediate container 189720bd246c
 ---> 17da3c2aa195
Step 5/10 : RUN yum -y install vim --nogpgcheck
 ---> Running in 9f389ccf9afc
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package vim-enhanced.x86_64 2:7.4.629-8.el7_9 will be installed
--> Processing Dependency: vim-common = 2:7.4.629-8.el7_9 for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: which for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: perl(:MODULE_COMPAT_5.16.3) for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: libperl.so()(64bit) for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Processing Dependency: libgpm.so.2()(64bit) for package: 2:vim-enhanced-7.4.629-8.el7_9.x86_64
--> Running transaction check
---> Package gpm-libs.x86_64 0:1.20.7-6.el7 will be installed
---> Package perl.x86_64 4:5.16.3-299.el7_9 will be installed
--> Processing Dependency: perl(Socket) >= 1.3 for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Scalar::Util) >= 1.10 for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl-macros for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(threads::shared) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(threads) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(constant) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Time::Local) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Time::HiRes) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Storable) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Socket) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Scalar::Util) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Pod::Simple::XHTML) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Pod::Simple::Search) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Getopt::Long) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Filter::Util::Call) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Temp) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Spec::Unix) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Spec::Functions) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Spec) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(File::Path) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Exporter) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Cwd) for package: 4:perl-5.16.3-299.el7_9.x86_64
--> Processing Dependency: perl(Carp) for package: 4:perl-5.16.3-299.el7_9.x86_64
---> Package perl-libs.x86_64 4:5.16.3-299.el7_9 will be installed
---> Package vim-common.x86_64 2:7.4.629-8.el7_9 will be installed
--> Processing Dependency: vim-filesystem for package: 2:vim-common-7.4.629-8.el7_9.x86_64
---> Package which.x86_64 0:2.20-7.el7 will be installed
--> Running transaction check
---> Package perl-Carp.noarch 0:1.26-244.el7 will be installed
---> Package perl-Exporter.noarch 0:5.68-3.el7 will be installed
---> Package perl-File-Path.noarch 0:2.09-2.el7 will be installed
---> Package perl-File-Temp.noarch 0:0.23.01-3.el7 will be installed
---> Package perl-Filter.x86_64 0:1.49-3.el7 will be installed
---> Package perl-Getopt-Long.noarch 0:2.40-3.el7 will be installed
--> Processing Dependency: perl(Pod::Usage) >= 1.14 for package: perl-Getopt-Long-2.40-3.el7.noarch
--> Processing Dependency: perl(Text::ParseWords) for package: perl-Getopt-Long-2.40-3.el7.noarch
---> Package perl-PathTools.x86_64 0:3.40-5.el7 will be installed
---> Package perl-Pod-Simple.noarch 1:3.28-4.el7 will be installed
--> Processing Dependency: perl(Pod::Escapes) >= 1.04 for package: 1:perl-Pod-Simple-3.28-4.el7.noarch
--> Processing Dependency: perl(Encode) for package: 1:perl-Pod-Simple-3.28-4.el7.noarch
---> Package perl-Scalar-List-Utils.x86_64 0:1.27-248.el7 will be installed
---> Package perl-Socket.x86_64 0:2.010-5.el7 will be installed
---> Package perl-Storable.x86_64 0:2.45-3.el7 will be installed
---> Package perl-Time-HiRes.x86_64 4:1.9725-3.el7 will be installed
---> Package perl-Time-Local.noarch 0:1.2300-2.el7 will be installed
---> Package perl-constant.noarch 0:1.27-2.el7 will be installed
---> Package perl-macros.x86_64 4:5.16.3-299.el7_9 will be installed
---> Package perl-threads.x86_64 0:1.87-4.el7 will be installed
---> Package perl-threads-shared.x86_64 0:1.43-6.el7 will be installed
---> Package vim-filesystem.x86_64 2:7.4.629-8.el7_9 will be installed
--> Running transaction check
---> Package perl-Encode.x86_64 0:2.51-7.el7 will be installed
---> Package perl-Pod-Escapes.noarch 1:1.04-299.el7_9 will be installed
---> Package perl-Pod-Usage.noarch 0:1.63-3.el7 will be installed
--> Processing Dependency: perl(Pod::Text) >= 3.15 for package: perl-Pod-Usage-1.63-3.el7.noarch
--> Processing Dependency: perl-Pod-Perldoc for package: perl-Pod-Usage-1.63-3.el7.noarch
---> Package perl-Text-ParseWords.noarch 0:3.29-4.el7 will be installed
--> Running transaction check
---> Package perl-Pod-Perldoc.noarch 0:3.20-4.el7 will be installed
--> Processing Dependency: perl(parent) for package: perl-Pod-Perldoc-3.20-4.el7.noarch
--> Processing Dependency: perl(HTTP::Tiny) for package: perl-Pod-Perldoc-3.20-4.el7.noarch
--> Processing Dependency: groff-base for package: perl-Pod-Perldoc-3.20-4.el7.noarch
---> Package perl-podlators.noarch 0:2.5.1-3.el7 will be installed
--> Running transaction check
---> Package groff-base.x86_64 0:1.22.2-8.el7 will be installed
---> Package perl-HTTP-Tiny.noarch 0:0.033-3.el7 will be installed
---> Package perl-parent.noarch 1:0.225-244.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                    Arch       Version                Repository   Size
================================================================================
Installing:
 vim-enhanced               x86_64     2:7.4.629-8.el7_9      updates     1.1 M
Installing for dependencies:
 gpm-libs                   x86_64     1.20.7-6.el7           base         32 k
 groff-base                 x86_64     1.22.2-8.el7           base        942 k
 perl                       x86_64     4:5.16.3-299.el7_9     updates     8.0 M
 perl-Carp                  noarch     1.26-244.el7           base         19 k
 perl-Encode                x86_64     2.51-7.el7             base        1.5 M
 perl-Exporter              noarch     5.68-3.el7             base         28 k
 perl-File-Path             noarch     2.09-2.el7             base         26 k
 perl-File-Temp             noarch     0.23.01-3.el7          base         56 k
 perl-Filter                x86_64     1.49-3.el7             base         76 k
 perl-Getopt-Long           noarch     2.40-3.el7             base         56 k
 perl-HTTP-Tiny             noarch     0.033-3.el7            base         38 k
 perl-PathTools             x86_64     3.40-5.el7             base         82 k
 perl-Pod-Escapes           noarch     1:1.04-299.el7_9       updates      52 k
 perl-Pod-Perldoc           noarch     3.20-4.el7             base         87 k
 perl-Pod-Simple            noarch     1:3.28-4.el7           base        216 k
 perl-Pod-Usage             noarch     1.63-3.el7             base         27 k
 perl-Scalar-List-Utils     x86_64     1.27-248.el7           base         36 k
 perl-Socket                x86_64     2.010-5.el7            base         49 k
 perl-Storable              x86_64     2.45-3.el7             base         77 k
 perl-Text-ParseWords       noarch     3.29-4.el7             base         14 k
 perl-Time-HiRes            x86_64     4:1.9725-3.el7         base         45 k
 perl-Time-Local            noarch     1.2300-2.el7           base         24 k
 perl-constant              noarch     1.27-2.el7             base         19 k
 perl-libs                  x86_64     4:5.16.3-299.el7_9     updates     690 k
 perl-macros                x86_64     4:5.16.3-299.el7_9     updates      44 k
 perl-parent                noarch     1:0.225-244.el7        base         12 k
 perl-podlators             noarch     2.5.1-3.el7            base        112 k
 perl-threads               x86_64     1.87-4.el7             base         49 k
 perl-threads-shared        x86_64     1.43-6.el7             base         39 k
 vim-common                 x86_64     2:7.4.629-8.el7_9      updates     5.9 M
 vim-filesystem             x86_64     2:7.4.629-8.el7_9      updates      11 k
 which                      x86_64     2.20-7.el7             base         41 k

Transaction Summary
================================================================================
Install  1 Package (+32 Dependent packages)

Total download size: 19 M
Installed size: 63 M
Downloading packages:
--------------------------------------------------------------------------------
Total                                               29 MB/s |  19 MB  00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : gpm-libs-1.20.7-6.el7.x86_64                                1/33
  Installing : 2:vim-filesystem-7.4.629-8.el7_9.x86_64                     2/33
  Installing : 2:vim-common-7.4.629-8.el7_9.x86_64                         3/33
  Installing : which-2.20-7.el7.x86_64                                     4/33
install-info: No such file or directory for /usr/share/info/which.info.gz
  Installing : groff-base-1.22.2-8.el7.x86_64                              5/33
  Installing : 1:perl-parent-0.225-244.el7.noarch                          6/33
  Installing : perl-HTTP-Tiny-0.033-3.el7.noarch                           7/33
  Installing : perl-podlators-2.5.1-3.el7.noarch                           8/33
  Installing : perl-Pod-Perldoc-3.20-4.el7.noarch                          9/33
  Installing : 1:perl-Pod-Escapes-1.04-299.el7_9.noarch                   10/33
  Installing : perl-Encode-2.51-7.el7.x86_64                              11/33
  Installing : perl-Text-ParseWords-3.29-4.el7.noarch                     12/33
  Installing : perl-Pod-Usage-1.63-3.el7.noarch                           13/33
  Installing : 4:perl-macros-5.16.3-299.el7_9.x86_64                      14/33
  Installing : perl-Storable-2.45-3.el7.x86_64                            15/33
  Installing : perl-Exporter-5.68-3.el7.noarch                            16/33
  Installing : perl-constant-1.27-2.el7.noarch                            17/33
  Installing : perl-Socket-2.010-5.el7.x86_64                             18/33
  Installing : perl-Time-Local-1.2300-2.el7.noarch                        19/33
  Installing : perl-Carp-1.26-244.el7.noarch                              20/33
  Installing : perl-PathTools-3.40-5.el7.x86_64                           21/33
  Installing : perl-Scalar-List-Utils-1.27-248.el7.x86_64                 22/33
  Installing : 1:perl-Pod-Simple-3.28-4.el7.noarch                        23/33
  Installing : perl-File-Temp-0.23.01-3.el7.noarch                        24/33
  Installing : perl-File-Path-2.09-2.el7.noarch                           25/33
  Installing : perl-threads-shared-1.43-6.el7.x86_64                      26/33
  Installing : perl-threads-1.87-4.el7.x86_64                             27/33
  Installing : 4:perl-Time-HiRes-1.9725-3.el7.x86_64                      28/33
  Installing : perl-Filter-1.49-3.el7.x86_64                              29/33
  Installing : 4:perl-libs-5.16.3-299.el7_9.x86_64                        30/33
  Installing : perl-Getopt-Long-2.40-3.el7.noarch                         31/33
  Installing : 4:perl-5.16.3-299.el7_9.x86_64                             32/33
  Installing : 2:vim-enhanced-7.4.629-8.el7_9.x86_64                      33/33
  Verifying  : perl-HTTP-Tiny-0.033-3.el7.noarch                           1/33
  Verifying  : perl-threads-shared-1.43-6.el7.x86_64                       2/33
  Verifying  : perl-Storable-2.45-3.el7.x86_64                             3/33
  Verifying  : groff-base-1.22.2-8.el7.x86_64                              4/33
  Verifying  : perl-Exporter-5.68-3.el7.noarch                             5/33
  Verifying  : perl-constant-1.27-2.el7.noarch                             6/33
  Verifying  : perl-PathTools-3.40-5.el7.x86_64                            7/33
  Verifying  : 4:perl-macros-5.16.3-299.el7_9.x86_64                       8/33
  Verifying  : 2:vim-enhanced-7.4.629-8.el7_9.x86_64                       9/33
  Verifying  : 1:perl-parent-0.225-244.el7.noarch                         10/33
  Verifying  : perl-Socket-2.010-5.el7.x86_64                             11/33
  Verifying  : which-2.20-7.el7.x86_64                                    12/33
  Verifying  : 2:vim-filesystem-7.4.629-8.el7_9.x86_64                    13/33
  Verifying  : perl-File-Temp-0.23.01-3.el7.noarch                        14/33
  Verifying  : 1:perl-Pod-Simple-3.28-4.el7.noarch                        15/33
  Verifying  : perl-Time-Local-1.2300-2.el7.noarch                        16/33
  Verifying  : 1:perl-Pod-Escapes-1.04-299.el7_9.noarch                   17/33
  Verifying  : perl-Carp-1.26-244.el7.noarch                              18/33
  Verifying  : 2:vim-common-7.4.629-8.el7_9.x86_64                        19/33
  Verifying  : perl-Scalar-List-Utils-1.27-248.el7.x86_64                 20/33
  Verifying  : perl-Pod-Usage-1.63-3.el7.noarch                           21/33
  Verifying  : perl-Encode-2.51-7.el7.x86_64                              22/33
  Verifying  : perl-Pod-Perldoc-3.20-4.el7.noarch                         23/33
  Verifying  : perl-podlators-2.5.1-3.el7.noarch                          24/33
  Verifying  : 4:perl-5.16.3-299.el7_9.x86_64                             25/33
  Verifying  : perl-File-Path-2.09-2.el7.noarch                           26/33
  Verifying  : perl-threads-1.87-4.el7.x86_64                             27/33
  Verifying  : 4:perl-Time-HiRes-1.9725-3.el7.x86_64                      28/33
  Verifying  : gpm-libs-1.20.7-6.el7.x86_64                               29/33
  Verifying  : perl-Filter-1.49-3.el7.x86_64                              30/33
  Verifying  : perl-Getopt-Long-2.40-3.el7.noarch                         31/33
  Verifying  : perl-Text-ParseWords-3.29-4.el7.noarch                     32/33
  Verifying  : 4:perl-libs-5.16.3-299.el7_9.x86_64                        33/33

Installed:
  vim-enhanced.x86_64 2:7.4.629-8.el7_9

Dependency Installed:
  gpm-libs.x86_64 0:1.20.7-6.el7
  groff-base.x86_64 0:1.22.2-8.el7
  perl.x86_64 4:5.16.3-299.el7_9
  perl-Carp.noarch 0:1.26-244.el7
  perl-Encode.x86_64 0:2.51-7.el7
  perl-Exporter.noarch 0:5.68-3.el7
  perl-File-Path.noarch 0:2.09-2.el7
  perl-File-Temp.noarch 0:0.23.01-3.el7
  perl-Filter.x86_64 0:1.49-3.el7
  perl-Getopt-Long.noarch 0:2.40-3.el7
  perl-HTTP-Tiny.noarch 0:0.033-3.el7
  perl-PathTools.x86_64 0:3.40-5.el7
  perl-Pod-Escapes.noarch 1:1.04-299.el7_9
  perl-Pod-Perldoc.noarch 0:3.20-4.el7
  perl-Pod-Simple.noarch 1:3.28-4.el7
  perl-Pod-Usage.noarch 0:1.63-3.el7
  perl-Scalar-List-Utils.x86_64 0:1.27-248.el7
  perl-Socket.x86_64 0:2.010-5.el7
  perl-Storable.x86_64 0:2.45-3.el7
  perl-Text-ParseWords.noarch 0:3.29-4.el7
  perl-Time-HiRes.x86_64 4:1.9725-3.el7
  perl-Time-Local.noarch 0:1.2300-2.el7
  perl-constant.noarch 0:1.27-2.el7
  perl-libs.x86_64 4:5.16.3-299.el7_9
  perl-macros.x86_64 4:5.16.3-299.el7_9
  perl-parent.noarch 1:0.225-244.el7
  perl-podlators.noarch 0:2.5.1-3.el7
  perl-threads.x86_64 0:1.87-4.el7
  perl-threads-shared.x86_64 0:1.43-6.el7
  vim-common.x86_64 2:7.4.629-8.el7_9
  vim-filesystem.x86_64 2:7.4.629-8.el7_9
  which.x86_64 0:2.20-7.el7

Complete!
Removing intermediate container 9f389ccf9afc
 ---> f16467a9ac16
Step 6/10 : RUN yum -y install net-tools --nogpgcheck
 ---> Running in dfadc031beec
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package net-tools.x86_64 0:2.0-0.25.20131004git.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package         Arch         Version                          Repository  Size
================================================================================
Installing:
 net-tools       x86_64       2.0-0.25.20131004git.el7         base       306 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 306 k
Installed size: 917 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : net-tools-2.0-0.25.20131004git.el7.x86_64                    1/1
  Verifying  : net-tools-2.0-0.25.20131004git.el7.x86_64                    1/1

Installed:
  net-tools.x86_64 0:2.0-0.25.20131004git.el7

Complete!
Removing intermediate container dfadc031beec
 ---> 14ec163c70a4
Step 7/10 : EXPOSE 80
 ---> Running in f33e6a3fb239
Removing intermediate container f33e6a3fb239
 ---> dd6c7adc8d4e
Step 8/10 : CMD echo $MYPATH
 ---> Running in 17bac206eb84
Removing intermediate container 17bac206eb84
 ---> 4d9c36fb2c0b
Step 9/10 : CMD echo --end---"
 ---> Running in 98461083f3bd
Removing intermediate container 98461083f3bd
 ---> dab7e40c9163
Step 10/10 : CMD /bin/bash
 ---> Running in 9c94aa822f8d
Removing intermediate container 9c94aa822f8d
 ---> 957dcf8bdbb5
Successfully built 957dcf8bdbb5
Successfully tagged mycentos-file:1.0
  1. 运行

docker run -it 新镜像名字:TAG

Removing intermediate container 9c94aa822f8d
 ---> 957dcf8bdbb5
# 镜像ID 
Successfully built 957dcf8bdbb5
Successfully tagged mycentos-file:1.0
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
mycentos-file         1.0       957dcf8bdbb5   10 minutes ago   580MB

[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# docker run -it mycentos-file:1.0
[root@09d169d1dd0a local]# pwd
/usr/local
#net-tools工具提供ifconfig命令
[root@09d169d1dd0a local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.9  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:09  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  1. 查看镜像的构建步骤

docker history 镜像id

[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# docker history 957dcf8bdbb5
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
957dcf8bdbb5   14 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B
dab7e40c9163   14 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
4d9c36fb2c0b   14 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
dd6c7adc8d4e   14 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B
14ec163c70a4   14 minutes ago   /bin/sh -c yum -y install net-tools --nogpgc…   161MB
f16467a9ac16   14 minutes ago   /bin/sh -c yum -y install vim --nogpgcheck      216MB
17da3c2aa195   14 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local            0B
669dccfc4948   14 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B
329ed2d5f69b   14 minutes ago   /bin/sh -c #(nop)  MAINTAINER fico<1111111@q…   0B
eeb6ee3f44bd   6 months ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      6 months ago     /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>      6 months ago     /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB

- 制作Tomcat镜像并发布

  1. 准备镜像文件tomcat、jdk压缩包
[root@iZ2zef4kmo4v6a3s72p6qfZ tomcat]# ll
总用量 191536
-rw-r--r-- 1 root root  10577344 44 16:50 apache-tomcat-8.5.78.tar.gz
-rw-r--r-- 1 root root       637 44 16:51 Dockerfile
-rw-r--r-- 1 root root 185540433 44 16:50 jdk-linux-x64.tar.gz
-rw-r--r-- 1 root root        13 44 15:36 readme.txt
drwxr-xr-x 2 root root      4096 44 16:55 test

# 编写dockerfile文件,文件名使用官方命名:Dockerfile ,
# build的时候会默认寻找当前目录下的文件,不需要使用-f参数指定
[root@iZ2zef4kmo4v6a3s72p6qfZ tomcat]# cat Dockerfile
FROM centos:centos7
MAINTAINER fico<11111111@qq.com>
#把宿主机当前上下文的read.txt拷贝到容器/usr/local/路径下
COPY readme.txt /usr/local/readme.txt
#把java与tomcat添加到容器中
ADD jdk-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.78.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_131
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.78
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.78
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat 
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.22/bin/startup.sh" ] 
# CMD ["/usr/local/apache-tomcat-9.0.22/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-8.5.78/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.78/bin/logs/catalina.out
  1. 构建镜像 Dockerfile
docker build -t diytomcat:1.0 .
  1. 启动生成的镜像,构建Tomcat容器.

设置了数据卷,宿主机的/home/dockerfile/tomcat/test对应该容器的/usr/local/apache-tomcat-8.5.55/webapps/test。这样关于test项目的修复只需要在宿主机上修改就可以了,不需要进入到容器中修改。

docker run -d -p 8088:8080 --name diytomcat -v /home/tomcat/test:/usr/local/apache-tomcat-8.5.78/webapps/test diytomcat:1.0
  1. 测试及访问

在/home/tomcat/test的目录下,新建index.html 测试Tomcat是否能正常使用;

<!DOCTYPE html>
<html>
    <head>
         <meta charset="UTF-8"/>
        <title>这是个标题</title>
    </head>
    <body>
        <h1>这是一个一个简单的HTML</h1>
        <p>Hello World!</p>
    </body>
</html>

- CMD和ENTRYPOINT的区别

  • CMD:Dockerfile 中可以有多个CMD 指令,但只有最后一个生效CMD 会被 docker run 之后的参数替换!
  • ENTRYPOINT: docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合!

cmd命令

# 1、构建dockerfile
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]#  vim dockerfile-cmd-test
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# cat dockerfile-cmd-test
FROM centos:centos7
CMD [ "ls", "-a" ]
# 2、build 镜像
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# docker build -f dockerfile-cmd-test -t cmdtest .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos:centos7
 ---> eeb6ee3f44bd
Step 2/2 : CMD [ "ls", "-a" ]
 ---> Running in 60544b0e6cc9
Removing intermediate container 60544b0e6cc9
 ---> d9a3f76a0e36
Successfully built d9a3f76a0e36
Successfully tagged cmdtest:latest
# 3、执行
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# docker run d9a3f76a0e36
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
......
# 4、如果希望用 -l 列表展示信息,就需要加上 -l参数
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# docker run cmdtest -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
# 问题:我们可以看到可执行文件找不到的报错,executable file not found。 
# 之前我们说过,跟在镜像名后面的是 command,运行时会替换 CMD 的默认值。 # 因此这里的 -l 替换了原来的 CMD,而不是添加在原来的 ls -a 后面。
# 而 -l 根本不是命令,所 以自然找不到。 
# 那么如果我们希望加入 -l 这参数,我们就必须重新完整的输入这个命令:
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# docker run cmdtest ls -al
total 64
drwxr-xr-x   1 root root  4096 Apr  4 06:52 .
drwxr-xr-x   1 root root  4096 Apr  4 06:52 ..
-rwxr-xr-x   1 root root     0 Apr  4 06:52 .dockerenv
-rw-r--r--   1 root root 12114 Nov 13  2020 anaconda-post.log
lrwxrwxrwx   1 root root     7 Nov 13  2020 bin -> usr/bin
drwxr-xr-x   5 root root   340 Apr  4 06:52 dev
drwxr-xr-x   1 root root  4096 Apr  4 06:52 etc
......

ENTRYPOINT命令

# 1、构建dockerfile
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]#  vim dockerfile-entrypoint-test
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# cat dockerfile-entrypoint-test
FROM centos:centos7
ENTRYPOINT [ "ls", "-a" ]
# 2、build 镜像
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]#  docker build -f dockerfile-entrypoint-test -t entrypointtest .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos:centos7
 ---> eeb6ee3f44bd
Step 2/2 : ENTRYPOINT [ "ls", "-a" ]
 ---> Running in 1d0e23fcd7b8
Removing intermediate container 1d0e23fcd7b8
 ---> 23f15868c669
Successfully built 23f15868c669
Successfully tagged entrypointtest:latest
# 3、执行
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# docker run 23f15868c669
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
......
# 4、测试-l参数,发现可以直接使用,
# 这里就是一种追加,明显的知道 CMD 和 ENTRYPOINT 的区别了
[root@iZ2zef4kmo4v6a3s72p6qfZ dockerfile-test]# docker run entrypointtest -l
total 64
drwxr-xr-x   1 root root  4096 Apr  4 06:59 .
drwxr-xr-x   1 root root  4096 Apr  4 06:59 ..
-rwxr-xr-x   1 root root     0 Apr  4 06:59 .dockerenv
-rw-r--r--   1 root root 12114 Nov 13  2020 anaconda-post.log
lrwxrwxrwx   1 root root     7 Nov 13  2020 bin -> usr/bin
drwxr-xr-x   5 root root   340 Apr  4 06:59 dev
drwxr-xr-x   1 root root  4096 Apr  4 06:59 etc
......
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44748605/article/details/123941932

智能推荐

JavaScript学习笔记_curry函数未定义-程序员宅基地

文章浏览阅读343次。五种原始的变量类型1.Undefined--未定义类型 例:var v;2.String -- ' '或" "3.Boolean4.Number5.Null--空类型 例: var v=null;Number中:NaN -- not a number非数本身是一个数字,但是它和任何数字都不相等,代表非数,它和自己都不相等判断是不是NaN不能用=_curry函数未定义

兑换码编码方案实践_优惠券编码规则-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏17次。兑换码编码设计当前各个业务系统,只要涉及到产品销售,就离不开大大小小的运营活动需求,其中最普遍的就是兑换码需求,无论是线下活动或者是线上活动,都能起到良好的宣传效果。兑换码:由一系列字符组成,每一个兑换码对应系统中的一组信息,可以是优惠信息(优惠券),也可以是相关奖品信息。在实际的运营活动中,要求兑换码是唯一的,每一个兑换码对应一个优惠信息,而且需求量往往比较大(实际上的需求只有预期_优惠券编码规则

c语言周林答案,C语言程序设计实训教程教学课件作者周林ch04结构化程序设计课件.ppt...-程序员宅基地

文章浏览阅读45次。C语言程序设计实训教程教学课件作者周林ch04结构化程序设计课件.ppt* * 4.1 选择结构程序设计 4.2 循环结构程序设计 4.3 辅助控制语句 第四章 结构化程序设计 4.1 选择结构程序设计 在现实生活中,需要进行判断和选择的情况是很多的: 如果你在家,我去拜访你 如果考试不及格,要补考 如果遇到红灯,要停车等待 第四章 结构化程序设计 在现实生活中,需要进行判断和选择的情况..._在现实生活中遇到过条件判断的问

幻数使用说明_ioctl-number.txt幻数说明-程序员宅基地

文章浏览阅读999次。幻数使用说明 在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程序员自己的事情。 因为设备都是特定的,这里也没法说。关键在于怎样组织命令码,因为在ioctl中命令码是唯一联系用户程序命令和驱动程序支持的途径 。 命令码的组织是有一些讲究的,因为我们一定要做到命令和设备是一一对应的,利_ioctl-number.txt幻数说明

ORB-SLAM3 + VScode:检测到 #include 错误。请更新 includePath。已为此翻译单元禁用波浪曲线_orb-slam3 include <system.h> 报错-程序员宅基地

文章浏览阅读399次。键盘按下“Shift+Ctrl+p” 输入: C++Configurations,选择JSON界面做如下改动:1.首先把 “/usr/include”,放在最前2.查看C++路径,终端输入gcc -v -E -x c++ - /usr/include/c++/5 /usr/include/x86_64-linux-gnu/c++/5 /usr/include/c++/5/backward /usr/lib/gcc/x86_64-linux-gnu/5/include /usr/local/_orb-slam3 include 报错

「Sqlserver」数据分析师有理由爱Sqlserver之十-Sqlserver自动化篇-程序员宅基地

文章浏览阅读129次。本系列的最后一篇,因未有精力写更多的入门教程,上篇已经抛出书单,有兴趣的朋友可阅读好书来成长,此系列主讲有理由爱Sqlserver的论证性文章,希望读者们看完后,可自行做出判断,Sqlserver是否真的合适自己,目的已达成。渴望自动化及使用场景笔者所最能接触到的群体为Excel、PowerBI用户群体,在Excel中,我们知道可以使用VBA、VSTO来给Excel带来自动化操作..._sqlsever 数据分析

随便推点

智慧校园智慧教育大数据平台(教育大脑)项目建设方案PPT_高校智慧大脑-程序员宅基地

文章浏览阅读294次,点赞6次,收藏4次。教育智脑)建立学校的全连接中台,对学校运营过程中的数据进行处理和标准化管理,挖掘数据的价值。能:一、原先孤立的系统聚合到一个统一的平台,实现单点登录,统一身份认证,方便管理;三、数据共享,盘活了教育大数据资源,通过对外提供数。的方式构建教育的通用服务能力平台,支撑教育核心服务能力的沉淀和共享。物联网将学校的各要素(人、机、料、法、环、测)全面互联,数据实时。智慧校园解决方案,赋能教学、管理和服务升级,智慧教育体系,该数据平台具有以下几大功。教育大数据平台底座:教育智脑。教育大数据平台,以中国联通。_高校智慧大脑

编程5大算法总结--概念加实例_算法概念实例-程序员宅基地

文章浏览阅读9.5k次,点赞2次,收藏27次。分治法,动态规划法,贪心算法这三者之间有类似之处,比如都需要将问题划分为一个个子问题,然后通过解决这些子问题来解决最终问题。但其实这三者之间的区别还是蛮大的。贪心是则可看成是链式结构回溯和分支界限为穷举式的搜索,其思想的差异是深度优先和广度优先一:分治算法一、基本概念在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两_算法概念实例

随笔—醒悟篇之考研调剂_考研调剂抑郁-程序员宅基地

文章浏览阅读5.6k次。考研篇emmmmm,这是我随笔篇章的第二更,原本计划是在中秋放假期间写好的,但是放假的时候被安排写一下单例模式,做了俩机试题目,还刷了下PAT的东西,emmmmm,最主要的还是因为我浪的很开心,没空出时间来写写东西。  距离我考研结束已经快两年了,距离今年的考研还有90天左右。  趁着这个机会回忆一下青春,这一篇会写的比较有趣,好玩,纯粹是为了记录一下当年考研中发生的有趣的事。  首先介绍..._考研调剂抑郁

SpringMVC_class org.springframework.web.filter.characterenco-程序员宅基地

文章浏览阅读438次。SpringMVC文章目录SpringMVC1、SpringMVC简介1.1 什么是MVC1.2 什么是SpringMVC1.3 SpringMVC的特点2、HelloWorld2.1 开发环境2.2 创建maven工程a>添加web模块b>打包方式:warc>引入依赖2.3 配置web.xml2.4 创建请求控制器2.5 创建SpringMVC的配置文件2.6 测试Helloworld2.7 总结3、@RequestMapping注解3.1 @RequestMapping注解的功能3._class org.springframework.web.filter.characterencodingfilter is not a jakart

gdb: Don‘t know how to run. Try “help target“._don't know how to run. try "help target".-程序员宅基地

文章浏览阅读4.9k次。gdb 远程调试的一个问题:Don't know how to run. Try "help target".它在抱怨不知道怎么跑,目标是什么. 你需要为它指定target remote 或target extended-remote例如:target extended-remote 192.168.1.136:1234指明target 是某IP的某端口完整示例如下:targ..._don't know how to run. try "help target".

c语言程序设计教程 郭浩志,C语言程序设计教程答案杨路明郭浩志-程序员宅基地

文章浏览阅读85次。习题 11、算法描述主要是用两种基本方法:第一是自然语言描述,第二是使用专用工具进行算法描述2、c 语言程序的结构如下:1、c 语言程序由函数组成,每个程序必须具有一个 main 函数作为程序的主控函数。2、“/*“与“*/“之间的内容构成 c 语言程序的注释部分。3、用预处理命令#include 可以包含有关文件的信息。4、大小写字母在 c 语言中是有区别的。5、除 main 函数和标准库函数以..._c语言语法0x1e