docker
docker安装
1.安装docker所需的软件
1 | yum install -y yum-utils device-mapper-persistent-data lvm2 |
2.添加docker源
1 | yum-config-manager --add-repo http: //mirrors .aliyun.com /docker-ce/linux/centos/docker-ce .repo |
3.安装docker,这里安装的是docker-ce,版本为17+,不加ce的话安装的是13版本。
1 | yum -y install docker-ce |
4.关闭selinux并启动并测试
1 2 | systemctl start docker docker run hello-world |
使用docker中国官方镜像加速
1 2 3 4 | [root@localhost ~] # vim /etc/docker/daemon.json { "registry-mirrors" : [ "https://registry.docker-cn.com" ] } |
使用阿里镜像加速器:https://cr.console.aliyun.com/cn-hangzhou/mirrors,获取自己的加速器地址
1 2 3 4 5 6 7 8 | sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon .json <<- 'EOF' { "registry-mirrors" : [ "https://r5pbevix.mirror.aliyuncs.com" ] } EOF sudo systemctl daemon-reload sudo systemctl restart docker |
使用刀云加速
1 | curl -sSL https: //get .daocloud.io /daotools/set_mirror .sh | sh -s http: //f1361db2 .m.daocloud.io |
容器的生命周期
1 2 3 4 5 6 7 | 1.检查本地是否存在镜像,如果不存在从远端从库拉取 2.利用镜像启动容器 3.分配一个文件系统,并在只读的镜像层外挂一层可写层 4.从宿主机配置的网桥接口中桥接一个虚拟接口到容器 5.从地址池配置一个ip给容器 6.执行用户指定的命令 7.执行完毕容器终止 |
镜像管理相关命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | docker image ls :列出镜像列表 build:通过dockerfile创建镜像 history :查看镜像历史 inspect:显示一个或多个镜像详细信息 pull:从镜像仓库拉取镜像 push:推送镜像到镜像仓库 rm :移除一个镜像或多个镜像 prune:移除未使用的镜像。没有被标记或被任何容器使用的 tag:给镜像打标签 export :导出容器文件系统到 tar 归档 import :导入容器文件系统,--input save:保存一个或多个镜像到 tar 归档文件,docker save 2f4qfsa4 > xxxx. tar load:加载镜像,docker load < xxxx. tar docker images --no-trunc:查看完整的imagesID -a:查看所有的镜像 -q:只返回 id 列 |
容器运行常用选项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | docker container run -h:设置容器主机名,就是 hostname -i:交互式 -t:分配一个伪终端 -d:在后台运行,itd为常用选项 -e key=value:设置环境变量 -- rm :退出后删除容器 -p:发布容器端口到宿主机 HostPort:containerPort 指定端口映射 ip:hostPort:containerPort 指定ip端口映射 ip::containerPort 指定ip随机端口映射 hostPort:containerPort:tcp 指定协议 -p HostPort:containerPort -p HostPort:containerPort:多次指定端口 -P:容器端口随机映射到宿主机 --name:设置容器名字 --ip:指定容器ip,只能用于自定义网络 --link: --network:指定容器所在网络 -- mount :挂载宿主机分区到容器 --restart:no|always|no-failure容器退出后是否重新启动容器,默认no -m:容器可以使用的最大内存量 --memory-swap:允许交换到磁盘的内存量 --cpus:限制容器可以使用多少cpu资源,1代表1个cpu,1.5代表一个半 --oom- kill -disable:后面不加参数,禁用自动杀掉容器功能 #创建1核512M的centos镜像 docker run -itd --name cent --cpus 1 --memory 512m --memory-swap 600m centos #映射nginx端口 docker run -itd --name nginx -p 88:80 nginx |
容器管理常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | docker ps :查看容器列表,-a查看全部 container ls :列出容器 inspect:显示容器详细信息,-f {{ .State.PID }}可以指定内容 exec :在容器中运行命令,如果进入容器docker exec -it 容器名 sh commit:将容器构建成镜像,-a:指定作者,-m:指定附加信息,-p:创建镜像时暂停容器 cp :拷贝文件,docker cp 本地文件 容器名:/保存路径 ,同样可以把容器中的文件拷贝到本地,类似于 scp 命令 logs:查看容器日志,-f持续输出 port:列出指定容器的端口映射 stats:显示容器资源使用情况 top :显示容器运行的进程 update:更新容器配置,cpu,内存 stop /start/restart :停止/启动/重启容器 rm :删除容器 快速停止所有容器:docker kill `docker ps -a -q` 快速删除所有容器:docker rm `docker ps -a -q` |
数据卷常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | docker volume create:创建一个卷,卷存在于 /var/lib/docker/volumes 下(要写的数据在_data下) inspect:查看卷详细信息 ls :查看卷列表 prune:移除没有被使用过的卷 rm :删除数据卷 #1.创建带有数据卷的容器,volume方式(建议方式) #(如果没有指定卷名,自动创建) docker run -itd --name=nginx- test -- mount src=容器卷名称,dst=容器内路径 nginx #2.将宿主机的目录或文件映射到容器内,bind方式 #(如果如果源文件或目录不存在会报错) #(如果目标为非空目录,目录内容将被隐藏) docker run -itd --name=nginx- test -- mount type =bind,src=宿主机路径,dst=容器内路径 nginx #其他 #docker run --name test1 -d -v /SOURCE:/DEST:rw centos:将本机的/SOURCE目录以读写方式(ro只读)挂载到docker容器的/DEST目录 #docker run --name test2 -d --volumes-from test1 centos:直接使用test1的数据卷 |
自定义网络
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #手动创建动docker网络,不需要考虑ip地址规划,让docker自己解决 docker network create 网络名称 #docker五种网络模式 -net=XXX:与默认的bridge原理一样,网络内具有DNS解析 -net=bridge:默认网络,通过宿主机docker0网桥通信 -net=host:容器与宿主机共用一个ip,除了网络其他都是隔离的 #下面不常用 -net=none:不为容器进行网络配置 -net=container:容器名称/容器ID:与指定容器使用同一个ip,container关键字 #创建容器时指定网络 [root@localhost ~] # docker network create test [root@localhost ~] # docker run -itd --name=db --net=test centos |
dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | docker build -t 仓库/镜像名:标签 -f dockerfile . -t:指定制作的镜像名称 -f:指定dockerfile .:指定路径 --no-cache:不使用缓存 FROM:必须为首行,基于哪个镜像构建 MAINTAINER:作者 RUN:后面接命令,在构建镜像时候要执行的命令 ENV:设定环境变量,格式为ENV <key> <value> ADD:复制文件到哪,源文件应放置和dockerfile同目录下,具有解压 tar 功能 COPY:单纯的复制,没有解压 USER:指定当前用户 WORKDIR:设置当前工作目录 VOLUME:设置卷,通常在创建时候再指定 EXPOSE:设置对外开放的端口 CMD:构建镜像完成之后才会执行的命令,后面接命令,只有最后出现的CMD才生效,同时会被docker run最后传递的命令覆盖 ENTRYPOINT:同CMD,但是不会被覆盖。 |
示例:编译安装nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | FROM centos:7 MAINTAINER www.ctnrs.com RUN yum install -y gcc gcc -c++ make \ openssl-devel pcre-devel gd-devel \ iproute net-tools telnet wget curl && \ yum clean all && \ rm -rf /var/cache/yum/ * RUN wget http: //nginx .org /download/nginx-1 .15.5. tar .gz && \ tar zxf nginx-1.15.5. tar .gz && \ cd nginx-1.15.5 && \ . /configure --prefix= /usr/local/nginx \ --with-http_ssl_module \ --with-http_stub_status_module && \ make -j 4 && make install && \ rm -rf /usr/local/nginx/html/ * && \ echo "ok" >> /usr/local/nginx/html/status .html && \ cd / && rm -rf nginx-1.15.5* && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH: /usr/local/nginx/sbin COPY nginx.conf /usr/local/nginx/conf/nginx .conf WORKDIR /usr/local/nginx EXPOSE 80 CMD [ "nginx" , "-g" , "daemon off;" ] |
私有仓库镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 1.下载仓库镜像registry [root@registry ~] # docker pull registry 2.创建镜像容器,加载数据卷并暴露端口 [root@registry ~] # docker run -itd --mount type=bind,src=/docker,dst=/var/lib/registry --name=registry -p 5000:5000 registry 3.在配置文件中添加信任仓库,并重启docker(仓库这里有个逗号) [root@node ~] # vim /etc/docker/daemon.json { "registry-mirrors" : [ "https://registry.docker-cn.com" ], "insecure-registries" : [ "自己镜像仓库ip:5000" ] } 4.为已有任意镜像打标签,不指定版本为latest [root@node ~] # docker tag nginx 192.168.183.130:5000/nginx:v2 5.推送镜像至仓库 [root@node ~] # docker push 192.168.183.130:5000/nginx:v2 6.列出镜像仓库中的镜像 [root@node ~] # curl http://192.168.183.130:5000/v2/_catalog { "repositories" :[ "nginx" ]} 7.查看指定镜像版本号 [root@node ~] # curl http://192.168.183.130:5000/v2/nginx/tags/list { "name" : "nginx" , "tags" :[ "v2" ]} 8.从私有仓库拉取镜像 [root@node ~] # docker pull 192.168.183.130:5000/nginx:v2 |
Harbor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | harbor镜像仓库的下载地址:https: //github .com /goharbor/harbor/releases docker-compose下载地址:https: //github .com /docker/compose/releases 1.下载压缩包后解压 tar zxvf harbor-offline-installer-v1.5.1.tgz 2.下载docker-compose并给予执行权限 curl -L https: //github .com /docker/compose/releases/download/1 .24.0-rc1 /docker-compose- ` uname -s`-` uname -m` -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose 3.将目录切换至harbor配置文件内 cd harbor 4.编辑harbor.cfg配置文件 hostname =当前主机地址 harbor_admin_password=123456 5.执行准备操作并安装 . /prepare . /install .sh 7.添加镜像仓库为可信任 vi /etc/docker/daemon .json { "insecure-registries" :[ "当前主机地址" ]} systemctl restart docker 6.通过docker-compose启动和关闭harbor docker-compose up -d:在后台启动harbor docker-compose down:停止并删掉harbor相关容器 7.在浏览器中输入本机地址即可打开harbor 8.在往harbor镜像仓库中推送镜像前,需要先给镜像打标签,可在图形化界面查看打标签方法 |
docker-compose:根据docker-compose的yml文件
start:开启
stop:关闭
up -d :建立组件并运行在后台
down:关闭组件并删除
打标签
1 2 3 4 | docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] #例: docker tag ubuntu:latest 127.0.0.1:5000 /ubuntu :latest |
推镜像
1 | docker push 127.0.0.1:5000 /ubuntu :latest |
构建镜像
docker commit [选项] 容器名称 镜像名称
-a="":指定镜像作者
-m="":指定携带信息
-p:提交时暂停容器
1 | [root@localhost ~] # docker commit -a="author" -m="message" -p red testredhat |
遇到的错误
1.docker无法启动,提示selinux问题
1 2 3 | 可以直接关掉selinux,也可以修改下面的内容 [root@master k8s] # vi /etc/sysconfig/docker OPTIONS='--selinux-enabled= false |
2.创建volume卷后,启动容器使用--mount命令,发现没有此命令
1 | 使用docker - v 命令可以查看docker的版本号,有些命令是在新版本中才有的,如果安装docker时,装的是低版本需要卸载后,重新安装17+版本 |
3.oci错误,管道错误
1 | 原因可能是系统中需要的依赖软件版本太低,需要使用yum upgrade -y命令升级依赖软件,不要使用yum update,这个会把系统内核版本也升上去。 |
4.docker自定义网络,容器内无法通信
1 | 在确认自定义网络没有错误的前提下,可能镜像有问题,换个镜像尝试下 |
5.docker登陆harbor时提示https错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 1.在要登录的机器上查找docker启动配置文件 [root@bogon ~] # find / -name docker.service 2.编辑这个文件,添加--insecureregistry=harbor主机ip地址 [Service] Type=notify ExecStart= /usr/bin/dockerd -H fd: // -containerd= /run/containerd/containerd .sock --insecureregistry=192.168.183.131 ExecReload= /bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always 3.保存退出后,重启服务,再登陆就可以了 [root@bogon ~]systemctl daemon-reload [root@bogon ~]systemctl restart docker 4.查看进程可以看到已经加上了刚才的选项 [root@bogon ~] # ps aux | grep docker root 17547 0.1 2.9 479908 54592 ? Ssl 11:11 0:00 /usr/bin/dockerd -H fd: // --containerd= /run/containerd/containerd .sock --insecure-registry=192.168.183.131 root 18154 0.0 0.0 112724 988 pts /0 S+ 11:19 0:00 grep --color=auto docker |
6.更改docker存储文件的位置
1 2 3 4 5 6 7 8 9 10 11 12 | # 先停止docker systemctl stop docker # 编辑docker的启动配置,在启动命令后面加上--graph并指定存储位置 vim /usr/lib/systemd/system/docker .service ExecStart= /usr/bin/dockerd --graph /new-path/docker # 保存退出后,重载systemd配置 systemctl daemon-reload # 启动docker即可 systemctl start docker |
初学linux,每学到一点东西就写一点,如有不对的地方,恳请包涵!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能