Docker 官网:http://www.docker.com
Docker 官网文档: https://docs.docker.com/get-started
Docker Hub官网: https://hub.docker.com
文章目录
- Docker 概述
- - Docker 历史
- - Docker 基本介绍
- - Docker 容器化 与 虚拟化
- - Docker 基本组成
- - Docker 容器运行原理
- Docker 安装
- - Docker 安装
- - Docker 阿里云镜像加速
- - Docker pull 原理
- Docker 常用命令
- - 基本/帮组命令
- - 镜像命令
- - 容器命令
- - 日志命令
- - 常用其他命令
- - PorTainer 图形化
- Docker 镜像
- - 是什么
- - Docker 镜像加载原理
- - 分层理解
- - 镜像commit
- Nginx 部署
- - 阿里云服务器配置安全组
- - 端口暴露的概念
- Tomcat 部署
- Es 部署
- Mysql 部署
- Docker 容器卷
- - 是什么
- - 使用数据卷
- 匿名挂载
- 具名挂载
- 指定目录挂载
- - MySQL容器建立数据卷同步数据
- - 其他命令
- - 数据卷容器
- DockerFile
- - 是什么
- - 构建过程
- - 指令说明
- - 制作Centos镜像
- - 制作Tomcat镜像并发布
- - CMD和ENTRYPOINT的区别
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):
- Docker 镜像(Image)就是一个只读的模板。
- 镜像可以用来创建 Docker 容器,一个镜像可以创建很 多容器。 就好似 Java 中的 类和对象,类就是镜像,容器就是对象!
- 容器(container):
- Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。
- 容器可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
- 把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等) 和运行在其中的应用程序。
- 容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
- 仓库(repository):
- 仓库(Repository)是集中存放镜像文件的场所。
- 仓库 (Repository) 和仓库注册服务器 (Registry) 是有区别的。仓库注册服务器上往往存放着多个仓 库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
- 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
- 最大的公开仓库是 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的安装与卸载:
- 卸载旧版本:
yum remove docker\
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装
yum
软件包:
yum install -y yum-utils
- 设置镜像的仓库:
# 国外
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 #国外的地址
- 更新
yum
软件包索引:
yum makecache fast
- 安装 Docker CE (即 社区版):
yum install docker-ce docker-ce-cli containerd.io
- 启动 Docker:
# 启动docker
systemctl start docker
# 查看当前版本号,是否启动成功
docker version
# 设置开机自启动
systemctl enable docker
# 测试命令---------------------
# 查看版本
docker version
# 拉去版本
docker run hello-world
# 查看镜像
docker images
- 安装
yum
软件包:
# 停止 docker
systemctl stop docker
# 移除docker 引擎
yum -y remove docker-ce docker-ce-cli containerd.io
# 删除docker默认工作路径文件夹
rm -rf /var/lib/docker
- Docker 阿里云镜像加速
- 配置文档地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
- 直接执行官方命令即可
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 部署
- 搜索并下载镜像
[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
- 运行测试
-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>
- 配置文件
进入容器,自定义配置文件
[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
- 安装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 部署
- 下载并运行
[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;}
......
- 进入镜像
阿里云镜像默认下载的是最小的镜像,保证最小的运行环境;
[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 部署
- 下载并运行
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 用户的密码。
- 进入容器查看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中我们就可以使用卷!让数据挂载到我们本地!这样数据就不会因为容器删除而丢失了!
作用:
- 卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System,提供一些用于持续存储或共享数据的特性:
- 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
- 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此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 4月 4 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
测试容器和宿主机之间数据共享:可以发现,在容器中,创建的会在宿主机中看到!
测试容器停止退出后,主机修改数据是否会同步!
- 停止容器
- 在宿主机上修改文件,增加些内容
- 启动刚才停止的容器
- 然后查看对应的文件,发现数据依旧同步!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 4月 4 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
- 其他命令
- 创建数据卷
docker volume create my-vol
- 查看所有的数据卷
docker volume ls
- 查看指定数据卷的信息
docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
- 删除数据卷 docker volume rm …
docker volume rm my-vol
- 删除容器之时删除相关的卷
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
- 使用 –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镜像
- 编写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
- 构建
# 注意
# -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
- 运行
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
- 查看镜像的构建步骤
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镜像并发布
- 准备镜像文件tomcat、jdk压缩包
[root@iZ2zef4kmo4v6a3s72p6qfZ tomcat]# ll
总用量 191536
-rw-r--r-- 1 root root 10577344 4月 4 16:50 apache-tomcat-8.5.78.tar.gz
-rw-r--r-- 1 root root 637 4月 4 16:51 Dockerfile
-rw-r--r-- 1 root root 185540433 4月 4 16:50 jdk-linux-x64.tar.gz
-rw-r--r-- 1 root root 13 4月 4 15:36 readme.txt
drwxr-xr-x 2 root root 4096 4月 4 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
- 构建镜像 Dockerfile
docker build -t diytomcat:1.0 .
- 启动生成的镜像,构建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
- 测试及访问
在/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
......