当前使用的系统版本为centos7.9,docker版本为19,docker容器为centos8.2(更新一下:8还是别用了,用7吧…)
docker安装教程见此处
修改docker镜像源,编辑/etc/docker/daemon.json写入
{
"registry-mirrors":[
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
查看本地镜像,依次为镜像名,版本,id,创建时间,大小
docker images
正常新装的本地仓是空的,拉取镜像,例拉取centos,一般拉取的为最新版本,版本号为latest,需要拉取指定版本在文件名后以冒号指定版本,如docker pull centos:6
docker pull centos
支持的版本在hub.docker.com搜索查看
删除一个镜像,docker中命令选择对象基本通用ID与NAME,如删除刚才pull的centos6镜像,执行docker rmi centos:6
或docker rmi d0957ffdf8a2
效果同等。移除镜像需要先移除镜像创建的容器
与镜像操作相关不指定版本号默认使用latest
docker rmi <ID/名字:版本>
创建并启动一个容器
docker run -itd --name mongodb -e LANG="en_US.UTF-8" --privileged=true -v /sys/fs/cgroup:/sys/fs/cgroup -p 1234:27017 mongod:0.1 /usr/sbin/init
命令解释:
docker run
为docker启动容器命令
-itd
意为分配一个终端,打开输入交换(可以输入命令),在后台运行
--name
指定容器名,可不使用
-e LANG="en_US.UTF-8"
指定容器字符集,避免中文乱码
--privileged=true -v /sys/fs/cgroup:/sys/fs/cgroup
联合使用,避免centos出现systemctl不能使用,以及启动应用出现进程问题,privileged为获取真实权限,-v为挂载宿主机文件。可不使用
-p
用来指定端口映射,可多次指定,示例将主机的1234映射到了容器的27017。可不使用
mongod:0.1 /usr/sbin/init
使用mongod:0.1这个镜像,版本可不声明,不指定版本号默认使用latest。/usr/sbin/init为镜像启动以后执行的命令
docker的run其实类似于执行windows的bat或是linux的sh脚本,是一个执行完指定命令就退出的设定,上面使用的/usr/sbin/init是为了避免centos出现0号进程问题,替换为/bin/bash或者其他循环命令也可以使用,使用的命令如果非一直执行状态会导致容器自动退出
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改时区
查看已有的容器,依次为容器id,使用的镜像(run时写的镜像名这里就显示镜像名,写的ID就显示镜像ID),使用的命令,创建时间,状态,端口,容器名
docker ps -a
连接,停止,启动,移除容器(移除需要先停止)
docker exec -it <容器ID/名字> /bin/bash
docker stop <容器ID/名字>
docker start <容器ID/名字>
docker rm <容器ID/名字>
如docker rm 1640d9cb4374
,docker exec -it mongodb /bin/bash
退出直接在容器内执行exit
文件/文件夹复制
docker cp <要复制的文件> <容器ID/名字>:<复制路径>
如将本机/home/downloads文件夹复制到容器内/home下docker cp /home/downloads mongodb:/home/
反过来就是容器内复制到本机docker cp mongodb:/home/downloads /home
容器保存到本地镜像
docker commit <容器ID/名字> <镜像名:版本号>
例将现有容器名为sss的打包到镜像仓库,镜像名为test版本为1.23docker commit sss test:1.23
此功能额外说明,commit实际类似于svn/git一样的提交,会记录历史版本。例如新pull一个centos镜像,安装nginx后commit一次nginx:1.0,再安装mysql后commit一次mysql:1.0,他们的关系是myslq:1.0->nginx:1.0->centos,此时若想真正删除nginx:1.0则需要先删除mysql1.0
导入和导出
镜像导入导出
docker save [镜像名:版本号] > [导出路径]
docker load < [导入路径]
例如
docker save centos-base > /home/centos-base.tar
docker load < /home/centos-base.tar
save和load成对使用,save针对的是镜像,也就是docker images列表的内容,save会包括历史版本,也就是上面所说的commit关系
容器导入和导出
docker export [容器ID/名字] > [导出路径]
docker import [导入路径]
例如
docker export 204166074aad >/home/centos-base.tar
docker import /home/centos-base.tar
export 和import 成对使用,export 导出是针对容器,只是将现在的容器打包,不包括历史,export 导出时需要注意需要容器正在运行状态,我实际测试容器停止状态下导出的文件导入无法使用,不知道是不是目前的bug
import 导入后名字和版本号都没有,使用tag进行命名
镜像重命名,根据ID对镜像名字和版本号进行修改
docker tag <镜像ID> <名字:版本号>
附:容器内乱码的处理