1. docker run
docker run :创建一个新的容器并运行一个命令
语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷
eg. sudo docker run -it -p 6622:22 -d --privileged -v /dev/bus/usb/:/dev/bus/usb/ --name="ros_foxy" ros:foxy-ros-base-l4t-r32.4.4
2. docker 容器
#退出容器
exit
Ctrl+P+Q
#查看运行容器
docker ps
docker container ls
#查看所有容器
docker ps -a
docker container ls -a
#启动已经停止的容器
docker start ${Container ID}
#停止容器
docker stop ${Container ID}
#重启容器
docker restart ${Container ID}
#查看容器分层级显示的信息
docker inspect ${Container ID}
#停用全部运行中的容器
docker stop $(docker ps -q)
#删除一个容器
docker rm -f ${Container ID}
#删除全部容器
docker rm -f $(docker ps -aq)
#导出容器
docker export ${Container ID} > ${file_path/file_name}
#导入容器快照,成为一个镜像,相比docker save,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照
docker import ${file_path/file_name} ${docker_image_name}
#单独说一下Docker容器的进入方式,共有四种
#后台启动时进入容器时,使用attach命令(使用attach进入容器后,再退出这个容器,会导致容器的停止)
docker attach ${Container ID}
#后台启动时进入容器时,使用exec命令(使用exec进入后台运行的容器,从容器中退出,不会导致容器的停止)
docker exec -it ${Container ID} /bin/bash
#SSH方式连接,也就是通过外部IP访问,这里不详细阐述
#使用nsenter进入Docker
#在主机中安装nsenter
$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
$ tar -xzvf util-linux-2.24.tar.gz
$ cd util-linux-2.24/
$ ./configure --without-ncurses
$ make nsenter
$ sudo cp nsenter /usr/local/bin
#nsenter可以访问另外一个进程的名称,所以为了连接到某个容器我们还需要获取该容器的第一个进程的PID
#使用docker inspect查看该PID
sudo docker inspect ${Container ID}
#显示该容器第一个PID
sudo docker inspect -f {{.State.Pid}} ${Container ID}
sudo nsenter --target ${FIRST PID} --mount --uts --ipc --net --pid
3. docker 镜像
#获取镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
OPTIONS:选项。可以使用如下OPTIONS:
-a, –all-tags:从镜像仓库中下载所有被标记的镜像
–disable-content-trust:跳过验证
NAME:仓库名
TAG:标签
DIGEST:数据摘要
#查看镜像提交历史信息
docker history IMAGE [IMAGE...]
#列出镜像
docker image ls
docker images
#列出所有镜像
docker image ls -a
docker images -a
#删除镜像
docker image rm
docker rmi
#从容器中导出镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
eg. docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
#打包一个镜像,会保存该镜像的的所有历史记录,比docker export命令导出的文件大
docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS说明:
-o, --output string :写入一个文件,取代标准输出
eg. docker save -o /tmp/test.tar nginx:latest
#载入镜像
docker load [OPTIONS]
OPTIONS 说明:
--input , -i : 指定导入的文件,代替 STDIN
--quiet , -q : 精简输出信息。
eg. docker load --input fedora.tar
#使用 Dockerfile 创建镜像
docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
--quiet, -q :安静模式,成功后只输出镜像 ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
--squash :将 Dockerfile 中所有的操作压缩为一层。
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
--network: 默认 default。在构建期间设置RUN指令的网络模式
eg. sudo docker build -t ros:foxy -f Dockerfile.ros.foxy --build-arg BASE_IMAGE="nvcr.io/nvidia/l4t-base:r32.4.3" .