【Docker】--7.curl,docker,远程API操作,文件上传下载/执行/命令行

“1 0 2 4”

  • 0. 对本地机远程操作开启
  • 1. 远程下载镜像
  • 2.远程实例化容器
  • 3. 远程开启容器
  • 4. 远程上传多个文件
  • 5. 远程执行命令
    • 5.1 创建命令实例(创建)
    • 5.2 实例化命令(生效)
  • 6. 远程下载文件
    • 6.1 下载单个文件
    • 6.2 下载整个文件夹
  • 7. 基于apache2改进

这是一个练手的小项目的升级版,已知docker容器名字为my_ubuntu,且已经开机.
通过外部运行API方式让本地1.txt 2.txt传入docker的/app/prj路径下作为输入文件,执行可执行程序deal,最终获得1.ou 2.ou 3.ou再传入docker外,即本地.
且本地与ubuntu是脱离的,在windows系统上

  • 参考官方docker关于curl的文档

0. 对本地机远程操作开启

  1. 修改docker服务的文件,设置端口
sudo gedit /usr/lib/systemd/system/docker.service
  1. ExecStart=/usr/bin/dockerd-current改为ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock
2. 重启docker 服务
```bash
systemctl daemon-reload
systemctl restart docker

此时远端已经可以访问我们IP:2375端口来访问本机docker

1. 远程下载镜像

根据官网,使用docker-curl命令下载一个镜像(内网不同主机此处192.112.0.122改为自己的IP)

curl -XPOST "http://192.112.0.122:2375/v1.41/images/create?fromImage=ubuntu&tag=latest"

2.远程实例化容器

创建我们的容器

curl -H "Content-Type: application/json" http://192.112.0.122:2375/containers/create?name=my_ubuntu -d '{
    "Image": "ubuntu:latest",
    "HostConfig": {
        "NetworkMode": "host",
        "Binds": [
            "/tmp:/tmp"
        ]
    },
    "Cmd": [
       "tail","-f","/dev/null"
  ]
}'
  • ,仍然是curl的语法,?后边接必须参数
  • /tmp:/tmp表示将本地tmp/传输到容器中的tmp/,并挂载到本地硬盘,容器内与外部本地修改是一样的(此参数只有宿主机可用)
  • -H 表示传输的数据类型,json
  • “tail”,“-f”,"/dev/null"是防止被关闭,不加这句,容器无法后台运行,一start就stop了
  • name后边是容器的名字

3. 远程开启容器

启动容器

curl -XPOST http://192.112.0.122:2375/containers/my_ubuntu/start

4. 远程上传多个文件

在docker官网上我只找到了一种上传方法,就是上传文件的压缩包(tar)格式,传送到容器中会自动解压到容器路径,

  1. 例如压缩文件命令tar czvf input.tar 1.txt 2.txt 3.txt,此时压缩包input.tar下就这三个文件
  2. 运行如下命令后,容器内/app/prj下会多** 1.txt 2.txt 3.txt **这三个文件(自动解压了)
curl -T input.tar -PUT "http://192.112.0.122:2375/v1.41/containers/ubuntu_bolang/archive?path=/app/prj"

5. 远程执行命令

执行命令分为两步,实例化命令,和执行实例化

5.1 创建命令实例(创建)

创建命令实例后会拿到一个id

curl -H "Content-Type: application/json" http://192.112.0.122:2375/containers/ubuntu_bolang/exec -d '{  "AttachStdin": false,
  "AttachStdout": true,
  "AttachStderr": true,
  "DetachKeys": "ctrl-p,ctrl-q",
  "Tty": false,
  "Cmd": [
     "sh","-c","cd test && sh ./push.sh"
  ],
  "Env": [
    "FOO=bar",
    "BAZ=quux"
  ]
}'
  • cmd内第三个双引号就是我们需要输入的命令,例如此处为打开test文件夹,并执行该文件夹下的push.sh脚本文件
  • 运行完毕,只是创建了个应用实例,还没有实例化,控制台输出如下:
{"Id":"b873b67f17a024aea12bb1a2d50fbc2917a13abc61e82b62f4be050aa7c5c70d"}

5.2 实例化命令(生效)

  • 运行5.1后会得到控制台的id,复制一长串数字和字符,粘贴替换掉如下命令中的id的字符序列即可
curl -XPOST -H "Content-Type: application/json" http://192.112.0.122:2375/exec/id的字符序列/start  -d '{
  "Detach": false,
  "Tty": false
}'

6. 远程下载文件

仍然和下载的一样,必须以.tar方式保存到本地,解压后才不会乱码(自动压缩)
某种意义上讲,也就是只能用-o而不是-O了,因为-O 直接以原文件名储存到本地,不带任何参数都可以

6.1 下载单个文件

curl -GET "http://192.112.0.122:2375/v1.41/containers/ubuntu_bolang/archive?path=/app/prj/output/1.ou" -o out.tar
  • 此时当地文件夹下会多出现一个output.tar压缩包,解压后就是所求文件1.ou

6.2 下载整个文件夹

已知output下只有1.ou 2.ou 3.ou文件

curl -GET "http://192.112.0.122:2375/v1.41/containers/ubuntu_bolang/archive?path=/app/prj/output/" -o out.zip
  • 此时本地文件夹内会出现output/文件夹,该文件夹下有1.ou 2.ou 3.ou三个文件

7. 基于apache2改进

此时已经完成了基本需求,但是甲方要求必须指定文件格式与数量上传,没办法,只能上apache2或者nginx文件服务器喽,下节再见,我选择apache2,在这里nginx也是可以的.

你可能感兴趣的:(#,Linux相关,1024程序员节,docker,linux,bash,ubuntu)