API官网 Docker run reference | Docker Documentation
docker run:
#!/usr/bin/bash
image_name="auto_test:v1.1"
#无启动脚本
#sudo docker run --restart=always --network="host" -d -it \
# -v /mnt:/mnt \
# -v $(pwd)/config.py:/auto_test/config.py \
# -v $(pwd)/logs:/auto_test/logs \
# --name auto_test \
# --entrypoint="" \
# $image_name bash
#启动test
#sudo docker run --restart=always --network="host" -d -it \
# -v /mnt:/mnt \
# -v $(pwd)/config.py:/auto_test/config.py \
# -v $(pwd)/logs:/auto_test/logs --name auto_test \
# --entrypoint /bin/bash $image_name -c "nohup python /auto_test/test.py > /auto_test/logs/log_test.txt 2>&1 & /bin/bash"
#启动main
sudo docker run --restart=always --network="host" -d -it \
-v /mnt:/mnt \
-v $(pwd)/config.py:/auto_test/config.py \
-v $(pwd)/logs:/auto_test/logs \
--name auto_test \
$image_name
镜像相关操作
#搜索镜像
docker search 关键字
去docker hub上检索镜像的详细信息,如镜像的TAG。
#拉取镜像
docker pull 镜像名:tag
:tag是可选的,tag表示标签,多为软件的版本,默认是latest
#查看所有本地镜像
docker images
#删除指定的本地镜像
docker rmi image-id
docker rmi imageName:tag
#构建镜像
docker build -t 镜像名:tag .
#运行镜像并进入容器
docker run -it 镜像名:tag bash
#可以修改镜像内容exit退出 然后 commit 提交新镜像
#进入已经运行的容器
docker exec -it 容器ID/名字 bash
#运行镜像
docker run -it -p 8885:8885 --name 别名 -d --network host 镜像名:tag
You can reset a containers entrypoint by passing an empty string, for example:
docker run -it --entrypoint="" mysql bash
容器相关操作
一个镜像可以创建多个容器,已创建的容器可以直接启动
docker ps 查看当前运行的容器
docker ps -a 查看已创建的全部容器
docker start 容器ID
docker stop 容器ID
docker restart 容器ID
docker rm 容器id 来删除一个终止状态的容器;若要删除一个运行中的容器,需要加-f参数。
启动mysql:
docker run -p 3306:3306 --name mysql_01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
备份 :https://www.cnblogs.com/linjiqin/category/1108912.html
#拷贝文件到容器
docker cp views.py ef9d82f6d2e4:/mask_detective/app
修改容器内镜像文件
1、docker run –it imageName bash 进入正在运行的容器内
2、进入容器后,就可以修改镜像了,比如修改镜像中已经部署的代码或者安装新的软件或包等,修改完成之后,exit 退出容器
3、docker ps 查看该容器ID
4、docker commit 容器ID imageName:v1.3 #提交你刚才修改的镜
导出镜像
docker save myimage:latest | gzip > myimage_latest.tar.gz
docker save -o seal_num_api_1.0.3.tar seal_num_api:1.0.3
导入镜像
docker load < 镜像名.tar.gz
可能会搜索不到镜像 需要给个名字:
docker容器设置自动启动
启动时加--restart=always
Flag Description
no 不自动重启容器. (默认value)
on-failure 容器发生error而退出(容器退出状态不为0)重启容器
unless-stopped 在容器已经stop掉或Docker stoped/restarted的时候才重启容器
always 在容器已经stop掉或Docker stoped/restarted的时候才重启容器
如果已经启动的项目,则使用update更新:
docker update --restart=always 容器名称(ID)
docker GPU服务
安装完dockers nvidia docker
运行 docker run --gpus all -it tensorflow/tensorflow:1.14.0-gpu-py3 bash 进入容器
nvidia-smi 检查是否启用GPU
# 使用所有GPU
docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
# 使用两个GPU
docker run --gpus 2 nvidia/cuda:9.0-base nvidia-smi
# 指定GPU运行
--gpus "device=0"
docker run --gpus '"device=1,2"' nvidia/cuda:9.0-base nvidia-smi
docker run --gpus '"device=UUID-ABCDEF,1"' nvidia/cuda:9.0-base nvidia-smi
docker镜像导入导出(windows)
解决方案参考:linux - Docker load and save: "archive/tar: invalid tar header" - Stack Overflow
原因:在不同的操作系统中运行 docker save 和 docker load 会导致出现这种问题,即使在不同的物理机上,相同的操作系统也可能出现。
解决方案:在 docker 保存时即添加参数 -o,参考官网docker save | Docker Documentation
在要保存 .tar 镜像的机器上运行:
docker save automl_base:1.0.0 -o automl_base_1.0.0.tar
在需要上传的机器上运行:
docker load -i automl_base_1.0.0.tar
Dockerfile
#FROM python:3.6.8
#RUN mkdir /mask_detective
#将本地代码添加到虚拟容器得code目录下
#ADD . /mask_detective
#设置为工作路径
#WORKDIR /mask_detective
#安装库
#RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple \
&& python -m pip install --upgrade pip
FROM mask_detetive_base:1.0
COPY start.sh /mask_detective
COPY app /mask_detective/app
#暴露的端口
EXPOSE 8885
#镜像启动时执行的脚本
ENTRYPOINT ["sh","/mask_detective/start.sh"]
eg2:
FROM python:3.8
ENV TIME_ZONE Asia/Shanghai
RUN sed -i 's/ports.ubuntu.com/mirror.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list
ADD auto_test /auto_test
WORKDIR /auto_test
RUN apt-get update -y
RUN apt-get install -y --no-install-recommends ffmpeg vim tzdata \
&& ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone \
&& dpkg-reconfigure -f noninteractive tzdata \
&& apt-get clean \
&& rm -rf /tmp/* /var/ca
RUN pip install -r /auto_test/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
ENTRYPOINT ["/bin/bash", "/auto_test/start.sh"]
启动脚本
为什么docker运行后就自动退出了
docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker 容器pid挂了,那么docker容器便会直接退出。
docker run的时候把command做为容器内部命令,如果你使用nginx,那么nginx程序将后台运行,这个时候nginx并不是pid为1的程序,而是执行的bash,这个bash执行了nginx指令后就挂了,所以容器也就退出了。
加 tail 或者 /bin/bash
#!/bin/bash
nohup python manage.py > /路径/app.log 2>&1 & tail -f /路径/app.log
#!/bin/bash
cd ./src
./scripts/start.sh &
/bin/bash