使用Docker管理你的生產環境

介紹

本文將介紹如何用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章