Docker管理服务器

随时更新...

Posted by JY on November 18, 2020
容器启动
docker pull registry.example.net:5000/env:1.0
docker tag registry.example.net:5000/env:1.0 env:1.0

# env1.0 (basic env Ubuntu18.04)
nvidia-docker run --name env -itd -p 88:8888 -p 2222:22 -v /data0/JY:/data0/JY env:1.0 /bin/zsh

# env2.0 (with conda and vnc)
docker pull registry.example.net:5000/env:2.0
docker tag registry.example.net:5000/env:2.0 env:2.0
nvidia-docker run --name env2.0 -itd -p 99:9999 -p 88:8888 -p 2222:22 -p 6901:5901 -v /data0:/data0 env:2.0  /bin/zsh
# -p 99:9999 备用IP端口
# -p 88:88 jupyter notebook端口
# -p 2222:22   ssh远程连接端口
# -p 6901:5901 vnc远程桌面端口

# env3.0(add nvtop,without vnc)
nvidia-docker run --name env3.1 -itd \
-p 88:8888 -p 2222:22 \
-v /data0:/data0 -v /data1:/data1 -v /data2:/data2  \
--privileged=true env:3.1 /bin/zsh

nvidia-docker exec -it env3.1 /bin/zsh
## 补充 启动时加入--ipc=host,解决
nvidia-docker run --name env3.4 -itd \
-p 88:8888 -p 2222:22 --ipc=host \
-v /data0:/data0 -v /data1:/data1 -v /data2:/data2  \
--privileged=true env:3.4 /bin/zsh
版本迭代
docker commit
docker tag env:3.0 registry.example.net:5000/env:[Version]
docker push registry.example.net:5000/env:[Version] # 上传镜像到本地
设置自动启动
# 启动时加--restart=always
nvidia-docker run --name env3.2 -itd --restart=always \
-p 88:8888 -p 2222:22 -p 6901:5901 \
-v /data0:/data0 -v /data1:/data1 -v /data2:/data2 \
--privileged=true env:3.2 /bin/zsh
Flag                      Description
no                        不自动重启容器. (默认value)
on-failure                容器发生error而退出(容器退出状态不为0)重启容器
unless-stopped            在容器已经stop掉或Docker stoped/restarted的时候才重启容器
always                    在容器已经stop掉或Docker stoped/restarted的时候才重启容器
# 如果已经启动的项目,则使用update更新:
docker update --restart=always env3.1
用户管理
useradd  -d  /data0/username -m -s  /bin/zsh  username   # docker中建立新用户,文件夹未存在
# -d: 指定用户登入时的主目录
# -m: 自动建立用户的登入目录
# -s: 用户登入后使用的shell,默认值为/bin/bash

useradd  -d  /data0/username -s /bin/zsh  username  # 文件夹已存在时

chown -R username:username /data0/username/*  # 指定目录的所用者
chmod 760 /data0/username # 赋予读写权限
passwd user # 添加密码
修改配置

方法一:不推荐

# 容器的配置文件路径
sudo service docker stop  # 这一步是必需的

/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json  # 可能需要管理员 su
# 可以通过docker ps或者docker inspect containername查看。(CONTAINER ID就可以看出来对应的hash_of_the_container)

# 修改.json文件
vim *.json  # 按下F4

sudo systemctl restart docker
"Binds": ["/data0:/data0"],
"PortBindings": {
        "5901/tcp": [
            {
                "HostIp": "",
                "HostPort": "6901"
            }
        ]
    },

方法二:重新启动新的(推荐)

step1: docker commit 容器名|容器id 新镜像名
step2: 重新run一个新容器
基本安装
apt-get install vim wget git
sudo apt-get install zsh 
apt-get install iproute2 iproute2-doc inetutils-ping net-tools
chsh -s /bin/zsh
sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
Anaconda安装
#修改镜像源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://anaconda.mirrors.sjtug.sjtu.edu.cn/pkgs/main
conda config --add channels https://anaconda.mirrors.sjtug.sjtu.edu.cn/pkgs/free
conda config --add channels https://anaconda.mirrors.sjtug.sjtu.edu.cn/pkgs/mro
conda config --add channels https://anaconda.mirrors.sjtug.sjtu.edu.cn/pkgs/msys2
conda config --add channels https://anaconda.mirrors.sjtug.sjtu.edu.cn/pkgs/pro
conda config --add channels https://anaconda.mirrors.sjtug.sjtu.edu.cn/pkgs/r
jupyter notebook配置

将docker的8888端口映射到88,连接为hostIP:88

# 配置:https://blog.csdn.net/u010420283/article/details/82871367

c.NotebookApp.ip='10.15.198.102'               
c.NotebookApp.password = u'sha1:8d2d020418c3:d4b6327fae1d40d2eb0e5a41a54311327f8dbe07' 
c.NotebookApp.open_browser = False      
c.NotebookApp.port =8888                

jupyter notebook --ip=0.0.0.0  # 运行jupyter-notebook
# 界面: hostIP:88

# 安装nodejs,jupyterlab需要 
sudo apt-get update
sudo apt-get install -y software-properties-common
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get install nodejs
sudo apt install libssl1.0-dev nodejs-dev node-gyp npm
SSH连接

将docker的22端口映射到2222,连接为hostIP:2222

# mkdir /var/run/sshd
echo 'root:amax' | chpasswd
sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
echo "export VISIBLE=now" >> /etc/profile
service ssh restart

# vscode连接
Host docker102
HostName 10.15.198.102
Port 22
User root
Password amax
文件传输
scp -P 34543 -r <local_file> <user@host:/dir>
VNC配置

将docker的5901端口映射到6901,连接为hostIP:5901

apt install xfce4 xfce4-goodies xrdp xbase-clients
apt install vnc4server 

vim ~/.vnc/xstartup
# 修改为如下: 
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &

chmod +x ~/.vnc/xstartup
vncserver