Ubuntu安裝Docker
# 更新軟件源列表
sudo apt update
# 安裝依賴
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# 在系統中添加Docker的官方密鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加Docker源,選擇stable長期穩定版
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
# 查看可以安裝的Docker版本
sudo apt-cache policy docker-ce
# 開始安裝Docker(ce表示社區版)
sudo apt install docker-ce
# 查看安裝的Docker版本
docker -v
# 啟動Docker服務
sudo systemctl start docker
# 設置開機自啟動docker
sudo systemctl enable docker
# 查看Docker是否開啟,出現綠色圓點表示服務正常開啟
sudo systemctl status docker
Ubuntu離線安裝Docker
Docker的離線安裝需要用到containerd.io ,docker-ce-cli,docker-ce,從下面的網址下載指定的版本。
link: https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/
安裝
安裝的順序為:containerd.io ,docker-ce-cli,docker-ce
如果出現
在執行dpkg -i containerd.io_1.3.7-1_amd64.deb 時出現報錯:
(正在讀取數據庫 ... 系統當前共安裝有 186840 個文件和目錄。)
正准備解包 containerd.io_1.3.7-1_amd64.deb ...
正在將 containerd.io (1.3.7-1) 解包到 (1.3.7-1) 上 ...
dpkg: 依賴關系問題使得 containerd.io 的配置工作不能繼續:
containerd.io 依賴於 libseccomp2 (>= 2.4.0);然而:
系統中 libseccomp2:amd64 的版本為 2.2.3-3kord3。
dpkg: 處理軟件包 containerd.io (--install)時出錯:
依賴關系問題 - 仍未被配置
正在處理用於 man-db (2.7.5-1kord) 的觸發器 ...
在處理時有錯誤發生:
containerd.io
解決辦法:
- 在線安裝
apt-get install -y libltdl7 libseccomp2
- 離線安裝
在http://ftp.sjtu.edu.cn/ubuntu/pool/main/libs/libseccomp/下載libseccomp2_2.4.3-1ubuntu1_amd64.deb
dpkg -i libseccomp2_2.4.3-1ubuntu1_amd64.deb
啟動Docker
sudo systemctl start docker
查看Docker的狀態
sudo systemctl status docker
安裝Nvidia Docker(NVIDIA Container Toolkit)
在線安裝
- 設置穩定版本的庫及GPG密鑰
$ 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
- 安裝nvidia-docker2包及其依賴:
sudo apt-get update
sudo apt-get install -y nvidia-docker2
# 重啟docker服務
sudo systemctl restart docker
離線安裝
在https://github.com/NVIDIA/libnvidia-container/tree/gh-pages/stable下載對應系統的
libnvidia-container1_1.9.0-1_amd64.deb
nvidia-container-toolkit_1.9.0-1_amd64.deb
nvidia-container-runtime_3.9.0-1_all.deb
nvidia-docker2_2.9.1-1_all.deb
libnvidia-container-dev_1.9.0-1_amd64.deb
libnvidia-container-tools_1.9.0-1_amd64.deb
安裝
sudo dpkg -i libnvidia-container1_1.9.0-1_amd64.deb
sudo dpkg -i libnvidia-container-tools_1.9.0-1_amd64.deb
sudo dpkg -i nvidia-container-toolkit_1.9.0-1_amd64.deb
sudo dpkg -i nvidia-container-runtime_3.9.0-1_all.deb
sudo dpkg -i libnvidia-container-dev_1.9.0-1_amd64.deb
sudo dpkg -i nvidia-docker2_2.9.1-1_all.deb
# or
sudo dpkg -i ./*.deb
# 重啟docker服務
sudo systemctl restart docker
測試
docker run --rm --gpus all nvidia/cuda:11.4-base nvidia-smi
修改docker源
可選的源列表
# Docker中國區官方鏡像:
https://registry.docker-cn.com
# 網易:
http://hub-mirror.c.163.com
# ustc:
https://docker.mirrors.ustc.edu.cn
# 中國科技大學:
https://docker.mirrors.ustc.edu.cn
# 阿里雲:
https://cr.console.aliyun.com/
# 騰訊雲:
https://mirror.ccs.tencentyun.com
修改源
創建或修改 /etc/docker/daemon.json
文件,修改:
{
"registry-mirrors" : [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://cr.console.aliyun.com",
"https://mirror.ccs.tencentyun.com"
]
}
重啟docker服務
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker添加用戶組
docker安裝完成需要添加用戶組,如果不添加會報如下警告,強迫症的筆者一定要干凈
WARNING: Error loading config file: /home/nvidia/.docker/config.json: stat /home/nvidia/.docker/config.json: permission denied
解決方案
- 創建組
sudo groupadd docker
- 將用戶先加到上一步創建的組中
sudo gpasswd -a {your user name of linux} docker
- 重啟docker-daemon
sudo systemctl restart docker
- 更新用戶組
newgrp docker
- 設置目錄及其所有文件的權限
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "/home/$USER/.docker" -R
Done!
Docker harbor私服搭建
安裝docker-compose
# 下載docker-compose的最新版本
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 為docker-compose添加可執行權限
chmod +x /usr/local/bin/docker-compose
# 驗證查看docker-compose版本
docker-compose --version
如果docker compose的版本太低會提示如下錯誤:
x Need to upgrade docker-compose package to 1.18.0+.
安裝Harbor
下載Harbor
下載Harbor離線安裝包:https://github.com/goharbor/harbor/releases
tar -xvf harbor-offline-installer-v2.6.0.tgz #解壓離線安裝包
mv harbor /opt/ #移到/opt目錄下
cd /opt #進入到/opt目錄
cd harbor
ll #查看目錄內容
進入harbor目錄修改harbor.yml
然后安裝harbor
./prepare
./install.sh
成功會顯示:
----Harbor has been installed and started successfully.----
使用Harbor
瀏覽器輸入harbor.yml
中設置的hostname
的IP
- 增加倉庫地址
文件目錄:/etc/docker/daemon.json (沒有則新建該文件)
{ "insecure-registries":["hostname:port"] }
重新登陸
docker logout hostname:port
docker login hostname:port
此時如果報錯
Error response from daemon: login attempt to http://10.1.1.49:80/v2/ failed with status: 502 Bad Gateway
是因為重啟docker服務的時候有一些容器沒有自動重啟
重啟所有容器
docker restart $(docker ps -a -q)
- 重啟dcoker服務
service docker restart
- push鏡像
-
重新登陸harbor
-
新建項目(私有倉庫)
#拉取鏡像
docker pull hello-world
#給鏡像打tag(鏡像的格式為,鏡像倉庫IP:端口/鏡像名稱)
docker tag hello-world 192.168.100.3:80/repo-test/hello-world:20190720
#PUSH到倉庫
docker push 192.168.100.3:80/repo-test/hello-world
如果出現
The push refers to repository [192.168.100.3:80/hello-world]
af0b15c8625b: Retrying in 5 seconds
是因為tag打的不對
如果忘記harbor密碼
#1、進入[harbor-db]容器內部
docker exec -it harbor-db /bin/bash
#2、進入postgresql命令行,
psql -U postgres -d postgres -h 127.0.0.1 -p 5432 #或者用這個可以不輸入密碼。
#3、切換到harbor所在的數據庫
\c registry
#4、查看harbor_user表
select * from harbor_user;
#5、例如修改admin的密碼,修改為初始化密碼Harbor12345 ,修改好了之后再可以從web ui上再改一次。
update harbor_user set password='94d45d5615496d023c8137c362d9d0a9', salt='g3vdOcNhqlQN4Q792SkznRN633ZqvIQ5' where username='admin';
#6、退出 \q 退出postgresql,exit退出容器。
\q
exit
完成后通過WEB UI,就可以使用admin 、Harbor12345 這個密碼登錄了,記得修改這個默認密碼哦,避免安全問題。
創建mysql容器並遠程連接
拉取鏡像
docker pull mysql:latest
創建容器
docker run -itd --name=mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mysql
配置容器
# 進入容器
docker exec -it mysql /bin/bash
# 安裝服務端等軟件
apt-get install ssh openssh-server vim
#修改/etc/ssh/sshd_config 修改為PermitRootLogin yes和修改為UsePAM no
mysql -uroot -proot 或 (mysql -uroot -p )
mysql> select host,user,plugin,authentication_string from mysql.user;
mysql> ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
mysql> FLUSH PRIVILEGES;
mysql> quit;
#重啟ssh服務
/etc/init.d/ssh restart
SQLyog登陸測試
MySQL Host Address: 宿主機IP
用戶名: root
密碼: root
端口: 3306, 如果有做過端口映射替換端口
docker容器中可視化
在本地宿主機上安裝x11界面服務
sudo apt-get install x11-xserver-utils
# 開放權限,允許所有用戶,當然包括docker,訪問X11的顯示接口
# xhost + 每次重新開機,需要在本機操作一次
xhost +
創建容器
docker run -it --net=host -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/zhangbo/.Xauthority:/root/.Xauthority -e DISPLAY=$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE --gpus all --restart=always --name v-test nvidia/cuda:11.4.0-base-ubuntu20.04 /bin/bash
容器可視化測試
安裝xarclock用於測試
apt update
apt-get install -y xarclock
xarclock
docker鏡像的保存和載入
保存鏡像
docker save {hash} > image.tar
載入鏡像
docker load --input image.tar
容器啟動后增加 端口映射 和 掛載目錄
增加 端口映射
停止docker服務(一定要,否則修改會自動還原)
sudo systemctl stop docker
查看docker容器的hash值
docker inspect <容器id> | grep Id
修改 /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
和 /var/lib/docker/containers/[hash_of_the_container]/config.v2.json
修改hostconfig.json
"NetworkMode":"default",
"PortBindings":{
"10002/tcp":[{ // "10002/tcp" 容器端口
"HostIp":"",
"HostPort":"10002" // "10002" 宿主機端口
}],
....
}
修改config.v2.json
這個文件要修改倆個地方
第一個地方
"Config":{
"Hostname":"f3d34c2e8a16",
"Domainname":"",
"User":"",
"AttachStdin":false,
"AttachStdout":false,
"AttachStderr":false,
-------------------------------
"ExposedPorts":{
"10002/tcp":{} //增加這部分內容,如果沒有的話,這個地方是暴露的容器的端口
.....
},
--------------------------------
"Tty":true,
"OpenStdin":true,
"StdinOnce":false,
}
第二個地方
"Service":null,
"Ports":{
"10002/tcp":[{ //容器端口
"HostIp":"0.0.0.0",
"HostPort":"10002" //宿主機端口
}]
},
"SandboxKey":"/var/run/docker/netns/b30d214a0bf1"
啟動docker服務
sudo systemctl start docker
增加 掛載目錄
停止docker服務(一定要,否則修改會自動還原)
sudo systemctl stop docker
修改/var/lib/docker/containers/[hash_of_the_container]/config.v2.json
修改config.v2.json
"MountPoints":{
"/root/workspace":{ //容器目錄
"Source":"/home/nvidia/data/zhangbo", //宿主機目錄
"Destination":"/root/workspace", //容器目錄
"RW":true,
"Name":"",
"Driver":"",
"Type":"bind",
"Propagation":"rprivate",
"Spec":{
"Type":"bind",
"Source":"/home/nvidia/data/zhangbo", //宿主機目錄
"Target":"/root/workspace" //容器目錄
},
"SkipMountpointCreation":false
}
},
"SecretReferences":null, ...
啟動docker服務
sudo systemctl start docker
Docker容器ssh遠程連接
安裝ssh
apt update
apt install openssh-server
/etc/init.d/ssh start
修改ssh配置文件
vim /etc/ssh/sshd_config
# 修改PasswordAuthentication yes
# 修改PermitRootLogin yes
重啟ssh服務
/etc/init.d/ssh restart
設置root密碼
passwd root