1,安装
1.1 ubuntu18.04

uname -r # 内核>=3.1
sudo apt-get remove docker \
                    docker-engine \
                    docker.io # 删除已安装的docker
sudo apt-get update # 更新
sudo apt-get install apt-transport-https \
                     ca-certificates \
                     curl \
                     software-properties-common
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
    "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
sudo apt-get update
sudo apt-get install docker-ce # ce,communication,社区版

1.3 卸载docker

sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker

1.4 centos安装docker

uname -r
yum -y install docker-ce
service docker start
docker run hello-world

vi /etc/sysconfig/docker
OPTIONS='--selinux-enabled=false

systemctl daemon-reload
service docker restart
service docker status

卸载docker

2,docker基础配置
2.1 docker配置aliyun镜像
登录https://cr.console.aliyun.com/undefined/instances/mirrors,镜像中心->镜像加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["xxx-镜像加速地址-xxx"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker # 重启docker
sudo docker info # 查看docker信息

sudo groupadd docker          #添加docker用户组
sudo gpasswd -a $USER docker  #将当前用户添加至docker用户组
newgrp docker             # update docker group

2.2 容器显卡设置

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 nvidia-container-toolkit
service docker restart

3,docker相关的指令

systemctl start docker # 启动docker
service docker start # 启动docker
systemctl stop docker # 停止docker
systemctl restart docker # 重启docker
systemctl enable docker # 开机启动docker
service docker status # 查看docker状态

4,docker镜像相关指令

docker info # 查看docker概要信息
docker --help # 查看docker帮助文档
docker version # 查看docker版本信息
docker pull ubuntu:18.04 # 从阿里云拉一个镜像,centos:7,hello-world
docker images # 显示所有镜像
docker search xx # 搜索镜像
docker images -qa # 列出所有镜像的id
docker rmi -f fce289e99eb9 # 删除镜像,参数,IMAGE ID
docker rmi -f $(docker images -qa) # 删除所有镜像

5.docker容器相关指令
有镜像才能创建容器
5.1 运行,run

docker run [可选参数] image
	--name="镜像名字" 容器名
	-d 				 后台运行
	-it 			 交互方式运行,进入容器查看内容
	-p     			 指定端口 -p 8080:8080 主机端口:容器端口
	-v               挂在磁盘 -v /hone/data:/root/data 主机路径:容器路径
# 运行centos
docker run -it centos /bin/bash
exit # 从容器退出主机, ctrl+alt+p退出,不退出进程

# 创建容器
docker run --gpus all -itd --name container_name -v /home/nvidia/data:/root/data yolo:l4t /bin/bash
--workdir /root 
--runtime=nvidia
# 使用GPU,容器名,挂在盘,镜像及版本
--dns 8.8.8.8 --dns 8.8.4.4 --network=host     # 连接外网
--cpu-cpus 1 -m 2G --memory-swap 8G            # 1核2G内存8G交换内存
-p 20022:22                                    # 端口映射
docker network create -d bridge class.com      # 创建网桥  --network=class.com
docker network connect class.com container_id  # 运行容器连接网桥,[网桥名称] [容器名称]

# 1.容器添加端口
1. sudo docker stop 容器Id # 停止容器,为其添加端口映射
2. sudo docker inspect 容器Id | grep Id  #  查看容器Id
3. cd /var/lib/docker/containers/container_id
4. vim hostconfig.json   # 键,内部端口,值,外部端口,8080/tcp内部端口
"PortBindings":{"8080/tcp":[{"HostIp":"","HostPort":"8080"}]}
5. vim config.v2.json
"ExposedPorts":{"8080/tcp":{}}
"Ports":{"8080/tcp":[{"HostIp":"0.0.0.0","HostPort":"8080"}]}
6. sudo systemctl restart docker # 重启docker
7. sudo docker port 容器Id
8000/tcp -> 0.0.0.0:8080   # 内部端口 -> 外部端口
8000/tcp -> :::8080

# 2.容器添加挂在目录
1. sudo docker stop 容器Id # 停止容器,为其添加端口映射
2. sudo docker inspect 容器Id | grep Ip  #  查看容器Id
3. cd /var/lib/docker/containers/container_id
4. vim hostconfig.json
"Binds":["/data:/import"]  # 数组,多个,隔开。外部挂在盘:内部挂在盘
5. vim config.v2.json
"MountPoints":  {
...
"/import":{                                    # 内部挂在目录
"Source":"data",                         # 外部挂在目录
"Destination":"/import",         # 内部挂在目录
"RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate",
"Spec":{
  "Type":"bind",
  "Source":"data",                     # 外部挂在目录
  "Target":"/import"},               # 内部挂在目录
"SkipMountpointCreation":false
}
} # MountPoints
6. sudo systemctl restart docker # 重启docker
7. docker inspect 容器Id | grep Mounts -A 20

5.2 常用镜像

sudo docker pull pytorch/pytorch:1.9.0-cuda10.2-cudnn7-devel   #  cuda=10.2
sudo docker pull pytorch/pytorch:1.10.0-cuda11.3-cudnn8-devel  # cuda=11.3
sudo docker pull nvcr.io/nvidia/tensorrt:21.05-py3             # tensorrt

5.3 容器操作

# 查看正在运行的容器
docker ps
docker ps -a # 查看历史运行的容器
docker ps -n=1 # 显示最近创建的容器
docker ps -q # 只显示容器的编号

docker start 容器id     # 启动
docker restart 容器id  # 重启
docker stop 容器id     # 停止当前正在运行的容器
docker kill 容器id       # 强制停止容器
docker status 容器id  # 查看容器状态
docker rm 容器id # 删除容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) # 删除所有的容器

6 docker其他命令

docker exec -it 容器id /bin/bash      # 方式一,开启新的终端,可以操作
docker attach 容器id                  # 方式二,进入容器正在运行的终端
docker cp 容器id:/root/1.txt /home    # 容器 -> 主机
docker cp 1.txt 容器id:/root          # 主机 -> 容器
docker logs -tf 容器id                # 查看日志
docker logs -tf --tail 10 容器id      # 显示启动容器的最后10条
docker top 容器id                     # 查看容器中的进程信息
docker inspect 容器id                 # 查看容器的元数据
docker commit 容器id 镜像:版本  # 容器 -> 镜像:版本
docker save hello:latest > hello.tar.gz        # 镜像打包
docker save hello:latest | gzip > hello.tar.gz # 压缩打包,减小一半空间
docker load -i hello.tar.gz                    # 镜像加载

6.6 本地连接docker
1.进入容器,修改ssh配置文件,root可以访问

vim /etc/ssh/sshd_config
PubkeyAuthentication yes #启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys #公钥文件路径
PermitRootLogin yes #root能使用ssh登录

7 制作docker镜像

8 docker-compose
8.1 linux安装

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
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

8.2 docker-compose的使用

docker-compose.yml  # docker-composer文件
version: 3.0
services:
	rtsp_server:  # 服务名
		image: tomcat:jre-8  # 镜像:版本
		container_name: server   # 容器名称
		environment:
        	OPENBLAS_CORETYPE: ARMV8
            LC_ALL: "zh_CN.utf8"
		ports:
			- "8080:8080"  # 端口映射
		volumes: 
		   - "/data:/data"   # 挂在卷
		working_dir: /opt/data
        command:
                - /bin/bash
                - -c
                - "bash start_rtsp_flask.sh"  # 启动指令

docker network create -d bridge hello # 创建网桥,docker容器内部通信
docker-compose up # 启动服务,-d 后台进程启动

创建,删除,重启,日志,查看
https://www.runoob.com/docker/docker-compose.html

相关链接
https://yeasy.gitbooks.io/docker_practice/install/ubuntu.html