Docker安装与使用 | conda环境配置 | 附常用命令

这里写自定义目录标题

  • Docker安装
  • Docker使用
    • 打包conda环境
    • 制作镜像
    • 运行镜像
    • 容器监视
    • 常用
  • 一些可能出现的问题

Docker安装

# 创建一个文件夹用于中转文件
mkdir -p ~/3dparty/docker
cd ~/3dparty/docker
# 进去选择docker一键安装即可
wget http://fishros.com/install -O fishros.sh && sh fishros.sh
# 把当前用户添加到docker组中,就不用每次都sudo了,添加后重启系统生效
whoami
sudo usermod -aG docker ckx
docker run hello-world

Docker使用

打包conda环境

# lotus是我的环境名,如果不需要打包环境,或者想在docker内部再配置conda,那么可以省略这步
cd ~/miniconda3/envs
tar -zcvf ~/3dparty/docker/env.tar.gz lotus

制作镜像

cd ~/3dparty/docker
touch Dockerfile
  • Dockerfile
# 使用Ubuntu 20.04作为基础镜像
FROM ubuntu:20.04

# 避免在安装过程中出现交互式提示
# ARG DEBIAN_FRONTEND=noninteractive

# 安装Miniconda
RUN apt-get update && apt-get install -y wget && \
    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \
    bash Miniconda3-latest-Linux-x86_64.sh -b -p /home/miniconda3 && \
    rm Miniconda3-latest-Linux-x86_64.sh

# 将Miniconda添加到PATH
ENV PATH="/home/miniconda3/bin:${PATH}"

# 复制打包的环境到容器中
COPY env.tar.gz /tmp/env.tar.gz
RUN tar -zxvf /tmp/env.tar.gz -C /home/miniconda3/envs/

# 设置当激活容器时自动激活环境的命令
ENV PATH="/home/miniconda3/envs/py39/bin:${PATH}"
RUN echo "source activate lotus" > ~/.bashrc

# 添加代理
RUN alias proxy="export https_proxy=http://127.0.0.1:7890;export http_proxy=http://127.0.0.1:7890" > ~/.bashrc
RUN alias unproxy="unset https_proxy;unset http_proxy" > ~/.bashrc

# 设置工作目录(根据你的项目调整)
WORKDIR /home
  • build dockerfile
docker build -t lotus_env_image .
  • mirror (eg. aliyun dockerhub)
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://uy35zvn6.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

运行镜像

如果直接run,就是root用户,home在/root,我们可以更自由地设置挂载点,退出后从container的处理方式,内存最大占用等

# param
-d                    # 以守护进程模式运行容器(后台运行)
--network host        # 使用主机网络(使容器共享主机的网络堆栈)
--rm                  # 容器停止后自动删除容器
--gpus all            # 允许容器访问所有 GPU
-it                   # 以交互模式运行容器,并分配一个伪终端
-v <主机目录>:<容器目录>  	# 将主机目录挂载到容器中的指定目录
--name <容器名称>     	# 为容器指定一个名称
-e DISPLAY=$DISPLAY 	# 将本地的 DISPLAY 环境变量传递给容器。
-v /tmp/.X11-unix:/tmp/.X11-unix 	# 将本地的X11 socket挂载到容器中。
# run directly 
docker run -d -it --rm --name lotus_env_container lotus_env_image
docker run -d --network host --gpus all --hostname RTX3060 -it --rm --name py39_container -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v ~/workbench:/home/workbench -v ~/3dparty:/home/3dparty py39_env_image
# run with more configs
docker run --hostname A5000 --gpus all -it --rm -v /media:/home/Media -v ~/workbench:/home/workbench --name lotus_env_container --shm-size 32G lotus_env_image:latest

容器监视

# 查看正在运行的容器
docker ps
# 使用 docker attach 附加到容器 (小心使用,容易误关docker)
docker attach lotus_env_container
# 或者使用 docker exec 启动一个新的 Bash 会话(建议配合 docker run -d 使用)
docker exec -it lotus_env_container /bin/bash
# 或者使用 docker logs 查看日志
docker logs -f lotus_env_container

常用


# 两种导出conda环境的方法
## 方法1:conda导出环境列表(在线下载)
conda env export > aloha_environment.yml
conda env create -f /tmp/aloha_environment.yml
## 方法2:压缩conda环境后解压使用(环境较大时用这个)
cd ~/miniconda/env
tar -zcvf ~/3dparty/docker_aloha/aloha_env.tar.gz aloha
tar -zxvf /tmp/aloha_env.tar.gz -C /miniconda/envs/

# 创建镜像(必须在dockerfile同级运行)
docker build -t aloha_env_image .

# 显示目前挂载的镜像/容器
docker image ls
docker container ls -a
# 删除镜像/容器
docker rmi env_image
docker rm env_container

# 镜像的导出和加载
docker save env_image:latest -o lotus_env.tar
docker load -i lotus_env.tar 
# 更新image(最好不要用重名来覆盖 因为不会覆盖 因为ID不同,还是用标签吧)
docker commit my_container my_image:v1
# 查看同一个镜像的所有标签
docker images my_image

# ssh拷贝(加 -r 拷贝整个目录)
sudo apt install openssh-server
# 本地 => 远程
scp -r Ghost_manipulation [email protected]:/home/ckx/workbench/
# 远程 => 本地
scp [email protected]:/to/remote/file /path/to/local/directory

# 临时源装包
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

# 由于容器内部开很麻烦,所以最好第一次启动的时候把python和apt的源换了
wget http://fishros.com/install -O fishros.sh && . fishros.sh

一些可能出现的问题

# pip-error 修改首行为正确的 Python 解释器路径 #!, [python -m pip install]也可以用
vim envs/lotus/bin/pip
# opencv
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python-headless
# libsqlite3
apt install libsqlite3
# SSL证书
apt-get install ca-certificates
update-ca-certificates --fresh
export SSL_CERT_DIR=/etc/ssl/certs
# nvidia-docker(install nvidia-docker2 at master not container)
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
    && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
    && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
# qt-plugin "xcb" error reference => [https://blog.csdn.net/LNSTOP/article/details/139748905?spm=1001.2014.3001.5502]
export QT_DEBUG_PLUGINS=1 # detailed log is always helpful when debugging.
sudo apt-get install qt5-default qttools5-dev-tools libxcb-xinput0  libx11-xcb1 libxcb1 libxcb-glx0 libxcb-keysyms1 libxcb-image0 libxcb-shm0 libxcb-icccm4 libxcb-sync1 libxcb-xfixes0 libxcb-shape0 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxkbcommon-x11-0 libxcb-cursor0 libxcb-xinerama0-dev
ls -l /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/
# D-Bus not built with -rdynamic so unable to print a backtrace
# one of the following 2 praram can solve this ref => [https://www.codeleading.com/article/33005297138/]
add --priviledged => docker run (not recommand)
add --network host => docker run (recommand)

你可能感兴趣的:(docker,conda,容器)