1. 基于docker的工作流程
- 在本地制作Docker镜像
- 在本地运行并测试Docker镜像, 修改Docker镜像。循环,直到结果稳定。
- 推送本地Docker镜像至仓库, 推送之后,所有的服务器都可以访问这个镜像
2. Docker 镜像制作
有两种方式制作Docker镜像
- Dockerfile是推荐的方法,因为其可复制性,Dockerfile记录了每一步Docker镜像制作的方式。
- docker commit也是可以选择的方式,但是不推荐。
3. Dockerfile示例
FROM ubuntu:16.04
RUN apt-get update
# INSTALL FFMPEG & OTHERS
RUN apt-get install -y unzip cmake g++ make ffmpeg libx264-dev wget
RUN apt-get install -y libavcodec-dev libavformat-dev libavdevice-dev
RUN apt-get install -y gcc g++ git libjpeg-dev libpng-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev pkg-config cmake libgtk2.0-dev libeigen3-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev sphinx-common libtbb-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libopenexr-dev libgstreamer-plugins-base1.0-dev libavcodec-dev libavutil-dev libavfilter-dev libavformat-dev libavresample-dev libboost-all-dev libgflags-dev libgoogle-glog-dev libproj-dev protobuf-compiler libprotobuf-dev libblas-dev libhdf5-dev libopenblas-dev
# INSTALL PYTHON3
RUN apt-get install -y python3.5 python3-pip
# INSTALL PYTHON ENVIRONMENT
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r /root/mv3d/python3/requirements.txt
WORKDIR /root/mv3d/python3
4. 创建docker镜像
- 基于dockerfile
cd ROOT_OF_WORKING
docker build -t registry.xx.yy/dockername:1.0.0 . # 注意最后有一个dot, 最后的dot表示当前工作目录,如果dockerfile中有COPY类似的命令,都是以该目录为基准
-t 指定一个docker tag也就是镜像名称
- docker commit
这种方式属于懒人的方法了,一般我们 docker run一个基础镜像,在进行安装依赖等操作,然后使用 “docker commit CONTAINERID registry.xx.yy/dockername:1.0.0 ” 的方式把正在运行的container保存为一个镜像。
测试可以这么干,开发中用到的镜像这样做会被骂娘。
5. 启动docker
docker run \
--runtime=nvidia \
-ti \
-p 50001:50000 \
-v $(pwd):/workspace \
-w /workspace \
--privileged \
registry.xx.yy/dockername:1.0.0
–runtime 指定 docker 使用的context, 如果需要使用GPU,需要指定nvidia, 或者使用nvidia-docker;
-p hostport:contianerport 端口映射;
-v hostdir:contianerdir 挂载文件夹
-w contianerdir 容器启动后cd到指定的目录
–privileged 特权模式,可以访问主机的所有设备,例如,CD-ROM、连接到主机的硬盘驱动器
6. 镜像命名 tag
给镜像起个别名,原来的镜像名还可以用,类似与linux的软连接或者c++中引用的意思。
docker tag registry.xx.yy/dockername:1.0.0 registry.xx.yy/dockername:latest
7. 推送镜像到远程仓库
打好镜像后,镜像是在本地存储的,也就是说只有本服务器可以使用,而且也有被删除、清理的风险
推送到远程镜像服务器后,大家才可以pull。
docker login registry.xx.yy #登录镜像仓库,随后需要输入username和passwd
docker push registry.xx.yy/dockername:latest
##8.最后
docker 基于C/S架构, 我们一般用的docker是Client端, dockerd服务才是server端,主机上上所有运行的container都是由dockerd 服务管理。
容器编排涉及到的docker-compose、k8s 等都是基于docker的,都是对docker能力的封装。