docker 个人总结
强烈建议参照系统说明文档,docker <命令> --help
docker 常用命令
cp
docker 容器中经常需要与主机进行文件交互,一种简单的方式是通过 docker run -v 选项直接挂载文件系统,两边的文件修改都会被实时同步。不过如果运行之后需要临时进行文件传递,可以使用 cp 命令
docker cp src tgt
docker cp <容器名称>:<路径> <主机路径>
docker cp mycontainer:/opt/testnew/file.txt /opt/test/
docker cp <主机路径> <容器名称>:<路径>
docker cp /opt/test/file.txt mycontainer:/opt/testnew/
如果指定路径为一个文件夹,那么整个文件夹将被拷贝
inspect
docker inspect <选项><容器或镜像名称,id>:用于以JSON格式显示容器与镜像的详细信息
runoob@runoob:~$ docker inspect mysql:5.6
[
{
"Id": "sha256:2c0964ec182ae9a045f866bbc2553087f6e42bfc16074a74fb820af235f070ec",
"RepoTags": [
"mysql:5.6"
],
"RepoDigests": [],
"Parent": "",
"Comment": "",
"Created": "2016-05-24T04:01:41.168371815Z",
"Container": "e0924bc460ff97787f34610115e9363e6363b30b8efa406e28eb495ab199ca54",
"ContainerConfig": {
"Hostname": "b0cf605c7757",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"3306/tcp": {}
},
...
load & save
docker save <选项><镜像名称>:<标签>:将镜像保存为tar包文件。镜像存储文件将保存完整记录
docker save -o <save image to path> <image name>
docker load <选项>:从tar文件创建镜像从tar文件创建镜像
docker load -i <path to image tar file>
同时可以通过组合 ssh 命令实现一条指令从一台机器拷贝镜像到另一台机器
docker save <image> | bzip2 | \
ssh user@host 'bunzip2 | docker load'
# 也可以通过 pv 查看转移过程
docker save <image> | bzip2 | pv | \
ssh user@host 'bunzip2 | docker load'
- docker attach <选项><容器名称, id>:将标准输入(stdin)与标准输出(stdout)连接到正在运行的容器。需要注意的是通过 attach 连接容器之后,如果退出容器,容器将自动停止。因此更建议使用下面的 exec 命令
- docker build <选项><Dockerfile路径>:命令使用Dockerfile文件创建镜像
- docker commit <选项><容器名称,id>/<镜像名称>:<标签>:用于从容器的修改项创建新的镜像
- docker create <选项><镜像名称,id><命令><参数>:使用指定的镜像创建容器。与run命令不同,使用create命令只能创建容器而并不启动
- docker diff <容器名称,id>:用于检查容器文件系统的修改
- docker exec <选项><容器名称,id><命令><参数>:从外部运行容器内部的命令
- docker export <容器名称,id>:用于将容器的文件系统导出为tar文件包,其仅保存容器当时的快照状态。容器快照文件将丢弃所有的历史记录和元数据信息
- docker history <选项><镜像名称,id>:用于显示镜像的历史。此处的历史依据Dockerfile文件中的设置创建。
- docker images <选项><镜像名称,id>:查看当前电脑上存在的 docker 镜像
- docker import <tar文件的URL或者 - ><注册名称>/<镜像名称>:<标签>:用于从压缩为tar文件(.tar .tar.gz .tgz .bzip .tar.xz .txz)的文件系统创建镜像。从容器快照文件导入时可以重新指定标签等元数据信息。
- docker info:用于显示当前系统信息、docker容器、镜像个数、设置等信息。
- docker login <选项><Docker 注册服务器的URL>:用于登录Docker 的注册服务器
- docker logout <选项><Docker 注册服务器的URL>:用于从Docker注册服务器中登出
- docker logs <容器名称,id>:用于输出容器日志
- docker port <容器名称,id><端口>:用于查看容器的某个端口是否处于开放状态
- docker ps <选项>:查看当前电脑上存在的 docker 容器
- docker pull <选项> <容器名称,id>:从Docker注册服务器获取镜像
- docker push <注册名>/<镜像名>:<标签>:将镜像推送到Docker注册服务器
- docker rm <选项><容器名称,id>:删除创建容器
- docker rmi <注册名称>/<镜像名称,id>:<标签>:用于删除镜像。若不指定标签,则删除latest标签
- docker run <选项><镜像名称,id><命令><参数>:指定镜像创建容器,并启动容器。run 命令默认会执行 /bin/bash
- docker restart <选项><容器名称,id>:重启容器,不包含容器文件系统的卸载与挂载操作。本质上 restart 命令不涉及文件系统的操作,因此restart命令并不是stop与start两个命令的顺序叠加。
- docker search <选项><搜索词>:用于在docker hub 中搜索镜像
- docker start <选项><容器名称,id>:用于启动容器,包含容器文件系统挂载的操作
- docker stop <选项><容器名称,id>:停止容器,包含容器文件系统卸载的操作
- docker tag <选项><镜像名称,id> <用户名/镜像新名称:id>:为一个镜像起一个别名,两个镜像本质共用物理存储
- Ctrl+D 或者 exit:退出容器
docker 命令选项介绍
- -d:Detach模式,一般为守护进程模式,容器以后台方式运行。比如 run 命令不加 -d 将直接进入容器
- -i:开启标准输入,即使未与容器连接,也维持标准输入
- --name:指定容器的名字
- -t:使用TTY模式(pseudo-TTY)若要使用bash,则必须设置该选项。若不设置该选项,则虽然输入命令,但不显示shell
最后详解一个复杂命令吧
docker run -d -it --net=host -v /home/test/:/home/test/ --gpus all --name test test:1.0
其指定在后台启动(-d),连接了输入输出(-i),启动了模拟终端(-t),使用宿主机网络(-net=host),映射端口( -p 50052:50052 配置 --net=host 自动映射对应端口),挂载宿主机文件系统(-v,使用完整路径),映射宿主机 gpu(-gpus),指定启动容器的名字(--name),docker 内部内存不足可以指定为主机内存(--ipc=host),指定运行的镜像和版本(test:1.0)
docker 服务重启
- sudo systemctl daemon-reload:重启守护进程
- systemctl restart docker,sudo service docker restart:重启docker服务
问题及解决方案
- docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].:可以使用 systemctl restart docker 重启 docker
- ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm).:可以添加 --ipc=host 选项启动 docker
- Got permission denied while trying to connect to the Docker daemon socket at ....:需要添加当前用户 docker 执行权限。
To create the docker group and add your user:
1、Create the docker group.
sudo groupadd docker
2、Add your user to the docker group.
sudo usermod -aG docker ${USER}
3、You would need to loog out and log back in so that your group membership is re-evaluated or type the following command:
su -s ${USER}
- docker push 私有仓提示(net/http: request canceled (Client.Timeout exceeded while awaiting headers):需要配置一下docker 的 no_proxy(/etc/systemd/system/docker.service.d/http-proxy.conf),配置之后重启 docker
- docker push 私有仓提示(http: server gave HTTP response to HTTPS client):Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误。需要配置一下 /etc/docker/daemon.json 添加 { "insecure-registries":["192.168.1.100:5000"] }