https://docs.docker.com/reference/

一、基础命令

帮助命令

docker --version  # 显示docker的版本信息
docker info    # 显示docker的系统信息
docker 命令 --help    # 显示帮助命令

搜索镜像

# 搜索镜像
docker search mysql
# 条件过滤搜索结果
docker search --filter=STARS=5000

「列表解释」

  • 「NAME: 镜像名称」

  • 「DESCRIPTION: 镜像介绍」

  • 「STARS: 镜像的stars」

  • 「OFFICIAL: 是否是官方提供的」

  • 「AUTOMATED: 是不是自动化的」

拉取镜像

# 默认拉取最新的镜像
docker pull mysql
# 指定版本下载
docker pull mysql:5.7

查看所有镜像

# 查看所有镜像信息
docker images -a
# 查看所有的镜像id
docker images -aq

「列表解释」

  • 「REPOSITORY: 镜像的仓库源」

  • 「TAG: 镜像的标签」

  • 「IMAGE ID: 镜像的id」

  • 「CREATE: 镜像的创建时间」

  • 「SIZE: 镜像的大小」

删除镜像

#删除指定id的镜像
docker rmi 镜像id
docker rmi 镜像id 镜像id 镜像id 镜像id
#删除指定名称的镜像
docker rmi mysql:5.7
#迭代删除所有的镜像
docker rmi -f $(docker images  -aq)

运行镜像

docker run [可选参数] image
# 运行实例
docker run --name=mycat -d -p 8080:8080 tomcat
# 用完即删
docker run -it --rm tomcat
# 指定环境变量(实例)
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m"  elasticsearch:7.6.2

「参数说明」

  • 「—name=“Name”:容器名字 tomacat01、tomacat02区分容器」

  • -「e」: 「指定环境变量」

  • 「-d:后台守护进程运行」

  • 「-it:使用交互方式运行,进入容器查看内容」

  • 「-p:指定容器的端口 -p 8080:8080」

    • 「-p :主机端口:容器端口」

    • 「-p :容器端口」

  • 「-P:随机指定端口」

  • 「-v: 指定数据卷」

    • 「-v 容器文件位置:宿主机文件位置」
  • 「—volumes-from: 指定容器的数据卷共享(指定谁,就同步谁的数据!继承!)」

    • 「—volumes-from:继承自那个容器」(父容器删除不影响已存在数据)
  • 「—net: 缺省 bridge」

进入容器

# 运行一个centos并进入到容器里面
docker run -it centos /bin/bash
# 退出容器
exit

查看容器

# 查看正在运行中的容器
docker ps
# 查看所有容器
docker ps -a

退出容器

exit   # 直接容器停止并退出
Ctrl + P + Q  # 容器退出不停止

删除容器

# 删除指定容器
docker rm bde00bc086cf
# 强制删除运行中的容器
docker rm -f bde00bc086cf
# 迭代删除全部的容器
docker rm -f $(docker ps -aq)

容器的启动与停止

# 启动容器
docker start 容器id
# 重启容器
docker restart 容器id
# 停止容器
docker stop 容器id
# 强制杀死容器
docker kill 容器id

进入当前在正在运行中的命令

# 进入到指定容器内部进行修改  开启一个新的终端
docker exec -it 0cd4d9d94de2 /bin/bash
# 进入到正在执行中的终端
docker attach 容器id

将文件从容器拷贝到宿主机

docker cp 容器id:容器内文件的路径 宿主机路径
#实例
docker cp 0cd4d9d94de2:/Test.java /Test.java

其他常用命令

「查看日志命令」

# 查看容器运行产生的日志
docker logs -ft --tail 10 容器id

复制

「参数解析:」

  • 「f: 格式化日志」

  • 「t: 携带日志时间戳」

查看进程

# 查看cpu等信息
docker top 0cd4d9d94de2
# 查看容器元信息
docker inspect 容器id

二、可视化面板

安装

# 安装可视化面板 portainer (数据卷路径不可改变)
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

image-20200906161505532

三、提交容器为一个镜像

  1. 提交容器

# 提交一个容器为一个镜像(将容器打包)
docker commit [可选参数] 服务id 自定义镜像名称[:版本标签]
# 示例代码提交
docker commit  -a="huangfu" -m="增加了主页" 19329ae6df90  diytomcat:1.0

「参数解释:」

  • 「-a: 作者」

  • 「-m: 备注」

  • 「-c: 将Dockerfile指令应用于创建的映像」

  • 「-p: 提交期间暂停容器(默认为true)」

四、Docker数据卷使用

数据卷的基本使用

# 关联数据卷
docker run [可选参数] -v /主机路径/:/容器路径/ 镜像名称
# 关联数据卷的实例命令
docker run -d -p 8080:8080 --name mytomcat -v /home/tomcat/webapps/:/usr/local/tomcat/webapps tomcat

mysql安装实战

docker run -d -p 3366:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

「命令解析:」

  • 「-d: 守护进程运行」

  • 「-v: 添加数据卷(宿主机位置和容器位置映射)」

  • 「-p: 堆对外映射端口」

  • 「-e: 指定环境变量」

  • 「—name: 容器名称」

五、Dockerfile

构建镜像文件

# 创建一个Dockerfile
vim Dockerfile
 
FROM centos
 
VOLUME ["volume01","volume02"]CMD echo "-----end---"CMD /bin/bash
 
:x
 
# 构建docker镜像
# -f dockerfile的路径   
# -t 生成的镜像名称
# . 以当前路径为上下文打包
docker build -f /home/docker-volom/Dockerfile -t huangfu/centos:1.0 .
 
# 构建基本命令
docker build [OPTIONS] PATH | URL | -

Dockerfile概念

  • 每个保留关键字(指令)都必须是大写字母

  • 执行顺序从上到下

  • # 表示注释

  • 每一个指令都会创建提交一个新的镜像层并提交!

Dockerfile语法浅析

  • 「FROM: 基础镜像,一切都从这里开始构建」

  • 「MAINTAINER: 镜像是谁写的,姓名+邮箱」

  • 「RUN: 镜像构建需要运行的命令」

  • 「ADD: 添加一个内容,比如需要添加一个tomcat,则需要传递一个压缩包,便于在容器内构建!」

  • 「WORKDIR: 镜像的工作目录」

  • 「VOLUME: 挂在的目录」

  • 「EXPOSE: 暴露端口」

  • 「CMD: 一个指令,指定这个容器启动的时候要运行的命令」

  • 「ENTRYPOINT: 指定这个容器启动的时候要运行的命令!可以追加命令!」

  • 「ONBUILD: 当构建一个被继承的Dockerfile 这个时候就会运行指令,触发命令!」

  • 「COPY: 类似与ADD,将文件拷贝到镜像中」

  • 「ENV:构建的时候设置环境变量」

# 构建一个具有复杂命令行的centos
vim Dockerfile
 
# 镜像继承自centos
FROM centos
# 作者信息
MAINTAINER huangfu<huangfusuper@163.com>
# 设置环境变量
ENV MYPATH /usr/local
# 设置工作目录
WORKDIR $MYPATH
# 执行命令安装指令
RUN yum -y install vim
RUN yum -y install net-tools
# 暴露端口
EXPOSE 80
# 执行一些指令
CMD echo "-------end------"CMD echo $MYPATHCMD /bin/bash
 
:x
 
# 构建镜像
docker build -f /home/docker-volom/Dockerfile -t huangfu/diycentos:1.0 .

六、自定义网络

网络模式详解

  • 「bridge: 桥接网络(默认)」

  • 「host:和宿主机共享」

  • 「none:不配置网络」

  • 「container:容器网络联通」

查看所有的网络模式

# 查看所有的网络模式
docker network ls

创建自定义的网络

# 创建一个网络
docker network create [OPTIONS] NETWORK
 
# 创建一个mynet
# create 创建
# driver 使用的网络模式
# subnet 子网掩码
# gateway 网关
# mynety 自定义的名称
docker netywork create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynety

使用自定义网络

docker run -d --net mynety --name tom01  tomcat
docker run -d --net mynety --name tom02  tomcat
 
# 进入到tom02
docker exec -it 7d75a637a90b865fe70259bd4e0b3f5c95133dc65693b05abaf078d31a362529 /bin/bash
# 结果是互通的
ping tom01

容器网络互通

# 把自定义网络和容器打通    容器一个容器两个ip
# 把不在该网络的容器加入当前网络
docker network connect 自定义网络 容器

七、打包SpringBoot jar项目

Dockerfile编写

FROM java:8COPY *.jar /app.jar
 
CMD ["--server.port=8080"]EXPOSE 8080ENTRYPOINT ["java","-jar","/app.jar"]

构建镜像

mkdir idea
 
cd idea
 
# 将 Dockerfile与jar包发送到idea目录
# 构建镜像
docker build -t huangfutest:1.0 .
# 后面运行不说了

八、如何容器化应用

镜像是容器的静态形式,它打包了应用程序的所有运行依赖项,方便保存和传输。使用容器技术运行镜像,就形成了动态的容器,由于镜像只读不可修改,所以应用程序的运行环境总是一致的。

容器化的应用就是指以镜像的形式打包应用程序,然后在容器环境里从镜像启动容器。

我这里就对今天的镜像操作和容器操作做个小结:

  • 常用的镜像操作有 docker pull、docker images、docker rmi,分别是拉取镜像、查看镜像和删除镜像。

  • 用来启动容器的 docker run 是最常用的命令,它有很多参数用来调整容器的运行状态,对于后台服务来说应该使用 -d。

  • Docker exec 命令可以在容器内部执行任意程序,对于调试排错特别有用。

  • 其他常用的容器操作还有 docker ps、docker stop、docker rm,用来查看容器、停止容器和删除容器。

九、 与外界资源共享

如何拷贝容器内的数据

Cp 命令,它可以在宿主机和容器之间拷贝文件,是最基本的一种数据交换功能。

Docker cp 的用法很简单,很类似 Linux 的“cp”“scp”,指定源路径(src path)和目标路径(dest path)就可以了。如果源路径是宿主机那么就是把文件拷贝进容器,如果源路径是容器那么就是把文件拷贝出容器,注意需要用容器名或者容器 ID 来指明是哪个容器的路径

 
docker cp a.txt 062:/tmp

如何共享主机上的文件

只需要在 docker run 命令启动容器的时候使用 -v 参数就行,具体的格式是“宿主机路径: 容器内路径”。

我还是以 Redis 为例,启动容器,使用 -v 参数把本机的“/tmp”目录挂载到容器里的“/tmp”目录,也就是说让容器共享宿主机的“/tmp”目录

 
docker run -d --rm -v /tmp:/tmp redis

如何实现网络互通

Docker 提供了三种网络模式,分别是 null、host 和 bridge。

  • Null 是最简单的模式,也就是没有网络,但允许其他的网络插件来自定义网络连接,这里就不多做介绍了。

  • Host 的意思是直接使用宿主机网络,相当于去掉了容器的网络隔离(其他隔离依然保留),所有的容器会共享宿主机的 IP 地址和网卡。这种模式没有中间层,自然通信效率高,但缺少了隔离,运行太多的容器也容易导致端口冲突。Host 模式需要在 docker run 时使用 —net=host 参数,下面我就用这个参数启动 Nginx:

 
docker run -d --rm --net=host nginx:alpine
  • 第三种 bridge,也就是桥接模式,它有点类似现实世界里的交换机、路由器,只不过是由软件虚拟出来的,容器和宿主机再通过虚拟网卡接入这个网桥(图中的 docker 0),那么它们之间也就可以正常的收发网络数据包了

如何分配服务端口号

使用 host 模式或者 bridge 模式,我们的容器就有了 IP 地址,建立了与外部世界的网络连接,接下来要解决的就是网络服务的端口号问题。

一台主机上的端口号数量是有限的,而且多个服务之间还不能够冲突,但我们打包镜像应用的时候通常都使用的是默认端口,容器实际运行起来就很容易因为端口号被占用而无法启动

解决这个问题的方法就是加入一个“中间层”,由容器环境例如 Docker 来统一管理分配端口号,在本机端口和容器端口之间做一个“映射”操作

端口号映射需要使用 bridge 模式,并且在 docker run 启动容器时使用 -p 参数,形式和共享目录的 -v 参数很类似,用 : 分隔本机端口和容器端口

 
docker run -d -p 80:80 --rm nginx:alpine
docker run -d -p 8080:80 --rm nginx:alpine
 
# 这样就把本机的 80 和 8080 端口分别“映射”到了两个容器里的 80 端口

十、镜像仓库

什么是镜像仓库(Registry)

右边的区域就是镜像仓库,术语叫 Registry,直译就是“注册中心”,意思是所有镜像的 Repository 都在这里登记保管,就像是一个巨大的档案馆。

然后我们再来看左边的“docker pull”,虚线显示了它的工作流程,先到“Docker daemon”,再到 Registry,只有当 Registry 里存有镜像才能真正把它下载到本地。

什么是 Docker Hub

什么是 Docker Hub

“Docker Hub”( https://hub.docker.com/ )。

如何在 Docker Hub 上挑选镜像

Docker Hub 上有官方镜像、认证镜像和非官方镜像的区别。

  • 官方镜像(Official image):是指 Docker 公司官方提供的高质量镜像( https://github.com/docker-library/official-images ),都经过了严格的漏洞扫描和安全检测,支持 x 86_64、arm 64 等多种硬件架构,还具有清晰易读的文档,一般来说是我们构建镜像的首选,也是我们编写 Dockerfile 的最佳范例。

  • 认证镜像(Verified publisher):也就是认证发行商,比如 Bitnami、Rancher、Ubuntu 等。它们都是颇具规模的大公司,具有不逊于 Docker 公司的实力,所以就在 Docker Hub 上开了个认证账号

  • 非官方镜像

    • “半官方”镜像。因为成为“Verified publisher”是要给 Docker 公司交钱的,而很多公司不想花这笔“冤枉钱”,所以只在 Docker Hub 上开了公司账号(比如 OpenResty )

    • 第二类就是纯粹的“民间”镜像了,通常是个人上传到 Docker Hub 的,因为条件所限,测试不完全甚至没有测试,质量上难以得到保证,下载的时候需要小心谨慎。

Docker Hub 上镜像命名的规则是什么

  • Docker Hub 也使用了同样的规则,就是“用户名 / 应用名”的形式,比如 bitnami/nginx、ubuntu/nginx、rancher/nginx 等等。

  • 因为镜像还会有许多不同的版本,也就是“标签”(tag)。

    • 直接使用默认的“latest”虽然简单方便

    • 通常来说,镜像标签的格式是应用的版本号加上操作系统。

    • 另外,有的标签还会加上 slim、fat,来进一步表示这个镜像的内容是经过精简的,还是包含了较多的辅助工具。

离线环境该怎么办

  • 在内网环境里仿造 Docker Hub,创建一个自己的私有 Registry 服务,比如 Docker Registry,还有 CNCF Harbor,

  • Docker 提供了 save 和 load 这两个镜像归档命令,可以把镜像导出成压缩包,或者从压缩包导入 Docker,而压缩包是非常容易保管和传输的,可以联机拷贝,FTP 共享,甚至存在 U 盘上随身携带。

 
docker save ngx-app:latest -o ngx.tar
docker load -i ngx.tar