目录
1、镜像
2、容器
3、网络
4、数据卷
5、docker-compose
6、Docker启动MySQL示例
分类 | 功能 | 备注 | 命令 |
镜像首页 | https://hub.docker.com/ | ||
镜像 | 下载镜像 | docker pull 软件名 | |
查询本机已有镜像 | docker images | ||
保存镜像为压缩包(单个镜像) | -o:输出到的文件 docker save tomcat:9.0.20-jre8-alpine -o tomcat9.tar docker save tomcat:9.0.20-jre8-slim > tomcat9.slim.tar |
docker save 软件名:TAG -o 文件名 | |
保存镜像为压缩包(多个镜像) | docker save \ ubuntu:20.04 \ alpine:3.12.1 \ debian:10.6-slim \ centos:7.8.2003 \ -o linux.tar |
||
将压缩包还原为镜像 | -i:指定导入的文件 docker load -i linux.tar docker load < tomcat9.0.20.tar |
docker load -i 压缩包名 | |
删除一个镜像(软件名:TAG) | -f, -force : 强制删除镜像,即便有容器引用该镜像; -no-prune : 不要删除未带标签的父镜像; docker rmi tomcat:9.0.20-jre8-alpine docker image rm tomcat:9.0.20-jre8-alpine |
docker rmi 软件名:TAG | |
批量删除镜像 | -f,-force : 强制删除镜像,即便有容器引用该镜像; | docker rmi -f $(docker images | grep "xxx" | awk '{print $3}') //其中xxx为关键字 | |
删除一个镜像(ID) | id重复时,删除失败(image的ID在终端长度未完全显示,ID值会出现重复) | docker rmi ee7cbd482336 | |
获取镜像的详细信息 | docker inspect 软件名:TAG | ||
查看镜像各个层的创建信息 | docker history 软件名:TAG | ||
重新标记本地镜像 | docker tag tomcat:9.0.20-jre8-alpine lagou/tomcat:9 | docker tag old软件名:TAG new软件名:TAG | |
清理镜像 | -a, --all : 删除所有没有用的镜像,而不仅仅是临时文件; -f, --force :强制删除镜像文件,无需弹出提示确认; |
docker image prune | |
镜像推送 | docker push harbor.xnunion.com/algplat/one/image:1.1 |
功能 | 备注 | 命令 | |
容器 | 容器可以理解成一个极小型的虚拟机(是镜像实例) | ||
新建并启动容器(run) | -d, --detach=false: 后台运行容器,并返回容器ID -i, --interactive=false: 以交互模式运行容器,通常与 -t 同时使用 -P, --publish-all=false: 随机端口映射,容器内部端口随机映射到主机的端口。不推荐各位小伙伴 使用该参数 -p, --publish=[]: 指定端口映射,格式为:主机(宿主)端口:容器端口,推荐各位小伙伴们使用 -t, --tty=false: 为容器重新分配一个伪输入终端,通常与 -i 同时使用 --name="nginx-lb": 为容器指定一个名称 -h , --hostname="laosiji": 指定容器的hostname -e , --env=[]: 设置环境变量,容器中可以使用该环境变量 --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型 --link=[]: 添加链接到另一个容器(容器间可通过容器名进行交互,而不用再通过ip进行交互);不推荐各位小伙伴使用该参数 -v, --volume : 绑定一个数据卷 --privileged=false: 指定容器是否为特权容器,特权容器拥有所有的capabilities --restart=no:指定容器停止后的重启策略 no:容器退出时不重启 on-failure:容器故障退出(返回值非零)时重启 always:容器退出时总是重启,推荐各位小伙伴们使用 --rm=false: 指定容器停止后自动删除容器,不能以docker run -d启动的容器 |
前台运行:docker run -it --rm tomcat:latest 后台运行:docker run -itd --name tomcat9 -p 8888:8080 tomcat:latest --name:为当前启动的容器起别名 将容器8080端口与主机8888端口映射,即可通过主机ip:8888访问容器内tomcat |
|
查看容器log日志 | -f : 跟踪日志输出 --tail :仅列出最新N条容器日志 |
docker logs -f 容器别名 | |
查看运行的容器 | -a :显示所有的容器,包括未运行的。 -q :只显示容器编号。 |
docker ps | |
创建容器但不启动(create) | 参数与run命令类似 | docker create -it --name tomcat9 -p 8888:8080 tomcat:latest | |
启动容器 | 按容器名称/id进行启动 | docker start 容器别名 | |
停止容器 | 按容器名称/id进行启动 | docker stop 容器别名 | |
重启容器 | 按容器名称/id进行启动 | docker restart 容器别名 | |
更新容器(不成熟) | 多个容器别名/id间用空格分割 | docker update --restart always 容器名称/容器id | |
杀掉容器 | 杀掉一个运行中的容器 | docker kill 容器别名/容器id | |
删除容器 | 按容器名称/id进行删除 -f :通过 SIGKILL 信号强制删除一个运行中的容器。 -l :移除容器间的网络连接,而非容器本身。 -v :删除与容器关联的卷。 |
docker rm 容器别名 | |
从虚拟机进入容器 | 进入容器内部,查看相关目录接口,修改配置 -i :即使没有附加也保持STDIN 打开 -t :分配一个伪终端 |
有bash命令的linux:docker exec -it 容器id /bin/bash 无bash命令的linux:docker exec -it 容器id sh |
|
获取容器的详细信息 | -f :指定返回值的模板文件。 -s :显示总的文件大小。 --type :为指定类型返回JSON。 |
docker inspect 容器名 | |
实用技巧 | 停止所有运行容器 docker stop $(docker ps -qa) 删除所有的容器 docker rm $(docker ps -aq) docker rm $(docker stop $(docker ps -q)) 删除所有的镜像 docker rmi $(docker images -q) |
功能 | 备注 | 命令 | |
docker网络 | docker网络帮助 | docker network --help | |
查看docker网络类型 | 在docker初始化时,会自动创建bridge、host、none三种网络 | docker network ls | |
查看docker网络详细信息 | 1、docker在宿主机虚拟一个docker容器网桥; 2、启动容器时,根据网桥的桥段分配一个ip地址(Container-ip); 3、容器间可通过Container-ip直接通信; 4、外部网络可通过映射容器端口到宿主主机端口进行访问。 -p |
docker info | |
查询所有bridge网络 | brctl show | ||
docker网络模式(了解即可,偏运维) | host模式、Container模式、none模式、bridge模式(默认)、Macvlan network模式、Overlay模式 |
||
查看具体网络详情 | 重点在于查询结果的Containers内容,会显示bridge网络下的容器网络信息。 docker network inspect bridge |
docker network inspect 网络名称 | |
可通过新建一个bridge网络的方式替代--link |
docker run -itd --name nginx2 |
||
新建网络 | docker network create -d bridge lagou-bridge 新建网络后,可通过容器名称进行多个容器之间的互访。 自定义的网卡可以在容器之间提供自动的 DNS 解析。 -d, --driver string 指定网络的驱动(默认 "bridge") --subnet strings 指定子网网段(如192.168.0.0/16、172.88.0.0/24) --ip-range strings 执行容器的IP范围,格式同subnet参数 --gateway strings 子网的IPv4 or IPv6网关,如(192.168.0.1) |
docker network create [OPTIONS] 网络类型 网络名 docker network create -d 网络类型 网络名 |
|
网络连接与断开 | docker network connect lagou-bridge nginx2 | docker network connect/disconnect 网络名 容器名 | |
删除网络 | docker network rm lagou-bridge | docker network rm 网络名 | |
docker安装ping相关命令 | apt update && apt install -y iproute2 && apt install -y net-tools && apt install -y iputils-ping |
功能 | 备注 | 命令 | |
数据卷 | 定义 | 实现容器数据的持久化,不随容器的删除而消失。 在使用docker容器的时候,产生的一系列数据文件。 宿主机的数据卷是可供多个容器使用的特殊目录,将主机操作系统目录直接映射进容器。 简化docker cp命令,实现容器数据的持久化。 docker官网推荐通过run挂在数据卷而非通过create/start创建启动容器时挂载。 docker官网推荐进行目录挂载而不是文件挂载。 |
|
特点 | 1. 数据卷可以在容器之间共享或重用数据 2. 数据卷中的更改可以立即生效 3. 数据卷中的更改不会包含在镜像的更新中 4. 数据卷默认会一直存在,即使容器被删除 5. 数据卷的生命周期一直持续到没有容器使用它为止 |
||
主机与容器间的数据拷贝 | -L :保持源目标中的链接 docker cp /data/index.html nginx:/usr/share/nginx/html/index.html |
宿主机文件复制到容器内 docker cp [OPTIONS] 宿主机文件路径 容器名:容器文件路径 容器内文件复制到宿主机 docker cp [OPTIONS] 容器名:容器文件路径 宿主机文件路径 |
|
数据卷三种类型 | 使用数据卷后,容器内文件的修改都会保存到宿主机的映射文件中。 1. 宿主机数据卷:直接在宿主机的文件系统中但是容器可以访问(bind mount) 2. 命名数据卷:磁盘上Docker管理的数据卷,但是这个卷有个名字。 3. 匿名数据卷:磁盘上Docker管理的数据卷,因为没有名字想要找到不容易,Docker来管理这些文件。 第一种是在宿主机内的特定(指定)目录下,而后两种则在docker管理的目录下,这个目录一般是 /var/lib/docker/volumes/ |
||
宿主机容器卷(数据卷):bind mounts | 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中。(容器目录cp到数据卷目录) 如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录会显示数据卷中的数据。(数据卷目录cp到容器目录) |
docker run -v /宿主机绝对路径目录:/容器内目录 镜像名 | |
容器目录权限 | 通过 -v 容器内路径: ro rw 改变读写权限 ro:readonly 只读 rw:readwrite 可读可写 docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 docker run -it -v /宿主机绝对路径目录:/容器内目录:rw 镜像名 例如: docker run -d -P --name nginx05 -v lagouedu1:/etc/nginx:ro nginx docker run -d -P --name nginx05 -v lagouedu2:/etc/nginx:rw nginx ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作! |
||
nexus3挂载数据卷(权限问题) | 某些容器挂载数据卷时,需要对数据卷目录赋予权限。 docker pull sonatype/nexus3:3.28.1 1、运行容器 docker run -d -p 8081:8081 --name nexus3 sonatype/nexus3:3.28.1 2、进入容器查找初始化密码 docker exec -it nexus3 /bin/bash cd /nexus-data/ cat admin.password 3、浏览器端访问 http://192.168.198.100:8081/ 4、查看官网说明文档,需要为挂载目录授权(舍去这一步可能导致容器启动失败) chown -R 200 nexus3/ 5、运行容器 docker run -d -p 8081:8081 --name nexus3 -v /data/nexus3/:/nexus-data/ sonatype/nexus3:3.28.1 |
||
命名数据卷 | -v为容器指定数据卷时,不指定路径,而是指定一个名字。 docker run -itd --name nginx -p 80:80 -v lagouedu-nginx:/etc/nginx nginx:1.19.3- alpine 1、查看docker数据卷 docker volume ls 2、查看lagouedu-nginx宿主机目录 docker volume inspect lagouedu-nginx 3、进入docker数据卷默认目录 cd /var/lib/docker/volumes/lagouedu-nginx 4、查看文件 ls 所有的文件docker默认保存在_data目录中 cd _data |
||
匿名数据卷 | -v不指定路径及名字,直接关联容器内目录。 docker run -itd --name nginx -p 80:80 -v /etc/nginx nginx:1.19.3-alpine 1、查看docker数据卷 docker volume ls 2、查看宿主机目录docker volume inspect dbd07daa4e40148b11.... 3、进入docker数据卷默认目录 cd /var/lib/docker/volumes/dbd07daa4e40148b11.... 4、查看文件 ls 所有的文件docker默认保存在_data目录中 cd _data |
||
清理数据卷 | docker volume prune | ||
数据卷容器 | 数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。 使用一个特定的容器作为数据卷容器,该容器通过-v与宿主机进行挂载; 其余的容器通过--volumes-from与数据卷容器进行挂载。 举例: docker pull centos:7.8.2003 docker pull nginx:1.19.3-alpine docker pull mysql:5.7.31 1、运行数据卷容器,并挂载到宿主机 docker run -d --name data-volume -v /data/nginx:/usr/share/nginx/html -v /data/mysql:/var/lib/mysql centos:7.8.2003 2、运行mysql容器,挂载到数据卷容器 docker run -itd --name mysql01 --restart always --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin --volumes-from data-volume mysql:5.7.31 -- character-set-server=utf8 --collation-server=utf8_general_ci 3、运行nginx容器,挂载到数据卷容器 docker run -itd --name nginx01 -p 80:80 --volumes-from data-volume nginx:1.19.3- alpine |
功能 | 备注 | 命令 | |
docker compose | 定义 | 定义和运行一个或多个容器,简化镜像的构建以及容器的运行。 使用YAML文件定义多容器之间的关系。一个 docker-compose up 就可以把完整的应用跑 起来。 本质上, compose 把 YAML 文件解析成 docker 命令的参数,然后调用相应的 docker 命令行接口,从而将应用以容器化的方式管理起来。它通过解析容器间的依赖关系顺序地启动容器。而容器间的依赖关系由 YAML 文件中的 links 标记指定。 举个例子,如果一个项目需要运行8个容器: 一种方式是手动一个一个docker run去启动这些容器; 另一种方式就是使用docker compose,定义多容器间的关系,从而使用一条命令完成部署。 |
|
安装 | 下载地址:https://github.com/docker/compose (二进制文件) 将docker-compose二进制文件放到/usr/local/bin/docker-compose 目录下 mv /data/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose cp /data/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose 授权: chmod +x /usr/local/bin/docker-compose 开发环境可以授予最高权限 chmod 777 /usr/local/bin/docker-compose |
||
卸载 | 直接删除二进制文件即可 | ||
yml配置文件 | IDEA的docker插件:https://plugins.jetbrains.com/plugin/7724-docker/versions 1、默认使用文件名 docker-compose.yml。当然,也可以使用 -f 参数指定具体文件。 2、YAML 文件包含 4 个一级 key:version、services、networks、volumes version 是必须指定的,而且总是位于文件的第一行。它定义了 Compose 文件格式(主要是 API)的版本。注意,version 并非定义 Docker Compose 或 Docker 引擎的版本号。 services 用于定义不同的应用服务。Docker Compose 会将每个服务部署在各自的容器中。 networks 用于指引 Docker 创建新的网络。默认情况下,Docker Compose 会创建 bridge 网络。 volumes 用于指引 Docker 来创建新的卷。 |
||
启动与停止 | 启动:docker-compose up -d docker-compose -f docker-compose.yml路径 up -d 停止:docker-compose down |
||
docker-compose常用命令 | 启动服务:docker-compose up -d 停止服务:docker-compose down 列出所有运行容器:docker-compose ps 查看服务日志:docker-compose logs 构建或者重新构建服务:docker-compose build 启动服务:docker-compose start 停止已运行的服务:docker-compose stop 重启服务:docker-compose restart |
功能 | 备注 | 命令 | |
MySQL | 运行mysql镜像 | -e:设置环境变量 MYSQL_ROOT_PASSWORD=admin 设置root用户密码为admin |
docker run -itd --name mysql --restart always --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin mysql:5.7.31 --character-set-server=utf8 --collation-server=utf8_general_ci |
运行mysql镜像(使用数据卷) | docker run -itd --name mysql --restart always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin -v /root/lagoustudy/docker/data/mysql:/var/lib/mysql mysql:5.7.31 | ||
进入mysql容器 | docker exec -it mysql bash | ||
在mysql容器内登录mysql客户端 | mysql -uroot -p |