Docker 学习笔记

Docker 架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
在这里插入图片描述
在这里插入图片描述

Ubuntu 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包含创建镜像所需要的全部指令。基于在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 仓库

Registry
在这里插入图片描述
在这里插入图片描述

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 <customize NAME> <IMAGE NAME/ID> <command>

启动一个容器后在关闭时自动销毁

# docker run -ti --rm <IMAGE NAME/ID> <command>

后台运行容器

# docker run -d <IMAGE NAME/ID> <command>

启动容器并挂载本地卷

# docker run -v <容器外(本机)路径>:<容器内路径>  <image NAME/ID> <command>

启动/停止/附着到容器

# docker start <container NAME/ID>
# docker stop <container NAME/ID>
# docker attach <container NAME/ID> [该指令退出时,容器会stop]

在容器内运行程序

# docker exec -d <container NAME/ID> <command>[退出容器时,容器不会stop]

查看容器内输出

# docker logs <container NAME/ID>

持续跟踪输出

# docker logs -f <container NAME/ID>

暂停运行容器

docker pause  CONTAINER
# 重新启动:
docker unpause CONTAINER

删除容器

# docker rm <container NAME/ID>

删除镜像

# docker rmi <image NAME/ID>

修改镜像名称

# 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Challovactor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值