常用命令拓展
后台启动容器 -d
# 如果这个容器里面没有前台进程、直接通过-d启动,就会退出。
[root@kuangshenlinux ~]# docker run -d centos
[root@kuangshenlinux ~]# docker run -d -it centos /bin/bash
[root@kuangshenlinux ~]# docker run -d -it centos /bin/bash
0e4a34338c611fd748ea6f7610b83e2fcfd68506d0c3b2b684f61746544bd7e6
[root@kuangshenlinux ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e4a34338c61 centos "/bin/bash" 4 seconds ago Up 3 seconds serene_margulis
查看日志 docker logs
# -c 可以输入一些 shell脚本来执行
[root@kuangshenlinux ~]# docker run -d centos /bin/sh -c "while true;do echo kuangshen;sleep 1;done"
bb07cc10ea857fea8c1d7e1ee6f4bbfb3d028e97553a9db184d5e6698cdd192b
[root@kuangshenlinux ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb07cc10ea85 centos "/bin/sh -c 'while t…" 2 seconds ago Up 2 seconds epic_shaw
0e4a34338c61 centos "/bin/bash" 3 minutes ago Up 3 minutes serene_margulis
#docker logs
# -t 打印 时间戳 -f 打印最新的日志
[root@kuangshenlinux ~]# docker logs -tf --tail 10 bb07cc10ea85
2023-12-09T12:14:03.034524461Z kuangshen
2023-12-09T12:14:04.043121537Z kuangshen
2023-12-09T12:14:05.048666087Z kuangshen
查看容器相关的进程 docker top
[root@kuangshenlinux ~]# docker top bb07
UID PID PPID C STIME TTY TIME CMD
root 13438 13417 0 20:13 ? 00:00:00 /bin/sh -c while true;do echo kuangshen;sleep 1;done
root 13617 13438 0 20:15 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
查看容器的元数据(inspect)
[root@kuangshenlinux ~]# docker inspect bb07
[
{
"Id": "bb07cc10ea857fea8c1d7e1ee6f4bbfb3d028e97553a9db184d5e6698cdd192b",
"Created": "2023-12-09T12:13:40.596173947Z",
"Path": "/bin/sh",
...........
}
进入一个正在执行的容器
docker exec -it 容器id /bin/bash
# 控制登录的shell,如果不控制的,会进入正在执行的容器终端中 attach
[root@kuangshenlinux ~]# docker exec -it bb07 /bin/bash
[root@bb07cc10ea85 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@bb07cc10ea85 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 12:13 ? 00:00:00 /bin/sh -c while true;do echo kuangshen;sleep 1;done
root 386 0 0 12:20 pts/0 00:00:00 /bin/bash
root 406 1 0 12:20 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 407 386 0 12:20 pts/0 00:00:00 ps -ef
# 进入容器正在执行的终端
[root@kuangshenlinux ~]# docker attach bb07
区别
exec 是在容器中打开新的终端,并且可以启动新的进程
attach 直接进入容器启动命令的终端,不会启动新的进程
拷贝容器内的文件到主机上 docker cp 容器id 容器内的文件 拷贝到容器外哪里
# docker cp 容器id:/home/xxxx 宿主机目录
[root@kuangshenlinux ~]# docker cp 87727d388e02:/home/service.go /root
Successfully copied 1.54kB to /root
[root@kuangshenlinux ~]# ls
anaconda-ks.cfg service.go
小结
常用命令
docker --help
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 # 截取容器停止时的退出状态值
练习安装 nginx
Docker 安装 nginx
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx
# 通过镜像启动容器
docker run nginx
# --name 给容器命名
# -p 3500<->80 端口映射: 本机端口:容器内端口
[root@kuangshenlinux ~]# docker run -d --name kuangshen-nginx -p 3500:80 nginx
aed9d461eaf9f68c17c5117a6514e1ae697aadc98790bf0e5ade8796a744b8dc
[root@kuangshenlinux ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aed9d461eaf9 nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second 0.0.0.0:3500->80/tcp, :::3500->80/tcp kuangshen-nginx
# 进入容器查看
# docker exec -it nginx /bin/bash
# whereis nginx
# /usr/share/nginx/html/index.html
docker 安装 tomcat
# 阿里云的tomcat最新精选,是没有主页的。404
root@kuangshenlinux ~]# docker pull tomcat
[root@kuangshenlinux ~]# docker run -d -p 8080:8080 --name tomcat-ali tomcat
docker 安装 es
# -p 可以同时暴露多个端口
# -e 环境配置,一般在镜像的文档中查看 hub.docker.com
[root@kuangshenlinux ~]# docker run -d --name elastaicsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
8425a8ac5781f6ed8a053901395d322c48f0c8bdd90f9a004a7e4055a44bb999
[root@kuangshenlinux ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8425a8ac5781 elasticsearch:7.6.2 "/usr/local/bin/dock…" 6 seconds ago Up 4 seconds 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp elastaicsearch
1cbe3e87f0b3 tomcat "catalina.sh run" 10 minutes ago Up 10 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat-ali
aed9d461eaf9 nginx "/docker-entrypoint.…" 17 minutes ago Up 15 minutes 0.0.0.0:3500->80/tcp, :::3500->80/tcp kuangshen-nginx
[root@kuangshenlinux ~]# curl localhost:9200
{
"name" : "8425a8ac5781",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "ADw_c37aT6iDvttknCZAMQ",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
概念
Docker镜像详解
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
别人给我们生成好的一个环境,或者项目
分层下载
[root@kuangshenlinux ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete
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.io/library/mysql:latest
docker inspect xxx
"RootFS": {
"Type": "layers",
// 镜像分层下载的片段
"Layers": [
"sha256:ad6b69b549193f81b039a1d478bc896f6e460c77c1849a4374ab95f9a3d2cea2",
"sha256:fba7b131c5c350d828ebea6ce6d52cdc751219c6287c4a7f13a51435b35eac06",
"sha256:0798f2528e8383f031ebd3c6d351f7d9f7731b3fd12007e5f2fdcdc4e1efc31a",
"sha256:a0c2a050fee24f87fde784c197a8b3eb66a3881b96ea261165ac1a01807ffb80",
"sha256:d7a777f6c3a4ded4667f61398eb1f9b380db07bf48876f64d93bf30fb1393f96",
"sha256:0d17fee8db40d61d9ca0d85bff8b32ef04bbd09d77e02cc67c454c8f84edb3d8",
"sha256:aad27784b7621a3e58bd03e5d798e505fb80b081a5070d7c822e41606b90a5c0",
"sha256:1d1f48e448f9b8abb9a2aad1e76d4746b69957882d1ddb9c11115302d45fcbbd",
"sha256:c654c2afcbba8c359565df63f6ecee333c9cc6abaeaa39838b05b4465a82758b",
"sha256:118fee5d988ac2057ab66d87bbebd1f18b865fb02a03ba0e23762af5b55b0bd5",
"sha256:fc8a043a3c7556d9abb4fad3aefa3ab6a5e1c02abda5f924f036c696687d094e",
"sha256:d67a9f3f65691979bc9e2b5ee0afcd4549c994f13e1a384ecf3e11f83d82d3f2"
]
},
理解:
所有的 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镜像加载原理
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?
对于一个精简的OS,rootfs 可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。
镜像commit
docker commit ,提交容器的副本,让这个容器产生一个新的镜像
-m="提交的信息"
-a="作者"
docker run -it tomcat
# 我们自己修改了阿里的tomcat的镜像
修改
docker exec -it 6305 /bin/bash
ls -l
cd webapps.dist/* webapps
cp -r webapps.dist/* webapps
提交
docker commit -a ="cheng" -m="tomcat" 6305 chengtomcat:1.0
docker inspect 进行查看
# 通过 commit 提交
修改提交以后的镜像分层:
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:11936051f93baf5a4fb090a8fa0999309b8173556f7826598e235e8a82127bce", /centos
"sha256:31892cc314cb1993ba1b8eb5f3002c4e9f099a9237af0d03d1893c6fcc559aab", /vim xxx
"sha256:8bf42db0de72f74f4ef0c1d1743f5d54efc3491ee38f4af6d914a6032148b78e", /java
"sha256:26a504e63be4c63395f216d70b1b8af52263a5289908df8e96a0e7c840813adc", /yumxx
"sha256:f9e18e59a5651609a1503ac17dcfc05856b5bea21e41595828471f02ad56a225", /xxxxxxx
"sha256:832e177bb5008934e2f5ed723247c04e1dd220d59a90ce32000b7c22bd9d9b54",
"sha256:3bb5258f46d2a511ddca2a4ec8f9091d676a116830a7f336815f02c4b34dbb23",
"sha256:59c516e5b6fafa2e6b63d76492702371ca008ade6e37d931089fe368385041a0",
"sha256:bd2befca2f7ef51f03b757caab549cc040a36143f3b7e3dab94fb308322f2953",
"sha256:3e2ed6847c7a081bd90ab8805efcb39a2933a807627eb7a4016728f881430f5f",
"sha256:488c81ac505f2256dca0152c6219731da237f1569fa5c6b6f627e8403af58131" /webapps/
]
},
原来的镜像分层:
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:11936051f93baf5a4fb090a8fa0999309b8173556f7826598e235e8a82127bce",
"sha256:31892cc314cb1993ba1b8eb5f3002c4e9f099a9237af0d03d1893c6fcc559aab",
"sha256:8bf42db0de72f74f4ef0c1d1743f5d54efc3491ee38f4af6d914a6032148b78e",
"sha256:26a504e63be4c63395f216d70b1b8af52263a5289908df8e96a0e7c840813adc",
"sha256:f9e18e59a5651609a1503ac17dcfc05856b5bea21e41595828471f02ad56a225",
"sha256:832e177bb5008934e2f5ed723247c04e1dd220d59a90ce32000b7c22bd9d9b54",
"sha256:3bb5258f46d2a511ddca2a4ec8f9091d676a116830a7f336815f02c4b34dbb23",
"sha256:59c516e5b6fafa2e6b63d76492702371ca008ade6e37d931089fe368385041a0",
"sha256:bd2befca2f7ef51f03b757caab549cc040a36143f3b7e3dab94fb308322f2953",
"sha256:3e2ed6847c7a081bd90ab8805efcb39a2933a807627eb7a4016728f881430f5f"
]
},
容器数据卷
什么是容器数据卷
docker的理念回顾:
将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化的!
就好比,你安装一个MySQL,结果你把容器删了,就相当于删库跑路了,这也太扯了吧!
所以我们希望容器之间有可能可以共享数据,Docker容器产生的数据,如果不通过docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了!这样是行不通的!
为了能保存数据在Docker中我们就可以使用卷!让数据挂载到我们本地!这样数据就不会因为容器删除而丢失了!
作用:
卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
1、数据卷可在容器之间共享或重用数据
2、卷中的更改可以直接生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止
所以:总结一句话: 就是容器的持久化,以及容器间的继承和数据共享!
使用数据卷
docker -v 宿主机目录:容器目录
# 自动创建对应的文件夹
docker run -it -v /home/ceshi:/root centos /bin/bash
删除容器以后,数据依旧存在!
容器再次重新启动挂载回来,容器内又可以使用这个数据了
安装mysql
docker run -d -p 3310: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
1、测试,创建数据库,新增数据
2、删除容器
3、启动容器,数据依旧存在。
Dockerfile挂载数据卷
DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本。
Dockerfile
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "---end---"
CMD /bin/bash
dokcer build 构建成一个镜像
-f 指定用哪个文件构建 -t 输出的镜像名 .
[root@kuangshenlinux ~]# docker build -f dockerfile1 -t xxb/centos
-v 本地目录
具名挂载、匿名挂载
# 指定目录挂载
-v 宿主机目录:容器内目录
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 匿名挂载的缺点,就是不好维护,通常使用命令 docker volume维护
docker volume ls
# 具名挂载
-v 卷名:/容器内路径
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx
数据卷容器
容器数据卷:容器的持久化
数据卷容器:容器,当做一个持久化的卷。
如果直接启动两个相同的容器,容器内的数据挂载不互通!
数据卷容器: 容器之间的数据是可以继承的(父-子)
# 在多个相同的容器中,如果想要共享数据,使用数据卷容器,将容器作为一个父数据卷
# 其他容器来挂载到我这个父卷下,就可以实现共享了
[root@kuangshenlinux ~]# docker run -it --name docker02 --volumes-from docker01 xxb/centos
[root@kuangshenlinux ~]# docker run -it --name docker03 --volumes-from docker01 xxb/centos
# 三个容器此时互通了
得出结论:
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
存储在本机的文件则会一直保留!