本文主要通过两个方法熟悉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
下,并设置TAG为0.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,仍然占满到卡死…查询了下官网,也有一些人遇见类似的问题。