Docker&Containerd常用命令

1、docker安装
CentOS中安装

# 配置yum源为aliyun
mv CentOS-Base.repo CentOS-Base.repo.bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 使用aliyun的yum源安装docker
vim /etc/yum.repos.d/docker.repo
[docker]
name=Docker Repository
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
enabled=1
# 重新生成yum缓存
yum clean all
yum makecache
# docker compose部署
yum -y install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-compose-plugin-2.27.1-1.el7.x86_64.rpm
yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose

wget --no-check-certificate https://download.docker.com/linux/centos/docker-ce.repo -P /etc/yum.repos.d/
yum list docker-ce --showduplicates | sort -r #查看可以安装的版本
yum install -y docker-ce-18.03.1.ce-1.el7.centos #或使用yum install -y docker-ce命令安装,不推荐
启动docker服务
systemctl start docker.service
Ubuntu中安装
#一键安装

apt-get install -y apt-transport-https ca-certificates curl software-properties-common && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" && apt-get update && sudo apt-get install -y docker-ce

#查看可安装的版本(中间列为docker版本号)
apt-cache madison docker-ce
#安装指定版本
apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
apt-get install docker-ce=5:20.10.9~3-0~ubuntu-bionic
#启动docker服务
systemctl start docker.service

2、docker镜像操作常用命令

# 登陆本地docker仓库
docker login -u[user] -p[password] localhost:8080
# 登出本地docker仓库
docker logout localhost:8080
# 打包系统(--exclude:排除指定目录,两条命令二选一,注意第二条命令后面有个点)
tar -cvpf /tmp/centos6-base.tar --exclude=proc --exclude=sys --exclude=dev --exclude=run --exclude=boot /
tar -cvpf /tmp/system.tar --directory=/ --exclude=proc --exclude=sys --exclude=dev --exclude=run --exclude=boot .
# 导入打包好的系统(注意docker镜像名不能有大写字母)
cat centos6-base.tar | docker import - centos6-base
docker import centos6-base.tar centos6-base
# 启动并进入容器,--rm:退出容器后自动删除容器,一般用于测试容器是否能正常运行
docker run -it --rm --name=alpine alpine:latest /bin/sh
# -p:映射端口,--name:指定容器名称,-d:表示放到后台运行,--net:指定网络类型(bridge|host|none|container:NAME/ID|user_defined_network)
docker run -p 8080:80 -p 443:443 --hostname=test --net=bridge --name=[NAMES] -it -d [REPOSITORY[:TAG]] /bin/bash
# 提交一个运行中的容器为镜像(-p:在commit时,将容器暂停)
docker commit -p [CONTAINER ID] [REPOSITORY[:TAG]]
# 下载docker镜像,加[:TAG]下载指定版本的镜像(centos7-ansible:6.4),不加下载最新的镜像
docker pull ansible/centos7-ansible
# 查看本地的docker镜像
docker images
# 将Docker镜像打包成tar归档文件
docker save -o [image_name].tar [REPOSITORY]:[TAG]
docker save -o /root/image1.tar image1:tag1
# 将多个Docker镜像打包成一个tar归档文件
docker save -o images.tar image1:tag1 image2:tag2 image3:tag3 ...
# 导入本地镜像文件
docker load </root/image1.tar
docker load -i /root/images.tar
# 删除docker镜像
docker image rm -f image1:tag1
# 删除旧标签,此操作仅删除标签,不会删除镜像本身,若还有其他标签指向同一镜像则不会删除镜像数据
docker rmi oldname1:tag1 oldname2:tag2
# 在仓库中搜索docker镜像
docker search centos7
# 检查网络配置
docker network inspect bridge

3、docker容器操作常用命令
运行一个容器(-d:后台运行容器;--privileged:使container内的root拥有真正的root权限)
docker container run -d --privileged -it [镜像名称] /sbin/init
启动一个退出状态中的docker容器
docker container start [CONTAINER ID]/[NAMES]
停止一个运行中的docker容器
docker container stop [CONTAINER ID]/[NAMES]
进入已启动的docker容器
docker exec -it [CONTAINER ID]/[NAMES] sh
强制删除运行中的docker容器
docker container rm -f [CONTAINER ID]/[NAMES]
查看运行中的docker容器
docker ps
查看所有docker容器
docker ps -a
修改容器名称
docker container rename [NAMES] [NEW_NAMES]
容器默认配置文件目录(489a4ec81e86前十二位为容器container id)
cd /var/lib/docker/containers/489a4ec81e869cade7fb1bd887f51f72727606ea2602292f98e10fd2fb80985b/
查看多个容器运行状态
docker stats [NAMES] [NAMES]
拷贝宿主机文件到容器
sudo docker cp my.sh c3646071ecd2:/opt/my.sh
拷贝容器中的文件到宿主机
sudo docker cp c3646071ecd2:/opt/my.sh ./my.sh

4、运行中的docker容器增加端口映射
iptables -A DOCKER ! -i docker0 -o docker0 -p tcp -s 0.0.0.0/0 -d 172.17.0.2 --dport 65510 -j ACCEPT
iptables -t nat -A DOCKER ! -i docker0 -p tcp --dport 65510-j DNAT --to-destination 172.17.0.2:65510
iptables -t nat -A POSTROUTING -p tcp --dport 65510 -j MASQUERADE
iptables -nvL
iptables -t nat -nvL
查看container端口映射(使用iptables开启的端口映射无法查看)
docker container port [CONTAINER] 80/tcp
docker port [CONTAINER] 80/tcp

5、docker的五种网络模式
--net=bridge|host|none|container:container_id/container_name|user_defined_network   #指定容器网络模式;
--net=bridge   #默认模式。为容器创建独立的网络命名空间,分配网卡、IP地址等网络配置,并通过veth接口对,将容器挂载到一个虚拟网桥(默认为docker0)上,类似于VMware的NAT模式;
--net=host    #不为容器创建独立的网络命名空间,容器内看到的网络配置(网卡信息、路由表、Iptables规则等)均与主机上保持一致。注意其他资源还是与主机隔离的,类似于VMware的桥接模式;
--net=none    #为容器创建独立的网络命名空间,但不进行网络配置,即容器内没有创建网卡、IP地址等;
--net=container:container_id/container_name    #新创建的容器共享指定的已存在容器的网络命名空间,两个容器内的网络配置共享,但其他资源(进程空间、文件系统等)还是相互隔离的;
--net=user_defined_network    #用户自行用network相关命令创建一个网络,同一个网络内的容器彼此可见,可以采用更多类型的网络插件。

6、修改容器配置文件
docker container stop fb7c338a6c93
systemctl stop docker.service
cd /var/lib/docker/containers/fb7c338a6c934359aff9936e32ebb69bf46dd7f64e1e7892a7340367850e7e0b
vim hostconfig.json
vim config.v2.json
systemctl start docker.service
docker ps -a
docker container start fb7c338a6c93
注意:
       修改容器配置文件前必需先停容器再停docker服务再修改容器配置文件,更改端口映射和网络模式,hostconfig.json文件和config.v2.json文件都需要修改。启动docker服务后使用docker ps -a命令查看不到修改完配置文件的容器时,请检查配置文件是否修改正确

7、创建容器启动脚本
[root@test /]# vim /bin/start.sh   #进入容器里创建start.sh脚本

#!/bin/bash

/etc/init.d/sshd start
/bin/bash    #保留一个终端,防止容器自动退出

[root@test /]# chmod +x /bin/start.sh

8、docker容器使用systemctl命令报错
root@nginx:~# systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
使用以下命令运行容器

docker run --cpus 2 -m 2g -p 22:22 -p 5000:5000 --add-host=nginx:192.168.1.2 --add-host=mysql:192.168.1.3 -v /sites:/var/www/html --restart=always --privileged --name flask --hostname centos8 --net=bridge -it -d  centos8:1.0.0 /usr/sbin/init

参数说明:
     --cpus           指定可以使用cpu的核数
     -m                 指定可以使用的内存大小
     -p                  指定映射端口
     --add-host     添加hosts解析
     -v                  映射主机目录到容器目录
     --restart        重启主机自动启动容器
     --privileged   使容器有root权限需要和/usr/sbin/init配合使用
     --name         指定容器名称
     --hostname  指定容器主机名
     --net             指定网络类型

9、docker、ctr、crictl命令对比

命令 docker ctr(containerd),在k8s集群中使用ctr需要加上  -n k8s.io crictl(kubernetes)
查看运行的容器 docker ps ctr task ls/ctr container ls crictl ps
查看镜像 docker images ctr image ls
# 在k8s集群中使用ctr命令查看镜像
ctr -n k8s.io image ls
crictl images
查看容器日志 docker logs crictl logs
查看容器数据信息 docker inspect ctr container info [CONTAINER] crictl inspect
查看容器资源 docker stats ctr task metrics [TASK]
(获取容器的内存、CPU和PID的限额与使用量)
crictl stats
启动/关闭已有容器 docker start/stop ctr task kill [TASK]     (关闭)
ctr task rm [TASK]     (删除)
ctr task start --log-uri /var/log/xxx.log -d [CONTAINER]    (启动)
crictl start/stop
运行一个新的容器 docker run ctr run -d --rm --net-host --mount type=bind,src=[HOST_PATH],dst=[CONTAINER_PATH],options=rbind:rw --log-uri /var/log/xxx.log [IMAGE] [CONTAINER_NAME]
-d后台运行,--mount指定宿主机目录挂载到容器目录,--log-uri指定容器日志文件路径(需要先创建xxx.log文件)
无(最小单元为pod)
修改镜像标签 docker tag ctr image tag
# 在k8s集群中使用ctr修改镜像标签
ctr -n k8s.io images tag [源TAG] [修改后TAG]
创建一个新的容器 docker create ctr container create crictl create
导入镜像 docker load ctr image import
导出镜像 docker save ctr image export <导出文件名> <镜像名>
删除容器 docker rm ctr container rm crictl rm
删除镜像 docker rmi ctr image rm crictl rmi
拉取镜像 docker pull ctr image pull ctictl pull
推送镜像 docker push ctr image push
# 在k8s集群中使用ctr命令推送镜像,-k:忽略证书
ctr -n k8s.io image push -k [IMAGE]
进入容器内 docker exec

ctr task exec --exec-id 0 -t [TASK] sh
(必须要指定--exec-id,这个id可以随便写,只要唯一就行)

crictl exec

10、nerdctl工具操作Containerd

# k8s默认使用k8s.io,而nerdctl默认使用default namspace。如果需要查看k8s相关镜像需要加上"-n k8s.io"来指定
# 查看镜像
nerdctl -n k8s.io image ls
# 导出镜像
nerdctl -n k8s.io image save registry.images.net/nginx:latest -o nginx_latest.tar
# 导入镜像
nerdctl -n k8s.io image load -i nginx_latest.tar
# 修改镜像tag
nerdctl -n k8s.io tag registry.images.net/nginx:latest registry.cloud.net/nginx:latest
# 上传镜像到仓库
nerdctl -n k8s.io image push registry.cloud.net/nginx:latest
# 查看k8s集群中pod的CONTAINER ID
nerdctl -n k8s.io ps
# 进入pod
nerdctl -n k8s.io exec -it [CONTAINER ID] -- sh
# 登陆仓库
nerdctl login -u admin -p passw0rd registry.cloud.net
# 登出仓库
nerdctl logout registry.cloud.net

11、使用dockerfile文件构建镜像

# 使用本地镜像作为基础镜像,先把镜像pull到本地,然后再使用dockfile文件打包镜像,本地没有则从镜像源pull
# [root@localhost ~]# docker pull alpine
# [root@localhost ~]# docker images
# REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
# alpine              latest              aded1e1a5b37        3 weeks ago         7.83MB
FROM alpine:latest

# 设置工作目录
WORKDIR /app

# 定义WEBSERVER变量,如果没有指定,默认为nginx,该变量可以在构建Docker镜像时通过--build-arg选项传递给Docker build
# docker build --build-arg WEBSERVER=apache -t registry.docker.net/apache:1.0 .
#ARG WEBSERVER=nginx

# 在Dockerfile中使用Shell命令实现条件逻辑,每个RUN命令都会在Docker镜像中创建一个新层,这会增加镜像的大小。可以尝试使用&&连接符组合命令
#RUN if [ "$WEBSERVER" = "nginx" ]; then \
#       apk update && apk install -y nginx; \
#   elif [ "$WEBSERVER" = "apache" ]; then \
#       apt-get update && apt-get install -y apache2; \
#   else \
#       echo "No valid webserver specified"; \
#   fi

# --no-cache-dir: 这个选项告诉pip不要缓存安装包,以减少镜像的体积。在Docker中,由于每个命令都会生成一个新的镜像层,如果不使用这个选项,pip会将下载的包缓存到镜像中,从而增加镜像的大小
#COPY requirements.txt .
#RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
#    apk add --no-cache python3 py3-pip && \
#    pip install --no-cache-dir -r requirements.txt \
#    -i https://mirrors.aliyun.com/pypi/simple/

# 安装所需的Python包
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
    && apk add --no-cache curl python3 py3-pip \
    && pip install --no-cache-dir --break-system-packages \
    Flask \
    gevent \
    gevent-websocket \
    Flask-SocketIO \
flask-sqlalchemy \
paramiko \ requests \ -i https:
//mirrors.aliyun.com/pypi/simple/ # 暴露Flask默认端口(按需修改) EXPOSE 5000 # 建议在运行时挂载代码,或在此处添加代码复制 COPY flask /app/flask # 设置默认启动命令(根据实际情况修改) CMD ["python", "./flask/flaskrun.py"] # -f dockerfile: 这个选项指定要使用的Dockerfile的文件名。默认情况下,Docker会查找名为Dockerfile的文件,但如果你将其命名为其他文件名(如 dockerfile),就需要使用此选项来指定。 # -t flask:1.0: 这个选项用于为创建的镜像指定一个名称和标签。在这里,镜像的名称是 flask,标签是 1.0,最终形成的完整镜像名为 flask:1.0。 # .: 这个点表示上下文目录。Docker客户端会将当前目录中的文件(及其子目录)作为构建上下文,Dockerfile 中的指令能使用这些文件。 # 使用dockerfile文件构建镜像命令 # [root@localhost ~]# docker build -t registry.docker.net/flask:1.0 -f dockerfile . # [root@localhost ~]# docker images # REPOSITORY TAG IMAGE ID CREATED SIZE # registry.docker.net/flask 1.0 1bad3fad52ad 24 minutes ago 114MB # alpine latest aded1e1a5b37 3 weeks ago 7.83MB # 启动docker # [root@localhost ~]# docker run -p 5000:5000 --name flask -d registry.docker.net/flask:1.0 # [root@localhost ~]# docker ps -a # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # 97d8bb75d612 registry.docker.net/flask:1.0 "python ./flask/flas…" 4 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp flask # 注意:使用docker save导出的镜像必需用docker load导入,否则导入的镜像将不可用 # 容器健康状态检查 HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD curl -f http://localhost:5000 || exit 1 # 每隔30秒执行一次curl -f http://localhost:5000,容器启动10秒后开始检测,如果失败超过3次且超时在5秒内,该容器被判定为不健康 # CMD curl -f http://localhost:5000:执行的命令,如果命令返回状态码0,表示健康;非0表示不健康 # --interval:两次检测间隔时间,默认30秒 # --timeout:每次检测超时时间,超过认为失败,默认30秒 # --start-period:容器启动后多长时间开始健康检测,默认0 # --retries:失败多少次后标记为不健康,默认3 # 注意:在Dockerfile中只能有一个HEALTHCHECK指令。如果您列出多个,则只有最后一个HEALTHCHECK将生效

12、 阿里云docker pull镜像报错

[root@localhost ~]# docker pull crpi-g05smmlotxjkdb8e.cn-hangzhou.personal.cr.aliyuncs.com/xxxxxx/alpine
Using default tag: latest
Error: remote trust data does not exist for crpi-g05smmlotxjkdb8e.cn-hangzhou.personal.cr.aliyuncs.com/xxxxxx/alpine: crpi-g05smmlotxjkdb8e.cn-hangzhou.personal.cr.aliyuncs.com does not have trust data for crpi-g05smmlotxjkdb8e.cn-hangzhou.personal.cr.aliyuncs.com/xxxxxx/alpine
# 解决方法,设置环境变量来禁用内容信任,这样运行的Docker pull命令将不会进行内容信任验证
# 临时允许未签名的镜像
[root@localhost ~]# export DOCKER_CONTENT_TRUST=false
# 永久设置
[root@localhost ~]# echo "export DOCKER_CONTENT_TRUST=false" >>.bashrc
[root@localhost ~]# source ~/.bashrc
# 允许使用未签名的镜像源
[root@localhost ~]# echo '{"insecure-registries": ["your-registry-address:port"]}' >/etc/docker/daemon.json
# 启动Docker守护进程时添加--insecure-registry
[root@localhost ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry your-registry-address:port

参考链接:
      https://docs.docker.com/reference/
      https://www.cnblogs.com/fps2tao/p/10557257.html         # 修改运行中的docker容器的端口映射
      https://www.cnblogs.com/kingsonfu/p/11578073.html      # docker容器添加对外映射端口
      https://www.cnblogs.com/maohai-kdg/p/13474024.html       # docker安装
      https://hub-stage.docker.com/_/centos/tags         # CentOS docker镜像
      https://www.cnblogs.com/zoujiaojiao/p/17021724.html        # nsenter命令进入容器网络命名空间
      https://blog.csdn.net/qq_35745940/article/details/119900634       # nsenter命令进入容器网络命名空间
      https://www.cnblogs.com/lifuqiang/articles/16815740.html           #  安装containerd
      https://www.akiraka.net/kubernetes/1139.html#18         # docker、ctr、crictl命令对比
      https://www.cnblogs.com/hukey/p/17282408.html         # ctr命令使用说明
      https://icloudnative.io/posts/getting-started-with-containerd/      # Containerd使用教程
      https://github.com/containerd/nerdctl       # nerdctl工具下载
      https://www.cnblogs.com/kissit/p/18366388       # Containerd高级命令行工具nerdctl安装及使用
      https://www.cnblogs.com/chen2ha/p/17086900.html     # containerd镜像构建工具nerdctl和buildkit
      https://github.com/moby/buildkit       # buildctl和builkitd下载
      https://www.jianshu.com/p/835179171609       # 使用buildkit构建镜像
      https://github.com/tech-shrimp/docker_image_pusher       # 从github推送镜像到aliyun个人仓库
      https://docker.aityp.com/     # 渡渡鸟镜像同步站
      https://www.rclogs.com/2024/06/docker-registry-build      # 自建Docker镜像/源加速的方法
      https://blog.csdn.net/u010702254/article/details/146243390     # x86与Arm多架构Docker镜像打包
      https://github.com/xfan1024/qemu-user-static     # 在x86架构上运行其它架构的docker

posted @ 2021-05-26 16:05  風£飛  阅读(395)  评论(0)    收藏  举报