Docker 是一个开源的应用容器引擎。
Docker包含三部分,分别是:镜像image,容器container,仓库repository
镜像和容器的关系,就相当于面向对象中的类和对象的关系,镜像是静态的定义,而容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
Docker 官网:https://www.docker.com
一、安装docker(windows)
链接:https://pan.baidu.com/s/1D6oyu7NgoHGGUrKaUcBRBw
提取码:sf72
自行下载安装,默认安装即可~
二、打开dockerhub
dockerhub就有点像github一样,各种各样的仓库镜像,搜索Ubuntu
选择合适的版本
在这里我选着Ubuntu20.04为例
三、查看当前有哪些镜像
docker images
我们可以看到现在本地没有镜像
四、拉取Ubuntu20.04镜像
docker pull ubuntu:20.04
这样就下载完啦~
我们再次查看本地镜像,多了Ubuntu20.04这个
五、使用Ubuntu镜像启动一个容器
docker run --name="ros_noetic" -it 825d55fb6340 /bin/bash
--name:为容器命名(因为我是用来装ros_noetic版本的)
-it:使用交互方式运行(-i:交互式操作,-t终端)
/bin/bash:表示交互式 Shell(我们可以看到运行结束,下面变成命令行窗口)
这时候我们的容器就创建完成了~
我们发现我们创建完它就直接运行了,以后重新登录的时候,只需要以下两步即可~
docker start 容器id
docker exec -it 4134c3bea12a /bin/bash
这样就可以开始Ubuntu的操作啦~~~
六、其他命令操作
1、查看所有的容器
docker ps -a
2、删除容器
docker rm -f 容器id
3、删除镜像
docker rmi -f 镜像id
以下内容为新增内容!
Docker更换下载源:
(直接飞一般的感觉)
cd /etc/docker
sudo vim daemon.json
在daemon.json中添加:
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
重启生效:
sudo systemctl daemon-reload
sudo systemctl restart docker
看是否生效:
sudo docker info
新增:
vscode没法找到docker 容器,原因是docker需要管理员权限,
因此会出现 docker ps -a 查看不了容器,而sudo docker ps -a 却可以查看,
解决方法:
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将当前用户添加至docker用户组
newgrp docker #更新docker用户组
再重启下电脑reboot,进入vscode就可以查看docker容器,从而进行远程控制
注意:vscode需要下载Dev Containers 插件!
新增:
如何将本地文件复制到docker容器内:
docker cp 本地文件路径 容器ID/容器NAME:容器内路径
新增:
卸载docker:
sudo apt-get remove docker \
docker-engine \
docker.io
Docker服务相关命令:
1、启动docker服务
systemctl start docker
2、停止docker服务
systemctl stop docker
3、重启docker服务
systemctl restart docker
4、查看docker服务状态
systemctl status docker
5、设置开机启动docker服务
systemctl enable docker
Docker镜像相关命令:
1、查看镜像(查看所有镜像)
docker images
2、查看所有镜像id
docker images -q
3、搜索镜像
docker search 镜像名称
4、拉取镜像(从Docker仓库下载镜像到本地,镜像名称的格式为 名称:版本号,若没有指定版本号,则下载最新版本)
docker pull 镜像名称
5、删除镜像
docker rmi 镜像id
6、删除所有镜像
docker rmi 'docker images -q'
Docker容器相关命令:
1、查看容器
(查看正在运行的容器)
docker ps
(查看所有容器)
docker ps -a
2、创建并启动容器
docker run 参数
参数说明:
- -i:保持容器运行。通常和-t同时使用,加入-it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭
- -t:为容器重新分配一个输入终端,通常与-i同时使用
- -d:以后台模式运行容器,需要使用docker exec 进入容器,退出后,容器不会关闭
- --name:为创建的容器命名
例如:
docker run --name="a1" -it ubuntu:20.04 /bin/bash
3、进入容器
docker exec 参数
例如:
docker exec -it a1 /bin/bash
a1 为容器名称
4、启动容器
docker start 容器名称
5、停止容器
docker stop 容器名称
6、删除容器(注:运行状态下的容器是不能删除的,只有停止容器后才能删除)
docker rm 容器名称
7、查看容器的信息
docker inspect 容器名称
Docker容器的数据卷
数据卷:
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
作用:
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
创建启动容器时,使用 -v 参数 ,设置数据卷
docker run …… -v 宿主机目录/文件:容器内目录/文件
注:
- 目录必须是绝对路径
- 如果目录不存在,则会自动创建
- 可以挂载多个数据卷
例如:
docker run -it --name=c1 -v /root/data:/root/data_container ubuntu:20.04 /bin/bash
数据卷容器:
多容器进行数据交换:
- 多个容器挂载在同一个数据卷
- 数据卷容器
1、创建启动c3数据卷容器,使用-v 参数 设置数据卷
docker run -it --name=c3 -v /volume ubuntu:20.04 /bin/bash
2、创建启动c1 c2 容器,使用-volume-from 参数 设置数据卷
docker run -it --name=c1 -v --volume-from c3 ubuntu:20.04 /bin/bash
docker run -it --name=c2 -v --volume-from c3 ubuntu:20.04 /bin/bash
Docker 镜像制作
1、容器转为镜像
docker commit 容器id 自定义镜像名称:版本号
例如:
docker commit 4134c3bea12ad my_images:1.0
压缩镜像:(进行传输)
docker save -o 压缩文件名称 镜像名称:版本号
例如:
docker save -o my_zip_file.tar my_images:1.0
解压缩加载镜像
docker load -i 压缩文件名称
例如:
docker load -i my_zip_file.tar
2、Dockerfile
关键字 | 作用 | 备注 |
FROM | 指定父镜像 | 指定dockerfile基于哪个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile是谁写的 |
LABEL | 标签 | 用来表明dockerfile的标签,可以使用LABEL代替MAINTAINER,最终可以在docker image基本信息中查看 |
RUN | 执行命令 | 格式:RUN command 或者 RUN ["command","param1","param2"] |
CMD | 容器启动命令 | 格式:CMD command param1 param2 或者 CMD ["command","param1","param2"] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中,不仅仅局限于当前build上下文,也可以来源于远程服务 |
ENV | 环境变量 | 指定build的时候的环境变量,也可以在启动容器的时候,通过-e ,格式:ENV name=value |
docker build -f dockerfile文件路径 -t 自定义镜像名称:版本 .
例如:
需求:
自定义Ubuntu20.04镜像:1、默认登录路径为/usr 2、可以使用vim
步骤:
- 定义父镜像:FROM Ubuntu:20.04
- 定义作者信息:MAINTAINER qsx <qsx@hh.cn>
- 执行安装vim命令:RUN apt install -y vim
- 定义默认的工作目录:WORKDIR /usr
- 定义容器启动执行的命令:CMD /bin/bash
dockerfile文件:
FROM Ubuntu:20.04
MAINTAINER qsx <qsx@hh.cn>
RUN apt install -y vim
WORKDIR /usr
CMD /bin/bash
构建dockerfile文件:
docker build -f ./dockerfile -t my_images:1.0 .
Docker 私有仓库
一、构建私有仓库
1、拉取私有仓库镜像
docker pull registry
2、启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
3、打开浏览器,输入地址http://私有仓库服务器ip:5000
4、修改daemon.json
vim /etc/docker/daemon.json
在上述文件中添加一个key,保存并退出
{"insecure-registries":["私有仓库服务器ip:5000"]}
5、重启docker服务
systemctl restart docker
docker start registry
二、将镜像上传至私有仓库
1、标记镜像为私有仓库的镜像
docker tag my_image:1.0 私有仓库服务器ip:5000/my_image:1.0
2、上传标记的镜像
docker push 私有仓库服务器ip:5000/my_image:1.0
三、从私有仓库拉取镜像
docker pull 私有仓库服务器ip:5000/my_image:1.0
新增:
由于docker只针对在CPU上面跑的情况,对于需要在GPU上面运行的服务器,其提供了一个nvidia-docker
安装nvidia-docker2
sudo apt-get install -y nvidia-docker2
验证:
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
若出现
docker: Error response from daemon: Unknown runtime specified nvidia.
则检查一下daemon.json文件,添加以下内容
{
"registry-mirrors": [
"https://610597w4.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://docker.mirrors.ustc.edu.cn"
],
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
重启生效:
sudo systemctl daemon-reload
sudo systemctl restart docker
就可以验证运行了!