Dockerfile 指令 VOLUME 介绍

Posted 未末0902

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dockerfile 指令 VOLUME 介绍相关的知识,希望对你有一定的参考价值。


前言

在实际的docker 操作中,我们会遇到各种各样的问题:

1.连接不上网络该咋办?
2.如何去创建和使用卷呢?
3.什么是volume 和 mount?

那么我们该如何解决呢?
别着急,接下来由我一 一解答哈!


提示:以下是本篇文章正文内容,下面案例可供参考

一、容器上不了网的问题的解决方法:

开启路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
[root@sc-docker ~]# echo 1 >/proc/sys/net/ipv4/ip_forward
[root@sc-docker ~]#service docker  restart  重启docker ,会到iptables里去添加相关规则
临时
[root@sc-docker ~]# echo 1 >/proc/sys/net/ipv4/ip_forward
[root@sc-docker ~]#
永久:
	[root@sc-docker ~]# vim /etc/sysctl.conf

net.ipv4.ip_forward = 1
[root@sc-docker ~]# sysctl  -p
net.ipv4.ip_forward = 1
[root@sc-docker ~]#

1.启动容器限制容器可以使用的cpu和内存资源**

cpu-shares 30 限制使用cpu
cpu的计算资源: 1 --》1000份 --》1m
1s -->1000ms

不管你有多少个核心,都是看做一个整体来计算
8核 --》1 --》30m
-m 100000000  限制内存  byte
	--memory bytes
[root@sc-docker ~]# docker run -it --cpu-shares 30 -m 100000000 -d --name luojiajun11 centos:7

[root@sc-docker ~]# docker run -it --cpu-shares 30 -m 100000000 -d --name luojiajun11 centos:7
a28681b066cd4c6e598006761119f3aa47296ad6d8fa502dfbed5247e7899bde
[root@sc-docker ~]# docker container inspect luojiajun11

oom --》out of memory 内存溢出
====

2.问题:如何限制一个进程可以使用多少cpu和多少内存?

创建一个容器,让这个进程在容器里run,这样可以限制容器所使用的cpu和内存,从而可以达到限制这个进程的cpu和内存的使用。

3.docker 容器起的mysql,可以使用root用户直接去连接

[root@firewall 8-13]# cat snat_dnat.sh
#!/bin/bash

#open  route function
echo 1 >/proc/sys/net/ipv4/ip_forward

#clear iptables rules
iptables -F
iptables -t nat -F
iptables -P INPUT ACCEPT

#start snat
#iptables -t nat -A POSTROUTING -s 192.168.170.0/24 -o ens33 -j SNAT --to-source 192.168.0.204
iptables -t nat -A POSTROUTING -s 192.168.170.0/24 -o ens33 -j MASQUERADE

#dnat
#dnat web
iptables -t nat -A PREROUTING -i ens33 -d 192.168.0.204 -p tcp --dport 80 -j DNAT --to-destination 192.168.170.1:80

#dnat mysql 192.168.170.2
iptables -t nat -A PREROUTING -i ens33 -d 192.168.0.204 -p tcp --dport 3306 -j DNAT --to-destination 192.168.170.2:3306

#dnat mysql 192.168.170.1 docker
iptables -t nat -A PREROUTING -i ens33 -d 192.168.0.204 -p tcp --dport 3309 -j DNAT --to-destination 192.168.170.1:3306
[root@firewall 8-13]#
====

二、volume + mount 问题

1.容器的数据保存-数据持久化 (data persistence )

数据持久化 --》保存到磁盘里
容器 --》进程
单进程思想–》容器

[root@sc-docker ~]# ps aux|grep containerd-shi
root       27539  0.0  0.4 712176 17216 ?        Sl   12:15   0:01 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 69eb9fc6eef84d79b1e006598d3808bdafd9ed7a3994bd707a0a54b7b918ff0d -address /run/containerd/containerd.sock
root       27820  0.0  0.4 713328 18512 ?        Sl   13:01   0:01 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 3ea804c5dd0cf36d641eeaf9dfdad7ce7b273c2d5187159207a3fdcb66f554cc -address /run/containerd/containerd.sock
root       28225  0.0  0.4 713584 18652 ?        Sl   14:41   0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 822a3a150d08e0b42c08fe3879f797b4598b364f4a77f3f38f289aa793016772 -address /run/containerd/containerd.sock
root       28341  0.0  0.4 713328 17708 ?        Sl   14:50   0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 3af5f37ee5925249aa6d0fd51c7b6cb7689a8aaf4b054e64f472303e5206f9b0 -address /run/containerd/containerd.sock
root       28446  0.0  0.5 713328 19960 ?        Sl   14:52   0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id a9db103780634654c8958d9c3103e76a45935d03708822e174383d4c905d2fc8 -address /run/containerd/containerd.sock
root       28530  0.0  0.4 713328 18104 ?        Sl   14:53   0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id c604138fd8f9a69970e4ebaa10b2d5c9391d8f4e715671aaa6d9e6173a8dd29e -address /run/containerd/containerd.sock
root       28774  0.0  0.4 713328 16648 ?        Sl   15:14   0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id a28681b066cd4c6e598006761119f3aa47296ad6d8fa502dfbed5247e7899bde -address /run/containerd/containerd.sock
root       28969  0.0  0.0  12348  1148 pts/0    S+   15:55   0:00 grep --color=auto containerd-shi
[root@sc-docker ~]# ps aux|grep containerd-shi|wc -l
8
[root@sc-docker ~]#
=====

2.volume + mount

volumes 数据卷 --》存放数据的地方
Mount 挂载

创建卷,查看卷,使用卷

[root@sc-docker sc-web]# docker run -d --name xuzz-2 -p 7789:80 -v /sc-web/:/usr/share/nginx/html/ nginx
b63a108a9eb82aa324106aa20094ae7e5c2a347baee3e390de594aa4c8485ca0
[root@sc-docker sc-web]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS          PORTS   NAMES
b63a108a9eb8   nginx          "/docker-entrypoint.…"   2 seconds ago   Up 1 second     0.0.0.0:7789->80/tcp, :::7789->80/tcp   xuzz-2
e9602a507295   nginx          "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes    0.0.0.0:7788->80/tcp, :::7788->80/tcp   xuzz-1
a4078e1a7ea1   mysql:5.7.35   "docker-entrypoint.s…"   23 hours ago    Up 17 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   sc-mysql-1
[root@sc-docker sc-web]#
创建卷
[root@sc-docker sc-web]# docker volume create sc
sc
[root@sc-docker sc-web]#
查看卷
[root@sc-docker _data]# docker volume ls
DRIVER    VOLUME NAME
local     a112a3c96f69a0df6e0be0dd156d8752c79d42a48917ea13c5a7f239c39056f0
local     sc
[root@sc-docker _data]#
[root@sc-docker _data]# docker volume inspect sc 查看卷的路径
[
    {
        "CreatedAt": "2021-08-12T16:30:30+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/sc/_data",
        "Name": "sc",
        "Options": {},
        "Scope": "local"
    }
]
[root@sc-docker _data]# cp /sc-web/* .
[root@sc-docker _data]# ls
feng.jpg  index.html  sc.html  xiong.jpg
[root@sc-docker _data]#
[root@sc-docker _data]#

使用卷:  容器去使用卷

docker run -d \\
  --name fan-nginx-1 \\
  --mount source=sc,target=/usr/share/nginx/html  \\
  -p 7790:80 \\
  nginx:latest

使用docker 来运行

 [root@sc-docker _data]# docker run -d   --name fan-nginx-1   --mount source=sc,target=/usr/share/nginx/html -p 7790:80   nginx:latest
ed4d7192e658d9f327ebee8bcdaaedb36f78dffe0c5666d32b7b3c831343fbaa
[root@sc-docker _data]#
docker run -d   --name wangll-nginx-1   --mount source=sc,target=/usr/share/nginx/html -p 7791:80   nginx:latest


docker run -d \\
  --name xuzz-3 \\
  -v sc:/usr/share/nginx/html \\
  nginx:latest

  docker run -d --name xuzz-2 -p 7789:80 -v /sc-web/:/usr/share/nginx/html/ nginx

3.练习:

1.创建一个卷: sanchuang,在sanchuang卷里创建一个index.html首页文件,内容welcome to sanchuang
2.创建2个容器名字自己定义:rose-1 rose-2,启动nginx,使用sanchuang这个卷
3.测试访问

具体操作:

(1)创建卷,并且往卷里新建文件index.html

[root@sc-docker _data]# docker volume ls
DRIVER    VOLUME NAME
local     a112a3c96f69a0df6e0be0dd156d8752c79d42a48917ea13c5a7f239c39056f0
local     sc
[root@sc-docker _data]# docker volume create sanchuang
sanchuang
[root@sc-docker _data]# docker volume ls
DRIVER    VOLUME NAME
local     a112a3c96f69a0df6e0be0dd156d8752c79d42a48917ea13c5a7f239c39056f0
local     sanchuang
local     sc
[root@sc-docker _data]# docker volume inspect sanchaung
[]
Error: No such volume: sanchaung
[root@sc-docker _data]# docker volume inspect sanchuang
[
    {
        "CreatedAt": "2021-08-12T17:16:26+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/sanchuang/_data",
        "Name": "sanchuang",
        "Options": {},
        "Scope": "local"
    }
]
[root@sc-docker _data]#
[root@sc-docker _data]# cd /var/lib/docker/volumes/sanchuang/_data/
[root@sc-docker _data]# ls
[root@sc-docker _data]# vim index.html
[root@sc-docker _data]# cat index.html
welcome to sanchuang
[root@sc-docker _data]#

(2)启动容器使用卷

[root@sc-docker _data]# docker run -d --name rose-nginx-1 -p 6688:80 --mount source=sanchuang,target=/usr/share/nginx/html nginx
2d269942c411213d41b63bb1596113b7eb854313beb05e14101a1dfbc4448896
[root@sc-docker _data]# docker run -d --name rose-nginx-2 -p 6689:80 --mount source=sanchuang,target=/usr/share/nginx/html nginx
75db457a31e0c36caeddcedce84bb1171d06c9afed2d01d4e176a5f0a1ea1731
[root@sc-docker _data]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS             PORTS          NAMES
75db457a31e0   nginx          "/docker-entrypoint.…"   4 seconds ago       Up 3 seconds       0.0.0.0:6689->80/tcp, :::6689->80/tcp          rose-nginx-2
2d269942c411   nginx          "/docker-entrypoint.…"   20 seconds ago      Up 19 seconds      0.0.0.0:6688->80/tcp, :::6688->80/tcp          rose-nginx-1
efec9667c9d1   nginx:latest   "/docker-entrypoint.…"   42 minutes ago      Up 42 minutes      0.0.0.0:7791->80/tcp, :::7791->80/tcp          wangll-nginx-1
ed4d7192e658   nginx:latest   "/docker-entrypoint.…"   46 minutes ago      Up 46 minutes      0.0.0.0:7790->80/tcp, :::7790->80/tcp          fan-nginx-1
b63a108a9eb8   nginx          "/docker-entrypoint.…"   56 minutes ago      Up 56 minutes      0.0.0.0:7789->80/tcp, :::7789->80/tcp          xuzz-2
e9602a507295   nginx          "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:7788->80/tcp, :::7788->80/tcp          xuzz-1
a4078e1a7ea1   mysql:5.7.35   "docker-entrypoint.s…"   24 hours ago        Up About an hour   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   sc-mysql-1
[root@sc-docker _data]#

总结

1.这里出现的问题都是面试中的经典考题,可以好好整理一下答案.

2.对于volume 和 mount 的实验,创建和挂载卷的操作是经常使用的,可以做做练习熟练一下.

3.如果你看到这里了,麻烦👍 + 关注哈,感谢支持,码字不易,谢谢理解.*

以上是关于Dockerfile 指令 VOLUME 介绍的主要内容,如果未能解决你的问题,请参考以下文章

Dockerfile Volume指令与docker -v的区别

Dockerfile 之 VOLUME

Dockerfile指令详解

Dokcer进阶-初识DockerFile

linux12 - dockerfile01 -->构建镜像指令与编写案例

dockerfile语法