天天看點

容器的建立過程及docker常用指令整理

作者:技術怪圈

寫在文章最前:

通篇文檔比較長,建議收藏以便以後慢慢翻閱

文章裡所有涉及的指令請勿在生産環境裡做測試。

1、容器的建立過程

通信流程:

容器的建立過程及docker常用指令整理

通信過程

1.1 dockerd 通過 grpc 和 containerd 子產品通信(runc)交換,dockerd 和 containerd通信的 socket 檔案:

/run/containerd/containerd.sock           

1.2 containerd 在 dockerd 啟動時被啟動,然後 containerd 啟動 grpc 請求監聽,containerd 處理 grpc 請求,根據請求做相應動作。

/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock           

1.3 若是建立容器,containerd 拉起一個 container-shim 容器程序 , 并進行相應的建立操作。

1.4 container-shim 被拉起後,start/exec/create 拉起 runC 程序,通過 exit、control檔案和 containerd 通信,通過父子程序關系和 SIGCHLD(信号)監控容器中程序狀态。

1.5 在整個容器生命周期中,containerd 通過 epoll 監控容器檔案,監控容器事件。

gRPC 是 Google 開發的一款高性能、開源和通用的 RPC 架構,支援衆多語言用戶端。

容器的建立過程及docker常用指令整理

gRPC

容器的生命周期

1.檢查本地是否存在鏡像,如果不存在即從遠端倉庫檢索
2.利用鏡像啟動容器
3.配置設定一個檔案系統,并在隻讀的鏡像層外挂載一層可讀寫層
4.從主控端的網橋接口中橋接一個虛拟接口到容器
5.從位址池配置一個IP地塊給容器
6.執行使用者指定的指令
7.執行完畢後容器終止           

2、docker管理常用的指令整理

2.1 建立第一個鏡像

~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

 容器啟動過程四個步驟
1. Docker用戶端聯系Docker服務端。
2. Docker服務端從Docker中心拉取“hello-world”映像。
3. Docker服務端(用新拉的鏡像)建立了一個新的容器,該容器運作可執行檔案(腳本),
生成您目前讀取的輸出。
4. Docker服務端将資訊流推到Docker用戶端,由用戶端展示在你的終端。           

2.2 鏡像操作

搜尋docker鏡像

~]# docker search alpine           

拉一個鏡像

#
~]# docker pull docker.io/library/alpine
~]# docker pull alpine:3.14.2 #指定版本

Using default tag: latest
latest: Pulling from library/alpine
a0d0a0d46f8b: Pull complete
Digest: sha256:e1c082e3d3c45cccac829840a25941e679c25d438cc8412c2fa221cf1a824e6a
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
alpine        latest    14119a10abf4   2 days ago     5.6MB
hello-world   latest    d1165f221234   5 months ago   13.3kB
~]# docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
alpine        latest    14119a10abf4   2 days ago     5.6MB
hello-world   latest    d1165f221234   5 months ago   13.3kB           

給鏡像打tag(标簽)

~]# docker tag 14119a10abf4 docker.io/sam202025/alpine:lastest

[root@localhost ~]# docker image ls
REPOSITORY         TAG       IMAGE ID       CREATED        SIZE
alpine             latest    14119a10abf4   2 days ago     5.6MB
sam202025/alpine   v3.14.2   14119a10abf4   2 days ago     5.6MB
hello-world        latest    d1165f221234   5 months ago   13.3kB
#IMAGE ID一樣的話說明鏡像是一樣的 前面的tag隻是一個指針 就像軟連結           

将打好标的鏡像推送到遠端倉庫

~]# docker push docker.io/sam202025/alpine           

鏡像名稱的結構

${registry_ name}/${repository. name}/${image. name}:${tag. name
                                                       
例如:
docker.io/library/alpine:3.10.1           

删除鏡像

~]# docker rmi 14119a10abf4
Untagged: alpine:latest
Untagged: alpine@sha256:e1c082e3d3c45cccac829840a25941e679c25d438cc8412c2fa221cf1a824e6a
Deleted: sha256:14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab
Deleted: sha256:e2eb06d8af8218cfec8210147357a68b7e13f7c485b991c288c2d01dc228bb68
~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   5 months ago   13.3kB           

上面的删除操作隻是删除了本地的鏡像,不會對遠端倉庫的鏡像産生影響

~]# docker pull docker.io/sam202025/alpine           

2.3 容器操作

檢視所有容器

~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
12aad23d764b   hello-world   "/hello"   56 minutes ago   Exited (0) 56 minutes ago             stoic_hopper           

啟動容器

#docker run是日常用的最頻繁用的指令之一,同樣也是較為複雜的指令之一
#指令格式: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
#OPTIONS :選項
    #-i:表示啟動-一個可互動的容器, 并持續打開标準輸入
    #-t:表示使用終端關聯到容器的标準輸入輸出上
    #-d:表示将容器放置背景運作
    #--rm:退出後即删除容器
    #--name:表示定義容器唯一名稱
    #IMAGE:表示要運作的鏡像
    #COMMAND:表示啟動容器時要運作的指令*
    #ARG:參數           
#删除已exit的容器
~]# for i in `docker ps -a|grep -i exit|awk '{print $1}'`;do docker rm -f $i;done           

互動式啟動

[root@alice ~]# docker run -it alpine:latest
/ #
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
47: eth0@if48: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:18:26:02 brd ff:ff:ff:ff:ff:ff
    inet 172.24.38.2/24 brd 172.24.38.255 scope global eth0 # 之前/etc/docker/daemon.json寫了網段位址
       valid_lft forever preferred_lft forever
~]#
[root@alice ~]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS                       PORTS               NAMES
facbbda54346        mmdghh/alpine:latest   "/bin/sh"           2 minutes ago       Exited (130) 6 seconds ago                       nostalgic_bartik
f5895a16fb3d        hello-world            "/hello"            18 minutes ago      Exited (0) 18 minutes ago                        hopeful_edison
~]#
這裡退出之後容器就挂了 因為init為1的程序沒有夯住 執行完就退出了           

非互動式啟動容器

~]# docker run -d --name myalpine alpine /bin/sleep 300
~]# docker ps
CONTAINER ID   IMAGE     COMMAND            CREATED         STATUS         PORTS     NAMES
3838f137eaa6   alpine    "/bin/sleep 300"   3 seconds ago   Up 3 seconds             myalpine
#這裡有程序夯住之後 容器就不會挂掉了           

在主控端檢視程序

~]# ps aux |grep sleep |grep -v grep
root      20435  0.0  0.0   1572   252 ?        Ss   14:34   0:00 /bin/sleep 300
#docker用了主控端的核心 是以雖然是隔離的 但是在主控端仍然可以檢視到docker的程序 
而且有自己的pid           

進入容器

~]# docker exec -it myalpine /bin/sh  # 也可以使用容器的名稱進入
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
30: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:2f:02:02 brd ff:ff:ff:ff:ff:ff
    inet 172.47.2.2/24 brd 172.47.2.255 scope global eth0
       valid_lft forever preferred_lft forever
/ #           

容器的啟動/停止/重新開機

~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND            CREATED         STATUS         PORTS     NAMES
3838f137eaa6   alpine    "/bin/sleep 300"   8 minutes ago   Up 2 minutes             myalpine
#停止容器
  ~]# docker stop 3838f137eaa6
3838f137eaa6
~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND            CREATED         STATUS                        PORTS     NAMES
3838f137eaa6   alpine    "/bin/sleep 300"   8 minutes ago   Exited (137) 21 seconds ago             myalpine

 #啟動容器 
  ~]# docker start 3838f137eaa6
3838f137eaa6
~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND            CREATED         STATUS         PORTS     NAMES
3838f137eaa6   alpine    "/bin/sleep 300"   9 minutes ago   Up 6 seconds             myalpine

  #重新開機容器
  ~]# docker restart 3838f137eaa6
3838f137eaa6
~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND            CREATED         STATUS         PORTS     NAMES
3838f137eaa6   alpine    "/bin/sleep 300"   9 minutes ago   Up 4 seconds             myalpine
~]# docker restart myalpine # 可以用名字也可以用ID
myalpine           

在主控端和容器之間傳輸檔案

#容器複制檔案到主控端
~]# docker cp  3838f137eaa6:/1.txt ./
[root@localhost ~]# cat 1.txt
hello-world
#主控端複制檔案到容器
[root@localhost ~]# docker cp 1.log 3838f137eaa6:/

~]#  docker exec -it myalpine /bin/sh
/ # cat 1.txt
hello-world
           

删除容器

~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND            CREATED          STATUS                     PORTS     NAMES
f06ec287330d   hello-world   "/hello"           9 seconds ago    Exited (0) 9 seconds ago             practical_darwin
3838f137eaa6   alpine        "/bin/sleep 300"   23 minutes ago   Up 56 seconds                        myalpine
[root@localhost ~]# docker rm f06ec287330d
f06ec287330d
#正在運作的容器需要用-f 來強制删除
~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND            CREATED          STATUS         PORTS     NAMES
3838f137eaa6   alpine    "/bin/sleep 300"   24 minutes ago   Up 2 minutes             myalpine

#删除所有未在運作的容器
~]# docker rm `docker ps -a -q`
5d396bf4792c
1390ed275479
Error response from daemon: You cannot remove a running container 3838f137eaa6484ae8fd5e692d57b9c236bc28463d3074a931ae786a375ac6d8. Stop the container before attempting removal or force remove # 如果需要删除所有容器 包括正在進行的容器,加上-f即可(慎重)
~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND            CREATED          STATUS         PORTS     NAMES
3838f137eaa6   alpine    "/bin/sleep 300"   26 minutes ago   Up 4 minutes             myalpine

#批量删除所有容器:
~]# docker rm -f $(docker ps -a -q)           

互動式進入容器

~]# docker exec -it 3838f137eaa6 /bin/sh
/ # ls
1.txt  bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var


~]# docker run -it 14119a10abf4 /bin/sh
/ # ls
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
#寫入到容器的檔案并不會儲存在鏡像裡           

-p儲存到執行指令這一時刻的内容,之後更新的不會報錯

~]#docker ps -a
CONTAINER ID   IMAGE          COMMAND            CREATED          STATUS                          PORTS     NAMES
3ff58b96c0aa   14119a10abf4   "/bin/sh"          3 minutes ago    Exited (0) About a minute ago             laughing_benz
3838f137eaa6   alpine         "/bin/sleep 300"   38 minutes ago   Exited (0) 2 minutes ago                  myalpine

~]# docker commit -p myalpine alpine:v_1.txt
sha256:3c5b072cbf49375a9436161c33102e4dbe671a1b51d2342bdf30fac9523687d0
[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
alpine        v_1.txt   3c5b072cbf49   17 seconds ago   5.77MB
alpine        latest    14119a10abf4   2 days ago       5.6MB
hello-world   latest    d1165f221234   5 months ago     13.3kB
[root@localhost ~]# docker run -it alpine:v_1.txt /bin/sh
/ # ls
1.txt  bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
/ # cat 1.txt
hello-world
           

導入導出鏡像

導出: docker save image_name/image_id > xxx.tar

導入: docker load -i xxx.tar 或 docker load < xxx.tar

tip: 如果你導出的時候名稱用了 : 記得導入的時候用 \ 轉義

~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
alpine        v_1.txt   3c5b072cbf49   6 minutes ago   5.77MB
alpine        latest    14119a10abf4   2 days ago      5.6MB
hello-world   latest    d1165f221234   5 months ago    13.3kB
#導出鏡象
~]# docker save 3c5b072cbf49 > alpine_v_1.txt.tar
~]# ls
1.log  1.txt  alpine_v_1.txt.tar

#删除鏡像
~]# docker rmi -f alpine:v_1.txt
Untagged: alpine:v_1.txt
Deleted: sha256:3c5b072cbf49375a9436161c33102e4dbe671a1b51d2342bdf30fac9523687d0
[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
alpine        latest    14119a10abf4   2 days ago     5.6MB
hello-world   latest    d1165f221234   5 months ago   13.3kB

#導入鏡像
~]# docker load < alpine_v_1.txt.tar
Loaded image ID: sha256:3c5b072cbf49375a9436161c33102e4dbe671a1b51d2342bdf30fac9523687d0
[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
<none>        <none>    3c5b072cbf49   11 minutes ago   5.77MB
alpine        latest    14119a10abf4   2 days ago       5.6MB
hello-world   latest    d1165f221234   5 months ago     13.3kB

#給鏡像打标簽
~]# docker tag 3c5b072cbf49 docker.io/sam202025/alpine:v_1.txt
~]# docker images
REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
sam202025/alpine   v_1.txt   3c5b072cbf49   12 minutes ago   5.77MB
alpine             latest    14119a10abf4   2 days ago       5.6MB
hello-world        latest    d1165f221234   5 months ago     13.3kB
~]# docker run -it docker.io/sam202025/alpine:v_1.txt /bin/sh
/ # cat 1.txt
hello-world           

檢視容器日志

docker logs container_id/container_name  [-f]

~]# docker logs 6f89f5ef071a

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
           

檢視容器的詳細資訊

docker inspect  container_name/container_diargs           

端口映射

-p host_port:container_port           

實戰案例1:端口映射

#摘取鏡像
~]# docker pull nginx:1.12.2
1.12.2: Pulling from library/nginx
f2aa67a397c4: Pull complete
e3eaf3d87fe0: Pull complete
38cb13c1e4c9: Pull complete
Digest: sha256:72daaf46f11cc753c4eab981cbf869919bd1fee3d2170a2adeac12400f494728
Status: Downloaded newer image for nginx:1.12.2
docker.io/library/nginx:1.12.2

#檢視鏡像
[root@localhost ~]# docker images
REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
sam202025/alpine   v_1.txt   3c5b072cbf49   36 minutes ago   5.77MB
alpine             latest    14119a10abf4   2 days ago       5.6MB
hello-world        latest    d1165f221234   5 months ago     13.3kB
nginx              1.12.2    4037a5562b03   3 years ago      108MB
[root@localhost ~]# docker images |grep nginx
nginx              1.12.2    4037a5562b03   3 years ago      108MB

[root@localhost ~]# docker run -d --name nginx -p 83:80 nginx:1.12.2   #-p指定端口
8ed5d901b884a4f2cc1fb8c4fed92481b27dc7407696a92dd6df092d68b7babf
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED             STATUS                        PORTS                               NAMES
8ed5d901b884   nginx:1.12.2               "nginx -g 'daemon of…"   7 seconds ago       Up 5 seconds                  0.0.0.0:83->80/tcp, :::83->80/tcp   nginx
6f89f5ef071a   hello-world                "/hello"                 9 minutes ago       Exited (0) 9 minutes ago
brave_


#測試端口
~]# curl 127.0.0.1:83
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
           

挂載目錄

docker run -v容器外目錄:容器内目錄

實戰案例2:驗證把主控端的目錄挂到容器

#摘取鏡像
~]# docker pull nginx:1.12.2
1.12.2: Pulling from library/nginx
f2aa67a397c4: Pull complete
e3eaf3d87fe0: Pull complete
38cb13c1e4c9: Pull complete
Digest: sha256:72daaf46f11cc753c4eab981cbf869919bd1fee3d2170a2adeac12400f494728
Status: Downloaded newer image for nginx:1.12.2

#檢視摘取的鏡像資訊
~]# docker images |grep nginx
nginx               1.12.2              4037a5562b03        2 years ago         108MB

#背景運作容器
~]# docker run -d --name nginx -p 83:80 nginx:1.12.2
6ce9e4bb303b754a576d3bf587e0aaec7e3749a3d20f1e40f43c734b28196c67

#檢視所有已運作的容器
~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
6ce9e4bb303b        nginx:1.12.2        "nginx -g 'daemon of…"   4 seconds ago       Up 3 seconds        0.0.0.0:83->80/tcp   nginx
~]#

#主控端建立要挂載的目錄
~]# mkdir html
~]# cd html/
html]# echo "test" > index.html

#運作容器并把目錄挂載到容器 -v
html]# docker run -d --name nginx_with_index -p 84:80 -v /root/html:/usr/share/nginx/html nginx:1.12.2
acf79798ce19fdb6e584723d0ab1cc057508082466f6b9be92acc19eca737699

#檢視所有已運作的容器
[root@alice html]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
acf79798ce19        nginx:1.12.2        "nginx -g 'daemon of…"   7 seconds ago       Up 5 seconds        0.0.0.0:84->80/tcp   nginx_with_index
6ce9e4bb303b        nginx:1.12.2        "nginx -g 'daemon of…"   6 minutes ago       Up 6 minutes        0.0.0.0:83->80/tcp   nginx

#進入容器裡面驗證
[root@alice html]# docker exec -it acf79798ce19 /bin/bash
root@acf79798ce19:/# ls /usr/share/nginx/html/
index.html           

檢視挂載的詳細資訊

html]# docker inspect nginx_with_index |grep -A 9 'Mounts'
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/root/html",
                "Destination": "/usr/share/nginx/html",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
html]#           

傳遞環境變量

-e variate_name=variate_value           
~]# docker run --rm -e E_OPTS=qwert docker.io/mmdghh/alpine:latest printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=62db172fe9da
E_OPTS=qwert
HOME=/root
~]# docker run --rm -e E_OPTS=qwert -e C_OPTS=12345 docker.io/mmdghh/alpine:latest printenv  #傳遞多個變量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=3ac265a1cf85
E_OPTS=qwert
C_OPTS=12345
HOME=/root
~]#           

容器内下載下傳軟體

紅帽系 yum

debian系 apt-get

alpine apt

進入容器并且下載下傳

~]# docker exec -it nginx_with_baidu /bin/bash
root@acf79798ce19:/# curl
bash: curl: command not found
root@acf79798ce19:/# exit
~]# docker exec -it nginx_with_baidu /bin/bash
root@acf79798ce19:/# tee /etc/apt/sources.list << EOF
deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
EOF
root@acf79798ce19:/# apt-get update && apt-get install curl -y           

安裝好後commit并且推送到倉庫

~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
acf79798ce19        nginx:1.12.2        "nginx -g 'daemon of…"   About an hour ago   Up About an hour    0.0.0.0:84->80/tcp   nginx_with_baidu
6ce9e4bb303b        nginx:1.12.2        "nginx -g 'daemon of…"   About an hour ago   Up About an hour    0.0.0.0:83->80/tcp   nginx
 
  ~]# docker commit -p acf79798ce19 mmdghh/nginx:curl
sha256:84b7a98f5ee209f0139febe7cac04a7edaaca7254ddf1c043e8ac779504204ba

  ~]# docker push docker.io/mmdghh/nginx:curl
The push refers to repository [docker.io/mmdghh/nginx]
bbadc5b62281: Pushed
4258832b2570: Mounted from library/nginx
683a28d1d7fd: Pushed
d626a8ad97a1: Mounted from library/nginx
curl: digest: sha256:f86f97bacf0ff37e3cc09f98dfb8153c486ee1e8bb9caad5046ed6aa58c43c50 size: 1160