此列表不断更新中,最后更新于2019-2-7
执行命令
有时候你需要在一个容器中执行命令,或者干脆启动一个bash——用这个万能的工具完成任务。
以下分别以Docker和Docker Compose来描述命令。
Docker
首先你需要知道容器的名字,不知道的话,可以运行docker ps命令列出所有运行的容器,从中获取容器名称。
这里我们使用docker exec命令来执行命令,并配合 -i交互 和 -t终端 选项参数来开启终端并保持交互。
$ docker exec -i -t container_name /bin/bash$ docker exec -i -t container_name /bin/bash-i和-t选项参数可以合并为-it,同时也可以直接执行多条命令。
$ docker exec -it container_name sh -c "echo a && echo b"$ docker exec -it container_name sh -c "echo a && echo b"Docker Compose
如果使用Docker Compose的话,其内含的不管是run命令还是exec命令,都会自动的分配一个终端, 因此只需要简单的执行以下命令。
$ docker-compose exec container_name /bin/bash$ docker-compose exec container_name /bin/bash同样的方法可以用来直接执行命令。
$ docker-compose exec container_name command$ docker-compose exec container_name command但是如果需要执行一系列的命令,则需要使用sh命令将他们连接起来。
$ docker-compose exec container_name sh -c 'echo a && echo b'$ docker-compose exec container_name sh -c 'echo a && echo b'进入Windows版Docker的命令行
在使用Windows版Docker时,其实在Hyper-V上运行了一个订制后的Linux,其使用的是LinuxKit发布版本, 但鉴于这个Linux并非时完整的发行版,因此功能是受限的,其实很少是有需要直接进入的。 不过真要是有这个需求,就用以下命令即可。
docker run -it --rm --privileged --pid=host justincormack/nsenter1docker run -it --rm --privileged --pid=host justincormack/nsenter1参考
将镜像从一台主机传输到另一台主机
Docker Hub
这是一个公共的Docker镜像集散地,不过他也提供收费的企业版镜像功能,可以不用公开。
在执行过docker login之后,可以使用以下命令推送镜像至Docker Hub
$ docker publish$ docker publish自建镜像集散地
我们首先使用以下命令启动 自建镜像集散地
$ docker run -d -p 5000:5000 --name registry registry:2$ docker run -d -p 5000:5000 --name registry registry:2使用以下命令将该镜像标记,链接至自建镜像集散地
$ docker image tag myimage (ip-address):5000/myfirstimage$ docker image tag myimage (ip-address):5000/myfirstimage在第一台主机上,使用以下命令将该镜像推送上去
$ docker push (ip-address):5000/myfirstimage$ docker push (ip-address):5000/myfirstimage在另外一台主机上,使用以下命令将该镜像拉取下来。
$ docker pull (ip-address):5000/myfirstimage$ docker pull (ip-address):5000/myfirstimage使用过程中可能会有证书问题的提示,请根据以下参考网址进行处理。
参考
通过文件传送
首先在源主机使用以下命令将镜像存储为tar文件
$ docker save -o <save image to path> <image name>$ docker save -o <save image to path> <image name>接下来把这个tar文件拷贝到目标主机上,这个过程你可能会用到cp或scp命令。 拷贝完成后,在这目标主机上执行以下命令,即可将镜像在该主机上恢复出来。
$ docker load -i <path to image tar file>$ docker load -i <path to image tar file>如果两台主机可以使用ssh进行连接,或许以下快速方法会更加方便, 顺序的完成打包、压缩、传送并释放装载的全过程。
$ docker save <image> | bzip2 | \
ssh user@host 'bunzip2 | docker load'$ docker save <image> | bzip2 | \
ssh user@host 'bunzip2 | docker load'如果你所使用系统中含有pv命令,也可以将其放在其中,可以监控整个流程。
$ docker save <image> | bzip2 | pv | \
ssh user@host 'bunzip2 | docker load'$ docker save <image> | bzip2 | pv | \
ssh user@host 'bunzip2 | docker load'参考
清理空间
Docker用久了后,很容易出现空间占用过多的问题,通过以下不同的方式进行清理
删除不再使用的镜像
通常情况,如果拉取了很多镜像,尤其是在本地多次编译过镜像时尤为突出, 可以使用以下命令删除这些没有被使用的镜像。
$ docker rmi $(docker images -q --filter "dangling=true")$ docker rmi $(docker images -q --filter "dangling=true")删除已经停止的容器
已经停止的容器,而没有打算保留其状态,也是可以被删除的。
$ docker rm `docker ps --no-trunc -aq`$ docker rm `docker ps --no-trunc -aq`参考
- https://gist.github.com/ngpestelos/4fc2e31e19f86b9cf10b
- http://stackoverflow.com/questions/17236796/how-to-remove-old-docker-containers
Proxy on ubuntu
对于Ubuntu 16.04 LTS系统,可以使用内置的systemd,步骤如下:
- 建立目录:
$ mkdir /etc/systemd/system/docker.service.d$ mkdir /etc/systemd/system/docker.service.d- 创建
/etc/systemd/system/docker.service.d/http-proxy.conf文件,内容如下:
[Service]
Environment="HTTP_PROXY=https://web-proxy.corp.xxxxxx.com:8080/"
Environment="HTTPS_PROXY=https://web-proxy.corp.xxxxxx.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,localaddress,.localdomain.com"[Service]
Environment="HTTP_PROXY=https://web-proxy.corp.xxxxxx.com:8080/"
Environment="HTTPS_PROXY=https://web-proxy.corp.xxxxxx.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,localaddress,.localdomain.com"- 应用变化:
$ systemctl daemon-reload$ systemctl daemon-reload- 重启docker:
$ systemctl restart docker$ systemctl restart docker