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 |
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
浙公网安备 33010602011771号