Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。
通过 uname -r 命令查看你当前的内核版本
$ uname -r
使用命令安装Docker
wget -qO- https://get.docker.com/ | sh
输入当前用户的密码后,就会下载脚本并且安装Docker及依赖包。
安装完成后有个提示:
当要以非root用户可以直接运行docker时,需要执行
sudo usermod -aG docker $USER
然后重新登陆,否则会报权限错误
启动docker 后台服务
sudo service docker start
Dockerfile包含创建镜像所需要的全部指令。基于在Dockerfile中的指令,我们可以使用Docker build命令来创建镜像。通过减少镜像和容器的创建过程来简化部署。
Dockerfile支持支持的语法命令如下:
INSTRUCTION argument
指令不区分大小写。但是,命名约定为全部大写。
所有Dockerfile都必须以FROM命令开始。 FROM命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像。FROM命令可以多次使用,表示会创建多个镜像。具体语法如下:
FROM <image name>
例如:
FROM ubuntu
上面的指定告诉我们,新的镜像将基于Ubuntu的镜像来构建。
继FROM命令,DockefFile还提供了一些其它的命令以实现自动化。在文本文件或Dockerfile文件中这些命令的顺序就是它们被执行的顺序。
MAINTAINER 设置该镜像的作者。语法如下:
MAINTAINER <author name>
RUN:在shell或者exec的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。语法如下:
RUN 《command》
ADD:复制文件指令。它有两个参数和。destination是容器内的路径。source可以是URL或者是启动配置上下文中的一个文件。语法如下:
ADD 《src》 《destination》
CMD:提供了容器默认的执行命令。 Dockerfile只允许使用一次CMD指令。 使用多个CMD会抵消之前所有的指令,只有最后一个指令生效。 CMD有三种形式:
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
EXPOSE:指定容器在运行时监听的端口。语法如下:
EXPOSE <port>;
ENTRYPOINT:配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。类似于CMD,Docker只允许一个ENTRYPOINT,多个ENTRYPOINT会抵消之前所有的指令,只执行最后的ENTRYPOINT指令。语法如下:
ENTRYPOINT ["executable", "param1","param2"]
ENTRYPOINT command param1 param2
WORKDIR:指定RUN、CMD与ENTRYPOINT命令的工作目录。语法如下:
WORKDIR /path/to/workdir
ENV:设置环境变量。它们使用键值对,增加运行程序的灵活性。语法如下:
ENV <key> <value>
USER:镜像正在运行时设置一个UID。语法如下:
USER <uid>
VOLUME:授权访问从容器内到主机上的目录。语法如下:
VOLUME ["/data"]
NV_GPU = 0,1 nvidia-docker ...
或在容器内:
export CUDA_VISIBLE_DEVICES=0,1
docker load --input <镜像路径>
docker save <镜像名称/id> > <保存文件名称>.tar
docker images
docker ps
docker ps -a
docker run -it <IMAGE NAME/ID> /bin/bash
# docker run --name
# docker run -ti --rm
# docker run -d
# docker run -v <容器外(本机)路径>:<容器内路径>
# docker start
# docker stop
# docker attach [该指令退出时,容器会stop]
# docker exec -d [退出容器时,容器不会stop]
# docker logs
# docker logs -f
docker pause CONTAINER
# 重新启动:
docker unpause CONTAINER
# docker rm
# docker rmi
# docker tag imageid name:tag
# docker run -ti 镜像名称 env LANG=C.UTF-8 /bin/bash
或在容器内:
export LC_ALL=en_US.utf8
docker cp <file name> <docker容器名:/xxx/xxx/xxxx>或< id:/xxx/xxx/xxxx>
docker run -ti -d --name xxx --restart=always <image_id>
docker run -u $(id -u):$(id -g) args ..
sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart
newgrp - docker
使用在容器里安装gui程序依赖项,然后将容器commit成镜像的办法
1)安装依赖项
进入容器后,先执行以下命令,安装以下依赖项:
$ apt-get update && apt-get -y install libasound2 libatk1.0-0 libcairo2 libcups2 libexpat1 libfontconfig1 libfreetype6 libgtk2.0-0 libpango-1.0-0 libx11-xcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 --no-install-recommends && rm -rf /var/lib/apt/lists/*
2) 将容器commit 成镜像
$ docker commit <容器ID> <镜像名:Tag>
**3) 开启容器挂载X11
运行 镜像时,挂载上 .X11, 将本地机器上的资源与容器内的gui资源共享
nvidia-docker run -it --user $(id -u) -e DISPLAY=unix$DISPLAY --workdir=$(pwd) --volume="/home/$USER:/home/$USER" --volume="/etc/group:/etc/group:ro" --volume="/etc/passwd:/etc/passwd:ro" --volume="/etc/shadow:/etc/shadow:ro" --volume="/etc/sudoers.d:/etc/sudoers.d:ro" -v /tmp/.X11-unix:/tmp/.X11-unix <镜像名:Tag> env LANG=C.UTF-8 /bin/bash
注: 要使容器内可以支持中文,后面需要加上 env LANG=C.UTF-8 /bin/bash,该测试环境为ubuntu16.04,docker19.03.1
默认安装完成docker后 docker 的所有images及相关信息存储位置为:/var/lib/docker
,而通常我们系统盘挂载盘一般不会很大,所以需要将其移到其他分区,我们可以采用软连接的方式来完成,示例,下面我们将其移到/home/docker目录下,具体方法如下:
1. 暂停docker服务
sudo service docker stop
2. 将文件移动到指定目录
sudo mv -v /var/lib/docker /home
3. 建立软连接
sudo ln -s /home/docker /var/lib/docker
4. 查看软连接是否成功
cd /var/lib
ls -la docker
5. 启动服务
sudo service docker start
6. 查看是否成功
docker info