AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1583983
Accepted
StoneThrow
StoneThrow
Asked: 2020-09-09 16:53:26 +0800 CST2020-09-09 16:53:26 +0800 CST 2020-09-09 16:53:26 +0800 CST

Como você pode ter uma camada de imagem docker de um sistema operacional diferente

  • 772

Eu sou novo dockere estou tentando entendê-lo um pouco melhor trabalhando com exemplos do zero.

Eu queria começar da forma mais primitiva possível: copiar um arquivo do meu contexto para a raiz da minha imagem do docker e, em seguida, validar a existência do arquivo no contêiner.

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 9.8 (stretch)
Release:        9.8
Codename:       stretch
$ ls -R
.:
demo.txt Dockerfile
$
$ cat Dockerfile
FROM scratch
WORKDIR .
COPY demo.txt /foo
$ 
$ docker build -t demo:v1 -f ./Dockerfile .
Sending build context to Docker daemon  28.67kB
Step 1/3 : FROM scratch
 --->
Step 2/3 : WORKDIR .
 ---> Using cache
 ---> 8eb9da711a99
Step 3/3 : COPY demo.txt /foo
 ---> c57e0e9a316b
Successfully built c57e0e9a316b
Successfully tagged demo:v1
$
$ docker run -it demo:v1 ls -l /foo
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"ls\": executable file not found in $PATH": unknown.

Eu entendo a essência do problema: FROM scratché apenas isso - sem mesmo ls. Então, isso pode ser corrigido mudando FROM scratchpara algo mais substancial:

$ cat Dockerfile
FROM alpine:3.7
WORKDIR .
COPY demo.txt /foo
$ 
$ docker build -t demo:v1 -f ./Dockerfile .
Sending build context to Docker daemon  28.67kB
Step 1/3 : FROM alpine:3.7
 ---> 6d1ef012b567
Step 2/3 : WORKDIR .
 ---> Using cache
 ---> 51c22fe2fd60
Step 3/3 : COPY demo.txt /foo
 ---> Using cache
 ---> e2c241241653
Successfully built e2c241241653
Successfully tagged demo:v1
$ 
$ docker run -it demo:v1 ls -l /foo
-rw-r--r--    1 root     root             6 Sep  8 23:42 /foo

Isso me leva à minha pergunta: estou confuso com esse conceito de instalar/executar uma distribuição Linux diferente (alpine) daquela que está no meu host (debian). O que acontece quando executo meu contêiner docker criado a partir de uma imagem incluída FROM alpine:3.7em seu Dockerfile? Uma máquina virtual que executa o Alpine Linux foi iniciada no meu PC físico que executa o Debian?

Se eu quisesse fazer algo muito primitivo - como ls- no meu contêiner docker, como escolher a imagem de base mínima? Eu escolhi alpine aleatoriamente - sem saber exatamente o que estava fazendo - quando alguém precisaria escolher uma distro diferente, como ubuntu, etc.?

linux docker
  • 2 2 respostas
  • 323 Views

2 respostas

  • Voted
  1. Ángel
    2020-09-09T17:19:14+08:002020-09-09T17:19:14+08:00

    As imagens do Docker são como sistemas de arquivos. Uma imagem docker seria um disco que continha uma instalação do Alpine, Ubuntu, Arch Linux... mesmo que seu host seja Debian. (você também pode ter imagens para o Debian, ou versões diferentes delas, mas é mais fácil explicar se forem completamente diferentes)

    O truque aqui é que você está executando o mesmo kernel em todos eles. Docker é uma solução de contêiner . Sua máquina baseada em alpine será executada em um kernel Linux distribuído pelo Debian (restringido pelo docker para não ver o mundo exterior). O Alpine funcionará bem com qualquer kernel do Linux novo o suficiente para executar o docker, então simplesmente funciona como se você tivesse uma instalação do Alpine (ou Ubuntu, ou Arch Linux ...).

    A desvantagem é que você não pode rodar o BSD ou o Windows lá, já que sua userland não seria capaz de rodar com um kernel Linux. Além disso, obviamente, eles precisam usar uma arquitetura compatível.

    O que acontece quando executo meu contêiner docker criado a partir de uma imagem que inclui FROM alpine:3.7 em seu Dockerfile? Uma máquina virtual que executa o Alpine Linux foi iniciada no meu PC físico que executa o Debian?

    Você inicia um novo contêiner que inicializa uma imagem com base em uma instalação alpina, que será muito semelhante à inicialização de uma instalação alpina.

    Observe que você pode criar uma instância do docker que faça outra coisa, como iniciar um console bash para você trabalhar, e não iniciar os daemons que a distribuição normalmente executaria na inicialização.

    Se eu quisesse fazer algo muito primitivo - como ls - no meu contêiner docker, como escolher a imagem base mínima? Eu escolhi alpine aleatoriamente --

    Se você quiser executar ls, e apenas isso, poderá criar uma imagem que contenha apenas ls(já que exigiria libc, provavelmente melhor como uma cópia de busybox-static). isso pode ser um exagero, no entanto.

    Alpine é usado com bastante frequência para isso, pois é uma distribuição muito pequena.

    não sabendo particularmente o que estava fazendo - quando alguém precisaria escolher uma distro diferente, como ubuntu, etc

    Se você precisava de algo fornecido por essa distro. Suponha que você queira executar um programa de console cujas dependências foram declaradas como "precisando do pacote X, Y e Z do Ubuntu MN". Portanto, faria sentido executá-lo em uma instância do docker com base em uma imagem "Ubuntu MN".

    Como você está trabalhando em um host Debian, você pode se sentir mais confortável trabalhando com imagens Debian, e faria sentido basear suas imagens docker em uma imagem Debian.

    Isso equivale à pergunta "Preciso instalar um novo servidor GNU/Linux, qual distribuição devo usar?", que no final das contas será uma escolha pessoal da pessoa (ou equipe) entre várias boas opções.

    • 2
  2. Best Answer
    Daniel B
    2020-09-11T08:49:40+08:002020-09-11T08:49:40+08:00

    Eu acho que sua pergunta é realmente “Por que eu preciso disso?” e a resposta simples é “Porque tem que ser independente”. Lembre-se de que, quando um contêiner está em execução, o que quer que esteja nele não pode acessar o sistema de arquivos do host.

    Isso é um problema porque muitos programas requerem bibliotecas compartilhadas. Vamos dar uma olhada em echo:

    ~$ ldd $(which echo)
            linux-vdso.so.1 (0x00007fffeec73000)
            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1a57c80000)
            /lib64/ld-linux-x86-64.so.2 (0x00007f1a57e75000)
    

    Assim, mesmo um programa tão simples quanto echonão é independente. Depende da libc. Se eu criasse uma FROM scratchimagem do Docker apenas com o echobinário, ela não poderia ser executada. Claro que você poderia (re)compilar algum software para ser vinculado estaticamente, mas isso requer tempo.

    Às vezes, você também depende de outras coisas, como certificados raiz, e deixar uma distribuição estabelecida cuidar disso é mais fácil.

    Quando você inicia um contêiner, ele não “executa o sistema operacional do contêiner”. Em vez disso, na maioria dos contêineres mais simples, apenas um único processo é iniciado (conforme definido na linha de comando ou em Dockerfile). Os contêineres mais complexos tendem a usar seus próprios sistemas “init”, porque os sistemas init clássicos do sistema operacional geralmente não são adequados para uso em contêineres.

    Escolher uma imagem de base adequada não é algo que possa ser formalizado. Você precisa pensar nos requisitos e pesquisar o que está disponível. Não há realmente nenhuma maneira de contornar isso. Você também pode ter preferências pessoais. Para este caso particular, talvez as imagens do busybox sejam adequadas e bastante mínimas.


    Com um tipo diferente de software de contêiner (LXC/LXD), você pode, de fato, executar uma segunda distribuição Linux inteira, com sistema init regular e outros enfeites, em um contêiner. Isso é preferível à virtualização total se não for necessário tanto isolamento. Ele oferece desempenho muito superior, muito parecido com o Docker.

    O isolamento usando namespaces do Linux é suficiente para permitir que muitas distribuições compartilhem o mesmo kernel em execução. Mas é válido pensar nisso como uma máquina virtual leve.

    • 1

relate perguntas

  • execute o contêiner do docker como root

  • Comunique-se com o daemon do Docker no Windows

  • Como ativar o sensor de impressão digital no domínio e no diretório ativo do Linux

  • Como alterar permanentemente Ctrl + C para Ctrl + K no CentOS 7?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 Por que uma conexão de Internet gigabit/s via cabo (coaxial) não oferece velocidades simétricas como fibra? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    fixer1234 O "HTTPS Everywhere" ainda é relevante? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve