Docker常用命令及概念理解

常用命令拓展

后台启动容器 -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

# 三个容器此时互通了

得出结论:

容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。

存储在本机的文件则会一直保留!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值