IT评测·应用市场-qidao123.com

标题: Docker 万字入门教程 [打印本页]

作者: 没腿的鸟    时间: 2024-10-12 09:55
标题: Docker 万字入门教程
0. 媒介


文章已经收录到 GitHub 个人博客项目,欢迎 Star:
  1. https://github.com/chenyl8848/chenyl8848.github.io
复制代码
大概访问网站,举行在线浏览:
  1. https://chenyl8848.github.io/
复制代码
1. Docker 简介

1.1 官方定义

官方介绍
官方定义:Docker 是一个容器技能。


关注微信公众号:【Java 陈序员】,获取开源项目分享、AI 副业分享、超 200 本经典计算机电子册本等。
1.2 Docker 的起源

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技能的一次革新,并于 2013 年 3 月以 Apache2.0 授权协议开源,主要项目代码在 GitHub 上举行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动开放容器联盟(OCI).
Docker 自开源后受到广泛的关注和讨论,由于 Docker 项目标火爆,在 2013 年底,dotCloud 公司决定改名为 Docker. Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 举行支持;Google 也在其 PaaS 产物中广泛应用 Docker.
Docker 使用 Google 公司推出的 Go 语言举行开发实现,基于 Linux 内核的 cgroup、namespace, 以及 OverlayFS 类的 Union FS 等技能,对历程举行封装隔离,属于操纵体系层面的虚拟化技能。由于隔离的历程独立于宿主和别的的隔离的历程,因此也称其为容器。
1.3 Docker 的优势

1.4 Docker 和虚拟机的区别

关于 Docker 与虚拟机的区别,在网上找到的一张图,非常直观形象地展示出来,话不多说,直接上图。

比力上面两张图,我们发现虚拟机是携带操纵体系,本身很小的应用程序却因为携带了操纵体系而变得非常大,很笨重。Docker 是不携带操纵体系的,以是 Docker 的应用就非常的轻巧。另外在调用宿主机的 CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是使用 Hypervisor 去虚拟化内存,整个调用过程是虚拟内存->虚拟物理内存->真正物理内存,但是 Docker 是使用 Docker Engine 去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存
传统虚拟机Docker 容器磁盘占用几个 GB 到几十个 GB 左右几十 MB 到几百 MB 左右CPU 内存占用虚拟操纵体系非常占用 CPU 和内存Docker 引擎占用极低启动速率(从开机到运行项目)几分钟(从开启容器到运行项目)几秒安装管理需要专门的运维技能安装、管理方便应用部署每次部署都费时费力从第二次部署开始轻松简便耦合性多个应用服务安装到一起,容易互相影响每个应用服务一个容器,达成隔离体系依赖无需求相同或相似的内核,目前推荐是 Linux2. Docker 的安装

2.1 安装 Docker(centos7.x)

  1. sudo yum remove docker \
  2.                 docker-client \
  3.                 docker-client-latest \
  4.                 docker-common \
  5.                 docker-latest \
  6.                 docker-latest-logrotate \
  7.                 docker-logrotate \
  8.                 docker-engine
复制代码
  1. sudo yum install -y yum-utils \
  2.   device-mapper-persistent-data \
  3.   lvm2
复制代码
  1. sudo yum-config-manager \
  2.     --add-repo \
  3.     https://download.docker.com/linux/centos/docker-ce.repo
复制代码
  1. sudo yum install docker-ce docker-ce-cli containerd.io
复制代码
  1. yum list docker-ce --showduplicates | sort -r
  2. # sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
  3. sudo yum install docker-ce-18.09.5-3.el7 docker-ce-cli-18.09.5-3.el7 containerd.io
复制代码
  1. sudo systemctl enable docker
  2. sudo systemctl start docker
复制代码
  1. sudo systemctl stop docker
复制代码
  1. sudo docker --version
复制代码
2.2 bash 安装(通用所有平台)

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 体系上可以使用这套脚本安装。另外可以通过 --mirror 选项使用国内源举行安装。
实行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 的稳定(stable)版本安装在体系中。
  1. curl -fsSL get.docker.com -o get-docker.sh
  2. sudo sh get-docker.sh --mirror Aliyun
复制代码
  1. sudo systemctl enable docker
  2. sudo systemctl start docker
复制代码
  1. sudo groupadd docker
复制代码
  1. sudo usermod -aG docker $USER
复制代码
  1. docker --version
复制代码
3. Docker 的核心架构


4. Docker 配置阿里镜像加速服务

4.1 Docker 运行流程


4.2 Docker 配置阿里云镜像加速

  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4.   "registry-mirrors": ["https://lz2nib3q.mirror.aliyuncs.com"]
  5. }
  6. EOF
  7. sudo systemctl daemon-reload
  8. sudo systemctl restart docker
复制代码
8.2 安装 Redis
  1. [root@localhost ~]# docker info
  2.                 ..........
  3.     127.0.0.0/8
  4.    Registry Mirrors:
  5.     'https://lz2nib3q.mirror.aliyuncs.com/'
  6.    Live Restore Enabled: false
  7.    Product License: Community Engine
复制代码
8.3 安装 Nginx
  1. [root@localhost ~]# docker run hello-world
  2. Hello from Docker!
  3. This message shows that your installation appears to be working correctly.
  4. To generate this message, Docker took the following steps:
  5. 1. The Docker client contacted the Docker daemon.
  6. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
  7.     (amd64)
  8. 3. The Docker daemon created a new container from that image which runs the
  9.     executable that produces the output you are currently reading.
  10. 4. The Docker daemon streamed that output to the Docker client, which sent it
  11.     to your terminal.
  12. To try something more ambitious, you can run an Ubuntu container with:
  13. $ docker run -it ubuntu bash
  14. Share images, automate workflows, and more with a free Docker ID:
  15. https://hub.docker.com/
  16. For more examples and ideas, visit:
  17. https://docs.docker.com/get-started/
复制代码
8.4 安装 Tomcat
  1. # 1.安装完成辅助命令
  2. docker version -------------------------- 查看 Docker 的信息
  3. docker info -------------------------- 查看更详细的信息
  4. docker --help -------------------------- 帮助命令
复制代码
8.5 安装 MongoDB 数据库
  1. # 1.查看本机中所有镜像
  2. docker images -------------------------- 列出本地所有镜像
  3. -a 列出所有镜像(包含中间映像层)
  4. -q 只显示镜像 id
  5. # 2.搜索镜像
  6.     docker search [options] 镜像名        -------------------        去 dockerhub 上查询当前镜像
  7.             -s 指定值                列出收藏数不少于指定值的镜像
  8. --no-trunc 显示完整的镜像信息
  9. # 3.从仓库下载镜像
  10.     docker pull 镜像名[:TAG|@DIGEST]        ----------------- 下载镜像
  11. # 4.删除镜像
  12.     docker rmi 镜像名        --------------------------  删除镜像
  13.             -f                强制删除
复制代码
8.6 安装 ElasticSearch

留意:需要调高 JVM 线程数限定数量
  1. # 1.运行容器
  2.     docker run 镜像名        --------------------------        镜像名新建并启动容器
  3.     --name                                         别名为容器起一个名字
  4.     -d                                                        启动守护式容器(在后台启动容器)
  5.     -p                                                         映射端口号:原始端口号                 指定端口号启动
  6.     例:docker run -it --name myTomcat -p 8888:8080 tomcat
  7.       docker run -d --name myTomcat -P tomcat
  8. # 2.查看运行的容器
  9.     docker ps                                        --------------------------        列出所有正在运行的容器
  10.     -a                        正在运行的和历史运行过的容器
  11.     -q                        静默模式,只显示容器编号
  12. # 3.停止|关闭|重启容器
  13.     docker start   容器名字或者容器id  --------------- 开启容器
  14.     docker restart 容器名或者容器id    --------------- 重启容器
  15.     docker stop  容器名或者容器id             ------------------ 正常停止容器运行
  16.     docker kill  容器名或者容器id      ------------------ 立即停止容器运行
  17. # 4.删除容器
  18.     docker rm -f 容器id和容器名
  19.     docker rm -f $(docker ps -aq)                --------------------------        删除所有容器
  20. # 5.查看容器内进程
  21.     docker top 容器id或者容器名 ------------------ 查看容器内的进程
  22. # 6.查看查看容器内部细节
  23.     docker inspect 容器id                 ------------------ 查看容器内部细节
  24. # 7.查看容器的运行日志
  25.     docker logs [OPTIONS] 容器id或容器名        ------------------ 查看容器日志
  26.     -t                         加入时间戳
  27.     -f                         跟随最新的日志打印
  28.     --tail          数字        显示最后多少条
  29. # 8.进入容器内部
  30.     docker exec [options] 容器id 容器内命令 ------------------ 进入容器执行命令
  31.             -i                以交互模式运行容器,通常与-t一起使用
  32.     -t                分配一个伪终端    shell窗口   bash
  33. # 9.容器和宿主机之间复制文件
  34.     docker cp 文件|目录 容器id:容器路径           -----------------   将宿主机复制到容器内部
  35.     docker cp 容器id:容器内资源路径 宿主机目录路径  -----------------   将容器内资源拷贝到主机上
  36. # 10.数据卷(volum)实现与宿主机共享目录
  37.     docker run -v 宿主机的路径|任意别名:/容器内的路径 镜像名
  38. 注意: 1. 如果是宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容 2. 如果是别名则会在 Docker 运行容器时自动在宿主机中创建一个目录,并将容器目录文件复制到宿主机中
  39. # 11.打包镜像
  40.             docker save 镜像名 -o  名称.tar
  41. # 12.载入镜像
  42.             docker load -i 名称.tar
  43. # 13.容器打包成新的镜像
  44.       docker commit -m "描述信息" -a "作者信息" (容器id或者名称)打包的镜像名称:标签
复制代码
若启动出现如下错误,按照如下步骤修改。
  1. # 1.拉取 mysql 镜像到本地
  2.     docker pull mysql:tag (tag不加默认最新版本)
  3. # 2.运行 mysql 服务
  4.     docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:tag                                                    --没有暴露外部端口外部不能连接
  5.     docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d  mysql:tag  --没有暴露外部端口
  6. # 3.进入 mysql 容器
  7.     docker exec -it 容器名称|容器id bash
  8. # 4.外部查看 mysql 日志
  9.     docker logs 容器名称|容器id
  10. # 5.使用自定义配置参数
  11.     docker run --name mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql:tag
  12. # 6.将容器数据位置与宿主机位置挂载保证数据安全
  13.     docker run --name mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:tag
  14. # 7.通过其他客户端访问 如在 window 系统|macos 系统使用客户端工具访问
  15. # 8.将 MySQL 数据库备份为 SQL 文件
  16.     docker exec mysql|容器id sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql  --导出全部数据
  17.     docker exec mysql sh -c 'exec mysqldump --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql  --导出指定库数据
  18.     docker exec mysql sh -c 'exec mysqldump --no-data --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql  --导出指定库数据不要数据
  19. # 9.执行 SQL 文件到 MySQL 中
  20.     docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /root/xxx.sql
复制代码
  1. # 1.在 Docker Hub 搜索 Redis 镜像
  2.     docker search redis
  3. # 2.拉取 Redis 镜像到本地
  4.     docker pull redis
  5. # 3.启动 Redis 服务运行容器
  6.     docker run --name redis -d redis:tag (没有暴露外部端口)
  7.     docker run --name redis -p 6379:6379 -d redis:tag (暴露外部宿主机端口为6379进行连接)
  8. # 4.查看启动日志
  9.     docker logs -t -f 容器id|容器名称
  10. # 5.进入容器内部查看
  11.     docker exec -it 容器id|名称 bash
  12. # 6.加载外部自定义配置启动 redis 容器
  13.     默认情况下 Redis 官方镜像中没有 redis.conf 配置文件,需要去官网下载指定版本的配置文件
  14.     1. wget http://download.redis.io/releases/redis-5.0.8.tar.gz  下载官方安装包
  15.     2. 将官方安装包中配置文件进行复制到宿主机指定目录中如 /root/redis/redis.conf 文件
  16.     3. 修改需要自定义的配置
  17.              bind 0.0.0.0 开启远程权限
  18.              appenonly yes 开启aof持久化
  19.     4. 加载配置启动
  20.     docker run --name redis -v /root/redis:/usr/local/etc/redis -p 6379:6379 -d redis redis-server /usr/local/etc/redis/redis.conf
  21. # 7.将数据目录挂在到本地保证数据安全
  22.     docker run --name redis -v /root/redis/data:/data -v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf -p 6379:6379 -d redis redis-server                                         /usr/local/etc/redis/redis.conf
复制代码
  1. # 1.在 Docker Hub 搜索 Nginx
  2.     docker search nginx
  3. # 2.拉取 Nginx 镜像到本地
  4.     [root@localhost ~]# docker pull nginx
  5.     Using default tag: latest
  6.     latest: Pulling from library/nginx
  7.     afb6ec6fdc1c: Pull complete
  8.     b90c53a0b692: Pull complete
  9.     11fa52a0fdc0: Pull complete
  10.     Digest: sha256:30dfa439718a17baafefadf16c5e7c9d0a1cde97b4fd84f63b69e13513be7097
  11.     Status: Downloaded newer image for nginx:latest
  12.     docker.io/library/nginx:latest
  13. # 3.启动 Nginx 容器
  14.             docker run -p 80:80 --name nginx01 -d nginx
  15. # 4.进入容器
  16.             docker exec -it nginx01 /bin/bash
  17.             查找目录:  whereis nginx
  18.             配置文件:  /etc/nginx/nginx.conf
  19. # 5.复制配置文件到宿主机
  20.             docker cp nginx01(容器id|容器名称):/etc/nginx/nginx.conf 宿主机名录
  21. # 6.挂在 nginx 配置以及 html 到宿主机外部
  22.             docker run --name nginx02 -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/html:/usr/share/nginx/html -p 80:80 -d nginx
复制代码
  1. # 1.在 Docker Hub 搜索 Tomcat
  2.     docker search tomcat
  3. # 2.下载 Tomcat 镜像
  4.     docker pull tomcat
  5. # 3.运行 Tomcat 镜像
  6.     docker run -p 8080:8080 -d --name mytomcat tomcat
  7. # 4.进入 Tomcat 容器
  8.     docker exec -it mytomcat /bin/bash
  9. # 5.将 webapps 目录挂载在外部
  10.     docker run -p 8080:8080 -v /root/webapps:/usr/local/tomcat/webapps -d --name mytomcat tomcat
复制代码
10. Docker 中出现如下错误解决方案
  1. # 1.运行 MongoDB
  2.     docker run -d -p 27017:27017 --name mymongo mongo  ---无须权限
  3.     docker logs -f mymongo --查看mongo运行日志
  4. # 2.进入 MongoDB 容器
  5.     docker exec -it mymongo /bin/bash
  6.     直接执行 mongo 命令进行操作
  7. # 3.常见具有权限的容器
  8.     docker run --name  mymongo  -p 27017:27017  -d mongo --auth
  9. # 4.进入容器配置用户名密码
  10.     mongo
  11. # 选择 admin 库
  12.     use admin
  13. # 创建用户,此用户创建成功,则后续操作都需要用户认证
  14.     db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
  15.     exit
  16. # 5.将 MongoDB 中数据目录映射到宿主机中
  17.     docker run -d -p 27017:27017 -v /root/mongo/data:/data/db --name mymongo mongo
复制代码

留意这个错误的缘故原由在于是体系的时间和 Docker Hub 时间差别等,需要做体系时间与网络时间同步
  1. # 1.拉取 ElasticSearch 镜像
  2.     docker pull elasticsearch:6.4.2
  3. # 2.查看 Docker 镜像
  4.     docker images
  5. # 3.运行 ElasticSearch 镜像
  6.     docker run -p 9200:9200 -p 9300:9300 elasticsearch:6.4.2
复制代码

11. Dockerfile

11.1 什么是 Dockerfile

Dockerfile 可以认为是Docker 镜像的形貌文件,是由一系列命令和参数构成的脚本。主要作用是用来构建 Docker 镜像的构建文件

通过架构图可以看出通过 DockerFile 可以直接构建镜像
11.2 Dockerfile 解析过程


11.3 Dockerfile 的保留命令

官方说明:https://docs.docker.com/engine/reference/builder/
保留字作用FROM当前镜像是基于哪个镜像的 第一个指令必须是FROMMAINTAINER镜像维护者的姓名和邮箱地址RUN构建镜像时需要运行的指令EXPOSE当前容器对外暴露出的端标语WORKDIR指定在创建容器后,终端默认登录进来的工作目次,一个落脚点ENV用来在构建镜像过程中设置环境变量ADD将宿主机目次下的文件拷贝进镜像且 ADD 命令会自动处置惩罚 URL 和解压 tar 包COPY类似于 ADD,拷贝文件和目次到镜像中
将从构建上下文目次中原路径的文件/目次复制到新的一层的镜像内的目标路径位置
VOLUME容器数据卷,用于数据保存和持久化工作CMD指定一个容器启动时要运行的命令
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数更换
ENTRYPOINT指定一个容器启动时要运行的命令
ENTRYPOINT 的目标和 CMD 一样,都是在指定容器启动程序及其参数
11.3.1 FROM 命令

基于哪个镜像举行构建新的镜像,在构建时会自动从 Docker Hub 拉取 base 镜像,必须作为 Dockerfile 的第一个指令出现
语法:
  1. # 1.在 CentOS 虚拟机中,修改配置 sysctl.conf
  2.     vim /etc/sysctl.conf
  3. # 2.加入如下配置
  4.     vm.max_map_count=262144
  5. # 3.启用配置
  6.     sysctl -p
  7.     注:这一步是为了防止启动容器时,报出如下错误:bootstrap checks failed max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
复制代码
11.3.2 # 0.复制容器中 data 目录到宿主机中

    docker cp 容器id:/usr/share/share/elasticsearch/data /root/es

# 1.运行 EleasticSearch 容器,指定 JVM 内存大小并指定 IK 分词器位置

    docker run -d --name es -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms128m -Xmx128m" -v /root/es/plugins:/usr/share/elasticsearch/plugins -v /root/es/data:/usr/share/elasticsearch/data elasticsearch:6.4.2命令


镜像维护者的姓名和邮箱地址[废弃]。
语法:
  1. # 0.复制容器中 data 目录到宿主机中
  2.     docker cp 容器id:/usr/share/share/elasticsearch/data /root/es
  3. # 1.运行 EleasticSearch 容器,指定 JVM 内存大小并指定 IK 分词器位置
  4.     docker run -d --name es -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms128m -Xmx128m" -v /root/es/plugins:/usr/share/elasticsearch/plugins -v /root/es/data:/usr/share/elasticsearch/data elasticsearch:6.4.2
复制代码
11.3.3 RUN 命令

RUN 命令将在当前映像之上的新层中实行任何命令并提交结果,生成的提交映像将用于 Dockerfile 中的下一步。
语法:
  1. # 1.下载对应版本的 IK 分词器
  2.     wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.2/elasticsearch-analysis-ik-6.4.2.zip
  3. # 2.解压到 plugins 文件夹中
  4.     yum install -y unzip
  5.     unzip -d ik elasticsearch-analysis-ik-6.4.2.zip
  6. # 3.添加自定义扩展词和停用词
  7.     cd plugins/elasticsearch/config
  8.     vim IKAnalyzer.cfg.xml
  9.     <properties>
  10.             <comment>IK Analyzer 扩展配置</comment>
  11.            
  12.             <entry key="ext_dict">ext_dict.dic</entry>
  13.            
  14.             <entry key="ext_stopwords">ext_stopwords.dic</entry>
  15.     </properties>
  16. # 4.在 IK 分词器目录下 config 目录中创建 ext_dict.dic 文件,编码一定要为 UTF-8 才能生效
  17.     vim ext_dict.dic 加入扩展词即可
  18. # 5. 在 IK 分词器目录下 config 目录中创建 ext_stopword.dic 文件
  19.     vim ext_stopwords.dic 加入停用词即可
  20. # 6.重启容器生效
  21.     docker restart 容器id
  22. # 7.将此容器提交成为一个新的镜像
  23.     docker commit -a="xiaochen" -m="es with IKAnalyzer" 容器id xiaochen/elasticsearch:6.4.2
复制代码
11.3.4 EXPOSE 命令

用来指定构建的镜像在运行为容器时对外暴露的端口。
语法:
  1. # 1.下载 Kibana 镜像到本地
  2.     docker pull kibana:6.4.2
  3. # 2.启动 Kibana 容器
  4.     docker run -d --name kibana -e ELASTICSEARCH_URL=http://10.15.0.3:9200 -p 5601:5601 kibana:6.4.2
复制代码
11.3.5 CMD 命令

用来为启动的容器指定实行的命令,在 Dockerfile 中只能有一条 CMD 指令。如果列出多个命令,则只有最后一个命令才会生效
语法:
  1. [root@localhost ~]# docker search mysql 或者 docker pull 这些命令无法使用
  2. Error response from daemon: Get https://index.docker.io/v1/search?q=mysql&n=25: x509: certificate has expired or is not yet valid
复制代码
11.3.6 WORKDIR 命令

用来为 Dockerfile 中的任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令设置工作目次。如果 WORKDIR 不存在,纵然它没有在任何后续 Dockerfile 指令中使用,它也将被创建。
语法:
  1. # 1.安装时间同步
  2.     sudo yum -y install ntp ntpdate
  3. # 2.同步时间
  4.     sudo ntpdate cn.pool.ntp.org
  5. # 3.查看本机时间
  6.     date
  7. # 4.重新测试
复制代码
留意:WORKDIR 指令可以在 Dockerfile 中多次使用。如果提供了相对路径,则该路径将与先前 WORKDIR 指令的路径相对
11.3.7 ENV 命令

用来为构建镜像设置环境变量,这个值将出现在构建阶段中所有后续指令的环境中。
语法:
  1. FROM  <image>
  2. FROM  <image>[:<tag>]     使用版本不写为latest
  3. FROM  <image>[@<digest>]  使用摘要
复制代码
11.3.8 ADD 命令

用来从 context 上下文复制新文件、目次或远程文件 url,并将它们添加到位于指定路径的映像文件体系中。
语法:
  1. MAINTAINER <name>
复制代码
11.3.9 COPY 命令

用来将 context 目次中指定文件复制到镜像的指定目次中。
语法:
  1. RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
  2. RUN echo hello
  3. RUN ["executable", "param1", "param2"] (exec form)
  4. RUN ["/bin/bash", "-c", "echo hello"]
复制代码
11.3.10 VOLUME 命令

用来定义容器运行时可以挂在到宿主机的目次。
语法:
  1. EXPOSE 80/tcp  如果没有显示指定则默认暴露都是tcp
  2. EXPOSE 80/udp
复制代码
11.3.11 ENTRYPOINT 命令

用来指定容器启动时实行命令和 CMD 类似。
语法:
  1. CMD ["executable","param1","param2"] (exec form, this is the preferred form)
  2. CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
  3. CMD command param1 param2 (shell form)
复制代码
11.3.11 ENTRYPOINT 命令

11.4 Dockerfile 构建 SpringBoot 项目部署

  1. WORKDIR /path/to/workdir
  2. WORKDIR /a
  3. WORKDIR b
  4. WORKDIR c
复制代码
  1. ENV <key> <value>
  2. ENV <key>=<value> ...
复制代码
  1. ADD hom* /mydir/       通配符添加多个文件
  2. ADD hom?.txt /mydir/   通配符添加
  3. ADD test.txt relativeDir/  可以指定相对路径
  4. ADD test.txt /absoluteDir/ 也可以指定绝对路径
  5. ADD url
复制代码
  1. COPY src dest
  2. COPY ["<src>",... "<dest>"]
复制代码

12. 高级网络配置

12.1 说明

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机,它会在挂载到它的网口之间举行转发。
同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。
当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通讯,容器之间也可以相互通讯。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。

12.2 Docker 网络操纵命令

  1. VOLUME ["/data"]
复制代码
  1.   ["executable", "param1", "param2"]
  2. ENTRYPOINT command param1 param2
复制代码
  1. FROM openjdk:8
  2. WORKDIR /ems
  3. ADD ems.jar /ems
  4. EXPOSE 8989
  5. ENTRYPOINT ["java","-jar"]
  6. CMD ["ems.jar"]
复制代码
12.3 容器之间使用网络通讯
  1. # 1.查询当前网络配置VOLUME ["/data"]
复制代码
  1. [root@localhost ems]# docker run -p 8989:8989 ems
复制代码
  1. http://10.15.0.8:8989/ems/login.html
复制代码
  1. [root@centos ~]# docker network create -d bridge info6e4aaebff79b1df43a064e0e8fdab08f52d64ce34db78dd5184ce7aaaf550a2f[root@centos ~]# VOLUME ["/data"][root@localhost ems]# docker run -p 8989:8989 ems6e4aaebff79b        info                bridge              local
复制代码
  1. docker network create -d bridge 网桥名称
复制代码
  1. docker network rm 网桥名称
复制代码
13. 高级数据卷配置

13.1 说明

数据卷是一个可供一个或多个容器使用的特别目次,它绕过 UFS,可以提供很多有用的特性:
留意:数据卷 的使用,类似于 Linux 下对目次或文件举行 mount,镜像中的被指定为挂载点的目次中的文件会复制到数据卷中(仅数据卷为空时会复制)。
13.2 数据卷操纵命令

  1. # 1.查询当前网络配置
  2. docker network ls
复制代码
  1. NETWORK ID          NAME                DRIVER              SCOPE
  2. 8e424e5936b7        bridge              bridge              local
  3. 17d974db02da        docker_gwbridge     bridge              local
  4. d6c326e433f7        host                host                local
复制代码
  1. # 2.创建桥接网络
  2. docker network create -d bridge info
复制代码
  1. [root@centos ~]# docker network create -d bridge info
  2. 6e4aaebff79b1df43a064e0e8fdab08f52d64ce34db78dd5184ce7aaaf550a2f
  3. [root@centos ~]# docker network ls
  4. NETWORK ID          NAME                DRIVER              SCOPE
  5. 8e424e5936b7        bridge              bridge              local
  6. 17d974db02da        docker_gwbridge     bridge              local
  7. d6c326e433f7        host                host                local
  8. 6e4aaebff79b        info                bridge              local
复制代码
14. Docker Compose

14.1 简介

Docker Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。
其代码目前在 https://github.com/docker/compose 上开源。
Docker Compose 定位是定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications),其前身是开源项目 Fig.
通过前面的介绍,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,常常会遇到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,每每还需要再加上后端的数据库服务容器,乃至还包罗负载均衡容器等。
Docker Compose 恰好满意了如许的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker Compose 中有两个重要的概念:
Docker Compose 的默认管理对象是项目,通过子命令对项目中的一组容器举行便捷地生命周期管理。
Docker Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器举行管理。因此,只要所操纵的平台支持 Docker API,就可以在其上使用 Docker Compose 来举行编排管理。
14.2 安装与卸载


在 Linux 上的也安装十分简单,从官方 GitHub Release 处直接下载编译好的二进制文件即可。例如,在 Linux64 位体系上直接下载对应的二进制包。
  1. # 3.启动容器指定使用网桥
  2. docker run -d -p 8890:80 --name nginx001 --network info nginx
  3. docker run -d -p 8891:80 --name nginx002 --network info nginx
  4. 注意:一旦指定网桥后--name 指定名字就是主机名,多个容器指定在同一个网桥时,可以在任意一个容器中使用主机名与容器进行互通。
复制代码
Docker Compose 可以通过 Python 的包管理工具 pip 举行安装,也可以直接下载编译好的二进制文件使用,乃至能够直接在 Docker 容器中运行。
Docker Desktop for Mac/Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用。
  1. [root@centos ~]# docker run -d -p 8890:80 --name nginx001 --network info nginx
  2. c315bcc94e9ddaa36eb6c6f16ca51592b1ac8bf1ecfe9d8f01d892f3f10825fe
  3. [root@centos ~]# docker run -d -p 8891:80 --name nginx002 --network info nginx
  4. f8682db35dd7fb4395f90edb38df7cad71bbfaba71b6a4c6e2a3a525cb73c2a5
  5. [root@centos ~]# docker ps
  6. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
  7. f8682db35dd7        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:8891->80/tcp   nginx002
  8. c315bcc94e9d        nginx               "/docker-entrypoint.…"   7 minutes ago       Up 7 minutes        0.0.0.0:8890->80/tcp   nginx001
  9. b63169d43792        mysql:5.7.19        "docker-entrypoint.s…"   7 minutes ago       Up 7 minutes        3306/tcp               mysql_mysql.1.s75qe5kkpwwttyf0wrjvd2cda
  10. [root@centos ~]# docker exec -it f8682db35dd7 /bin/bash
  11. root@f8682db35dd7:/# curl http://nginx001
  12. <!DOCTYPE html>
  13. <html>
  14. <head>
  15. <title>Welcome to nginx!</title>
  16. .....
复制代码
如果是二进制包方式安装的,删除二进制文件即可。
  1. [root@centos ~]# docker volume create my-vol
  2. my-vol
复制代码
  1. [root@centos ~]# docker volume inspect my-vol
  2. [
  3.     {
  4.         "CreatedAt": "2020-11-25T11:43:56+08:00",
  5.         "Driver": "local",
  6.         "Labels": {},
  7.         "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
  8.         "Name": "my-vol",
  9.         "Options": {},
  10.         "Scope": "local"
  11.     }
  12. ]
复制代码
14.3 Docker Compose 使用

起首介绍几个术语。
最常见的项目是 Web 网站,该项目应该包罗 Web 应用和缓存。
参考文档:https://docker_practice.gitee.io/zh-cn/compose/compose_file.html
  1. [root@centos ~]# docker run -d -P --name web  -v my-vol:/usr/share/nginx/html  nginx
  2. [root@centos ~]# docker inspect web
  3.                                 "Mounts": [
  4.             {
  5.                 "Type": "volume",
  6.                 "Name": "my-vol",
  7.                 "Source": "/var/lib/docker/volumes/my-vol/_data",
  8.                 "Destination": "/usr/share/nginx/html",
  9.                 "Driver": "local",
  10.                 "Mode": "z",
  11.                 "RW": true,
  12.                 "Propagation": ""
  13.             }
  14.         ],
复制代码
参考文档:https://docker_practice.gitee.io/zh-cn/compose/commands.html
  1. docker volume rm my-vol
复制代码
14.4 docker-compose 模板文件

模板文件是使用 Docker Compose 的核心,涉及到的指令关键字也比力多。但各人不消担心,这里面大部门指令跟 docker run 相关参数的含义都是类似的。
默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。
  1. curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  2. chmod +x /usr/local/bin/docker-compose
复制代码
留意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。
如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中重复设置。
下面分别介绍各个指令的用法。
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,大概相对 docker-compose.yml 文件的路径)。Docker Compose 将会使用它自动构建这个镜像,然后使用这个镜像。
  1. curl -L https://raw.githubusercontent.com/docker/compose/1.25.5/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
复制代码
也可以使用 context 指令指定 Dockerfile 所在文件夹的路径。
使用 dockerfile 指令指定 Dockerfile 文件名。
使用 arg 指令指定构建镜像时的变量。
  1. rm /usr/local/bin/docker-compose
复制代码
覆盖容器启动后默认实行的命令。
  1. docker-compose --version
复制代码
指定容器名称。默认将会使用 项目名称_服务名称_序号 如许的格式。
  1. version: "3.0"
  2. services:
  3.   mysqldb:
  4.     image: mysql:5.7.19
  5.     container_name: mysql
  6.     ports:
  7.       - "3306:3306"
  8.     volumes:
  9.       - /root/mysql/conf:/etc/mysql/conf.d
  10.       - /root/mysql/logs:/logs
  11.       - /root/mysql/data:/var/lib/mysql
  12.     environment:
  13.       MYSQL_ROOT_PASSWORD: root
  14.     networks:
  15.       - ems
  16.     depends_on:
  17.       - redis
  18.   redis:
  19.     image: redis:4.0.14
  20.     container_name: redis
  21.     ports:
  22.       - "6379:6379"
  23.     networks:
  24.       - ems
  25.     volumes:
  26.       - /root/redis/data:/data
  27.     command: redis-server
  28. networks:
  29.   ems:
复制代码
留意: 指定容器名称后,该服务将无法举行扩展(scale),因为 Docker 不允许多个容器具有相同的名称。

解决容器的依赖、启动先后的题目。以下例子中会先启动 redis、db 再启动 web.
  1. # 前台启动一组服务
  2. docker-compose up
  3. # 后台启动一组服务
  4. docker-compose up -d
复制代码
留意:web 服务不会等待 redis db 「完全启动」之后才启动。

从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 docker-compose -f FILE 方式来指定 Docker Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径。
如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。
  1. version: "3"
  2. services:
  3.   webapp:
  4.     image: examples/web
  5.     ports:
  6.       - "80:80"
  7.     volumes:
  8.       - "/data"
复制代码
环境变量文件中每一行必须符及格式,支持 # 开头的解释行。
  1. version: '3'
  2. services:
  3.   webapp:
  4.     build: ./dir
复制代码
设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取运行 Docker Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
  1. version: '3'
  2. services:
  3.   webapp:
  4.     build:
  5.       context: ./dir
  6.       dockerfile: Dockerfile-alternate
  7.       args:
  8.         buildno: 1
复制代码
如果变量名称大概值中用到 true|false,yes|no 等表达 布尔 含义的词汇,最好放到引号里,避免 YAML 自动解析某些内容为对应的布尔语义。这些特定词汇,包罗
  1. command: echo "hello world"
复制代码
通过命令查抄容器是否健康运行。
  1. container_name: docker-web-container
复制代码
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Docker Compose 将会尝试拉取这个镜像。
  1. version: '3'
  2. services:
  3.   web:
  4.     build: .
  5.     depends_on:
  6.       - db
  7.       - redis
  8.   redis:
  9.     image: redis
  10.   db:
  11.     image: postgres
复制代码
配置容器连接的网络。
  1. env_file: .env
  2. env_file:
  3.   - ./common.env
  4.   - ./apps/web.env
  5.   - /opt/secrets.env
复制代码
暴露端口信息。
使用宿主端口:容器端口 (HOST:CONTAINER) 格式,大概仅仅指定容器的端口(宿主将会随机选择端口)都可以。
  1. # common.env: Set development environment
  2. PROG_ENV=development
复制代码
留意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种题目,发起数字串都采用引号包罗起来的字符串格式。
配置容器内核参数。
  1. environment:
  2.   RACK_ENV: development
  3.   SESSION_SECRET:
  4. environment:
  5.   - RACK_ENV=development
  6.   - SESSION_SECRET
复制代码
指定容器的 ulimits 限定值。
例如,指定最大历程数为 65535,指定文件句柄数为 20000(软限定,应用可以随时修改,不能凌驾硬限定) 和 40000(体系硬限定,只能 root 用户提高)。
  1. y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
复制代码
数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)大概数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。
该指令中路径支持相对路径。
  1. healthcheck:
  2.   test: ["CMD", "curl", "-f", "http://localhost"]
  3.   interval: 1m30s
  4.   timeout: 10s
  5.   retries: 3
复制代码
如果路径为数据卷名称,必须在文件中配置数据卷。
  1. image: ubuntu
  2. image: orchardup/postgresql
  3. image: a4bc65fd
复制代码
14.5 docker-compose 常用命令

对于 Docker Compose 来说,大部门命令的对象既可以是项目本身,也可以指定为项目中的服务大概容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
实行 docker-compose [COMMAND] --help 大概 docker-compose help [COMMAND] 可以查察具体某个命令的使用格式。
docker-compose 命令的基本的使用格式是
  1. version: "3"
  2. services:
  3.   some-service:
  4.     networks:
  5.      - some-network
  6.      - other-network
  7. networks:
  8.   some-network:
  9.   other-network:
复制代码


格式为:docker-compose up [options] [SERVICE...].


此命令将会停止 up 命令所启动的容器,并移除网络。
进入指定的容器。
列出项目中目前的所有容器。
格式为:docker-compose ps [options] [SERVICE...].
选项:-q 只打印容器的 ID 信息。
重启项目中的服务。
格式为:docker-compose restart [options] [SERVICE...].
选项:-t, --timeout TIMEOUT 指定重启前停止容器的超时(默认为 10 秒)。
删除所有(停止状态的)服务容器。推荐先实行 docker-compose stop 命令来停止容器。
格式为:docker-compose rm [options] [SERVICE...].
选项:
启动已经存在的服务容器。
格式为:docker-compose start [SERVICE...]。
停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
格式为:docker-compose stop [options] [SERVICE...].
选项:-t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
查察各个服务容器内运行的历程。
恢复处于暂停状态中的服务。
格式为 docker-compose unpause [SERVICE...].
15. Docker 可视化工具

15.1 安装 Portainer

官方安装说明:http://www.yunweipai.com/go?_=8fe4813824aHR0cHM6Ly93d3cucG9ydGFpbmVyLmlvL2luc3RhbGxhdGlvbi8=
  1. ports:
  2. - "3000"
  3. - "8000:8000"
  4. - "49100:22"
  5. - "127.0.0.1:8001:8001"
复制代码
15.2 登录和使用 Portainer

用浏览器访问:http://localhost:9000


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4