:-) Docker
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