docker-宿主机与容器的命令执行方法

在宿主机中命令运行状态的容器执行一条命令

问题描述

当前有一个容器在运行,在不进入容器的情况下,如何在宿主机中命令该容器在容器内执行一条命令?

环境

宿主机:centos7,python2.7,
容器:ubuntu20,python3.8

解法

假设有一个test.py,内容是:

print "hello!"

需要实现的效果是在宿主机中,使用python3运行test.py。(会报错,但是仅作测试、示意)

首先将test.py放在/home/xxx/test,并且在容器中建立一个文件夹/mnt/share/test作为可共享的文件夹。

然后启动容器:

docker run -itd --privileged -v /home/xxx/test:/mnt/share/test ubuntu-py385:2023

复制容器id备用。

此时在宿主机中只需要执行docker exec即可看到结果。

(base) [root@localhost test]# docker exec 容器ID python3 /mnt/share/test/test.py
  File "/mnt/share/test/test.py", line 1
    print "hello!" 
          ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("hello!")?

在运行的容器中命令宿主机执行一条命令

问题描述

当前有一个容器在运行,如何在容器中向宿主机发送一条命令,要求宿主机执行?

环境

同上。

解法

test.py存放位置同上,内容同上,容器启动方法同上。

这里使用socket解决这个问题。

准备两个python文件:

  1. host.py 在宿主机中执行
  2. container.py 在容器中执行
'''host.py
'''
import os
import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 8890))
server.listen(5)

while True:
    client_socket, address = server.accept()
    data = client_socket.recv(1024)
    cmd = data.decode('utf-8')
    if len(cmd) == 0: continue
    print cmd
    os.system(cmd)
    client_socket.close()

#---------------------------------------------------------

'''container.py
'''
import socket
  
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('宿主机ip', 8890))
client.sendall(b'python /home/xxx/test/test.py')
client.close()

需要注意的是:

  1. container的connect函数要换成宿主机ip;
  2. container发出的命令中用到的路径,需要使用宿主机的(因为这个命令要在宿主机中执行);
  3. 需要确保宿主机的8890端口已经开启。

随后在宿主机上运行host.py

python /home/xxx/test/test.py

然后在容器中运行container.py

python3 /mnt/share/test/container.py

此时宿主机中的输出是:

python /home/xxx/test/test.py
hello!

你可能感兴趣的:(docker,容器,运维)