docker 个人总结
docker 安装
docker 安装
- 可以直接参考官方教程:Install Docker Engine on Ubuntu | Docker Documentation
- 个人通过官方教程的离线安装方式进行的安装,具体可以参考官方教程
nvidia-docker 安装
- 可以直接参考官方教程:Installation Guide — NVIDIA Cloud Native Technologies documentation
- 个人也是通过离线方式进行的安装,下载对应安装包 Index of /nvidia-docker/
- 需要的安装包有
- libnvidia-container-tools
- libnvidia-container1
- nvidia-container-runtime
- nvidia-container-toolkit
- nvidia-docker2
- 最后通过 sudo apt install ./libnvidia-container* ./nvidia-* 安装即可
强烈建议参照系统说明文档,docker <命令> --help
docker 常用命令
强烈建议参照系统说明文档,docker <命令> --help
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>/<镜像名称>:<标签>:用于从容器的修改项创建新的镜像
# 将某个容器保存为镜像 -a 修改人 -m 备注
docker commit -a 'weikaixxxxxx' -m '导入了数据库' container_name saved_image_name
- docker create <选项><镜像名称,id><命令><参数>:使用指定的镜像创建容器。与run命令不同,使用create命令只能创建容器而并不启动
- docker diff <容器名称,id>:用于检查容器文件系统的修改
- docker exec <选项><容器名称,id><命令><参数>:从外部运行容器内部的命令
# 以命令行方式进入 docker 容器内
docker exec -it --user user_name container_name bash
- 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:开启标准输入,即使未与容器连接,也维持标准输入
- -t:使用TTY模式(pseudo-TTY)若要使用bash,则必须设置该选项。若不设置该选项,则虽然输入命令,但不显示shell
- --name:指定容器的名字
- --net:容器网络状态,1)默认为 bridge,创建独立的网络,适用于同一宿主机上的多个容器间需要相互通信的场景;2)host,复用宿主机网络,开销更小;3)None,无连接网络;4)其他,包括Overlay、Macvlan和IPvlan。
- -p:指定宿主机与容器之间的端口映射,--net=bridge时有效,-p [宿主机端口号]:[容器端口号]
- -v:指定宿主机与容器之间的文件系统映射,-v [宿主机文件路径]:[容器文件路径]
- --shm-size:指定容器中的共享内存大小,用于容器内的进程间通信,默认64M
- --ipc:允许容器内的进程共享内存段、消息队列和信号量等资源;--ipc=host 使用主机内存
- --device:指定宿主机与容器之间的物理设备映射,-p [宿主机设备]:[容器设备]
- --privileged:用于启动具有特权的容器,例如使用宿主机上的所有设备。
- --gpus:指定需要使用的 GPU 数量或具体的 GPU 设备,--gpus all,--gpus 2,--gpus "device=0,1"
最后详解一个复杂命令吧
docker run -d -it --net=host -v /home/test/:/work/test/ --gpus all --ipc=host --name test test:1.0
其指定在后台启动(-d),连接了输入输出(-i),启动了模拟终端(-t),使用宿主机网络(--net=host,自动映射宿主机所有端口并忽略-p的端口指定),挂载宿主机文件系统(-v /home/test/:/work/test/,使用完整路径,将宿主机上/home/test/映射到容器内/work/test/),映射宿主机 gpu(--gpus all 使用宿主机所有GPU),使用主机内存(--ipc=host),指定启动的容器名称(--name test,启动后的容器名为test),指定运行的镜像和版本(test:1.0)
docker 服务重启
- sudo systemctl daemon-reload:重启守护进程
- sudo systemctl restart docker,sudo service docker restart:重启docker服务
docker 私有仓管理
- ip:5000/v2/_catalog:获取该 ip 下私有仓的镜像信息
- ip:5000/v2/image_name/tags/list:获取该 ip 下私有仓的该 image_name 镜像的 tag 信息
问题及解决方案
- 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 执行权限。Post-installation steps for Linux | Docker Documentation
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:
newgrp docker
# 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":["**.**.**.**:5000"] }
- docker pull 提示 failed to verify certificate: x509: certificate signed by unknown authority,修改 /etc/docker/daemon.json,添加 insecure-registries
# cat /etc/docker/daemon.json
{
"registry-mirrors":[
"https://d8b3zdiw.mirror.aliyuncs.com"
],
"insecure-registries": [
"https://ower.site.com"
],
}