docker
docker常用命令
容器生命周期管理
run - 创建并启动一个新的容器。
start/stop/restart - 这些命令主要用于启动、停止和重启容器。
kill - 立即终止一个或多个正在运行的容器
rm - 于删除一个或多个已经停止的容器。
pause/unpause - 暂停和恢复容器中的所有进程。
create - 创建一个新的容器,但不会启动它。
exec - 在运行中的容器内执行一个新的命令。
rename - 重命名容器。
容器操作
ps - 列出 Docker 容器
inspect - 获取 Docker 对象(容器、镜像、卷、网络等)的详细信息。
top - 显示指定容器中的正在运行的进程。
attach - 允许用户附加到正在运行的容器并与其交互。
events - 获取 Docker 守护进程生成的事件。
logs - 获取和查看容器的日志输出。
wait - 允许用户等待容器停止并获取其退出代码。
export - 将容器的文件系统导出为 tar 归档文件。
port - 显示容器的端口映射信息。
stats - 实时显示 Docker 容器的资源使用情况。
容器的root文件系统(rootfs)命令
commit - 允许用户将容器的当前状态保存为新的 Docker 镜像。
cp - 用于在容器和宿主机之间复制文件或目录。
diff - 显示 Docker 容器文件系统的变更。
镜像仓库
login/logout - 管理 Docker 客户端与 Docker 注册表的身份验证。
pull - 从 Docker 注册表(例如 Docker Hub)中拉取(下载)镜像到本地。
push - 将本地构建的 Docker 镜像推送(上传)到 Docker 注册表(如 Docker Hub 或私有注册表)。
search - 用于在 Docker Hub 或其他注册表中搜索镜像。
本地镜像管理
images - 列出本地的 Docker 镜像。
rmi - 删除不再需要的镜像。
tag - 创建本地镜像的别名(tag)。
build - 从 Dockerfile 构建 Docker 镜像。
history - 查看指定镜像的历史层信息。
save - 将一个或多个 Docker 镜像保存到一个 tar 归档文件中。
load - 从由 docker save 命令生成的 tar 文件中加载 Docker 镜像。
import - 从一个 tar 文件或 URL 导入容器快照,从而创建一个新的 Docker 镜像。
info|version
info - 显示 Docker 的系统级信息,包括当前的镜像和容器数量。
version - 显示 Docker 客户端和服务端的版本信息。
Docker Compose
docker compose run - 启动一个新容器并运行一个特定的应用程序。
docker compose rm - 启动一个新容器并删除一个特定的应用程序。
docker compose ps - 从 docker compose 检查 docker 容器状态。
docker compose build - 构建 docker compose 文件。
docker compose up - 运行 docker compose 文件。
docker compose ls - 列出 docker compose 服务。
docker compose start - 启动 docker compose 文件创建的容器。
docker compose restart - 重启 docker compose 文件创建的容器。
网络命令
docker network ls -列出所有网络。
docker network create <network> -创建一个新的网络。
docker network rm <network> -删除指定的网络。
docker network connect <network> <container> -连接容器到网络。
docker network disconnect <network> <container> -断开容器与网络的连接。
卷命令
docker volume ls -列出所有卷。
docker volume create <volume> -创建一个新的卷。
docker volume rm <volume> -删除指定的卷。
docker volume inspect <volume> -显示卷的详细信息。
harbor仓库测试
服务端
修改镜像加速文件 放行服务端
vi /etc/docker/daemon.json
{
"registry-mirrors": [
"https://4a1qkm2x.mirror.aliyuncs.com",
"https://docker.1panel.live",
"https://hub.rat.dev"
],
"insecure-registries":["192.32.62.150:5000"] ##添加放行服务端ip+端口
}
harbor部署:docker部署 – cuo的小窝
这里以mysql做测试,先给mysql镜像打标签
命令:
docker tag +镜像名称/ID +ip:端口/harbor项目/项目目录镜像名称:版本
演示:
docker tag mysql 192.32.62.150:5000/library/mysql:latest
命令行登录harbor
docker login -u +用户名 -p +密码 +ip:端口
上传
docker push +ip:端口 +目录
服务端
更改镜像加速器 ,一样道理 放行客户端
登录harbor
pull其镜像
run一个
命令诠释
镜像命令
命令:docker search 镜像名 # 搜索镜像
命令:docker images # 查看所有本地的主机上的镜像
命令:docker pull 镜像名 [:tag]# 下载镜像,默认是下载最新版 latest 。
# 删除镜像 -f就是全部删除,后面的条件是根据什么来删除,这里是根据容器的id进行删除
docker rmi -f 容器id
# 删除多个镜像
docker rmi -f 容器id 容器id 容器id
# 删除所有的镜像
docker rmi -f $(docker images -aq)
参数解释
REPOSITORY :镜像的仓库源
TAG :镜像的标签
IMAGE ID :镜像的ID
CERATED :镜像的创建时间
SIZE :镜像的大小
docker images [可选项]
-a , --all # 列出所有镜像
-q , --quiet # 只显示镜像的ID
容器命令
docker run 参数 image
参数说明:
--name="Name" : 容器名字 ,tomcat01、tomcat02,用来区分容器
-d :后台方式运行
-it:使用交互方式运行,进入容器查看内容
-p :指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用方式)
-p 容器端口
容器端口
-p: 随机指定端口
命令:docker run -it centos /bin/bash #启动容器并进入
命令: ls # 查看容器内的centos,基础版本,很多命令都是不完善的
命令:docker ps [可选参数] # 列出当前正在运行的程序
-a #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器
-p #只显示容器的编号
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) # 删除所有的容器
docker ps -a -q|xargs docker rm # 删除所有的容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止正在运行的容器
docker kill 容器id # 强制停止当前正在运行的容器
其他命令docker run -d 镜像名
容器后台启动
docker stats [容器id] 查看系统CPU状态
docker logs -tf –tail 容器 查看日志
-tf #显示日志
--tail number #要显示日志条数
例如:docker logs -tf --tail 10 容器id
正常 这里没有日志
docker top 容器id 查看容器进程
docker inspect 容器id 查看元数据 (常用来看ip)
进入正在运行的容器
docker exec -it 容器id bashShell
docker attach 容器id
docker exec
: 进入容器后开启一个新的终端,可以在里面操作(常用)docker attach
:进入容器正在执行的终端,不会启动新的进程
docker数据卷
docker run -it -v 主机目录 : 容器内目录 使用命令挂载数据卷
容器内数据将和主机同步
以centos镜像为例 在 centos容器内创建文件 然后同步至主机/home下
查看卷挂载目录
具名挂载和匿名挂载
# 如何锁定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
匿名挂载
通过【-v 容器内路径
】 而没有指定卷名或者指定主机路径的挂载方式
具名挂载
通过【-v 卷名:容器内路径
】 而没有指定主机路径的挂载方式
可看出来指定了容器目录 ,而主机目录默认存在/var/lib/dockervolumes下
扩展
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一旦设置了容器权限,容器对我们挂载出咯哎的内容就会有限定了
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的。
dockerfile
Dockerfile的介绍
Dockerfile是用来构建dokcer镜像的文件,是一个命令参数脚本。
构建步骤∶
1、编写一个dockerfile文件
2、docker build构建成为一个镜像
3、docker run运行镜像
4、docker push发布镜像(DockerHub、阿里云镜像仓库)
很多官方的镜像都是基础包,很多功能都没有,我们通常会自己搭建自己的镜像。
官方既然可以制作镜像,那么我们也可以去构建自己的镜像。
注意:
- 每个保留关键字(指令)都必须是大写字母;
- 执行顺序是从上往下依次执行;
#
表示注释;- 每一个指令都会创建提交一个新的镜像层,并提交。
dockerfile指令
FROM:指定基础镜像,一切都是从这里开始构建
MAINTAINER:指定维护者信息【镜像是谁写的,姓名+邮箱】
RUN:镜像构建的时候需要运行的命令【你想要镜像做一些什么】
ADD:步骤,添加内容
WORKDIR:镜像的工作目录
VOLUME:挂载的目录
EXPOSE:保留端口配置
CMD:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT:指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD:当构建一个被继承,DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY:类似ADD,将我们文件拷贝到镜像中
ENV:构建的时候设置环境变量
案例
这里以以官方centos构建jdk为例,jdk版本为8u141
进入root家目录/home创建dockerfile目录
命令:vim mydockerfile-jdk
# 书写内容,正式构建不能带解释参数,这里起到诠释作用
FROM centos 指定基础镜像
MAINTAINER user 指定作者
RUN mkdir /usr/local/java 新建文件夹存放jdk文件
ADD jdk-8u141-linux-x64.tar.gz /usr/local/java/ 将jdk复制到镜像内并解压
RUN ln -s /usr/local/java/jdk1.8.0_141 /usr/local/java/jdk 创建软连接让系统变量识别
ENV JAVA_HOME /usr/local/java/jdk 环境变量
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH ${JAVA_HOME}/bin:$PATH
通过文件构建镜像
docker build -f dockerfile文件路径 -t 镜像名:[tag] 构建后的路径
列出镜像变迁史
docker history image/ID
CMD 和 ENTRYPOINT区别
- CMD: 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
- ENTRYPOINT: 指定这个容器启动的时候要运行的命令,可以追加命令
创建测试文件对比:
cmd文件内容
运行
正常报错,因为 -l 代替了 ls -l
entrypoint文件内容
运行
正常 因为 entrypoint 是追加而不是代替 相当于此处运行 ls -al
docker网络
四种模式
bridge
:桥接docker(默认,自己创建也使用bridge模式);none
:不配置网络;host
:和宿主机共享网络;container
:容器网络连通!(用的少,局限很大);
所有容器再不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP地址,此情况下的容器都是可以互ping的
Docker使用的是Linux的桥接模式,宿主机中是一个Docker容器的网桥docker0,所有东西都是经过这个docker0的,只要你启动一个容器,不指定一个网络它就会往docker0这里给你分配一个IP,最多能分配65535个。如果是容器之间需要通信,那么就通过Veth-pair给转发连接过去。核心就是利用了Linux的虚拟化网络技术,在容器内和Docker0分别创建了一个虚拟网卡,通过Veth-pair进行一个连接。
Docker中的所有网络接口都是虚拟的,这是因为虚拟的转发效率高,只要在一个容器内转发是非常快的。
只要容器删除,对应的网桥一对就没有了。
自定义网络
先查看网络列表
docker network ls
这里的harbor是我harbor仓库网络
桥接网络直接启动的命令 【--net bridge
】,而这个就是docker0默认的启动方式
docker run -d -P --name tomcat01 tomcat
# 以上命令就相当于
docker run -d -P --name tomcat01 --net bridge tomcat
创建自定义网络
docker network create
–driver bridge # 桥接模式
–subnet 192.168.0.0/16 # 配制一个子网,65535个字段 192.168.0.2——192.168.255.255
–gateway 192.168.0.1 # 配制默认的路由网关
mynet #表示自定义的网络名
查看网络详情,即元数据
自定义网络互ping
run两个tomcat在自定义网络下进行互ping
通过查看元数据查看两容器的ip,这里展示直接从自定义网络元数据查看
互ping
正所谓在不同网段中,不同网络之中的容器是不能联通的,解决方法如下
docker network connect 网络1 另一个网络的容器
例如这里以自定义mynet 和bridge网络中的容器ping
以默认bridge网络创建容器
与centos1 互ping
失败
打通mynet网络和centos3
使用connect就是将centos3放到了mynet下,如果我们以后想要跨网络操作别人的容器,就需要使用docker network connect
连通。
centos3内网络