docker常用命令记录
常用命令
查看命令帮助
有用!
docker --help
docker
启动docker
systemctl start docker
停止docker服务
systemctl stop docker
重启docker
systemctl restart docker
使用国内源
切换路径,查看路径下是否存在daemon.json文件,不存在的话新建一个。
cd /etc/docker
touch daemon.json
使用vim打开daemon.json,输入i进入插入模式。
vi /etc/docker/daemon.json
添加内容如下。
{
"registry-mirrors": [
"https://xx4bwyg2.mirror.aliyuncs.com",
"http://f1361db2.m.daocloud.io",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}{}
保存退出。
:wq
使配置生效
systemctl daemon-reload
重启Docker
systemctl restart docker
image
查看已安装的镜像
docker images
删除镜像
docker rmi image_id
container
创建容器
nvidia-docker表示创建的容器可以使用gpu(对于docker版本小于19的需要使用该格式),参考[ubuntu安装docker和nvidia-docker2];(https://blog.csdn.net/moutain9426/article/details/120252641)
-it表示交互式运行容器;
–name指定容器名;
–shm-size设置的是共享内存大小,根据需要设置,如果不设置的话,默认64M,训练深度学习模型的时候dataloader会报错提示共享内存不足;
-p是端口映射(主机端口:容器端口),如果需要使用ssh,容器端口必须设为22;
-v是地址映射(主机文件夹:容器文件夹,注意必须用绝对路径);
镜像的RESPOSITORY:TAG,使用docker images查看;
/bin/bash表示进入容器后启动bash
nvidia-docker run -it --name container_name --shm-size="15g" -p 8080:22 -v /home/ecust/txx/docker/container:/workspace REPOSITORY:TAG /bin/bash
启动容器
docker start container_id
挂载容器(进入容器)
docker attach container_id
退出容器
exit
查看容器状态
docker stats container_name
查看容器ip
参考Docker查看容器ip及指定固定IP,其中container_name为容器名或容器id
sudo docker inspect container_name | grep IPAddress
修改容器的共享内存
查看容器信息
容器id为06b7be1cc029
docker ps -a
查找要修改容器的完整id
docker inspect 06b7be1cc029 |grep Id
进入/var/lib/docker/containers 目录下找到与 Id 相同的目录
这里可能会碰到权限不够无法cd的情况,需要切换到root权限进行操作
sudo su
cd /var/lib/docker/containers
cd 06b7be1cc029066af08e1dc6bc4a16e52a57cbc6a1065fd3c16a7ea4bd6ff943/
pytorch1.4为docker name,可通过docker ps -a查看
docker update pytorch1.4 --restart=always
停止docker
service docker stop
修改 hostconfig.json文件
“ShmSize”:67108864,根据需要改为30g(30* 1024* 1024* 1024),也就是32212254720,保存后退出。
gedit hostconfig.json
启动docker
systemctl start docker
再次进入容器可以发现共享内存shm已经变成30G了
修改容器的端口映射
修改
- 参考前面修改容器的共享内存的方法打开hostconfig.json;
- 找到"PortBindings":{“8080/tcp”:[{“HostIp”:"",“HostPort”:“8080”}]}进行修改,第一个8080是容器内部的ip,第二个8080是主机的ip,根据需求进行修改;
启动docker
systemctl start docker
pycharm使用docker环境
安装专业版pycharm,参考ubuntu常用软件安装
社区版好像不支持访问docker环境
方法一:连接docker镜像,pycharm运行代码时自动创建容器
将容器commit为image镜像
如果利用镜像创建容器之后,在容器中对环境进行了修改,想要使用pycharm调用容器中的环境,可以将该容器commit为镜像,以供pycharm调用;
-m后可以输入修改的说明信息,06b7be1cc029 为容器id,pytorch1.4:da_fasterrcnn_krumo是自己设定的镜像的pytorch1.4:da_fasterrcnn_krumo:tag
sudo docker commit -m "da_fasterrcnn_krumo_docker_pytorch1.4" 06b7be1cc029 pytorch1.4:da_fasterrcnn_krumo
查看生成的image
docker images
设置Pycharm
image name选择相应的image即可
python interpreter path选择相应路径下的python
PS:
- 实践中发现,pycharm调用docker内的环境的方法是,根据配置的镜像,生成了一个辅助的容器,如下图。
- 因此需要把代码和数据放到生成的新容器中,才能正确运行,否则地址映射就有问题。
方法二(推荐):通过ssh连接已在运行中的docker容器
ssh一般用来服务器控制远程设备,pycharm使用ssh来访问容器,利用容器内的环境代码和数据来训练;
pycharm会把本地的代码和数据上传到docker容器映射的地址上,因此会需要有两份代码和数据,本地需要有一份代码数据,docker容器在本机的映射地址上也需要有一份代码和数据;
配置docker容器
参考pycharm如何连接远程服务器的docker容器进行运行和调试代码(一),需要在创建容器的时候将容器的端口设为22,或者创建完容器之后对端口映射进行修改。
进入容器
sudo docker start pytorch1.4
sudo docker attach pytorch1.4
修改容器密码
passwd
安装openssh-server和openssh-client
apt-get install openssh-server
apt-get install openssh-client
修改SSH配置文件
在最后添加一行
PermitRootLogin yes #允许root用户使用ssh登录
vim /etc/ssh/sshd_config
重启ssh服务
/etc/init.d/ssh restart
查看容器ip
apt install net-tools
ifconfig
容器ip为172.17.0.3
退出容器
exit
查看本机ip
参考ubuntu-查看本机的ip地址,同样用ifconfig查看本机ip为172.17.0.1
测试能否连接容器
172.17.0.3为容器的ip
ping 172.17.0.3
参考pycharm如何连接远程服务器的docker容器进行运行和调试代码(一),在本机上运行以下命令;
root:容器内部系统的root账号;
172.17.0.1:本机ip,前文使用ifconfig查看得到的docker0的ip;
-p 8080:本机的端口号;
ssh root@172.17.0.1 -p 8080
配置pycharm
configuration配置远程连接
使用pycharm专业版,在菜单中选择Tools-Deployment-Configuration,点击左上角的‘+’号,选择SFTP,设一个server name之后,进入如下页面
SSH configuration
点击SSH configuration后面的…,在弹出的界面进行配置:
- HOST:容器ip;
- Port:容器端口号;
- User name:容器的root账号;
- Local port:主机端口号;
- Password:容器中设的密码;
配置完之后,点击Test Connection测试连接,下图已经成功连接;
设置Root path
设置容器的root path,后面的在映射到容器的地址时,会以该路径为根目录进行映射;
路径映射
切换到Mappings选项卡,设置路径映射;
后面会将代码上传到容器的映射路径下进行运行;
Local path:本地项目的路径;
Deployment path:容器的映射路径,可以自定义需要映射的路径;
上传本地代码和数据到docker容器
点击Tools-Deployment-Upload to htcn
也可以点击下方的Automatic Upload,自动上传代码,配置一次,之后就不需要手动上传了,每次在本地保存了代码,就会自动上传,在pycharm底部的File Transfer中可以看到上传记录;
设置python环境
选择SSH Interpreter-Existing server configuration,点击…和刚才一样配置,配置完之后点击Move,点击next;
在弹出的选项卡中进行设置:
- 选择好容器内部的python环境,注意需要在容器中安装好运行代码所需的包;
- 设置好路径映射
配置成功,运行代码即可。
Tips:
- 如果有多个容器,每次重启之后,容器的ip地址都会发生变化,这时候就需要重新修改前面配置的Tools-Deployment-configuration和file-Settings-Project-Python Interpreter里的ip。
报错及解决办法
报错1:cannot connect to the docker daemon at unix
解决方案
参考网址,在本地修改两个文件的权限即可。
sudo chmod a+rwx /var/run/docker.sock
sudo chmod a+rwx /var/run/docker.pid
报错2:使用apt install报错E: Unable to locate package
解决办法:
参考docker下使用apt install报错E: Unable to locate package,
把ubuntu主系统中的sources.list文件复制进docker,然后更新源即可。
cp sources.list /etc/apt/sources.list
apt update
报错3:ssh: connect to host 172.17.0.1 port 8080: Connection refused
解决办法:
进入对应容器,重启ssh服务
/etc/init.d/ssh restart
退出容器,测试能否连接
ssh root@172.17.0.1 -p 8080
PS:也可能由于容器内没有设置密码导致。
报错4:error pulling image configuration: Get … : dial tcp …: i/o timeout
解决办法:
网络不好,可以参考前文为docker配置国内源。
[1]:pycharm Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon run
[2]:添加和修改docker容器端口映射的方法
[3]:Docker安装问题解决–error pulling image configuration: Get https://dseasb33srnrn.cloudfront.net/
[4]:Docker 配置国内镜像源加速