Docker Learning (2) Explicação detalhada de imagens e volumes de dados de contêiner

7. Ferramentas gráficas de gerenciamento

O conteúdo deste artigo é resumido do conteúdo do Docker Quick Start (1) ;

Portaniner é uma ferramenta de gerenciamento gráfico para Docker que fornece um painel de fundo para operarmos, semelhante a ferramentas como o painel de visualização de banco de dados SQLyog.

1. Baixe e instale

# -p 8088:9000  			 # 内部9000端口映射外部端口为8088
# -v /var/run/docker.sock:/var/run/docker.sock 	(这是挂载技术,后面再学习)
# --privileged=true 		# 授权可以访问
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer


[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
94cfa856b2b1: Already exists 
49d59ee0881a: Already exists 
a2300fd28637: Already exists 
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
3cad49e5d24c55ba9aebbcde2d593f948e7aba91751ae27148dac709314fab14
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND             CREATED         STATUS         PORTS                    NAMES
3cad49e5d24c   portainer/portainer   "/portainer"        8 seconds ago   Up 8 seconds   0.0.0.0:8088->9000/tcp   jovial_perlman
3e7fc95c278a   tomcat                "catalina.sh run"   9 hours ago     Up 9 hours     0.0.0.0:3355->8080/tcp   tomcat01
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# 

2. Acesso através da rede externa, http://endereço IP do servidor: 8088

O servidor Alibaba Cloud define um grupo de segurança. Ao fazer login pela primeira vez, você precisa definir a senha do usuário administrador.
Insira a descrição da imagem aqui

Após definir a senha e criar o usuário, entre na página abaixo e selecione conexão local.

Insira a descrição da imagem aqui

Esta é a visualização geral da interface visual:

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

8. Explicação detalhada da imagem docker

8.1. O que é um espelho?

Uma imagem é um pacote de software independente, leve e executável, usado para empacotar ambientes de execução de software e software desenvolvido com base no ambiente de execução. Ela contém tudo o que é necessário para executar um determinado software, incluindo código, dependências de tempo de execução e bibliotecas. Variáveis ​​de ambiente e arquivos de configuração.

8.2. Princípio de carregamento da imagem docker

8.2.1. Sistema de Arquivos Union (UnionFS)

Sistema de arquivos de união (UnionFS):

  • Desenvolvido pela Universidade Estadual de Nova York em 2004, ele pode montar conjuntamente o conteúdo de vários diretórios no mesmo diretório, enquanto as localizações físicas dos diretórios são separadas. UnionFS pode mesclar sistemas de arquivos somente leitura e leitura-gravação e possui uma função de cópia na gravação, permitindo que modificações no sistema de arquivos somente leitura sejam salvas no sistema de arquivos gravável.

  • É um sistema de arquivos em camadas, leve e de alto desempenho. Ele suporta modificações no sistema de arquivos para serem sobrepostas camada por camada como um único envio. Ao mesmo tempo, diferentes diretórios podem ser montados no mesmo sistema de arquivos virtual.

  • É a base das imagens Docker. As imagens podem ser herdadas por meio de camadas. Com base na imagem base (sem imagem pai), várias imagens de aplicativos específicos podem ser produzidas.

Características: Carregue vários sistemas de arquivos ao mesmo tempo, mas do lado de fora, apenas um sistema de arquivos pode ser visto. O carregamento conjunto sobreporá cada camada de sistemas de arquivos, de modo que o sistema de arquivos final conterá todos os arquivos e diretórios subjacentes.

8.2.2. Carregamento de imagem Docker

Insira a descrição da imagem aqui

bootfs (sistema de arquivos de inicialização) inclui principalmente bootloader e Kernel. O bootloader é principalmente para inicialização e kernel. O sistema de arquivos bootfs será carregado quando o Linux for iniciado pela primeira vez. A camada inferior da imagem Docker é bootfs. Esta camada é a mesma do nosso sistema Linux/Unix típico, incluindo o carregador de boot e o kernel. Quando o carregamento da inicialização for concluído, todo o kernel estará na memória. Neste momento, o direito de usar a memória foi transferido do bootfs para o kernel. Neste momento, o sistema também desinstalará o bootfs.

rootfs (sistema de arquivos raiz), em cima do bootfs. Contém diretórios e arquivos padrão como /dev, /proc, /bin, /etc em sistemas Linux típicos. Rootfs refere-se a várias distribuições de sistemas operacionais, como Ubuntu, Centos, etc.

Insira a descrição da imagem aqui

Normalmente o CentOS que instalamos na máquina virtual tem vários GB. Por que o Docker tem apenas 230 MB?

Para um sistema operacional simplificado, o rootfs pode ser muito pequeno e precisa conter apenas os comandos, ferramentas e bibliotecas mais básicos. Como a camada inferior usa diretamente o kernel do host, você só precisa fornecer o rootfs. Pode-se ver que para diferentes distribuições Linux, bootfs é basicamente o mesmo, mas rootfs serão diferentes, então diferentes distribuições podem compartilhar bootfs.

8.3. Compreensão das camadas

A imagem do docker é na verdade composta por camadas de sistemas de arquivos. Conforme mencionado acima, ao baixar a imagem por meio do docker pull, você pode ver que a imagem do docker parece ser baixada camada por camada. Ao baixar diferentes versões de uma imagem localmente, existem partes de arquivo comuns entre as diferentes versões da imagem. Se esta parte já existir localmente, ela não será baixada repetidamente e será compartilhada diretamente.

Razões para estratificação:

  1. A maior vantagem da estratificação é == recursos compartilhados ==
  2. Se várias imagens forem construídas a partir da mesma imagem base, o host só precisará salvar uma cópia da imagem base no disco;
  3. Ao mesmo tempo, apenas uma imagem base é carregada na memória para servir todos os contêineres, e cada camada da imagem pode ser compartilhada.

Baixe uma imagem da versão mysql 5.7 na máquina virtual e observe a saída do log baixado, conforme mostrado na figura abaixo. O processo de download é baixado camada por camada. Se as camadas anteriores já existirem localmente, não há necessidade de baixá-las novamente. .

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Visualize a camada da imagem: docker image inspecionar nome da imagem

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Compreensão em camadas:

Todas as imagens Docker começam a partir de uma camada de imagem básica.Quando o conteúdo é modificado ou novo conteúdo é adicionado,uma nova camada de imagem será criada sobre a camada de imagem atual. Por exemplo, se você criar uma nova imagem baseada no Ubuntu Linux 16.04, esta será a primeira camada da nova imagem. Ao adicionar conteúdo relacionado a python a esta imagem, uma segunda camada de imagens será criada sobre a primeira camada . À medida que você continua adicionando patches de segurança (Patch de Segurança), uma imagem de terceira camada será criada.

Insira a descrição da imagem aqui

Para outro exemplo, a imagem de primeiro nível contém os arquivos 1, 2 e 3. Posteriormente, é criada uma imagem de segundo nível, que contém os arquivos 4, 5 e 6. Posteriormente, o conteúdo da imagem precisa ser modificado para atualizar o arquivo 5 ao arquivo 7., novas atualizações e modificações exigem a criação de uma imagem de terceira camada. Neste caso, os arquivos da imagem superior substituem os arquivos da imagem inferior. Isso faz com que a versão atualizada do arquivo seja adicionada à imagem como uma nova camada de imagem. Portanto, do lado de fora, toda a imagem é dividida em três camadas e contém um total de 6 arquivos, dos quais o arquivo 7 é uma versão atualizada do arquivo 5.

Insira a descrição da imagem aqui

As imagens Dokcer são somente leitura. Quando o contêiner é iniciado, uma nova camada gravável será carregada no topo da imagem. Essa nova camada é comumente chamada de camada do contêiner, e aquela abaixo do contêiner é a camada da imagem.

8.4. Comprometa-se a enviar a imagem

Existem duas maneiras de construir uma imagem:

  • Uma é criar um espelho através do commit
  • A outra é construir a imagem através do dockerfile (o método de construção do dockerfile será aprendido mais tarde)

Depois que o contêiner for enviado por meio de commit, ele poderá ser enviado como uma nova versão de imagem.

# docker commit -m=“提交的描述信息” -a=“作者信息” 容器id 目标镜像名:[TAG]

Conforme mencionado acima sobre a implantação do Tomcat, a imagem do Tomcat baixada por padrão é a menor imagem para garantir o menor ambiente operacional. O diretório webapps na imagem está vazio. Você precisa entrar no contêiner e copiar o conteúdo do diretório webapps.dist para webapps antes de acessá-lo da rede externa por meio do mapeamento de portas. Para isso, crie uma nova imagem do Tomcat da seguinte maneira: Envie um contêiner do Tomcat totalmente operacional como uma nova imagem. Isso permite que a imagem seja utilizada diretamente após o download, sem a necessidade de copiá-la.

Passos para fazer a imagem do Tomcat:

# 1. 下载默认的tomcat镜像
docker pull tomcat
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker pull tomcat  # 下载tomcat镜像
Using default tag: latest
latest: Pulling from library/tomcat
0e29546d541c: Already exists 
9b829c73b52b: Already exists 
cb5b7ae36172: Already exists 
6494e4811622: Already exists 
668f6fcc5fa5: Already exists 
dc120c3e0290: Already exists 
8f7c0eebb7b1: Already exists 
77b694f83996: Already exists 
0f611256ec3a: Already exists 
4f25def12f23: Already exists 
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images		#查看是否下载成功
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
elasticsearch         8.2.0     f75ee9faf718   3 weeks ago     1.21GB
nginx                 latest    605c77e624dd   4 months ago    141MB
tomcat                latest    fb5657adc892   4 months ago    680MB
redis                 latest    7614ae9453d1   4 months ago    113MB
mysql                 latest    3218b38490ce   4 months ago    516MB
hello-world           latest    feb5d9fea6a5   7 months ago    13.3kB
centos                latest    5d0da3dc9764   7 months ago    231MB
portainer/portainer   latest    580c0e4e98b0   13 months ago   79.1MB
# 2. 启动这个tomcat镜像,
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -it -p 8023:8080 tomcat
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/openjdk-11
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
# 3. 查看正在运行的容器
docker ps
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND             CREATED         STATUS         PORTS                    NAMES
e315dfa9c866   tomcat                "catalina.sh run"   2 minutes ago   Up 2 minutes   0.0.0.0:8023->8080/tcp   strange_brown
3cad49e5d24c   portainer/portainer   "/portainer"        14 hours ago    Up 14 hours    0.0.0.0:8088->9000/tcp   jovial_perlman
# 4。 进入tomcat容器内部,查看webapps目录,没有内容,将webapps.dist目录中的内容拷贝到webapps目录中
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker exec -it e315dfa9c866 /bin/bash
root@e315dfa9c866:/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@e315dfa9c866:/usr/local/tomcat# cd webapps
root@e315dfa9c866:/usr/local/tomcat/webapps# ls
root@e315dfa9c866:/usr/local/tomcat/webapps# cd ..
root@e315dfa9c866:/usr/local/tomcat# cd webapps.dist
root@e315dfa9c866:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager
root@e315dfa9c866:/usr/local/tomcat/webapps.dist# cd ..
root@e315dfa9c866:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@e315dfa9c866:/usr/local/tomcat# cd webapps
root@e315dfa9c866:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@e315dfa9c866:/usr/local/tomcat/webapps# 

# 4. 将操作之后的容器通过commit提交成一个新的tomcat镜像,以后便可以直接下载这个新的镜像使用。
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker commit -m="new tomcat that added app to webapps" -a="Kevin-Ding" e315dfa9c866 mytomcat:1.0
sha256:fae635bb688d1260244034fe2ed158f28de3bd0fa5cc7269cb77edcc0d5b6931
# 5. docker images 便可查看到自己提交的镜像 mytomcat
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
mytomcat              1.0       fae635bb688d   28 seconds ago   684MB
elasticsearch         8.2.0     f75ee9faf718   3 weeks ago      1.21GB
nginx                 latest    605c77e624dd   4 months ago     141MB
tomcat                latest    fb5657adc892   4 months ago     680MB
redis                 latest    7614ae9453d1   4 months ago     113MB
mysql                 latest    3218b38490ce   4 months ago     516MB
hello-world           latest    feb5d9fea6a5   7 months ago     13.3kB
centos                latest    5d0da3dc9764   7 months ago     231MB
portainer/portainer   latest    580c0e4e98b0   13 months ago    79.1MB

# 6.运行自己制作的镜像
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -it mytomcat:1.0 /bin/bash
root@bc1b6aac1bea:/usr/local/tomcat# cd webapps	
root@bc1b6aac1bea:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@bc1b6aac1bea:/usr/local/tomcat/webapps# cd ..
root@bc1b6aac1bea:/usr/local/tomcat# exit

9. Volume de dados do contêiner

9.1. Introdução aos volumes de dados

Docker pode empacotar aplicativos e ambientes operacionais em uma imagem.

Se o banco de dados MySQL for implantado no docker e o docker for excluído acidentalmente, isso não significaria que o banco de dados foi excluído e desapareceu? Então, como salvar dados no docker?

  1. Gere uma nova imagem por meio do docker commit, salve alguns dados e faça commit em uma nova imagem sempre que os dados forem alterados, o que é um pouco complicado;
  2. Os dados no contêiner podem ser armazenados localmente e de forma persistente?

Esta é a tecnologia de volumes de dados. Ao montar, o diretório no contêiner é montado no Linux, para que os dados possam ser sincronizados com o local local para fácil persistência. Afinal, os dados não têm preço.

O objetivo do design dos volumes é a persistência de dados, que é completamente independente do ciclo de vida do contêiner, portanto, o Docker não excluirá seu volume de dados montado quando o contêiner for excluído.

Volume de dados: realiza operações de persistência e sincronização de contêineres e também pode realizar compartilhamento de dados entre contêineres!

9.2. Uso básico

Método 1: montar usando o comando -v

# docker run -it -v 主机目录:容器内目录		# 路径映射
# docker run -it -p 主机端口:容器端口		 # 端口映射

# 1.查看home目录下的目录结构
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# cd home
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# ls
kevin  test.java
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# cd ..

# 2. 运行centos,并将centos的home目录挂载到虚拟机home目录的testcentos下 
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -it -v /home/testcentos:/home centos /bin/bash
[root@fc3e6a5f86ad /]# 

# 3. 新开窗口连接,查看虚拟机的home目录,发现testcentos目录
[root@iZ2ze1dg1xkfc3i15ybixmZ /]# cd home
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# ls
redis  test1.java  testcentos  test.java  www
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# 

内部查看挂载信息
[root@iZ2ze1dg1xkfc3i15ybixmZ testcentos]# docker inspect fc3e6a5f86ad
挂载信息:显示已经将/home 目录挂载到 /home/testcentos

Insira a descrição da imagem aqui

Crie um novo arquivo test.java no diretório inicial do contêiner. O arquivo pode ser visualizado de forma síncrona no diretório da máquina virtual testcentos.

Insira a descrição da imagem aqui

Em seguida, faça modificações no arquivo correspondente à máquina virtual para ver se o arquivo modificado pode ser exibido normalmente no container.

# 1. 先停止容器并退出,
[root@fc3e6a5f86ad /]# exit
exit
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# clear
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED        STATUS        PORTS                    NAMES
3cad49e5d24c   portainer/portainer   "/portainer"   25 hours ago   Up 11 hours   0.0.0.0:8088->9000/tcp   jovial_perlman
# 2.在主机中修改testcentos目录下的test.java
# vim操作,i进入插入模式; :wq保存并退出
[root@iZ2ze1dg1xkfc3i15ybixmZ testcentos]# vim test.java

# 3.重新启动刚才的centos,进入容器里面查看test.java发现内容已经被修改成功
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker start fc3e6a5f86ad
fc3e6a5f86ad
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker attach fc3e6a5f86ad
[root@fc3e6a5f86ad /]# cd home
[root@fc3e6a5f86ad home]# ls
test.java
[root@fc3e6a5f86ad home]# cat test.java
hello, Linux update			#成功显示修改信息

A montagem e ligação de volumes de dados é um processo bidirecional. No futuro, o conteúdo da parte de ligação da montagem só poderá ser modificado na máquina virtual sem entrar no contêiner!

9.3. Exercício – Instalar e implantar o MySQL

Para persistência dos dados MySQL, o diretório de dados no MySQL pode ser montado na máquina virtual por meio de montagem.

  1. Baixar imagem mysql
# docker pull 命令下载 mysql 5.7版本
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker pull mysql:5.7
5.7: 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 
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
# 查看本地镜像中是否下载了mysql 5.7
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
mytomcat              1.0       fae635bb688d   2 days ago      684MB
elasticsearch         8.2.0     f75ee9faf718   3 weeks ago     1.21GB
nginx                 latest    605c77e624dd   4 months ago    141MB
tomcat                latest    fb5657adc892   4 months ago    680MB
redis                 latest    7614ae9453d1   4 months ago    113MB
mysql                 5.7       c20987f18b13   4 months ago    448MB
hello-world           latest    feb5d9fea6a5   7 months ago    13.3kB
centos                latest    5d0da3dc9764   8 months ago    231MB
portainer/portainer   latest    580c0e4e98b0   14 months ago   79.1MB
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]#
  1. Execute a imagem e conclua a montagem do caminho
# 运行镜像
-d 后台运行
--name 指定名字
-v 主机目录:容器内目录	# 需要挂载多个路径时,每个挂载用一个-v即可
-p 主机端口:容器内端口	
-e MYSQL_ROOT_PASSWORD=123454321 初始化mysql的登录密码
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d --name mysql_5_7 -v /home/mysql/config:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123454321 mysql:5.7
  1. Após a inicialização bem-sucedida, conecte-se ao banco de dados MySQL localmente para adicionar uma tabela de banco de dados e você poderá visualizar o diretório de montagem correspondente no diretório da máquina virtual.

Lembrete: A porta padrão para conexão de linha de comando é 3306. Após a modificação do mapeamento da porta, o comando -P port precisa ser adicionado à linha de comando.

[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# mysql -h 39.107.241.179 -P 3307 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

# 成功通过命令行进入到数据库

Depois de excluirmos o contêiner mysql na máquina virtual, o diretório originalmente montado na máquina virtual ainda será retido, garantindo que nenhum dado seja perdido.

9.4. Montagem anônima e montagem nomeada

9.4.1. Montagem anônima

Montagem anônima significa literalmente que ao montar um volume de dados, o caminho a ser montado no host não é especificado, portanto a montagem será no caminho padrão do host: /var/lib/docker/volumes/ Nomeie aleatoriamente uma pasta como o caminho de montagem.

Teste: execute o contêiner nginx e o caminho no contêiner montado anonimamente é: /etc/nginx

# -P(大写P) 随机映射端口
docker run -d -P --name nginx01 -v /etc/nginx nginx
# docker run 后台运行nginx,随机映射端口,匿名挂在
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# docker run -d -P -v /etc/nginx nginx
f7d28a8dc9ea221c0a8d192d8079b28166151d11890ac432b75b0389b4005f5f
# 运行成功之后,进入home目录
[root@iZ2ze1dg1xkfc3i15ybixmZ ~]# cd home
# 通过docker volume ls 查看所有的volumes
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker volume ls
DRIVER    VOLUME NAME
local     e0d7fd0fa4fea35d21a8ee229d058812ff1607e6e81c1bb7f390b2f05fa4f88e
local     e46617b607b5c2cd660cbe1b222e7b7b083787af73e8bcac18a4115c9c698971
local     f4b46eeb747bf12180df6eb2a523b0acdcb48725c9137aab594fd0d9719a40df
# 看到volums的名字为随机生成的,此为匿名挂载
9.4.2. Montagem nomeada

Montagem nomeada, como o nome sugere, serve para especificar o nome do volume durante a montagem. Diferente da montagem do caminho especificado, o caminho onde o nome do volume especificado na montagem nomeada está localizado é o caminho sob o volume de dados por padrão.

Teste: reinicie um contêiner nginx, monte-o com um nome e renomeie-o para nginx02

# 随机指定端口,重命名为nginx02, 具名挂载,卷名设置为juming-nginx
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx nginx
# 重新启动一个具名挂载的nginx
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
206217bd55b69753a7788d1a9872bab2500e146e2c962394da3ddd0b600d9fd3
# 查看卷列表,可以看到有名为 juming-nginx的卷信息
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker volume ls
DRIVER    VOLUME NAME
local     e0d7fd0fa4fea35d21a8ee229d058812ff1607e6e81c1bb7f390b2f05fa4f88e
local     e46617b607b5c2cd660cbe1b222e7b7b083787af73e8bcac18a4115c9c698971
local     f4b46eeb747bf12180df6eb2a523b0acdcb48725c9137aab594fd0d9719a40df
local     juming-nginx
# 通过docker volume inspect 卷名   查看指定卷的相关信息
[root@iZ2ze1dg1xkfc3i15ybixmZ home]# docker volume inspect juming-nginx
[
    {
    
    
        "CreatedAt": "2022-05-15T23:49:34+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]
# 查询出来的信息为:MountPoint为卷的默认挂载路径

Você pode ver que o caminho de montagem do volume juming-nginxde especificado no volume de dados do host é: /var/lib/docker/volumes/volume name/_data;

Todos os volumes de dados do Docker estão no diretório /var/lib/docker/volumes/ por padrão

9.4.3. Diferenças

Como distinguir entre montagem anônima e montagem nomeada?

-v 容器内路径    			# 匿名挂载
-v 卷名:容器内路径			   # 具名挂载
-v /宿主机路径:容器内路径		 # 指定路径挂载

Resumindo, o volume de dados que montamos pode ser facilmente encontrado através da montagem nomeada. Recomenda-se usar a montagem nomeada.

Um ponto adicional: Instruções sobre ro e rw durante a montagem

  • ro readonly é somente leitura.Quando definido para permissão somente leitura, significa que o caminho correspondente no contêiner não pode ser operado e só pode ser operado através do caminho do host.
  • rw readwrite pode ler e gravar, a permissão padrão para montagem de volume.

Expressão:

# ro(只读)的表示
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx:ro nginx
#rw(可读可写)的表示
docker run -d -P -name nginx02 -v juming-nginx:/etc/nginx:rw nginx

9.5. Crie uma imagem usando o método DockerFile

Dockerfile é um arquivo de construção usado para construir uma imagem docker e é um comando de script.

A segunda maneira de criar uma imagem: crie uma imagem através do dockerfile

  1. Primeiro, crie uma nova pasta docker-test-volume no diretório inicial, crie um novo arquivo dockerfile1 nela e escreva o seguinte script:
FROM centos

VOLUME ["volume01", "volume02"]

CMD echo "----end----"

CMD /bin/bash 
  1. Após a criação, o método docker build executa a imagem de construção

    # docker build -f dockerfile的全路径 -t 镜像名:tag .
    [root@kevinDing docker_test_volume]# docker build -f /home/docker_test_volume/dockerfile1 -t kevin/mycentos:1.0 .
    Sending build context to Docker daemon  2.048kB
    Step 1/4 : FROM centos
     ---> 5d0da3dc9764
    Step 2/4 : VOLUME ["volume01", "volume02"]
     ---> Running in b860235245ea
    Removing intermediate container b860235245ea
     ---> 0bc3ac498d5f
    Step 3/4 : CMD echo "----end----"
     ---> Running in 324159180d29
    Removing intermediate container 324159180d29
     ---> 0a3ee43af21b
    Step 4/4 : CMD /bin/bash
     ---> Running in b3263513fb82
    Removing intermediate container b3263513fb82
     ---> f520432b291f
    Successfully built f520432b291f
    Successfully tagged kevin/mycentos:1.0
    [root@kevinDing docker_test_volume]# docker images
    REPOSITORY       TAG       IMAGE ID       CREATED         SIZE
    kevin/mycentos   1.0       f520432b291f   6 seconds ago   231MB
    hello-world      latest    feb5d9fea6a5   7 months ago    13.3kB
    centos           latest    5d0da3dc9764   8 months ago    231MB
    [root@kevinDing docker_test_volume]# 
    
    

Insira a descrição da imagem aqui

  1. Execute a imagem que você construiu e visualize as informações do diretório dentro da imagem

    [root@kevinDing docker_test_volume]# docker run -it f520432b291f /bin/bash
    # 查看列表信息,可以看到最后两个文件为挂载的目录volume01和volume02
    [root@8ebf26cff30f /]# ls -l
    total 56
    lrwxrwxrwx  1 root root    7 Nov  3  2020 bin -> usr/bin
    drwxr-xr-x  5 root root  360 May 20 15:17 dev
    drwxr-xr-x  1 root root 4096 May 20 15:17 etc
    drwxr-xr-x  2 root root 4096 Nov  3  2020 home
    lrwxrwxrwx  1 root root    7 Nov  3  2020 lib -> usr/lib
    lrwxrwxrwx  1 root root    9 Nov  3  2020 lib64 -> usr/lib64
    drwx------  2 root root 4096 Sep 15  2021 lost+found
    drwxr-xr-x  2 root root 4096 Nov  3  2020 media
    drwxr-xr-x  2 root root 4096 Nov  3  2020 mnt
    drwxr-xr-x  2 root root 4096 Nov  3  2020 opt
    dr-xr-xr-x 94 root root    0 May 20 15:17 proc
    dr-xr-x---  2 root root 4096 Sep 15  2021 root
    drwxr-xr-x 11 root root 4096 Sep 15  2021 run
    lrwxrwxrwx  1 root root    8 Nov  3  2020 sbin -> usr/sbin
    drwxr-xr-x  2 root root 4096 Nov  3  2020 srv
    dr-xr-xr-x 13 root root    0 May 17 01:11 sys
    drwxrwxrwt  7 root root 4096 Sep 15  2021 tmp
    drwxr-xr-x 12 root root 4096 Sep 15  2021 usr
    drwxr-xr-x 20 root root 4096 Sep 15  2021 var
    drwxr-xr-x  2 root root 4096 May 20 15:17 volume01
    drwxr-xr-x  2 root root 4096 May 20 15:17 volume02
    [root@8ebf26cff30f /]# 
    
  2. Abra outra conexão e visualize as informações internas da imagem através do docker inspecionar

    # 新开连接,查看运行的镜像
    [root@kevinDing /]# docker ps
    CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS     NAMES
    8ebf26cff30f   f520432b291f   "/bin/bash"   2 minutes ago   Up 2 minutes             suspicious_stonebraker
    # 进入到镜像内部查看
    [root@kevinDing /]# docker inspect f520432b291f
    
    [
        {
          
          
            "Id": "8ebf26cff30fd0eb9c75e144eb7c8b18bd07def9faa1d413fa12ad7f5c8efc90",
            "Created": "2022-05-20T15:17:29.740198902Z",
            "Path": "/bin/bash",
            "Args": [],
           ......   中间内容省略
            "Mounts": [
                {
          
          
                    "Type": "volume",
                    "Name": "de516c45849d34553a8e9ee1c76ca4c3949aeebdfd9cb07d7a08e4d8f78a3273",
                    "Source": "/var/lib/docker/volumes/de516c45849d34553a8e9ee1c76ca4c3949aeebdfd9cb07d7a08e4d8f78a3273/_data",
                    "Destination": "volume01",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                },
                {
          
          
                    "Type": "volume",
                    "Name": "7f18328f873a7760294840e4fef2e9688d2303c071a695736fc0b41a802abb73",
                    "Source": "/var/lib/docker/volumes/7f18328f873a7760294840e4fef2e9688d2303c071a695736fc0b41a802abb73/_data",
                    "Destination": "volume02",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ]
        }
    ]
    
    
    
    

Insira a descrição da imagem aqui

  1. Verifique se a montagem foi bem-sucedida

    Insira o diretório de montagem volume01 dentro da imagem, crie um arquivo container_test.txt e verifique se o arquivo é gerado no caminho de montagem de volume01.

    [root@8ebf26cff30f /]# cd volume01
    [root@8ebf26cff30f volume01]# touch container_test.txt
    [root@8ebf26cff30f volume01]# ls
    container_test.txt
    [root@8ebf26cff30f volume01]# 
    # 在新开的连接中,进入到volume01的挂载路径中,可以查看到创建的文件
    [root@kevinDing volumes]# cd /var/lib/docker/volumes/de516c45849d34553a8e9ee1c76ca4c3949aeebdfd9cb07d7a08e4d8f78a3273/_data
    [root@kevinDing _data]# ls
    container_test.txt
    [root@kevinDing _data]# 
    

Insira a descrição da imagem aqui

9.6. Volume de dados do contêiner

O volume de dados do contêiner refere-se ao estabelecimento de um volume de dados para obter a sincronização de dados entre os contêineres.

Insira a descrição da imagem aqui

Inicie a imagem centos criada acima, inicie centos01centos02 e centos01 é o contêiner pai:

[root@kevinDing ~]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
kevin/mycentos   1.0       f520432b291f   52 minutes ago   231MB
hello-world      latest    feb5d9fea6a5   7 months ago     13.3kB
centos           latest    5d0da3dc9764   8 months ago     231MB
# 启动一个centos01容器
[root@kevinDing ~]# docker run -it --name centos01 kevin/mycentos:1.0
# ctrl+P+Q退出当前容器
# 再启动一个centos02容器, --volumes-from centos01
[root@kevinDing ~]# docker run -it --name centos02 --volumes-from centos01 kevin/mycentos:1.0

Após abrir uma conexão, insira dois containers para visualizar o conteúdo:

[root@kevinDing ~]# docker ps
CONTAINER ID   IMAGE                COMMAND                  CS         PORTS     NAMES
5b0deb75f776   kevin/mycentos:1.0   "/bin/sh -c /bin/bash"   4minutes             centos02
b8dcce0bcf25   kevin/mycentos:1.0   "/bin/sh -c /bin/bash"   5minutes             centos01
[root@kevinDing ~]# docker attach b8dcce0bcf25
[root@b8dcce0bcf25 /]# ls -l
total 56
lrwxrwxrwx  1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x  5 root root  360 May 20 16:04 dev
drwxr-xr-x  1 root root 4096 May 20 16:04 etc
drwxr-xr-x  2 root root 4096 Nov  3  2020 home
lrwxrwxrwx  1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx  1 root root    9 Nov  3  2020 lib64 -> usr/lib64
drwx------  2 root root 4096 Sep 15  2021 lost+found
drwxr-xr-x  2 root root 4096 Nov  3  2020 media
drwxr-xr-x  2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x  2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 97 root root    0 May 20 16:04 proc
dr-xr-x---  2 root root 4096 Sep 15  2021 root
drwxr-xr-x 11 root root 4096 Sep 15  2021 run
lrwxrwxrwx  1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x  2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x 13 root root    0 May 17 01:11 sys
drwxrwxrwt  7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15  2021 usr
drwxr-xr-x 20 root root 4096 Sep 15  2021 var
drwxr-xr-x  2 root root 4096 May 20 16:04 volume01
drwxr-xr-x  2 root root 4096 May 20 16:04 volume02
[root@b8dcce0bcf25 /]# cd volume01
[root@b8dcce0bcf25 volume01]# ls
[root@b8dcce0bcf25 volume01]# touch test01.txt
[root@b8dcce0bcf25 volume01]# ls
test01.txt
[root@b8dcce0bcf25 volume01]# 

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Se o contêiner centos01 for interrompido e excluído, os dados no contêiner centos02 não serão afetados, o que equivale a uma cópia bidirecional do diretório montado ao realizar volumes-from, realizando o compartilhamento de dados entre contêineres.

Da mesma forma, ao compartilhar dados entre vários bancos de dados MySQL e arquivos de configuração, as operações para centos01 e centos02 acima são semelhantes. Primeiro, inicie o mySQL01 e crie um volume de dados. Em seguida, use –volumes-from para montar o volume de dados do contêiner em outro contêiner MySQL:

# 挂载第一个MySQL容器 匿名挂载
[root@KevinDing ~]# docker run -d --name mysql01 -p 3307:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123454321 mysql:5.7

# 挂载第二个MySQL,因为是挂载到mysql01,无需再进行-v的匿名挂载了
[root@KevinDing ~]# docker run -d --name mysql02 --volumes-from mysql01 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123454321 mysql:5.7

Isso permite a sincronização de dados entre dois contêineres MySQL.

As informações de configuração são transferidas entre contêineres e o ciclo de vida de um contêiner de volume de dados continua até que nenhum outro contêiner seja usado.
Depois que o conteúdo do contêiner pai for persistido localmente, os dados locais não serão perdidos sem exclusão.

Acho que você gosta

Origin blog.csdn.net/weixin_43155804/article/details/124892975
Recomendado
Clasificación