O primeiro erro é pensar que uma imagem/contêiner do Docker é semelhante a uma máquina virtual. Existem semelhanças, mas elas não são as mesmas e, francamente, não são realmente semelhantes.
Docker não é, realmente, para executar um sistema operacional. É para executar um único processo em um ambiente contido (isolado). O contêiner usa o mesmo kernel que o que está no host.
Quando você cria uma imagem Docker com FROM ubuntu
você está iniciando sua imagem com algumas camadas pré-criadas que trazem algumas partes de um sistema de arquivos padrão e pacotes que você encontraria em um servidor Ubuntu.
Em seguida, você adiciona suas próprias camadas adicionais, adicionando binários e arquivos necessários para executar seu programa / processo.
A imagem (normalmente, mas não obrigatória) teria um CMD
comando ou ENTRYPOINT
comando para executar alguma coisa.
Cada linha em um Dockerfile
é um comando instruindo Docker sobre como criar a imagem. Cada linha / comando resulta em mais uma camada. Para instalar pacotes, você provavelmente quer fazer algo assim:
FROM ubuntu:16.04RUN apt-get -qq update && \ apt-get -y install build-essential autoconf libtool && \ apt-get install -y python-setuptools python-dev python3-dev && \ apt-get install -y python-pip python3-pip && \ apt-get install -y python-virtualenv unixodbc-dev libffi-dev git && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*
Isso manterá sua imagem menor.
Então você precisará realmente executar algo...
CMD python
Então você pode construir sua imagem:
docker build -t myimage .
E usa-o...
docker run --rm -it myimage
ifconfig
não funciona porque o binário não está na imagem. Não é realmente necessário, pois você não gerencia a rede de dentro do contêiner.
Então você parece estar fazendo um contêiner para construir algum código. Você gostaria de montar seu diretório com o código dentro do contêiner ao executá-lo. Não sei qual sistema operacional você executa em sua estação de trabalho ou servidor, então vou me referir a este post para obter mais informações: https://stackoverflow.com/questions/41485217/mount-current-directory-as-a-volume-in-docker-on-windows-10/41489151#41489151
Digamos que você esteja construindo com o comando make
, você poderia fazer isso:
docker run --rm -it -v $(pwd):/usr/src/project myimage make
Isso exigiria uma linha em seu Dockerfile
para fazer o dir de trabalho /usr/src/project
:
WORKDIR /usr/src/project
O que acontecerá se você executar o docker
a linha de comando acima é que ele criará um contêiner a partir da imagem chamada myimage
(comando build mostrado anteriormente), monte o diretório atual em que você está /usr/src/project
dentro do novo recipiente. Executar o make
comando dentro do recipiente e, em seguida, sair. O --rm
o parâmetro diz ao Docker para não manter o contêiner assim que terminar de funcionar. O -it
parâmetros média interactive
e tty
.
Se você quisesse apenas ter acesso a algum shell para poder executar manualmente make
ou outros comandos de forma ad-hoc, Você também pode fazer isso:
docker run --rm -it -v $(pwd):/usr/src/project myimage /bin/bash
Isso criaria o contêiner a partir do myimage
imagem e execução bash
. Porque bash
não sai e você tem o -it
parâmetro, você estará no prompt do contêiner, onde poderá fazer o que quiser.
Lembre-se de que qualquer arquivo que você modificar de dentro do contêiner não será preservado e da próxima vez que você começar a voltar ao estado padrão. Claro que todos os arquivos do /usr/src/project
diretório será modificado em seu disco rígido local como este é montado a partir dele.