Docker基本开发技术简介
Docker基本原理简介
docker 是一个开源的应用引擎,开发者可以打包自己的应用到容器里面,然后迁移到其他机器的docker应用中,可以实现快速部署,可以通过镜像,快速恢复服务。
docker是利用Linux内核虚拟化技术(LXC),提供轻量级的虚拟化,以隔离进程和资源。LXC不是硬件的虚拟化,而是Linux内核的虚拟机化,相对传统的虚拟机,节省了很多硬件资源。
docker是Linux原生技术,windows上是通过嵌入一个了Linux虚拟机来实现的。
Docker 安装与常用配置
安装:
docker安装方法详见:https://docs.docker.com/install/linux/docker-ce/ubuntu/
nvidia-docker安装方法详见:https://github.com/NVIDIA/nvidia-docker
配置:
1 使用Docker作为非root用户
将用户添加到docker组,这样不用每次用sudo执行,退出重新登录之后生效
sudo usermod -aG docker $USER
2 更改docker存储路径目录
docker安装时会创建一个目录/var/lib/docker/ 来存储所有的东西,所以需要大的存储空间,来防止单一磁盘被占满。
步骤:
sudo systemctl stop docker
sudo mv /var/lib/docker /data1/
sudo ln -s /data1/docker /var/lib/docker
sudo systemctl start docker
3 镜像加速
加入镜像的方法:
为了永久性保留更改,您可以修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。
{
"registry-mirrors": ["https://<>.mirror.aliyuncs.com"],
}
这里加入的是阿里云的源,需要自行去申请加速地址。
Docker container 常用命令
Docker常用命令
docker run #运行容器
例如:
1 docker run -it --gpus all --shm-size 8G --rm -v data_dir:/data repo:tag python test.py arg...
2 docker run -it --rm -p 6080:80 -p 5900:5900 -u 1000:1000 --name ubuntu_vnc dorowu/ubuntu-desktop-lxde-vnc
Docker run 常用选项
--rm #保证在运行完之后自动清理container
-v local_path:container_path #挂载宿主机路径到容器中
-i #交互式运行
-t #分配tty设备,该可以支持终端登录
-u #指定容器的用户 uid:groupid
-d #后台运行
--name #指定容器名称
-p #指定容器暴露的端口
-m #指定容器的内存上限
Docker 其他常用命令
docker ps [-a] #当前运行或者是当前存在的已经stop的容器
docker start containerID #启动已经stop的容器
docker attach containerID #进入运行中的容器
docker rmi ImageID #删除镜像
docker rm containerID #删除容器
docker exec containerID #在容器中运行一个进程
docker logs container #获取容器日志
docker inspect container查看容器的详细信息
docker top container # 查看容器内部的进程
#提取镜像和载入镜像
docker save images:tag | gzip > imagename.tar.gz
docker load < imagename.tar.gz
Nvidia-docker 常用命令:
#### Test nvidia-smi with the latest official CUDA image
docker run --gpus all nvidia/cuda:10.0-base nvidia-smi
# Start a GPU enabled container on two GPUs
docker run --gpus 2 nvidia/cuda:10.0-base nvidia-smi
# Starting a GPU enabled container on specific GPUs
docker run --gpus '"device=1,2"' nvidia/cuda:10.0-base nvidia-smi
docker run --gpus '"device=UUID-ABCDEF,1"' nvidia/cuda:10.0-base nvidia-smi
# Specifying a capability (graphics, compute, ...) for my container
# Note this is rarely if ever used this way
docker run --gpus all,capabilities=utility nvidia/cuda:10.0-base nvidia-smi
Docker image介绍与制作方法
镜像介绍
Docker镜像是一个只读的Docker容器模板,含有启动Docker容器所需的文件系统结构及其内容,因此是启动一个Docker容器的基础。Docker镜像的文件内容以及一些运行Docker容器的配置文件组成了Docker容器的静态文件系统运行环境–rootfs。可以这么理解,Docker镜像是Docker容器的静态视角,Docker容器是Docker镜像的运行状态
镜像制作两种方法
1 在基础镜像中修改然后commit提交修改 。
基础镜像从docker hub拉取或者是本地已有镜像。
docker 官方仓库:https://hub.docker.com/
commit 提交: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
小的依赖升级可以通过这种方式来实现。
使用容器创建镜像。容器就是在镜像层的最上方存在一个可写的容器层。将容器打包镜像,就是将可写容器层变成一个只读的镜像层次,和下层的所有镜像层一起作为新镜像的镜像层。
2 Dockerfile 进行build
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
通过dockerfile build镜像:
docker build -t name:tag <上下文路径>
上下文路径:存放在build过程中需要打包给docker 引擎的文件,一般默认讲所有文件组织在一个docker文件夹下,所以不必要的文件不要放在这个路径下。
Dockerfile 常用指令
FROM: 定制的镜像都是基于FROM的镜像。
COPY: 复制指令,从上下文目录中复制文件或者目录到容器里指定路径
RUN: 在容器中运行命令并创建新的镜像层用于执行后面跟着的命令行命令。
ENV: 设置环境变量,容器中使用
ARG: 指定构建镜像时的变量
VOLUME: 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。docker run 的时候,可以通过-v参数修改挂载点。需要注意的是在这个数据卷中所做的任何修改在之后进行commit时都不会写入到新生成的镜像中。
WORKDIR: 指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在
docker 镜像分层结构
Container layer: Copy-on-write可写容器层
Image layers :只读层
容器层保存镜像的变化部分,并不对镜像本身进行任何修改。容器中镜像层是不可变的,如果我们再某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件(只是这个文件在 Docker 容器中不可见了)。
Dockerfile build过程中应该注意:
Dockerfile 中的每个指令都会创建一个新的镜像层。
镜像层将被缓存和复用
当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
查看镜像分层结构:
Docker history ImageName:ID
Docker 网络相关
目前项目中未设置,已阅读,有时间再续。。。