Docker 学习笔记

Docker学习笔记

  • Docker 架构
  • Ubuntu Docker 安装
  • Dockerfile
    • Dockerfile命令
  • Docker 仓库
  • Docker命令
    • 指定GPU
    • 装载本地镜像
    • 保存镜像文件
    • 查看已安装的镜像
    • 查看运行中的容器
    • 查看全部容器
    • 运行一个带有输入输出并启动bash的容器
    • 启动一个自定义名称的容器
    • 启动一个容器后在关闭时自动销毁
    • 后台运行容器
    • 启动容器并挂载本地卷
    • 启动/停止/附着到容器
    • 在容器内运行程序
    • 查看容器内输出
    • 持续跟踪输出
    • 暂停运行容器
    • 删除容器
    • 删除镜像
    • 修改镜像名称
    • 支持中文的运行方式
    • 往容器中拷贝文件
    • 容器开机自动启动
    • 启动容器时添加用户权限
  • 其他操作
    • 免sudo使用docker命令
    • 在容器内使用 gui程序
    • 修改docker默认的存储位置

Docker 架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker 学习笔记_第1张图片
Docker 学习笔记_第2张图片

Ubuntu Docker 安装

Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。
通过 uname -r 命令查看你当前的内核版本

$ uname -r

使用命令安装Docker

wget -qO- https://get.docker.com/ | sh

输入当前用户的密码后,就会下载脚本并且安装Docker及依赖包。
安装完成后有个提示:
Docker 学习笔记_第3张图片
当要以非root用户可以直接运行docker时,需要执行

sudo usermod -aG docker $USER 

然后重新登陆,否则会报权限错误

启动docker 后台服务

sudo service docker start

Dockerfile

Dockerfile包含创建镜像所需要的全部指令。基于在Dockerfile中的指令,我们可以使用Docker build命令来创建镜像。通过减少镜像和容器的创建过程来简化部署。
Dockerfile支持支持的语法命令如下:

INSTRUCTION argument

指令不区分大小写。但是,命名约定为全部大写。
所有Dockerfile都必须以FROM命令开始。 FROM命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像。FROM命令可以多次使用,表示会创建多个镜像。具体语法如下:

FROM <image name>
例如:
FROM ubuntu

上面的指定告诉我们,新的镜像将基于Ubuntu的镜像来构建。

继FROM命令,DockefFile还提供了一些其它的命令以实现自动化。在文本文件或Dockerfile文件中这些命令的顺序就是它们被执行的顺序。

Dockerfile命令

  1. MAINTAINER 设置该镜像的作者。语法如下:

    MAINTAINER <author name>
    
  2. RUN:在shell或者exec的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。语法如下:

    RUN 《command》
    
  3. ADD:复制文件指令。它有两个参数和。destination是容器内的路径。source可以是URL或者是启动配置上下文中的一个文件。语法如下:

    ADD 《src》 《destination》
    
  4. CMD:提供了容器默认的执行命令。 Dockerfile只允许使用一次CMD指令。 使用多个CMD会抵消之前所有的指令,只有最后一个指令生效。 CMD有三种形式:

    CMD ["executable","param1","param2"]
    CMD ["param1","param2"]
    CMD command param1 param2
    
  5. EXPOSE:指定容器在运行时监听的端口。语法如下:

    EXPOSE <port>;
    
  6. ENTRYPOINT:配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。类似于CMD,Docker只允许一个ENTRYPOINT,多个ENTRYPOINT会抵消之前所有的指令,只执行最后的ENTRYPOINT指令。语法如下:

    ENTRYPOINT ["executable", "param1","param2"]
    ENTRYPOINT command param1 param2
    
  7. WORKDIR:指定RUN、CMD与ENTRYPOINT命令的工作目录。语法如下:

    WORKDIR /path/to/workdir
    
  8. ENV:设置环境变量。它们使用键值对,增加运行程序的灵活性。语法如下:

    ENV <key> <value>
    
  9. USER:镜像正在运行时设置一个UID。语法如下:

    USER <uid>
    
  10. VOLUME:授权访问从容器内到主机上的目录。语法如下:

    VOLUME ["/data"]
    

Docker 仓库

Docker 学习笔记_第4张图片
Docker 学习笔记_第5张图片
Docker 学习笔记_第6张图片

Docker命令

指定GPU

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

运行一个带有输入输出并启动bash的容器

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使用docker命令

sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart
newgrp - docker

在容器内使用 gui程序

使用在容器里安装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后 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

你可能感兴趣的:(Docker 学习笔记)