Docker的常见用法与Carla的使用

本文主要通过两个方法熟悉docker的基本使用方法,一个是通过docker pull的方式拉取,另一个是通过docker build的方式建立

一、Docker简介

1.1 容器与镜像

  • Docker的主要组成部分有镜像Image和容器Container
  • 通过镜像来构建多个容器
  • 修改后的容器能生成新的镜像文件,通过版本号来区分

镜像可以理解成一个模板,可以生成很多个容器,结果比较好的容器可以保存成新的模板,由于新的模板是继承于原始镜像的,因此最好加上版本号来表示这个是新版本的镜像。

1.2 Docker与GPU

  • 在服务器里可以使用docker运行程序
  • docker里一般配置了对应的cuda版本文件
  • github上的一些项目提供了docker版本,通过docker pull拉取镜像后无需配置,即可进入原作者的配置工作环境
  • docker里监视显卡的一个常见命令为:
$ watch -n 1 nvidia-smi

表示每隔1s监视一下显卡的使用状况

  • 不需要安装nvidia-docker这个版本,目前最新docker已经支持GPU。

二、Docker 拉取镜像

2.1 从Docker官网拉取

  • 一般来说,通过如下命令从docker官网里直接拉取镜像。
  • 一些公司在docker官网购买了对应的存储镜像位置,比如 https://hub.docker.com/u/carlasim
  • 进去后可以看到拉取的命令,输入后即从该网站拉取了carla,等价于第二行的拉取最新版本。
$ docker pull carlasim/carla
$ docker pull carlasim/carla:latest
  • 点击Tag后看到有不同的版本,默认不输入是拉取最新版本,选择版本如下所示
$ docker docker pull carlasim/carla:0.9.11

很可能遇见下载的问题,比如连接超时,那么如何解决呢?

2.1.1 阿里云加速

  • 注册阿里云账号并打开该网页:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
  • 复制该网页最下面的语句,大概如下所示,xxx需要替换成你账号提供的信息
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

需要一行一行输入,第二句的意思是在这个配置文件的末尾加入这个语句,如果出现了Runtime的问题,说明可能完全替换了这个配置文件,通过复制原始的文件后,也可以通过手动修改的方式修改daemon.json文件。

2.2 从阿里云拉取

  • 可以通过阿里云服务器docker pull到本地
  • 一些比赛中提供了镜像的地址
$ docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/super-mario-ppo:race
  • 当然也可以通过自己仓库里直接拉取,详情见3.3.2

三、Docker 更新镜像

对于第一次运行,应该使用docker run,而进入已经运行的容器,使用docker exec

选项缩写说明
–detach-d在后台运行容器,并且打印容器id。
–interactive-i即使没有连接,也要保持标准输入保持打开状态,一般与 -t 连用。
–tty-t分配一个伪tty,一般与 -i 连用。

首先查看一下镜像有哪些?(可能需要有管理员权限)

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
air                 cpu_r.1             047dc00744a3        15 months ago       2.59GB
nvidia/cuda         9.0-base            3c57055e68a2        16 months ago       140MB
deepdrive/spc       latest              8a5399f1ba56        20 months ago       29GB
carlasim/carla      0.9.6               daf8c17483e2        21 months ago       6.7GB
carlasim/carla      0.9.5               130f9443c473        2 years ago         7.95GB
carlasim/carla      0.8.4               35e5046c8e16        2 years ago         10.4GB

那么一个文件可以有两个身份,分别是仓库:标签,镜像ID

  • carlasim/carla:0.9.6
  • daf8c17483e2

因此进入的方法也有两种。

3.1 进入容器的方法

3.1.1 docker run -it

首次运行时候应该使用该指令,类似地,可以通过仓库标签的形式进入,也可以通过镜像ID

$ docker run -it carlasim/carla:0.9.6 /bin/bash
$ docker run -it daf8c17483e2 /bin/bash

运行后会生成一个容器,该容器的ID为1142d7e8c313

$ docker ps -a

该指令可以看到所有的容器。

3.1.2 docker exec -it

该指令是下一次用docker需要输入的指令,实际上,docker run后会生成一个新的容器,而在关闭后该容器并不会消失

$ docker exec -it daf8c17483e2 /bin/bash

使用完后,可以停止这个容器,如果下次用还可以激活该容器,并且保留上次的修改结果。

$ docker start daf8c17483e2
$ docker stop daf8c17483e2

3.1.3 docker exec -u 0 -it

root权限进入docker,因为如果你将文件移入docker后,可能会出现只读权限,然而有时候还需要修改,最快的方法就是vi方法

而且,在docker的容器里,sudo肯定是不知道密码的。因此要直接root进入docker

3.2 修改容器内容的方法

修改容器主要有两种,第一种是使用vim来直接修改容器内的文件,第二种是通过复制到本地,修改后再传入容器,实现文件的更新。

3.2.1 VIM方法

有一些Docker中没有vim,如果有的话可以按如下方法修改文件。

首先进入容器,然后cd到需要修改文件的文件夹后输入

$ vi ppo_lstm.py
  • vi的基本操作分为三个,进入后按 **A开启编辑模式,按ESC退出编辑模式,输入:wq**保存并退出。

  • 进入编辑模式后通过上下左右移动光标,退出时候强制退出不保存的话,输入**:q!**即可

**:是进入到命令模式,命令在最下面一行的位置,在该模式下输入wq然后Enter**保存。

3.2.2 CP方法

此命令需要管理权限,前面应该加入sudo

注意修改后的文件夹名称应该相同,这样直接覆盖掉原来的文件夹。如果名称不同的话,就是一般情况的复制一个新文件夹过来。

$ docker cp daf8c17483e23:/home/carla /home/shy/Desktop/carla
$ docker cp /home/shy/Desktop/carla daf8c17483e2:/home

3.3 更新容器到镜像

容器内的内容修改后,可以直接运行某些程序,并且如果不删除该容器的话,下次仅需要开启START这个容器并进入EXEC就可以了。但如果能保存成镜像文件,这个就变成了一个修改好的镜像文件,可以供其他人继续使用。

3.3.1 本地镜像

$ docker commit 1142d7e8c313 carlasim/carla:0.9.9.2
$ docker commit -m"carla 0.9.9.2 version " -a="Shy" 1142d7e8c313 carlasim/carla:0.9.9.2

即将修改好的容器ID为1142d7e8c313的东西更新到carlasim/carla下,并设置TAG0.9.9.2

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
carlasim/carla      0.9.9.2             e33fe3c64c00        28 seconds ago      21.1GB
air                 cpu_r.1             047dc00744a3        15 months ago       2.59GB
nvidia/cuda         9.0-base            3c57055e68a2        16 months ago       140MB
deepdrive/spc       latest              8a5399f1ba56        20 months ago       29GB
carlasim/carla      0.9.6               daf8c17483e2        21 months ago       6.7GB
carlasim/carla      0.9.5               130f9443c473        2 years ago         7.95GB
carlasim/carla      0.8.4               35e5046c8e16        2 years ago         10.4GB

这样生成了一个新的镜像,并且生成了新的镜像ID。

这就回到了第三章开头部分,一个镜像文件的两种身份,一个是镜像ID,另一个是仓库:版本号

3.3.2 阿里云镜像

在生成了修改后的本地镜像,下一步是将本地镜像上传到阿里云仓库中。

那么首先应该建立一个本地仓库,https://cr.console.aliyun.com/cn-hangzhou/instance/repositories

然后点击管理,可以看到提交到该仓库的方法,代码大概长这样

主要分为以下几个步骤:

  • 登陆阿里云
$ sudo docker login --username=shy registry.cn-hangzhou.aliyuncs.com

这里注意一下,一共有两个密码,首先输入的是服务器的密码,然后才是阿里云仓库的密码

  • 从自己仓库拉取镜像
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/shy/carla:0.9.9.2
  • 将镜像推送到仓库
$ sudo docker login --username=shy registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag e33fe3c64c00 registry.cn-hangzhou.aliyuncs.com/shy/carla:0.9.9.2
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/shy/carla:0.9.9.2

docker tag命令是将本地镜像命名为registry.cn-hangzhou.aliyuncs.com/shy/carla,这样可以和阿里云仓库对应上

docker push命令是将该镜像推送至远程仓库

四、Docker 构建镜像

构建镜像的过程比较复杂,这里仅仅通过配置好的文件,如具有Dockerfile等文件,直接建立镜像文件

4.1 以Carla为例构建镜像

carla的docker文件只有一些大版本更新,如果想使用小版本的docker的话可以通过已有的文件来构建。如0.9.9.2

可以构建任意版本的文件,比如你在官网下载了任意版本的carlaXXX.tar.gz,然后使用tar -zxvf方式解压,可以看到里面的dockerfile文件,那么直接构建即可。

首先切换到该dockfile路径,然后build即可。

$ docker build -t carlasim/carla:0.9.9.2 .
xx@amax2080-3:/home/shy/Desktop/carla$ docker build -t carlasim/carla:0.9.9.2 .
Sending build context to Docker daemon  7.213GB
Step 1/8 : FROM nvidia/vulkan:1.1.121-cuda-10.1-alpha
1.1.121-cuda-10.1-alpha: Pulling from nvidia/vulkan
Step 2/8 : RUN packages='libsdl2-2.0' 	&& apt-get update && apt-get install -y $packages --no-install-recommends 	&& rm -rf /var/lib/apt/lists/*
 ---> Running in 52cac4867718
 ---> 1b66ac26486f
Step 3/8 : RUN useradd -m carla
 ---> Running in db6f21c64632
Removing intermediate container db6f21c64632
 ---> 607bdd5426f7
Step 4/8 : COPY --chown=carla:carla . /home/carla
 ---> 8e368c286a3d
Step 5/8 : USER carla
 ---> Running in 609d1a367c2c
Removing intermediate container 609d1a367c2c
 ---> dacd2071adb2
Step 6/8 : WORKDIR /home/carla
 ---> Running in 0ea3e203b324
Removing intermediate container 0ea3e203b324
 ---> a4999881469b
Step 7/8 : ENV SDL_VIDEODRIVER=offscreen
 ---> Running in 9153b9cc182f
Removing intermediate container 9153b9cc182f
 ---> f1ef8394e391
Step 8/8 : CMD /bin/bash CarlaUE4.sh
 ---> Running in a2c7f1995bdb
Removing intermediate container a2c7f1995bdb
 ---> f66e30bfa2b0
Successfully built f66e30bfa2b0
Successfully tagged carlasim/carla:0.9.9.2shel

五、Docker 删除镜像

Docker删除镜像时候会遇到各种麻烦,主要是因为容器还在,必须先删除所有容器后才能删除对应的镜像文件。

5.1 删除容器

首先应该查看有哪些镜像容器,顺序是先删除对应镜像中的容器,然后再删除镜像

$ docker images
$ docker ps -a

一些容器文件显示Exited XXX hours ago,说明这个容器仅仅是退出了,但实际上还在,下次仍然能启动,所以如果直接删除容器对应镜像会提示仍然有些容器在运行,因此需要先把这些容器删除。

$ sudo docker rm -f containerID

5.2 删除镜像

$ sudo docker rmi imageID

六、Docker 运行Carla

Docker运行carla,主要需要两个终端,一个终端用于运行carla,另一个终端用于运行python文件

6.1 运行Carla终端

Docker中运行carla主要有两种模式,第一个是从镜像直接生成容器并进入到carla文件夹运行,第二个是在已经建立的容器中运行carla

  • 第一种方法的弊端是每次都会生成一个的容器,这样如果不删除容器的话,容器会越来越多,这个相对位置是确定的,按照官网的启动方法即可。
  • 第二种方法更通用一些,适合任意docker文件,因为进入docker里的位置,不一定刚刚好是carla目录内,也就是不一定有CarlaUE4.sh文件。如果作者构建了这个docker文件,你可以通过这种方法从镜像生成容器,先进入到有CarlaUE4.sh的路径下,再运行文件。

在运行Carla时候可以直接将Carla的配置文件放入ini中,然后启动时候加入这句即可。-carla-settings=“carla_0.8.4/xxx.ini”,例如:

$ ./Carla.sh -benchmark -fps=XX -carla-server -carla-settings="Path/To/CarlaSettings.ini"

6.1.1 方法1 通过镜像生成容器并运行Carla

$ docker run -p 2080-2082:2080-2082 --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=2 f66e30bfa2b0 /bin/bash CarlaUE4.sh -carla-port=2080 

-p 设置端口,连续的三个即可,注意不要和已运行的端口冲突
这个表示端口的映射关系,即docker内的端口会被映射到服务器的端口上去。

-e 设置选择哪个几号显卡运行carla,范围为0-3

选择存储carla的对应镜像ID

-carla-port 最后设置carla的端口

6.1.2 方法2 容器中切换到Carla路径下再运行Carla

这个位置有时候需要修改,通过进入容器的位置确定,可以先切换到Carla目录,然后输入下列语句

(spc) carla@ab8df04932c5$ cd carla_0.8.4
(spc) carla@ab8df04932c5:~/carla_0.8.4 $ sh CarlaUE4.sh -p 2080-2082:2080-2082 --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=2 -carla-port=2080  

6.2 运行python文件

不同python文件训练或者测试时候输入的端口命令不一定相同,但大致类似,需要设置通讯的端口号,设置port

  • 测试程序(运行训练好的模型,由于缺少Opengl似乎只能在本地图形化系统里运行)
$ python3 run.py --agent_id=1 --env=CarlaGymEnv-v1 --test -p 2080

在运行python文件的时候,也要根据这个文件里的设置,设置对应的端口来通讯,如此时选择2080端口。

  • 训练程序
$ python3 run.py --cfg_file=tools/cfgs/config.yaml --agent_id=1 --env=CarlaGymEnv-v1 -p 2080

七、其他尝试

7.1 笔记本Pycharm专业版的使用

这部分遇见了一些难以解决的问题,简单说一下思路,解决了再更新

pycharm专业版里主要有三个部分可能会用到,分别是

  • ssh,和VNCviewer等类似,直接连接到服务器的环境中
  • ftp,将本地的文件夹和服务器做映射,这样将文件传过去,也可以用如mobaxterm来传文件
  • docker,将本地连接到docker里的镜像或者容器

而如果想与docker连接,需要配置端口,Configuring remote access with systemd unit file🔗
连接成功后,可以显示所有镜像和容器,也可以直接通过镜像生成容器,将文件拷贝会本地pycharm,修改后再部署回去等等…

一个问题是打开后CPU占用过高,没有进行操作CPU占用自动变多,即时设置了分配更大的内存,这里给了8个G,仍然占满到卡死…查询了下官网,也有一些人遇见类似的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值