Docker基础
Docker快速入门
概述
官网
容器较为官方的解释
一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。 (1)容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。 (2)容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行。 (3)容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
容器较为通俗的解释
如果需要通俗地描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用比如网站、程序甚至是系统环境。
Docker的基本组成

镜像(image)
Docker 镜像就是一个只读的模板。 镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。 它也相当于是一个 root 文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。 相当于容器的“源代码”,docker 镜像文件类似于 Java 的类模板,而 docker 容器实例类似于 java 中 new 出来的实例对象。 容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
容器(container)
可以把容器看做是一个简易版的 Linux 环境 (包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
仓库(repository)
仓库(Repository)是集中存放镜像文件的场所。 仓库分为公开仓库(Public)和私有仓库 (Private)两种形式。 最大的公开仓库是 Docker Hub(https://hub.docker.com/) 存放了数量庞大的镜像供用户下载。国内的公 开仓库包括阿里云 、网易云等。
Docker安装
桌面版:https://www.docker.com/products/docker-desktop 桌面版无脑下一步 服务器版:https://docs.docker.com/engine/install/#server
环境查看
查看系统内核
[root@Docker ~]# uname -r
3.10.0-862.el7.x86_64
查看系统配置
[root@Docker ~]# uname -r
3.10.0-862.el7.x86_64
[root@Docker ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
1.卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.下载需要的安装包
yum install -y yum-utils
3.设置镜像的仓库
设置阿里云的Docker镜像仓库
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新yum软件包索引
yum makecache fast
5.安装docker
docker-ce 是社区版,docker-ee 企业版
yum install docker-ce docker-ce-cli containerd.io
6.启动Docker
systemctl start docker
# 查看当前版本号,是否启动成功
docker version
# 设置开机自启动
systemctl enable docker

7.测试helloworld
docker run hello-world
查看下载的hello-world镜像
[root@Docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 11 months ago 13.3kB
卸载
# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除资源 . /var/lib/docker是docker的默认工作路径
rm -rf /var/lib/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://1z6kznch.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
百度docker加速:https://mirror.baidubce.com (因为中途碰到了,阿里云的加速失效)
Docker容器运行流程和原理
启动流程

底层原理
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!Docker Server接收到Docker-Client的指令,就会执行这个指令! Docker为什么比VM Ware快? 1、Docker比虚拟机更少的抽象层 2、Focker利用宿主机的内核,VM需要的是Guest OS
Docker新建一个容器的时候,不需要像虚拟机一样重新加载一个操作系统内核,直接利用宿主机的操作系统,而虚拟机是需要加载Guest OS。Docker和VM的对比如下:
Docker的常用命令
帮助命令
docker version #查看docker的版本信息
docker info #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令(可查看可选的参数)
帮助文档地址:https://docs.docker.com/engine/reference/commandline/docker/
镜像命令
docker images 查看本地主机的所有镜像
[root@Docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 11 months ago 13.3kB
#解释:
1.REPOSITORY 镜像的仓库源
2.TAG 镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小
# 可选参数
-a/--all 列出所有镜像
-q/--quiet 只显示镜像的id
docker search 搜索镜像
[root@Docker ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13051 [OK]
mariadb MariaDB Server is a high performing open sou… 4994 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 608 [OK]
percona Percona Server is a fork of the MySQL relati… 584 [OK]
bitnami/mysql Bitnami MySQL Docker Image 75 [OK]
linuxserver/mysql-workbench 42
linuxserver/mysql A Mysql container, brought to you by LinuxSe… 37
ubuntu/mysql MySQL open source fast, stable, multi-thread… 36
#可选参数
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
#搜索收藏数大于3000的镜像
[root@Docker ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13051 [OK]
mariadb MariaDB Server is a high performing open sou… 4994 [OK]
docker pull 镜像名[:tag] 下载镜像
[root@Docker ~]# docker pull mysql
Using default tag: latest #如果不写tag默认就是latest
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete #分层下载,docker image的核心-联合文件系统
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
6aa3859c4789: Pull complete
1ed875d851ef: Pull complete
Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #下载来源的真实地址 #docker pull mysql等价于docker pull docker.io/library/mysql:latest
#指定版本下载
[root@Docker ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 删除镜像
[root@Docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 8 months ago 448MB
mysql latest 3218b38490ce 8 months ago 516MB
hello-world latest feb5d9fea6a5 11 months ago 13.3kB
#1.删除指定的镜像id
[root@Docker ~]# docker rmi -f c20987f18b13
#2.删除多个镜像id
[root@Docker ~]# docker rmi -f 镜像id 镜像id
#3.删除全部的镜像id
[root@Docker ~]# docker rmi -f $(docker images -aq)
容器命令
有了镜像才可以创建容器,linux,下载一个 centos 镜像来测试
[root@Docker ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
启动并进入容器centos
docker run [可选参数] image
#参数说明
--name="Name" 指定容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口(小写)
-p ip:主机端口:容器端口 配置主机端口映射到容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口
-P 随机指定端口(大写的P)
[root@Docker ~]# docker run -it centos /bin/bash
[root@2da28ff98a79 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
退出容器
#exit 停止并退出容器(后台方式运行则仅退出)
#Ctrl+P+Q 不停止容器退出
[root@2da28ff98a79 /]# exit
exit
[root@Docker ~]#
列出运行过的容器命令
#docker ps
# 列出当前正在运行的容器
-a # 列出所有容器的运行记录
-n=? # 显示最近创建的n个容器
-q # 只显示容器的编号
[root@Docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@Docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2da28ff98a79 centos "/bin/bash" 2 minutes ago Exited (0) 43 seconds ago dreamy_tereshkova
bfcae6760fd7 feb5d9fea6a5 "/hello" 24 hours ago Exited (0) 24 hours ago silly_lamport
删除容器命令
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器命令
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前运行的容器
docker kill 容器id #强制停止当前容器
常用其他命令
后台启动容器
# docker run -d 镜像名
[root@Docker ~]# docker run -d centos
94486234de69d39323637b4dee9644ef020584a1bd6724711dd76a611833443b
# 问题docker ps,发现centos停止了
# 常见的坑,docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
[root@Docker ~]# 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)
# 常用:
docker logs -tf 容器id
docker logs --tail number 容器id #num为要显示的日志条数
# 写一段脚本
[root@Docker ~]# docker run -d centos /bin/sh -c "while true;do echo hello LiAng;sleep 1;done"
f2094529df58b3b7e6430755804af585953301e4727d8a50708ed09191bd36d4
[root@Docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2094529df58 centos "/bin/sh -c 'while t…" 26 seconds ago Up 25 seconds beautiful_chandrasekhar
# 显示日志
[root@Docker ~]# docker logs -tf --tail 10 f2094529df58
2022-08-22T10:15:00.205909998Z hello LiAng
2022-08-22T10:15:01.210752466Z hello LiAng
2022-08-22T10:15:02.216652316Z hello LiAng
2022-08-22T10:15:03.220693298Z hello LiAng
2022-08-22T10:15:04.224790923Z hello LiAng
2022-08-22T10:15:05.227797371Z hello LiAng
2022-08-22T10:15:06.230381579Z hello LiAng
2022-08-22T10:15:07.235376347Z hello LiAng
2022-08-22T10:15:08.237936467Z hello LiAng
2022-08-22T10:15:09.241725451Z hello LiAng
查看容器中进程信息
# 命令 docker top 容器id
[root@Docker ~]# docker top f2094529df58
UID PID PPID C STIME TTY
root 8258 8239 0 18:13 ?
root 8638 8258 0 18:17 ?
查看容器的元数据 [root@Docker ~]# docker inspect 容器id 进入当前正在运行的容器
# 通常我们的容器都是使用后台方式来运行的,有时需要进入容器修改配置
# docker exec -it 容器id bashShell
# 方式一
[root@Docker ~]# docker exec -it f2094529df58 /bin/bash
[root@f2094529df58 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys us
# 方式二
# docker attach 容器id
[root@Docker ~]# docker attach f2094529df58
docker exec 进入容器后开启一个新的终端,可以在里面操作 docker attach 进入容器正在执行的终端,不会启动新的进程 拷贝操作
#拷贝容器的文件到主机中
docker cp 容器id:容器内路径 目的主机路径
#拷贝宿主机的文件到容器中
docker cp 目的主机路径 容器id:容器内路径
[root@Docker home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
88577802c17c centos "/bin/bash" 43 seconds ago Up 42 seconds vigorous_jackson
[root@Docker home]# docker attach 88577802c17c
[root@88577802c17c /]# cd /home
[root@88577802c17c home]# touch test.java
[root@88577802c17c home]# ls
test.java
[root@88577802c17c home]# exit
exit
[root@Docker home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
88577802c17c centos "/bin/bash" About a minute ago Exited (0) 6 seconds ago vigorous_jackson
[root@Docker home]# docker cp 88577802c17c:/home/test.java /home
[root@Docker home]# ls
lzw test.java
小结

attach Attach to a running container #当前shell下attach连接指定运行镜像
build Build an image from a Dockerfile #通过Dockerfile定制镜像
commit Create a new image from a container's changes #提交当前容器为新的镜像
cp Copy files/folders from a container to a HOSTDIR or to STDOUT #从容器中拷贝指定文件或者目录到宿主机中
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 a running container#在已存在的容器上运行命令
export Export a container's filesystem as a tar archive #导出容器的内容流作为一个tar归档文件(对应import)
history Show the history of an image #展示一个镜像形成历史
images List images #列出系统当前镜像
import Import the contents from a tarball to create a filesystem image #从tar包中的内容创建一个新的文件系统映像(对应export)
info Display system-wide information #显示系统相关信息
inspect Return low-level information on a container or image #查看容器详细信息
kill Kill a running container #kill指定docker容器
load Load an image from a tar archive or STDIN #从一个tar包中加载一个镜像(对应save)
login Register or log in to a Docker registry#注册或者登陆一个docker源服务器
logout Log out from a Docker registry #从当前Docker registry退出
logs Fetch the logs of a container #输出当前容器日志信息
pause Pause all processes within a container#暂停容器
port List port mappings or a specific mapping for the CONTAINER #查看映射端口对应的容器内部源端口
ps List containers #列出容器列表
pull Pull an image or a repository from a registry #从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to a registry #推送指定镜像或者库镜像至docker源服务器
rename Rename a container #重命名容器
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(s) to a tar archive#保存一个镜像为一个tar包(对应load)
search Search the Docker Hub for images #在dockerhub中搜索镜像
start Start one or more stopped containers#启动容器
stats Display a live stream of container(s) resource usage statistics #统计容器使用资源
stop Stop a running container #停止容器
tag Tag an image into a repository #给源中镜像打标签
top Display the running processes of a container #查看容器中运行的进程信息
unpause Unpause all processes within a container #取消暂停容器
version Show the Docker version information#查看容器版本号
wait Block until a container stops, then print its exit code #截取容器停止时的退出状态值
作业
部署 Nginx
# 1.搜索镜像 search
# 2.下载镜像 pull
# 3.运行测试
[root@Docker home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 7 months ago 141MB
centos latest 5d0da3dc9764 11 months ago 231MB
# -d 后台运行
# --name 给容器命名
# p 宿主机端口,服务器内部端口
[root@Docker home]# docker run -d --name nginx01 -p 3344:80 nginx
70b82e2131d9143b32a86d66da4474829f0fd7ba4c4a72df0efaa6086bb8f14d
[root@Docker home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70b82e2131d9 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
[root@Docker home]# curl localhost:3344
。。。
<title>Welcome to nginx!</title>
。。。
# 进入容器
[root@Docker home]# docker exec -it nginx01 /bin/bash
root@70b82e2131d9:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@70b82e2131d9:/# cd /etc/nginx/
root@70b82e2131d9:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
# 停止
[root@Docker home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70b82e2131d9 nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
[root@Docker home]# docker stop 70b82e2131d9
70b82e2131d9

部署 Tomcat
# 官方的使用,用完直接删了
docker run -it --rm tomcat:9.0
# 之前启动的都是后台,停止了容器之后,容器还是可以查到
# 下载再启动
[root@Docker home]#docker pull tomcat
[root@Docker home]# docker run -d -p:3355:8080 --name tomcat01 tomcat
1a7527bc08536d45d3a4fe9b08ae3cab24f671e4aad135820935efbaf8effad5
# 测试访问没有问题
# 进入容器
[root@Docker home]# docker exec -it tomcat01 /bin/bash
# 发现问题:1.linux命令少了 2.没有webapps,阿里云镜像的原因,默认是最小的镜像,剔除了所有不必要的,保证最小可运行的环境
root@1a7527bc0853:/usr/local/tomcat# cd webapps.dist/
root@1a7527bc0853:/usr/local/tomcat/webapps.dist# ls
ROOT docs examples host-manager manager
root@1a7527bc0853:/usr/local/tomcat/webapps.dist# cd ..
root@1a7527bc0853:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@1a7527bc0853:/usr/local/tomcat# cd webapps
root@1a7527bc0853:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager

部署 ES+Kibana
# es 暴露端口很多
# es 十分的耗内存
# es 的数据一般需要放置到安全目录
图形化管理工具Portaniner安装
Portaniner是Docker的图形化管理工具,类似的工具还有Rancher(CI/CD再用)
[root@Docker home]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
选择本地的
可视化面板平时不会用
Docker镜像详解
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。
Docker镜像加载原理
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统是UnionFS联合文件系统。 UnionFS(联合文件系统) 联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。 特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。 镜像加载原理 Docker的镜像实际由一层一层的文件系统组成: bootfs(boot file system)主要包含bootloader和kernel。bootloader主要是引导加载kernel,完成后整个内核就都在内存中了。此时内存的使用权已由bootfs转交给内核,系统卸载bootfs。可以被不同的Linux发行版公用。 rootfs(root file system),包含典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同操作系统发行版(Ubuntu,Centos等)。因为底层直接用Host的kernel,rootfs只包含最基本的命令,工具和程序就可以了。
分层理解
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的容器层。 容器在启动时会在镜像最外层上建立一层可读写的容器层(R/W),而镜像层是只读的(R/O)。
[root@Docker ~]# docker image inspect nginx:latest
[
{
"Id": "sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85",
"RepoTags": [
"nginx:latest"
],
"RepoDigests": [
"nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31"
],
"Parent": "",
"Comment": "",
"Created": "2021-12-29T19:28:29.892199479Z",
"Container": "ca3e48389f7160bc9d9a892d316fcbba459344ee3679998739b1c3cd8e56f7da",
"ContainerConfig": {
"Hostname": "ca3e48389f71",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.21.5",
"NJS_VERSION=0.7.1",
"PKG_RELEASE=1~bullseye"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"nginx\" \"-g\" \"daemon off;\"]"
],
"Image": "sha256:82941edee2f4d17c55563bb926387c3ae39fa1a99777f088bc9d3db885192209",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"/docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGQUIT"
},
"DockerVersion": "20.10.7",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.21.5",
"NJS_VERSION=0.7.1",
"PKG_RELEASE=1~bullseye"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"Image": "sha256:82941edee2f4d17c55563bb926387c3ae39fa1a99777f088bc9d3db885192209",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"/docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGQUIT"
},
"Architecture": "amd64",
"Os": "linux",
"Size": 141479488,
"VirtualSize": 141479488,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/9fe36532c4ef89e370256237b29da9e21256e3dcc81b035b2af8b76d82dfd50a/diff:/var/lib/docker/overlay2/594f08c4cea02dab44191e30523376f613aeeae1774affc36334266db55c9831/diff:/var/lib/docker/overlay2/2e53c13382c6c71406cf75571935ac0ac27796916319dda47e54bf335b6b405b/diff:/var/lib/docker/overlay2/1c1c7286f6729e8d84f0e70a38c4f6e4beeb282364addd3742f73fd0ecc0360b/diff:/var/lib/docker/overlay2/8c1ada4337353740240b7969ab4193aba3388d620733245c11d7e6e438e5eecd/diff",
"MergedDir": "/var/lib/docker/overlay2/75c3c9d6ebc063d6e809227ead16b110db67be83925225b6cf4a086523515c1f/merged",
"UpperDir": "/var/lib/docker/overlay2/75c3c9d6ebc063d6e809227ead16b110db67be83925225b6cf4a086523515c1f/diff",
"WorkDir": "/var/lib/docker/overlay2/75c3c9d6ebc063d6e809227ead16b110db67be83925225b6cf4a086523515c1f/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
"sha256:e379e8aedd4d72bb4c529a4ca07a4e4d230b5a1d3f7a61bc80179e8f02421ad8",
"sha256:b8d6e692a25e11b0d32c5c3dd544b71b1085ddc1fddad08e68cbd7fda7f70221",
"sha256:f1db227348d0a5e0b99b15a096d930d1a69db7474a1847acbc31f05e4ef8df8c",
"sha256:32ce5f6a5106cc637d09a98289782edf47c32cb082dc475dd47cbf19a4f866da",
"sha256:d874fd2bc83bb3322b566df739681fbd2248c58d3369cb25908d68e7ed6040a6"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
特点 Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部! 这一层就是我们通常说的容器层,容器之下的都叫镜像层!
提交镜像
# 使用docker commit 命令提交容器成为一个新的版本
docker commit -m=“提交的描述信息” -a="作者" 容器id 目标镜像名:[TAG]
# 启动默认的tomcat
[root@Docker ~]# docker run -it -p 8080:8080 tomcat
# 由于默认的Tomcat镜像的webapps文件夹中没有任何内容,需要从webapps.dist中拷贝文件到webapps文件夹。下面自行制作镜像:就是从webapps.dist中拷贝文件到webapps文件夹下,并提交该镜像作为一个新的镜像。使得该镜像默认的webapps文件夹下就有文件。具体命令如下:
[root@Docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7fc74a6136a tomcat "catalina.sh run" 29 seconds ago Up 28 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp strange_rosalind
[root@Docker ~]# docker exec -it a7fc74a6136a /bin/bash
root@a7fc74a6136a:/usr/local/tomcat# cd webapps
root@a7fc74a6136a:/usr/local/tomcat/webapps# ls
root@a7fc74a6136a:/usr/local/tomcat/webapps# cd ..
root@a7fc74a6136a:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@a7fc74a6136a:/usr/local/tomcat# webapps.dist/* webapps
bash: webapps.dist/ROOT: Is a directory
root@a7fc74a6136a:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@a7fc74a6136a:/usr/local/tomcat# cd webapps
root@a7fc74a6136a:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
root@a7fc74a6136a:/usr/local/tomcat/webapps# exit
exit
[root@Docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7fc74a6136a tomcat "catalina.sh run" 4 minutes ago Up 4 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp strange_rosalind
# 提交镜像作为一个新的镜像
[root@Docker ~]# docker commit -a="LiAng" -m="add webapps app" a7fc74a6136a tomcat02:1.0
sha256:9f5f1bde2bf08d0f342f20953f320bbf67f894384f159cf252574efc7611ff59
