docker学习笔记

docker学习笔记

常用的镜像:

docker pull anibali/pytorch:cuda-10.0

删除none的镜像:

#!/bin/bash

docker ps -a | grep “Exited” | awk ‘{print $1}’ | xargs docker stop

docker ps -a | grep “Exited” | awk ‘{print $1}’ | xargs docker rm

docker images | grep none | awk ‘{print $3}’ | xargs docker rmi

Docker是什么?

Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。

Docker官方文档比较全,建议有能力的读一下官方文档

1. Docker的三个概念

  1. 镜像(Image):类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像。
  2. 容器(Container):类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。
  3. 仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。

关于镜像与容器的关系和联系,可以使用overlay2文件存储驱动来进一步深入理解,具体见文件存储驱动overlay2的使用介绍

2.1 Docker的安装和卸载

Docker可以安装在Windows、Linux、Mac等各个平台上。具体可以查看文档Install Docker

sudo apt install docker.io

将当前用户添加到docker用户组中(否则就只能sudo执行Docker相关命令)

sudo usermod -aG docker $USER

添加docker用户组

sudo groupadd docker

将当前用户加入到docker用户组

sudo gpasswd -a ${USER} docker

重启docker服务

sudo service docker restart

作者:crystalcd
链接:https://www.jianshu.com/p/8412a99e3a08
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

安装完成之后,可以查看Docker的版本信息:

[root``@xxx ~]# docker version

Client:

?``Version:????? 1.12``.``3

?``API version:? 1.24

?``Go version:?? go1.``6.3

?``Git commit:?? 6b644ec

?``Built:

?``OS/Arch:????? linux/amd64

Server:

?``Version:????? 1.12``.``3

?``API version:? 1.24

?``Go version:?? go1.``6.3

?``Git commit:?? 6b644ec

?``Built:

?``OS/Arch:????? linux/amd64

查看Docker的帮助信息:# docker --help。各种命令的用法也不再赘述,后边用到哪些命令时会作出一定的解释。

如果你打算制作或者使用涉及到cuda或者cudnn等与GPU相关的镜像或容器,你需要安装nvidia-docker,请按照repo里的步骤安装nvidia-docker:https://github.com/NVIDIA/nvidia-docker

在完成两步安装后,需要更改docker守护进程默认的runtime参数,请将/etc/docker/daemon.json文件中键default-runtime对应的值修改为nvidia(如果没有default-runtime这个key,则需要添加:“default-runtime”:“nvidia”),

然后通过sudo service docker restart重启docker服务,这一步操作是为了避免之后运行与cuda或者cudnn库相关的容器时每次都要指定runtime参数的情况。

2.2 安装nvidia-docker2

若要使用GPU nvidia时,需要安装nvidia-docker2,安装教程–>参考链接

如果出现:docker: Error response from daemon: Unknown runtime specified nvidia.,请安装:

apt-get install nvidia-container-runtime

测试是否安装成功:

sudo docker run -it --gpus all nvidia/cuda:10.0-base

或者

sudo docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

一些运行命令:

docker run -it -v /path/to/project:/path/to/project -v /path/to/dataset:/path/to/dataset docker-image:tag/bin/bash

nvidia-docker run -it -v /path/to/project:/path/to/project -v /path/to/dataset:/path/to/dataset docker-image:tag/bin/bash

2.2 避免每次需要输入sudo

# 输入
sudo groupadd docker
# 回显示groupadd: group 'docker' already exists
# 将docker账户给与权限
sudo gpasswd -a <你的用户名> docker
# 例如:  sudo gpasswd -a ubuntu docker
# 重启docker
sudo service docker restart

3 Docker中关于镜像的基本操作

安装完Docker引擎之后,就可以对镜像进行基本的操作了。

# 查看/etc/group,确定是否存在docker组
cat /etc/group | grep docker
# 安装Docker后,docker组已经创建好了,上面的命令输出如下:
docker:x:999:
# 将当前用户添加到 docker 组
sudo gpasswd -a ${USER} docker
# 重新登录或者用以下命令切换到docker组
newgrp - docker
# 重启docker服务
sudo service docker restart
# 不加sudo直接执行docker命令检查效果
docker images
# 安装Docker的时候拉取过hello-world镜像,所以输出如下:
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        8 weeks ago         1.84kB
# 删除none的镜像:
#!/bin/bash
docker ps -a | grep "Exited" | awk '{print $1}' | xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1}' | xargs docker rm
docker images | grep none | awk '{print $3}' | xargs docker rmi
# 删除镜像
docker rmi -f image_ID

# 如果要退出就:
Ctrl-D

root@af8bae53bdd3:/# exit

我们从官方注册服务器(https://hub.docker.com)的仓库中pull下CentOS的镜像(或者设置我们公司的镜像仓库,具体方式见本文第五节的介绍)。每个仓库会有多个镜像,用tag标示,如果不加tag,默认使用latest镜像:

[root``@xxx ~]# docker search centos??? # 查看centos镜像是否存在

[root``@xxx ~]# docker pull centos??? # 利用pull命令获取镜像

Using default tag: latest

latest: Pulling from library/centos

08d48e6f1cff: Pull complete

Digest: sha256:b2f9d1c0ff5f87a4743104d099a3d561002ac500db1b9bfa02a783a46e0d366c

Status: Downloaded newer image for centos:latest

[root``@xxx ~]# docker images??? # 查看当前系统中的images信息

REPOSITORY????? TAG??????????? IMAGE ID?????? CREATED??????? SIZE

centos????????? latest???????? 0584b3d2cf6d?? 9 days ago???? 196.5 MB

以上是下载一个已有镜像,此外有两种方法可以帮助你新建自有镜像。

3.1 docker删除容器和镜像

1、删除容器

1)首先需要停止所有的容器

docker stop $(docker ps -a -q)

2)删除所有的容器(只删除单个时把后面的变量改为image id即可)

docker rm $(docker ps -a -q)

2、删除镜像

1)查看host中的镜像

docker images

2)删除指定id的镜像

docker rmi <image id>

想要删除untagged images,也就是那些id为的image的话可以用

docker rmi $(docker images | grep "^" | awk "{print $3}")

3)删除全部的images

docker rmi $(docker images -q)

3.2利用镜像启动一个容器后进行修改 ==> 利用commit提交更新后的副本

[root``@xxx ~]# docker run -it centos:latest /bin/bash??? # 启动一个容器

[root``@72f1a8a0e394 /]#??? # 这里命令行形式变了,表示已经进入了一个新环境

[root``@72f1a8a0e394 /]# git --version??? # 此时的容器中没有git

bash: git: command not found

[root``@72f1a8a0e394 /]# yum install git??? # 利用yum安装git

......

[root``@72f1a8a0e394 /]# git --version?? # 此时的容器中已经装有git了

git version 1.8``.``3.1

此时利用exit退出该容器,然后查看docker中运行的程序(容器):

[root``@xxx ~]# docker ps -a

CONTAINER ID? IMAGE??? COMMAND????? CREATED?? STATUS?? PORTS??? NAMES

72f1a8a0e394? centos:latest "/bin/bash" 9 minutes ago?? Exited (``0``) 3 minutes ago????? angry_hodgkin

这里将容器转化为一个镜像,即执行commit操作,完成后可使用docker images查看:

[root``@xxx ~]# docker commit -m "centos with git" -a "panjinqan" 72f1a8a0e394 zhengwenyong/centos:git

[root``@xxx ~]# docker images

REPOSITORY???????????? TAG??? IMAGE ID???????? CREATED???????????? SIZE

panjinqan/centos??? git??? 52166e4475ed???? 5 seconds ago?????? 358.1 MB

centos???????????????? latest 0584b3d2cf6d???? 9 days ago????????? 196.5 MB

其中,-m指定说明信息;-a指定用户信息;72f1a8a0e394代表容器的id;panjinquan/centos:git指定目标镜像的用户名、仓库名和 tag 信息。注意这里的用户名zheng,后边会用到。

此时Docker引擎中就有了我们新建的镜像panjinqan/centos:git,此镜像和原有的CentOS镜像区别在于多了个Git工具。此时我们利用新镜像创建的容器,本身就自带git了。

[root``@xxx ~]# docker run -it panjinqan/centos:git /bin/bash

[root``@520afc596c51 /]# git --version

git version 1.8``.``3.1

利用exit退出容器。注意此时Docker引擎中就有了两个容器,可使用docker ps -a查看。

3.3利用Dockerfile创建镜像

Dockerfile可以理解为一种配置文件,用来告诉docker build命令应该执行哪些操作。一个简易的Dockerfile文件如下所示,官方说明:Dockerfile reference

# 说明该镜像以哪个镜像为基础
FROM centos:latest

# 构建者的基本信息
MAINTAINER panjinqan

# 在build这个镜像时执行的操作
RUN yum update
RUN yum install -y git

# 拷贝本地文件到镜像中
COPY ./* /usr/share/gitdir/

有了Dockerfile之后,就可以利用build命令构建镜像了:

[root``@xxx ~]# docker build -t="panjinqan/centos:gitdir" .

其中-t用来指定新镜像的用户信息、tag等。最后的点表示在当前目录寻找Dockerfile。

构建完成之后,同样可以使用docker images命令查看:

[root``@xxx ~]# docker images

REPOSITORY????????????? TAG?????? IMAGE ID????? CREATED??????????? SIZE

panjinqan/centos???? gitdir??? 0749ecbca587? 34 minutes ago???? 359.7 MB

panjinqan/centos???? git?????? 52166e4475ed? About an hour ago? 358.1 MB

centos????????????????? latest??? 0584b3d2cf6d? 9 days ago???????? 196.5 MB

以上就是构建自己镜像的两种方法。其中也涉及到了容器的一些操作。如果想删除容器或者镜像,可以使用rm命令,注意:删除镜像前必须先删除以此镜像为基础的容器。

[root``@xxx ~]# docker rm container_name/container_id

[root``@xxx ~]# docker rmi image_name/image_id

镜像其他操作指令:

[root``@xxx ~]# docker save -o centos.tar panjinqan/centos:git??? # 保存镜像, -o也可以是--output

[root``@xxx ~]# docker load -i centos.tar??? # 加载镜像, -i也可以是--input

四、Docker中关于容器的基本操作

在前边镜像的章节中,我们已经看到了如何基于镜像启动一个容器,即docker run操作。

(1)启动容器

[root``@xxx ~]# docker run -it centos:latest /bin/bash

这里-it是两个参数:-i和-t。前者表示打开并保持stdout,后者表示分配一个终端(pseudo-tty)。此时如果使用exit退出,则容器的状态处于Exit,而不是后台运行。如果想让容器一直运行,而不是停止,可以使用快捷键 ctrl+p ctrl+q 退出,此时容器的状态为Up。

除了这两个参数之外,run命令还有很多其他参数。其中比较有用的是-d后台运行:

[root``@xxx ~]# docker run centos:latest /bin/bash -c "while true; do echo hello; sleep 1; done"

[root``@xxx ~]# docker run -d centos:latest /bin/bash -c "while true; do echo hello; sleep 1; done"

这里第二条命令使用了-d参数,使这个容器处于后台运行的状态,不会对当前终端产生任何输出,所有的stdout都输出到log,可以使用docker logs container_name/container_id查看。

(2)docker run的其他参数命令如下:

-d, --detach=``false``, 指定容器运行于前台还是后台,默认为``false

-i, --interactive=``false``, 打开STDIN,用于控制台交互

-t, --tty=``false``, 分配tty设备,该可以支持终端登录,默认为``false

-u, --user=``""``, 指定容器的用户

-a, --attach=[], 登录容器(必须是以docker run -d启动的容器)

-w, --workdir=``""``, 指定容器的工作目录

-c, --cpu-shares=``0``, 设置容器CPU权重,在CPU共享场景使用

-e, --env=[], 指定环境变量,容器中可以使用该环境变量

-m, --memory=``""``, 指定容器的内存上限

-P, --publish-all=``false``, 指定容器暴露的端口

-p, --publish=[], 指定容器暴露的端口

-h, --hostname=``""``, 指定容器的主机名

-v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录

--volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录

--cap-add=[], 添加权限,权限清单详见:http:``//linux.die.net/man/7/capabilities

--cap-drop=[], 删除权限,权限清单详见:http:``//linux.die.net/man/7/capabilities

--cidfile=``""``, 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法

--cpuset=``""``, 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU

--device=[], 添加主机设备给容器,相当于设备直通

--dns=[], 指定容器的dns服务器

--dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件

--entrypoint=``""``, 覆盖image的入口点

--env-file=[], 指定环境变量文件,文件格式为每行一个环境变量

--expose=[], 指定容器暴露的端口,即修改镜像的暴露端口

--link=[], 指定容器间的关联,使用其他容器的IP、env等信息

--lxc-conf=[], 指定容器的配置文件,只有在指定--exec-driver=lxc时使用

--name=``""``, 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字

--net=``"bridge"``, 容器网络设置:bridge 使用docker daemon指定的网桥

host //容器使用主机的网络

container:NAME_or_ID >``//使用其他容器的网路,共享IP和PORT等网络资源

none 容器使用自己的网络(类似--net=bridge),但是不进行配置

--privileged=``false``, 指定容器是否为特权容器,特权容器拥有所有的capabilities

--restart=``"no"``, 指定容器停止后的重启策略:no:容器退出时不重启

on-failure:容器故障退出(返回值非零)时重启

always:容器退出时总是重启

--rm=``false``, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)

--sig-proxy=``true``, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

(3)启动、停止、重启容器命令:

[root``@xxx ~]# docker start container_name/container_id

[root``@xxx ~]# docker stop container_name/container_id

[root``@xxx ~]# docker restart container_name/container_id

后台启动一个容器后,如果想进入到这个容器,可以使用attach命令:

[root``@xxx ~]# docker attach container_name/container_id

删除容器的命令前边已经提到过了:

[root``@xxx ~]# docker rm container_name/container_id

(4)挂载路径的方法:

docker run -it -v /path/to/project:/path/to/project -v /path/to/dataset:/path/to/dataset? docker-image:tag
# 或者使用`pwd`表示当前路径
docker?run?--rm?-it?-v?`pwd`:/workspace?data:cv2?/bin/bash
# 对容器处理完的数据更改一下权限:
chmod?-R?1000:1000?<要修改权限的文件或文件夹>

#!/usr/bin/env bash
#  pip install --no-cache-dir -U polyaxon-client[gcs]==0.5.0
#  pip install --no-cache-dir -U memory_profiler
#  pip install --no-cache-dir -U xmltodict
# docker run -it -v /path/to/project:/path/to/project -v /path/to/dataset:/path/to/dataset docker-image:tag
# 或者使用`pwd`表示当前路径
# docker run --rm -it -v `pwd`:/workspace data:cv2 /bin/bash
# 对容器处理完的数据更改一下权限:
# chmod?-R?1000:1000?<要修改权限的文件或文件夹>
docker run --rm -it 
-v `pwd`:/workspace 
-v /data3/panjinquan/dataset:/data3/panjinquan/dataset 
docker.dm-ai.cn/algorithm-research/torch:torch1.3-cuda10.0-face-recognition-v3 
/bin/bash 

五、Docker中关于仓库的基本操作

Docker官方维护了一个DockerHub的公共仓库,里边包含有很多平时用的较多的镜像。除了从上边下载镜像之外,我们也可以将自己自定义的镜像发布(push)到DockerHub上。

在镜像操作章节中,我们新建了一个panjinqan/centos:git镜像。

(1)访问https://hub.docker.com/,如果没有账号,需要先注册一个。

(2)利用命令docker login登录DockerHub,输入用户名、密码即可登录成功:

[root``@xxx ~]# docker login

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https:``//hub.docker.com to create one.

Username: panjinqan

Password:

Login Succeeded

将容器转换镜像:

docker commit -m "Flask" -a "panjinqan" container_id panjinqan/flask:v1

(3)将本地的镜像推送到DockerHub上,这里的panjinqan要和登录时的username一致:

[root``@xxx ~]# docker push panjinqan/centos:git??? # 成功推送

[root``@xxx ~]# docker push xxx/centos:git??? # 失败

The push refers to a repository [docker.io/xxx/centos]

unauthorized: authentication required

此时若不一致的话可以使用tag的形式进行标记:

[root``@xxx ~]# docker tag mycentos:git panjinqan/centos:git

(4)以后别人就可以从你的仓库中下载合适的镜像了。

[root``@xxx ~]# docker pull panjinqan/centos:git

对应于镜像的两种创建方法,镜像的更新也有两种:
  • 创建容器之后做更改,之后commit生成镜像,然后push到仓库中。
  • 更新Dockerfile。在工作时一般建议这种方式,更简洁明了。

**配置公司docker仓库**

DM docker仓库地址:Harbor

研究中心的docker均放置于algorithm-research路径下

修改~/.docker/config.json:(不存在此文件则需创建该文件)

{

????????``"auths"``: {

????????????????"panjinqan@docker.pjq.cn": {

????????????????????????``"auth"``: "emhlbmd3ZW55b25nOlp3eTE1OTU5NA=="

????????????????``},

????????????????``"[https://index.docker.io/v1/](https://index.docker.io/v1/ "https://index.docker.io/v1/")"``: {

????????????????????????``"auth"``: "emhlbmd3ZW55b25nOnp3eTE1OTU5NDk2NjI4"

????????????????``}

????????``},

????????``"HttpHeaders"``: {

????????????????``"User-Agent"``: "Docker-Client/18.09.6 (linux)"

????????``}

}

注意:上图中配置的是panjinqan的用户名及密码,需要重启服务并登出账户,然后使用自己的账户登录。

service docker restart

docker logout panjinqan@docker.pjq.cn

docker login docker.dm-ai.cn

然后按照提示输入ldap账号和密码

配置成功后便可以使用docker pull 和docker push对公司的镜像进行操作。

六、利用Docker创建一个用于Flask开发的Python环境

上边已经解释和练习了Docker的基本操作命令,下边以实例的形式完整走一遍流程。

我们创建一个用于Flask开发的Python环境,包含Git、Python3、Flask以及其他依赖包等。

完整命令如下:

[root``@xxx ~]# docker pull centos

[root``@xxx ~]# docker run -it centos:latest /bin/bash

# 此时进入容器,安装Python3、Git、Flask及其依赖包等,安装完成后exit退出

[root``@xxx ~]# docker commit -m "Flask" -a "panjinqan" container_id panjinqan/flask:v1

[root``@xxx ~]# docker push panjinqan/flask:v1

Docker的功能和特性还有很多,各种运行命令、参数等也都有待学习和练习,比如如何管理数据、如何管理网络、如何互相配合工作、如何编写更专业的Dockerfile等。本文先入门为主,以后有时间再慢慢更新关于Docker的知识。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值