Docker基操_1.操作汇总
docker安装
yum安装
[root@wg ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@wg ~]# yum makecache fast // 更新软件包索引
[root@wg ~]# yum -y install docker-ce docker-ce-cli containerd.io
[root@wg ~]# yum list docker --showduplicates | sort -r // 显示具体版本,通过sort 进行排序
[root@wg ~]# yum search --showduplicates docker
[root@wg ~]# yum downgrade docker // 降级指定版本后面写查询到的软件包全名
[root@wg ~]# docker version
[root@wg ~]# docker info
[root@wg ~]# docker command --help
[root@wg ~]# systemctl start docker
[root@wg ~]# systemctl enable docker
[root@wg ~]# docker images
[root@wg ~]# yum remove docker-ce docker-ce-cli containerd.io
[root@wg ~]# rm -rf /var/lib/docker //默认安装路径
变更存储路径
docker info |grep 'Docker Root Dir'
vim /etc/docker/daemon.json
{
"graph": "/home/server/docker"
}
- 迁移原有文件到新目录
- 重启docker和容器
卸载
[root@wg ~]# rpm -qa | grep docker
[root@wg ~]# yum list installed | grep docker
[root@wg ~]# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-engine
官方通用安装
[root@wg ~]# curl -fsSL get.docker.com -o get-docker.sh
[root@wg ~]# sudo sh get-docker.sh --mirror Aliyun
[root@wg ~]# systemctl start docker
[root@wg ~]# sudo groupadd docker
[root@wg ~]# usermod -aG docker $USER
[root@wg ~]# systemctl restart docker
portainer部署
[root@wg ~]# docker run -d -p 8001:8000 -p 9001:9000 --name=portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock --privileged=true \
-v /data/portainer:/data portainer/portainer-ce:latest
¤ 镜像已经跟过去的有变化了,portainer/portainer-ce
¤ /var/run/docker.sock 这个路径暂时先不变,没有拷贝容器内文件,不自己定义路径了,避免无法在前端页面找到portainer
¤ 有汉化版,暂时不理会了
镜像&容器操作
镜像操作
- https://www.docker.com/ 账号密码登录,找到官方镜像,选择想要的版本
[root@wg ~]# docker login -u xiaorenwudashuju // 可以不登录,登录是为了找自己上传的镜像
[root@wg ~]# docker pull kibana:7.14.0 // 下载相应版本号镜像
- 拉取镜像真实路径: docker pull mysql == docker pull docker.io/library/mysql:latest
[root@wg ~]# docker search 镜像名 // 搜索镜像
[root@wg ~]# docker search --filter=STARS=30 镜像名 // 搜stars大于30的
[root@wg ~]# docker images -a // 列出所有镜像
[root@wg ~]# docker images -q // 只显示镜像Id
[root@wg ~]# docker rmi $(docker images -aq) // 拉出所有镜像id,全删
[root@wg ~]# docker diff // 查看镜像存储层变化
[root@wg ~]# docker history 容器id // 查看dockerfile构建信息
容器操作
- 启动容器有两种方式,一种是基于镜像新建一个容器并启动, 另外一个是将在终止状态(stopped)的容器重新启动。
[root@wg ~]# docker run -d -it centos bash // 启动容器
[root@wg ~]# docker run --restart=always // 无论退出状态如何,都重启容器
[root@wg ~]# docker run -d centos:7 /bin/bash -c "while true;do echo smitty;sleep 1;done"
[root@wg ~]# docker container update --restart=always 容器名 // 已启动容器设置直接重启
[root@wg ~]# docker ps // 查看运行中容器
[root@wg ~]# docker ps -a // 查看历史启动容器
[root@wg ~]# docker ps -n=2 // 查询最新创建的两个容器
[root@wg ~]# docker rm $(docker ps -aq) // 拉出所有容器id,全删
[root@wg ~]# docker start 容器id
[root@wg ~]# docker stop 容器id
[root@wg ~]# docker restart 容器id
[root@wg ~]# docker kill 容器id
[root@wg ~]# docker exec -it 容器id bash // 开启一个新终端,进入容器(常用)
[root@wg ~]# docker attach 容器id // 进在运行容器,不开新进程(退出后不能再进)
[root@wg ~]# exit // 退出容器 等同于 ctrl+p+q
- 1.不写/bin/bash的话会报错,无法登录
- 2.exec登入容器,用id和名称都可以:
| 2.1 exec是新开启一个进程;attach是进入旧进程
| 2.2 exec需要-it /bin/bash;attach不需要
| 2.3 exec登出后容器还运行;attach登出后容器不运行
信息查看
[root@wg ~]# docker version // 镜像外查看,版本信息
[root@wg ~]# docker info // 显示系统信息
[root@wg ~]# docker command --help // 命令帮助
[root@wg ~]# docker images // 查看镜像
[root@wg ~]# docker ps // 查看容器
[root@wg ~]# docker ps -l // 查询最后一次创建的容器
[root@wg ~]# docker logs -f 容器id // 实时监听日志 -t打印时间戳
[root@wg ~]# docker logs -tf --tail 10 容器id // 查看日志 最后10条
[root@wg ~]# docker stats // 查看cpu状态
[root@wg ~]# docker top 容器id // 查看容器内进程信息
[root@wg ~]# docker port 容器id // 查看端口映射
[root@wg ~]# docker inspect 容器id // 查看容器元数据,底层信息
[root@wg ~]# docker inspect container名称或id/network名称或id/volume名称或id
[root@wg ~]# docker container/network/volume ls
[root@wg ~]# docker inspect -f '{{.ID}}' kibana
生成备份
[root@wg ~]# docker commit 容器id|name -m "描述信息" -a "作者" 镜像名:版本 // 将容器提交成镜像
[root@wg ~]# docker save -o nginx.tar nginx:latest
[root@wg ~]# docker save > nginx.tar nginx:latest
[root@wg ~]# docker load -i nginx.tar
[root@wg ~]# docker load < nginx.tar
[root@wg ~]# docker export -o nginx-test.tar nginx-test
[root@wg ~]# docker export nginx:latest > /home/export.tar
[root@wg ~]# docker import nginx-test.tar nginx:imp
[root@wg ~]# cat nginx-test.tar | docker import - nginx:imp
- save和export的区别:
| save会保存该镜像的所有历史记录;export不会保留历史记录,即没有commit历史
| save保存的是镜像(image);export保存的是容器(container)
| load用来载入镜像包,import用来载入容器包,但两者都会恢复为镜像;
| load不能对载入的镜像重命名;import可以为镜像指定新名称。
[root@wg ~]# docker login -u xiaorenwudashuju // 上传下载
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@wg ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql test1 e74a7965445b 2 hours ago 448MB
[root@wg ~]# docker tag e74a7965445b xiaorenwudashuju/mysql:test1
[root@wg ~]# docker push xiaorenwudashuju/mysql:test1
[root@wg ~]# docker pull xiaorenwudashuju/mysql:test1
卷&路径操作
数据拷贝
[root@wg ~]# docker cp 容器id:容器内路径 本地路径 // 从容器拷贝内容,关闭了容器也可以
[root@wg ~]# docker cp 本地路径 容器id:容器内路径 // 从本地拷贝内容到容器
卷操作
[root@wg ~]# docker run -it -v /home/test:/home centos /bin/bash
[root@wg ~]# docker inspect 容器id //查看挂载是否成功 命令查看的是容器元数据
------------------------------------
"Mounts": [
{
"Type": "bind",
"Source": "/opt/docker1",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
------------------------------------
[root@wg ~]# docker volume create todo-db // 添加卷
[root@wg ~]# docker run -v 容器内路径 // 匿名挂载
[root@wg ~]# docker run -v 卷名:容器内路径 // 具名挂载
# 使用别名方式能保留容器内路径原始内容,前提是别名对应路径不能存在内容
# 别名路径不存在则自动创建,存在则直接使用
[root@wg ~]# docker run -v 宿主路径:容器内路径 // 指定路径挂载(这是bind mount)
# 这种方式会将容器内原始路径内容清空,始终以宿主机为主
[root@wg ~]# docker run -v 卷名:容器内路径:ro // 具名,改变读写权限 只读 read only
[root@wg ~]# docker run -it --name d03 --volumes-from d01 镜像
网络命令
查询命令
[root@wg ~]# docker run -d -P --name tomcat01 tomcat ifconfig //报错
[root@wg ~]# docker run -id -P --name tomcat02 tomcat
root@id:/usr/local/tomcat# apt update && apt install -y iproute2 net-tools
root@id:/usr/local/tomcat# ip addr
root@id:/usr/local/tomcat# apt -y install iputils-ping
root@id:/usr/local/tomcat# ping www.baidu.com
root@id:/usr/local/tomcat# C-p-q
[root@wg ~]# docker exec -it tomcat01 ifconfig
[root@wg ~]# docker inspect 容器id | grep IPAddress // 不进入容器查看
[root@wg ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
db75e3ed6573 bridge bridge local // 为每个容器分配和设置ip,并将容器连接到docker0
da929a3925d2 host host local // 容器不会虚拟网卡,使用宿主机ip和端口
f1b6f9435c59 none null local // 该模式关闭了容器的网络功能
网络操作
[root@wg ~]# docker network create --driver bridge --subnet 192.168.10.0/24 --gateway 192.168.10.1 nginx-network
# --driver bridge 表示使用桥接模式
# --subnet 192.168.10.0/24 表示子网ip 可以分配 192.168.10.2 到 192.168.10.255
# gateway 192.168.1.0 表示网关
# mynet 表示网络名
[root@wg ~]# docker network ls //查看所有网络
[root@wg ~]# docker network inspect nginx-network //查看网络详细信息
[root@wg ~]# docker run -d --name tomcat1 --network mynet tomcat
[root@wg ~]# docker run -d --name tomcat2 -e TZ="Asia/Beijing" --network mynet --ip 192.168.10.120 tomcat
[root@wg ~]# docker network rm 网卡名/id //删除网卡
# 通过容器名通信,必须是自定义网络,而不能用默认网络
[root@wg ~]# docker network connect 网络名 容器id(name) //把容器连接到网络
其他命令
磁盘清理
[root@wg ~]# docker system df // 查看Docker的磁盘使用情况
[root@wg ~]# docker system prune // 清理磁盘,删除关闭的容器、无用的卷和网络,以及dangling镜像(即无tag的镜像)
[root@wg ~]# docker system prune -a // 还可以删除没有使用的镜像
[root@wg ~]# truncate -s 0 /var/lib/docker/containers/.../*-json.log // 清除日志
- 配置docker-compose配置文件可以限制日志文件的大小
修改时区
- 容器内时间和系统时间差数小时,是因为宿主机和容器时区不一致导致。
方法1-把本机时区复制到宿主机即可:
docker cp /etc/localtime a9c27487faf4:/etc/localtime
然后重启容器。
-----------------------
方法2-容器内修改时区
docker exec -it <容器名> /bin/bash
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
docker restart <容器名>
-----------------------
方法3-在创建Dockerfile时加上
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
Dockerfile
build指令
FROM # 基础镜像,一切从这里开始
RUN # 镜像构建的时候需要运行的命令
ADD # 拷贝文件;能将上传的压缩文件解压,能指定路径;跟网址能下载,可指定路径
COPY # 类似ADD 将我们的文件拷贝到镜像中;能上传文件,可指定路径
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录,仅仅是描述
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令;可以存在多个,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 dockerfile 这个时候就会运行 onbuild 的指令 触发指令
ENV # 构建的时候设置环境变量
基本命令
[root@wg ~]# docker build -t mycentos:01 --no-cache //不使用缓存
[root@wg ~]# docker run mycentos:01 ls /data
构建示例
FROM centos:centos7.9.2009 // 从centos镜像开始
MAINTAINER wg<m18610609135@163.com> // 作者及邮箱
ENV MYPATH /usr/local // 构建环境,mypath和/usr/local是键值对
WORKDIR $MYPATH // 指定默认目录 可以是不存在路径
RUN yum -y install vim // 执行下载任务
RUN yum -y install net-tools // ipconfig命令在这里边
EXPOSE 80 // 暴露80端口;这里仅仅是声明;通过-p指定
ADD https://.... . // 下载,但不能解压
ADD mysql.5.7.35.tar.gz // 拷贝进去并解压,可以指定解压目录
WORKDIR mysql // 可以用相对路径,相对的是/usr/local
COPY my.cnf // 把文件拷贝进去
CMD ["sh", "-c", "ls $MYPATH"]
CMD echo $MYPATH // echo是在脚本执行过程中输出的
CMD ehco "---end---"
CMD /bin/bash
docker compose
构建流程
- 1.构建docker-compose.yml文件 // 这个文件是配置文件,也是一个项目
- 2.docker-compose up // 启动docker-compose
- 3.docker-compose down // 关闭服务
基本格式
version: "3.8"
services:
tomcat:
image: tomcat:latest
ports:
- 8080:8080
- 8081:8081
mysql:
image: mysql:5.7.35
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD: "root"
- "MYSQL_ROOT_PASSWORD=root"
volumes:
- /root/mysqldata1:/var/lib/mysql #使用绝对路径要先创建
volumes:
mysqlData: #声明数据卷别名
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律