一、安装
Docker需要64的操作系统,kernel内核至少在3.10版本之上。
检测当前的kernel版本:
uname -r
安装Docker命令:
wget -qO- https://get.docker.com/ | sh
docker -v
# ===> Docker version 1.12.6, build 78d1802
或者:
sudo apt install curl
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
二、验证和配置
开启进程:
sudo service docker start
检测是否安装成功:
sudo docker run hello-world //打印测试镜像信息
修改默认存储路径:
vi /etc/docker/daemon.json
添加:
{
"data-root": "/data/docker"
}
重启:
systemctl restart docker
三、创建docker组
docker进程使用的Unix的socket而不是TCP端口,而Unix的socket属于用户root。可以使用sudo命令。如果不想使用sudo,创建一个Unix组名为docker添加当前用户。
sudo groupadd docker
sudo usermod -aG docker $USER
退出重新登录,再测试:
docker run hello-world
四、命令
卸载docker,不会删除镜像和容器,需手动删除:
rm -rf /var/lib/docker
运行容器命令:
docker run参数
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
docker run --name mynginx -d nginx:latest
使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
docker run -P -d nginx:latest
使用镜像nginx:latest以后台模式启动一个容器,将容器的80端口映射到主机的80端口,主机的目录/data映射到容器的/data。
docker run -p 80:80 -v /data:/data -d nginx:latest
使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it nginx:latest /bin/bash
在运行的容器中执行命令:
docker exec
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
查看容器密码:
docker logs <容器名orID> 2>&1 | grep '^User: ' | tail -n1
查看运行的容器:
docker ps
docker ps -a 包括已经停止的。
容器的启动,停止,kill:
docker stop <容器名orID>
docker start <容器名orID>
docker kill <容器名orID>
docker stop $(docker ps -a -q) //停止所有容器
删除容器:
docker rm <容器名orID> 单个
docker rm `docker ps -a -q` 所有
查看所有镜像:
docker images
拉取镜像:
docker pull malaohu/ssr-with-net-speeder
删除所有镜像:
docker rmi `docker images -q`
条件删除镜像:
没有打标签
docker rmi `docker images -q | awk '/^<none>/ { print $3 }'`
docker rmi $(docker images | grep "none" | awk '{print $3}')
镜像名包含关键字
docker rmi --force `docker images | grep doss-api | awk '{print $3}'` //其中doss-api为关键字
构建自己的镜像:
docker build -t <镜像名> <file路径>
迁移镜像:
docker save aaaa > /aaaa.tar 保存
docker load < /aaaa.tar 载入
把一个宿主机上的目录挂载到镜像里:
# -v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。
docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash
从容器内拷贝文件到主机上:
docker cp <containerId>:/file/path/within/container /host/path/target
从主机上拷贝文件到容器内:
# 用-v挂载主机数据卷到容器内
docker run -v /path/to/hostdir:/mnt $container
# 在容器内拷贝
cp /mnt/sourcefile /path/to/destfile
五、删除镜像步骤
docker images # 查找image id
docker rmi 7b13adf4339f #如果出现报错,说明有容器存在,需要先删除容器
docker ps -a # 查看容器
docker rm ab6c1c542a11 #删除容器,可能需要先停止容器docker stop <容器名orID>
docker rmi 7b13adf4339f #再删除镜像
#强制删除镜像
docker rmi 7b13adf4339f -f
#一次性删除所有容器
docker rm $(docker ps -a -q)
六、细节问题
1、在构建某些镜像时需要获取cuda信息:
1、Edit/create the /etc/docker/daemon.json with the below content:
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
2、Install nvidia-container-runtime package. I had followed the instructions here, but it seems nvidia-container-runtime isn't installed by default.
sudo apt-get install nvidia-container-runtime
3、sudo systemctl restart docker.service
Try your docker build again.
参考解决 2、构建时Sending build context to Docker daemon 的数据量非常大:
docker构建时会默认把dockerfile同路径下所有文件发送过去,一种解决方法是新建一个文件夹把需要的文件放进去;另一种是在同路径下新近.dockerignore文件,把忽略的文件名和文件夹放进去
3、RuntimeError: DataLoader worker (pid 69) is killed by signal: Bus error错误:
内存不足,使用–shm-size 8g指定内存
docker run -it -v /data:/tcdata --shm-size 8g com/tianchi:1.0
七、Dockerfile示例
docker build -t registry_tianchi:0.5 .
# mmdet镜像制作
# 基础镜像
FROM gouchicao/mmdetection:latest
# RUN在build时执行shell命令
RUN pip3 uninstall -y mmdet mmcv
RUN pip3 install tqdm opencv-python==4.2.0.32 mmcv==0.2.15
RUN rm -rf /mmcv
RUN rm -rf /mmdetection
# ADD ./ /将当前文件夹下所有文件加入镜像的根目录
# ADD 如果添加文件夹则必须镜像路径下有完全相同的文件名
ADD ./mmdetection /mmdetection
# 跳转工作路径,类似于cd
WORKDIR /mmdetection
RUN python3 setup.py develop
# CMD在启动容器时执行的命令
CMD ["sh", "run.sh"]
参考