文章目錄
介紹
本文將介紹如何用docker封裝你的生成環境,從而實現一次部署到處運行。docker非常適合有多臺服務器,或者需要經常切換工作環境的人。比如,在生產環境使用docker,因爲開發環境跟生產環境是一致的,因此可以大大減低開發成本。
Docker有兩個比較重要的概念,一個是image一個是container,container是用image產生出來的一個運行的容器,也就是說,你可以從同一個image裏面,產生出多個不同的容器來分別執行不同的任務。你可以用 docker image ls
來查看你所有的鏡像,以及用docker ps -a
來查看你所有的container。
Docker-CE安裝
Docker 有幾種不同的版本:
- Docker CE(Community Edition)是簡單的經典OSS(開源軟件)Docker Engine。
- Docker EE(Enterprise Edition)是Docker CE在某些系統上獲得認證,並得到Docker Inc.的支持的版本。
- Docker CS(Commercially Supported)是捆綁了舊Docker EE版本<= 1.13的Docker。
更詳細介紹可以看看這篇博文和另一篇關於Docker CE和Docker EE的文章。
這裏安裝的是Docker-CE,安裝的教程請直接看:https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce-1
我這裏的安裝代碼有可能會過期,這是目前ubuntu的安裝代碼:
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
Nvidia-docker 安裝
爲了使用gpu功能,我們還需要安裝nvidia-docker, 安裝教程請看:https://github.com/NVIDIA/nvidia-docker
我這裏給出的安裝代碼有可能是過時的,僅供參考:
# If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
# Add the package repositories
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
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
# Install nvidia-docker2 and reload the Docker daemon configuration
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
# Test nvidia-smi with the latest official CUDA image
docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
阿里雲加速
使用加速器可以提升獲取Docker官方鏡像的速度
,方法如下:
- 首先進入阿里雲docker庫首頁 https://dev.aliyun.com/
- 搜索:容器鏡像服務
- 進入控制檯,點擊鏡像加速器,然後按照裏面教程配置你的加速器
使用阿里雲docker倉庫同步鏡像
首先,還是訪問上面的阿里雲的容器鏡像服務,然後選擇鏡像倉庫,創建你自己的鏡像倉庫
最後就可以按照教程push你的docker鏡像到阿里雲啦,在其他機器還能pull這個鏡像,不要太方便。
常用命令
配置用戶分組,免除sudo煩惱
把自己的用戶加到docker組就不需要sudo了
sudo groupadd docker
sudo usermod -aG docker $USER
查看版本
docker --version
docker version
docker info
運行鏡像
docker run hello-world
使用-v掛載本機文件
因爲在鏡像無法動態保存你的代碼,所以,如果要開發,我們可以將你本機的文件掛載到容器中(一般是掛載你的代碼),這樣就可以實現文件共享,你的代碼在容器結束的時候也不會丟失。
docker run -v ~/github:~/github hello-world
使用-p 映射端口
將22端口應該到本機的2222端口中,這樣可以在外部訪問2222端口來ssh連接你的容器
docker run -v ~/github:~/github -p 2222:22 hello-world
顯示所有Docker images
docker image ls
顯示所有docker container
docker container ls
docker container ls --all
docker container ls -aq
導入導出docker鏡像
參考:https://stackoverflow.com/questions/23935141/how-to-copy-docker-images-from-one-host-to-another-without-using-a-repository
保存命令:
docker save -o <path for generated tar file> <image name>
加載命令:
docker load -i <path to image tar file>
docker 刪除所有名字爲none鏡像
在初期build自己的鏡像的時候,可能會產生一堆none的鏡像,用下面的命令可以批量刪除:
docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }') #停止容器
docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }') #刪除容器
docker rmi $(docker images | grep "none" | awk '{print $3}') #刪除鏡像
docker自定義鏡像安裝路徑
參考:https://forums.docker.com/t/how-do-i-change-the-docker-image-installation-directory/1169
有的時候可能你的根目錄空間不夠,想要將鏡像安裝到其他目錄裏,我們可以將/var/lib/docker這個路徑移到其他地方,然後建立一個鏈接:
mv /var/lib/docker /mnt/docker
ln -s /mnt/docker /var/lib/docker
docker自定義運行的用戶(解決權限問題)
如果在docker中運行的userid與本地服務器的userid不一致可能會出現權限混亂的問題,解決方法如下:
nvidia-docker run --name qjcontainer_gpu -d qj/qj_docker_gpu\
&& sleep 5 \
&& nvidia-docker exec qjcontainer_gpu sudo usermod -u $(id -u) qj \
&& nvidia-docker exec -it qjcontainer_gpu bash
假設docker裏面是使用qj作爲用戶運行的,這裏其實就是使用usermod 強行改qj用戶的id爲本機的userid。
如果不需要我們可以使用
nvidia-docker exec qjcontainer_gpu sudo usermod -u xxxxxx qj
改回去,xxxxx就是你要改回去的id,可能是1001或者1002之類的。
寫自己的Dockerfile並建立鏡像
關於怎麼寫Dockerfile建議你先去看看別人怎麼寫的,一個比較好的教程是:
https://takacsmark.com/dockerfile-tutorial-by-example-dockerfile-best-practices-2018/
常用的幾個關鍵字就是FROM, COPY, RUN, ENV, EXPOSE, CMD
FROM就是你要繼承的鏡像,一般是選擇官方的鏡像
RUN 就是在裏面使用shell命令,比如 RUN apt-get update
ENV 是設置環境變量
COPY 這是複製文件到鏡像裏面
EXPOSE 是用來暴露端口的,需要結合-p命令使用,比如EPOSE 22
這樣就能使用ssh了
CMD 一般每個Docerfile只有一個,用來負責定義運行這個鏡像的初始動作的,比如CMD ["bash"]
,比如一運行就打開終端。
寫完Dockerfile之後,就可以直接調用命令來build你自己的鏡像了:
docker build -t qj/qj_docker:latest .
之後就可以運行自己的鏡像:
docker run qj/qj_docker
我自己寫了一個nvidia gpu + pytorch + rstudio server的Dockerfile,有興趣可以來看看:https://github.com/Jie-Qiao/pytorch-r-dockerfile