Docker&Containerd常用命令
1、docker安装
CentOS中安装
wget -P /etc/yum.repos.d/ https://download.docker.com/linux/centos/docker-ce.repo
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 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镜像(注意docker镜像名不能有大写字母)
cat centos6-base.tar | docker import - centos6-base
docker import centos6-base.tar centos6-base
启动导入的docker镜像,-d表示放到后台运行,--net指定网络类型(bridge|host|none|container:NAME/ID|user_defined_network)
docker run -p 80:80 -p 443:443 -p 2022:22 --hostname CentOS6 --net=bridge -it -d centos6-base /bin/bash
提交一个运行中的容器为镜像(-p :在commit时,将容器暂停)
docker commit -p [CONTAINER ID] [REPOSITORY[:TAG]]
导出镜像到本地
docker save -o /root/centos610_ssh.tar centos:6.10_ssh
导入本地镜像
docker load </root/centos610_ssh.tar
运行镜像添加端口映射和修改网络模式(--name:指定容器名称)
docker run -p 8080:80 --hostname=test --net=bridge --name=[NAMES] -it -d [REPOSITORY[:TAG]] /bin/bash
查看docker镜像
docker images
删除docker镜像
docker image rm -f centos6-base
docker rmi centos:6.10_ssh
搜索docker镜像
docker search centos7
下载docker镜像
docker pull ansible/centos7-ansible
检查网络配置
docker network inspect bridge
拷贝宿主机文件到容器
sudo docker cp my.sh c3646071ecd2:/opt/my.sh
拷贝容器中的文件到宿主机
sudo docker cp c3646071ecd2:/opt/my.sh ./my.sh
3、docker容器操作常用命令
运行一个容器(-d:后台运行容器;--privileged:使container内的root拥有真正的root权限)
docker container run -d --privileged -it [镜像名称] /sbin/init
启动一个退出状态中的docker容器
docker container start [CONTAINER ID]
停止一个运行中的docker容器
docker container stop [CONTAINER ID]
进入启动好的docker容器
docker exec -it [CONTAINER ID] bash
强制删除运行中的docker容器
docker container rm -f [CONTAINER ID]
查看运行中的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]
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) | crictl(kubernetes) |
查看运行的容器 | docker ps | ctr task ls/ctr container ls | crictl ps |
查看镜像 | docker images | ctr image ls | crictl images |
查看容器日志 | docker logs | 无 | crictl logs |
查看容器数据信息 | docker inspect | ctr container info | crictl inspect |
查看容器资源 | docker stats |
ctr task metrics [TASK] |
crictl stats |
启动/关闭已有容器 | docker start/stop |
ctr task kill [TASK] (关闭) |
crictl start/stop |
运行一个新的容器 | docker run |
ctr run -d --log-uri /var/log/xxx.log --net-host [IMAGE] [CONTAINER] |
无(最小单元为pod) |
修改镜像标签 | docker tag | ctr image 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 | 无 |
进入容器内 | docker exec |
ctr task exec --exec-id 0 -t [TASK] sh |
crictl exec |
参考链接:
https://docs.docker.com/reference/
https://www.cnblogs.com/fps2tao/p/10557257.html #修改运行中的docker容器的端口映射
https://www.cnblogs.com/kingsonfu/p/11578073.html #docker容器添加对外映射端口
https://blog.csdn.net/weixin_42498981/article/details/112110445 #docker常用命令
https://www.cnblogs.com/maohai-kdg/p/13474024.html #docker安装
https://hub-stage.docker.com/_/centos?tab=tags&page=2&ordering=last_updated #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使用教程