Como entro num contentor de ancoragem?
eu estou tentando ssh em um dos recipientes para inspecionar os arquivos / diretórios que foram criados durante a compilação inicial. Tentei fugir, mas isso não fez nada. Mesmo que tivesse, preferia ter uma consola onde pudesse atravessar a estrutura do directório, em vez de executar um único comando. Qual é a maneira certa de fazer isto com o Docker?
20 answers
docker attach
vai deixar você se conectar ao seu recipiente de Docker, mas isso não é realmente a mesma coisa que ssh
. Se o seu contentor estiver a correr um servidor web, por exemplo, docker attach
irá provavelmente ligá-lo ao stdout do processo do servidor web. Não vai necessariamente dar-te uma concha.
O comando docker exec
é provavelmente o que procura; isto permitir-lhe-á executar comandos arbitrários dentro de um contentor existente. Por exemplo:
docker exec -it <mycontainer> bash
Claro, qualquer que seja o comando. você está executando deve existir no sistema de arquivos container.
No comando acima <mycontainer>
está o nome ou o ID do contentor alvo. Não importa se você está ou não usando docker compose
; basta executar docker ps
e usar tanto o ID (um texto hexadecimal mostrado na primeira coluna) ou o nome (mostrado na coluna final). Por exemplo:
$ docker ps
d2d4a89aaee9 larsks/mini-httpd "mini_httpd -d /cont 7 days ago Up 7 days web
Posso correr:
$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:3/64 scope link
valid_lft forever preferred_lft forever
Eu poderia fazer a mesma coisa correndo:
$ docker exec -it d2d4a89aaee9 ip addr
Da mesma forma, eu poderia começar uma concha em o contentor;
$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
Para embater num contentor, escreva isto:
docker exec -t -i container_name /bin/bash
apt-get update
apt-get install openssh-server
mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd
useradd --create-home --shell /bin/bash --groups sudo username ## includes 'sudo'
passwd username ## Enter a password
apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk '/inet addr/{print substr($2,6)}' ## Display IP address (optional)
Agora pode até executar aplicações gráficas (se estiverem instaladas no contentor) usando o encaminhamento X11 para o cliente SSH:
ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client
Aqui estão alguns recursos relacionados:
- o openssh-server não começa no 'Docker' contentor
- Como colocar o bash ou o ssh num contentor em execução no modo de fundo?
- pode executar aplicações GUI num contentor de Docker?
- outras abordagens úteis para o acesso gráfico encontrado com a pesquisa: Docker X11
- Se você corre SSHD em seus recipientes Docker, você está fazendo errado!
Repare : esta resposta promove uma ferramenta que escrevi.
Eu criei um servidor SSH contendo que você pode 'colar' em qualquer container em execução. Desta forma você pode criar composições com cada recipiente. O único requisito é que o recipiente tem Bash.O seguinte exemplo iniciaria um servidor SSH ligado a um contentor com o nome 'my-container'.
docker run -d -p 2222:22 \
-v /var/run/docker.sock:/var/run/docker.sock \
-e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
jeroenpeeters/docker-ssh
ssh localhost -p 2222
Quando se ligar a este serviço SSH (com o seu cliente SSH à sua escolha), uma sessão Bash irá ser iniciado no recipiente com o nome "my-container".
Para mais indicações e documentação, ver: https://github.com/jeroenpeeters/docker-ssh
SSH num contentor de estivadores usando este comando:
sudo docker exec -i -t (container ID) bash
docker-compose exec
toma o nome do serviço de acordo com o seu arquivo docker-compose.yml
.
Então para obter uma shell Bash para o seu serviço 'web', você pode fazer:
$ docker-compose exec web bash
Se estiver a usar o 'Docker' no Windows e quiser obter acesso ao 'shell' de um contentor, use isto:
winpty docker exec -it <container_id> sh
O mais provável é que já tenhao Git Bash instalado. Se não o fizer, certifique-se de o instalar.
Para se ligar ao cmd num contentor do Windows, use
docker exec -it d8c25fde2769 cmd
Onde d8c25fde2769 é a identificação do contentor.
docker exec
será definitivamente uma solução. Uma forma fácil de trabalhar com a pergunta que fez é montando a pasta dentro do 'Docker' para a pasta do sistema local .
Para que possa ver as alterações no caminho local instantaneamente.
docker run -v /Users/<path>:/<container path>
Utilizar:
docker attach <container name/id here>
Outro modo, embora haja um perigo para ele, é usar attach
, mas se você Ctrl + C para sair da sessão, você também irá parar o recipiente. Se você só quer ver o que está acontecendo, use docker logs -f
.
:~$ docker attach --help
Usage: docker attach [OPTIONS] CONTAINER
Attach to a running container
Options:
--detach-keys string Override the key sequence for detaching a container
--help Print usage
--no-stdin Do not attach STDIN
--sig-proxy Proxy all received signals to the process (default true)
Em alguns casos, a sua imagem pode ser Alpina. Neste caso ele vai lançar:
O EXECUTIME do OCI falhou: o exec falhou: container_linux.go: 348: iniciar o processo do contentor causou "exec: \" bash\": ficheiro executável não encontrado em $PATH": desconhecido
Porque /bin/bash
não existe. Em vez disso, deve usar:
docker exec -it 9f7d99aa6625 ash
Ou
docker exec -it 9f7d99aa6625 sh
Para inspeccionar ficheiros, execute docker run -it <image> /bin/bash
para obter um terminal interactivo. A lista de imagens pode ser obtida por docker images
. Ao contrário de docker exec
, esta solução também funciona no caso de uma imagem não começar (ou sair imediatamente após a execução).
É simples!
Enumere todas as suas imagens do acoplador:
sudo docker images
No meu sistema mostrou o seguinte resultado:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
bash latest 922b9cc3ea5e 9 hours ago
14.03 MB
ubuntu latest 7feff7652c69 5 weeks ago 81.15 MB
Tenho duas imagens do Docker no meu PC. Digamos que quero correr o primeiro.
sudo docker run -i -t ubuntu:latest /bin/bash
Isto vai dar-lhe o controlo terminal do contentor. Agora você pode fazer todo o tipo de operações de shell dentro do recipiente. Como fazer ls
irá enviar todas as pastas na raiz do sistema de ficheiros.
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
Se tiver o Docker instalado com {[[0]}, pode usar a interface gráfica. Abra Kitematic
do ícone do acoplador e na janela Kitematic
seleccione o seu contentor e carregue depois no ícone exec
.
Você pode ver o registo do contentor e muitas informações do contentor (na página Configuração) também nesta interface.
SOLUÇÃO DE GOINSIDE
Instalar goinside
a ferramenta da linha de comandos com:
sudo npm install -g goinside
E entrar num contentor com um tamanho terminal adequado com:
goinside docker_container_name
Resposta Antiga
Pusemos este excerto.~/.profile
:
goinside(){
docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside
Isto não só faz com que todos possam entrar num contentor com:
goinside containername
Também resolve um problema de longa duração sobre o tamanho fixo do terminal de contentores do Cais. O que é muito irritante se encarares ele.
Também se seguires a ligação também terás a completação de comandos para os nomes dos contentores do docker.
Use este comando:
docker exec -it containerid /bin/bash`
Outra opção é usar nsenter.
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
Se estiver a utilizar a composição da Docker, isto irá levá-lo para dentro de um contentor da Docker.
docker-compose run container_name /bin/bash
Dentro do contentor irá levar-te ao WORKDIR definido no ficheiro Dockerfile. Pode alterar o seu directório de trabalho por
WORKDIR directory_path # E.g /usr/src -> container's path
ip
route
netstat
ps
...
Verifiquei todas estas respostas, não são válidas para mim. Procurei informações noutros sites. Eu não vou adicionar um super link aqui, uma vez que não está escrito em inglês. Então eu acabei de colocar este post com solução sumária para as pessoas que têm o mesmo requisito que eu.
Diz que tens um contentor chamado teste de luz. Siga os passos abaixo. -
docker inspect light-test -f {{.NetworkSettings.SandboxKey}}
. Este comando receberá resposta como/var/run/docker/netns/xxxx
.
- Depois
ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx
. A pasta pode não existir, Façamkdir /var/run/netns
primeiro.
Agora você pode executar
ip netns exec xxxx ip addr show
para explorar o mundo da rede em container.
PS. xxxx
é sempre o mesmo valor obtido através do primeiro comando. E, claro, quaisquer outros comandos são válidos, ou seja ip netns exec xxxx netstat -antp|grep 8080
.
For docker-compose up (Docker4Drupal)
docker-compose exec php bash
Usoo 'Docker' do Drupal num portátil Linux. Depois de executar o contentor, eu uso 'docker-compose exec php bash
' para me ligar ao Contentor para poder executar comandos drush. Funciona bem para mim.