docker操作2
文章目录
- docker操作2
- 启动新容器
- 配置新的容器后要做的操作
- 进入Docker容器
- 可以显示图片的容器
- 镜像
- pull 网络镜像
- 日志
- 停止与删除
- 停止
- 删除
- 删除image报错
- 在容器和宿主机之间拷贝数据
- 创建命令别名
- 查看docker运行容器的ip
- docker image保存与导入
- 保存image
- 导入image
- 打标签tag
- 拉取镜像 / 推送镜像
- 扩展容器
- 导出镜像 / 导入镜像
- 查询image操作历史
- 导出和导入容器
- 重命名镜像 / 容器
- 查看docker占用硬盘空间大小
- docker阿里云镜像加速,修改 `/etc/docker/daemon.json`
- Reference
- 欢迎关注公众号【三戒纪元】
启动新容器
docker run -it ubuntu /bin/bash
参数说明:
- -i: 交互式操作。
- -t: 终端。
- ubuntu: ubuntu 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
每次起docker的时候,可以增加-rm,退出docker时,直接删除,可节省硬盘空间
# 启动新的容器并挂载目录
docker run -it --name mycontainer -v /home/lab305/XXX:/root/XXX python:3.6 /bin/bash
docker run -it --name 容器名称 -v 主机上的绝对路径目录:容器上的目录 镜像名:版本号 /bin/bash
# 使用所有显卡
docker run -it --runtime=nvidia --name mycontainer -v /home/lab305/XXX:/root/XXX python:3.6 /bin/bash
docker run -it --gpus all --name mycontainer -v /home/lab305/XXX:/root/XXX python:3.6 /bin/bash
# 指定使用哪几张显卡
docker run -it --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=1,2 --name mycontainer -v /home/lab305/XXX:/root/XXX python:3.6 /bin/bash
docker run -it --gpus "device=1,2" --name mycontainer -v /home/lab305/XXX:/root/XXX python:3.6 /bin/bash
配置新的容器后要做的操作
apt-get update
apt-get install build-essential cmake unzip vim
apt install sudo pciutils usbutils cpio lsb-release
apt-get install -y build-essential cmake curl wget libssl-dev ca-certificates git libboost-regex-dev gcc-multilib g++-multilib libgtk2.0-dev pkg-config unzip automake libtool autoconf libcairo2-dev libpango1.0-dev libglib2.0-dev libgtk2.0-dev libswscale-dev libavcodec-dev libavformat-dev libgstreamer1.0-0 gstreamer1.0-plugins-base libusb-1.0-0-dev libopenblas-dev
进入Docker容器
# 使用该命令进入一个已经在运行的容器
docker ps
docker start 容器名称或者容器id
# 完整版
docker exec -it 镜像ID /bin/bash # 针对已运行的容器执行该命令,Ctrl+D不会停止容器的运行
# 最小版(alpine)
docker exec -it 镜像ID sh
docker attach 容器名称或者容器id # 进入容器,Ctrl+D会停止容器的运行
- 使用 docker exec 命令,之后退出容器终端,不会导致容器的停止;
- 使用 docker attach 命令,从这个容器退出,会导致容器的停止。
可以显示图片的容器
# 安装 X11
sudo apt install x11-xserver-utils
host + # 许可所有用户都可访问xserver
# 创建容器时添加以下参数
--net=host -e DISPLAY=$DISPLAY
-v /tmp/.X11-unix/:/tmp/.X11-unix -v $HOME/.Xauthority:/root/.Xauthority
--device /dev/video0 # 摄像头
进入到容器的时候,自动激活环境变量,在 /root/.bashrc
中设置
镜像
# 查看docker镜像
docker images
# 构建一个镜像
docker build -t holiday /usr/local/docker/holiday #Re-build docker container
# 提交一个镜像
docker commit 1a442630f4a9 test/javaweb:0.0
pull 网络镜像
如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像:
docker pull ubuntu
日志
# docker日志查询
docker logs xxxxxxxxxxx
停止与删除
停止
# 杀死所有正在运行的容器
docker kill $(docker ps -a -q)
docker stop 容器名称或者容器id
# 停止所有容器
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
删除
# 删除所有已经停止的容器
docker rm 容器名称或者容器id
docker rm $(docker ps -a -q)
# 删除所有容器
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
# 删除所有未打 dangling 标签的镜像
docker rmi $(docker images -q -f dangling=true)
# 删除所有镜像
docker rmi $(docker images -q)
# 根据 IMAGE ID 来删除
docker rmi xxxxxxxxxxx
# 删除所有none镜像
docker images|grep none|awk '{print $3 }'|xargs docker rmi
删除image报错
如果删除时报错:
(base) qiancj@qiancj-HP-ZBook-G8:~/tools$ docker rmi 61c45d0e9798
Error response from daemon: conflict: unable to delete 61c45d0e9798 (cannot be forced) - image has dependent child images
可查询依赖
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=XXX) # XXX指镜像ID
(base) qiancj@qiancj-HP-ZBook-G8:~/tools$ docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=61c45d0e9798)
[10.78.4.163:8080/tmp_trans/lidar:ubuntu20.04_v3.0 ubuntu20.04:v3.0] sha256:f0b1a8c5a031b19d1c1c7edb47d1d1b55ca549ce29d406aa3df5d91e4210a6bd sha256:6c534e1db1d04a998fa0ab67630bab6a55a2879d07b7fb20a60baa4df1874ad3
[10.78.4.163:8080/tmp_trans/lidar:ubuntu20.04_v3.0 ubuntu20.04:v3.0] sha256:f0b1a8c5a031b19d1c1c7edb47d1d1b55ca549ce29d406aa3df5d91e4210a6bd sha256:6c534e1db1d04a998fa0ab67630bab6a55a2879d07b7fb20a60baa4df1874ad3
[10.78.4.163:8080/tmp_trans/lidar:ubuntu20.04_v2] sha256:6c534e1db1d04a998fa0ab67630bab6a55a2879d07b7fb20a60baa4df1874ad3 sha256:61c45d0e97988ff0cfa876e9ec145445974b9b384fe0a150b057ffc46039b3a0
[compiler:2.0] sha256:0478384869aa6e000a8eda9402a671cfadb46dc76f384a15218ffd7370a82bda sha256:6819470c102372ecbdede48e4bd2ee80e587f7c7a1ee7068c03381e68802eb90
[10.78.4.163:8080/tmp_trans/ros:1.0] sha256:6819470c102372ecbdede48e4bd2ee80e587f7c7a1ee7068c03381e68802eb90
(base) qiancj@qiancj-HP-ZBook-G8:~/tools$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.78.4.163:8080/tmp_trans/lidar ubuntu20.04_v3.0 f0b1a8c5a031 About an hour ago 6.1GB
ubuntu20.04 v3.0 f0b1a8c5a031 About an hour ago 6.1GB
10.78.4.163:8080/tmp_trans/lidar ubuntu20.04_v2 6c534e1db1d0 5 weeks ago 6.1GB
compiler 2.0 0478384869aa 5 weeks ago 3.97GB
10.78.4.163:8080/tmp_trans/ros 1.0 6819470c1023 5 weeks ago 1.53GB
ubuntu 20.04 61c45d0e9798 7 weeks ago 72.8MB
10.78.4.163:8080/lru/faw.lru v1.9.2-focal 5526da13aba5 3 months ago 6.07GB
10.78.4.163:8080/lru/faw.lru v1.8.3-bionic c7f06d4ee561 3 months ago 25.5GB
alpine 3.16.3 bfe296a52501 5 months ago 5.54MB
也就是本地基于原始版本image,开发适配环境后,生成了几个新的image,这几个新的image 是依赖旧的 image的,相当于父与子的关系,删除父亲之前先删除儿子。
根据根据TAG删除容器
docker rm REPOSITORY:TAG
docker rmi ubuntu:20.04
Untagged: ubuntu:20.04
Untagged: ubuntu@sha256:9fa30fcef427e5e88c76bc41ad37b7cc573e1d79cecb23035e413c4be6e476ab
在容器和宿主机之间拷贝数据
docker cp <container-ID>:/usr/local/bin/randy /usr/local/bin/randy
docker cp 主机数据位置 容器名称:/容器/中的位置
docker cp 容器名称:/容器/中的位置 主机数据位置
创建命令别名
# 杀死所有正在运行的容器.
alias dockerkill='docker kill $(docker ps -a -q)'
# 删除所有已经停止的容器.
alias dockercleanc='docker rm $(docker ps -a -q)'
# 删除所有未打标签的镜像.
alias dockercleani='docker rmi $(docker images -q -f dangling=true)'
# 删除所有已经停止的容器和未打标签的镜像.
alias dockerclean='dockercleanc || true && dockercleani'
查看docker运行容器的ip
# 第一次运行
sudo docker run --name myjenkins -p 8088:8080 -p 50000:50000 -d docker.io/jenkinsci/jenkins
# 1. 进入容器内部后
cat /etc/hosts
会显示自己以及(– link)软连接的容器IP
# 2.使用命令
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container-ID>
或
docker inspect <container id>
或
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
# 3. 可以考虑在 ~/.bashrc 中写一个 bash 函数:
function docker_ip() {
sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $1
}
source ~/.bashrc 然后:
$ docker_ip <container-ID>
172.qq.cc.jj
# 4.要获取所有容器名称及其IP地址只需一个命令。
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
如果使用docker-compose命令将是:
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
# 5.显示所有容器IP地址:
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
docker image保存与导入
保存image
docker save image_ID > 导出文件名.tar
导入image
# 将image导入到目标环境的本地设备上
docker load < centos-binary-neutron-server.tar
打标签tag
docker tag 本地容器名称:版本(或容器ID) 目标镜像名称:版本号
docker tag 3be9fa41ec86 10.78.4.163:8080/tmp_trans/lidar:2.0
(base) qiancj@qiancj-HP-ZBook-G8:~/docker_backup$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.78.4.163:8080/tmp_trans/lidar 2.0 3be9fa41ec86 47 hours ago 27.7GB
lidar 2.0 3be9fa41ec86 47 hours ago 27.7GB
原来的lidar镜像,打完标签后,会多一个镜像10.78.4.163:8080/tmp_trans/lidar 2.0
拉取镜像 / 推送镜像
docker pull 镜像名称:版本号
docker pull xxx.xxx.xxx.xxx:8000/randy:0.8
docker push 镜像名称:版本号
Usage: docker push [OPTIONS] NAME[:TAG]
Upload an image to a registry
Aliases:
docker image push, docker push
Options:
-a, --all-tags Push all tags of an image to the repository
--disable-content-trust Skip image signing (default true)
-q, --quiet Suppress verbose output
# 打包提交拉取
docker tag randy:0.8 10.qq.cc.1jj:8000/randy:0.8
docker push xxx.xxx.xxx.xxx:8000/randy:0.8
扩展容器
当我们获取的镜像不能满足需求时,可以在容器内进行扩展,将该容器中的更改后的镜像保存下来。
docker commit -m="randy update" -a="randy" e218edb10161 randy/ubuntu:v3
docker commit -a 作者 -m 提交日志 -t 容器名或ID 仓库名:镜像版本
# 详细解释
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Aliases:
docker container commit, docker commit
Options:
-a, --author string Author (e.g., "John Hannibal Smith
<hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true
扩展的内容可通过导出镜像到文件查看,如下。
导出镜像 / 导入镜像
docker save -o 要保存的文件名 要保存的镜像
docker save -o openvino.tar openvino
Usage: docker save [OPTIONS] IMAGE [IMAGE...]
Save one or more images to a tar archive (streamed to STDOUT by default)
Aliases:
docker image save, docker save
Options:
-o, --output string Write to a file, instead of STDOUT
########
docker load < 文件名 或 docker load --input 文件
Usage: docker load [OPTIONS]
Load an image from a tar archive or STDIN
Aliases:
docker image load, docker load
Options:
-i, --input string Read from tar archive file, instead of STDIN
-q, --quiet Suppress the load outputUsage: docker load [OPTIONS]
Load an image from a tar archive or STDIN
Aliases:
docker image load, docker load
Options:
-i, --input string Read from tar archive file, instead of STDIN
-q, --quiet Suppress the load output
保存后的文件,可以很清晰地看到保存到内容,包括初始镜像文件,还有每次扩展之后的内容
查询image操作历史
(base) qiancj@qiancj-HP-ZBook-G8:~$ docker history --help
Usage: docker history [OPTIONS] IMAGE
Show the history of an image
Aliases:
docker image history, docker history
Options:
--format string Format output using a custom template:
'table': Print output in table format with column headers (default)
'table TEMPLATE': Print output in table format using the given Go template
'json': Print in JSON format
'TEMPLATE': Print output using the given Go template.
Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates
-H, --human Print sizes and dates in human readable format (default true)
--no-trunc Don't truncate output
-q, --quiet Only show image IDs
(base) qiancj@qiancj-HP-ZBook-G8:~$ docker history --format table 10.78.4.163:8080/lru/faw.lru:v1.8.3-bionic
IMAGE CREATED CREATED BY SIZE COMMENT
c7f06d4ee561 2 months ago /bin/sh -c #(nop) WORKDIR /home 0B
<missing> 2 months ago /bin/sh -c #(nop) ENV PATH=/usr/local/x86_s… 0B
<missing> 2 months ago /bin/sh -c #(nop) ENV LD_LIBRARY_PATH=/usr/… 0B
<missing> 2 months ago /bin/sh -c ln -s /usr/local/x86_sdk/sysroot/… 40B
<missing> 2 months ago /bin/sh -c apt-get update && apt-get install… 74.7MB
<missing> 2 months ago /bin/sh -c #(nop) COPY file:0a977882018a9194… 5.25MB
<missing> 2 months ago /bin/sh -c #(nop) COPY dir:fab1f9d5697162031… 22.7GB
<missing> 2 months ago /bin/sh -c #(nop) COPY file:de9f2b043b2d5dc8… 2.89kB
<missing> 21 months ago /bin/sh -c apt-get update && apt-get install… 771MB
<missing> 21 months ago /bin/sh -c apt-get update && apt-get install… 667MB
<missing> 21 months ago /bin/sh -c apt-get update && apt-get install… 35.9MB
<missing> 21 months ago /bin/sh -c apt-get update && apt-get install… 238MB
<missing> 21 months ago /bin/sh -c rosdep init && rosdep update --… 895kB
<missing> 21 months ago /bin/sh -c apt-get update && apt-get install… 175MB
<missing> 21 months ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 21 months ago /bin/sh -c #(nop) ENTRYPOINT ["/ros_entrypo… 0B
<missing> 21 months ago /bin/sh -c #(nop) COPY file:cbbaa0f5d6a27651… 95B
<missing> 21 months ago /bin/sh -c apt-get update && apt-get install… 785MB
<missing> 21 months ago /bin/sh -c #(nop) ENV ROS_DISTRO=melodic 0B
<missing> 21 months ago /bin/sh -c #(nop) ENV LC_ALL=C.UTF-8 0B
<missing> 21 months ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
<missing> 21 months ago /bin/sh -c apt-key adv --keyserver hkp://key… 1.77kB
<missing> 21 months ago /bin/sh -c echo "deb http://packages.ros.org… 51B
<missing> 22 months ago /bin/sh -c apt-get update && apt-get install… 11.1MB
<missing> 22 months ago /bin/sh -c echo 'Etc/UTC' > /etc/timezone &&… 3.19MB
<missing> 22 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 22 months ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 22 months ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 0B
<missing> 22 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B
<missing> 22 months ago /bin/sh -c #(nop) ADD file:e05689b5b0d51a231… 63.1MB
能看出来每一次的操作
导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export 命令。
$ docker export 1e560fca3906 > ubuntu.tar
这样将导出容器快照到本地文件。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1
此外,也可以通过指定 URL 或者某个目录来导入,例如:
$ docker import http://example.com/exampleimage.tgz example/imagerepo
重命名镜像 / 容器
# 重命名镜像,其实是复制一份镜像
docker tag IMAGEID REPOSITORY:TAG
# 重命名容器
docker rename 旧容器名 新容器名
查看docker占用硬盘空间大小
docker system df
du -hs /var/lib/docker/
docker阿里云镜像加速,修改 /etc/docker/daemon.json
# 如果没有 daemon.json 文件,就新建一个
# 加入以下内容, 其中 'y8lulm2r' 是在阿里云官网上个人的id
{
"registry-mirrors": ["https://y8lulm2r.mirror.aliyuncs.com"]
}
# 如果存在 daemon.json 文件
{
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
},
"registry-mirrors": ["https://y8lulm2r.mirror.aliyuncs.com"]
}
# 最后运行
sudo systemctl daemon-reload
sudo systemctl restart docker
Reference
docker images 导入和导出
Docker的使用记录