当前位置: 代码迷 >> 综合 >> 数据卷、YAML、Dockerfile 与 Docker-Compose
  详细解决方案

数据卷、YAML、Dockerfile 与 Docker-Compose

热度:68   发布时间:2023-11-26 17:22:47.0

基础命令:

启动 docker 服务:
[root@localhost ~]# systemctl start docker && systemctl enable docker下载镜像:
[root@localhost ~]# docker pull 10.9.10.232:5000/redis:5.0.4查看本地的镜像:
[root@localhost ~]# docker images镜像重命名:
docker tag IMAGEID 新镜像名称:新标签
[root@localhost ~]# docker tag 4842 centos7:1.0
docker tag 镜像名:tag 新镜像名称:新标签
[root@localhost ~]# docker tag hello-world:latest hello-world:1.1运行 docker:
[root@localhost ~]# docker run -itd -p 6379:6379 redis:5.0.4 4161e91dcc29查看 docker 的进程:
[root@localhost ~]# docker ps
查看 docker 的所有进程:
[root@localhost ~]# docker ps -a开启 docker 的进程:
[root@localhost ~]# docker start a4ce2dcf6cc9
重启 docker 的进程:
[root@localhost ~]# docker restart a4ce2dcf6cc9停止指定 docker 进程:
[root@localhost ~]# docker stop d854a73518fb 28c29de4c487删除 docker 实例:
[root@localhost ~]# docker rm a4ce2dcf6cc9redis 客户端连接命令:
[root@localhost ~]# docker exec -it 95abb7fb1e74 redis-cli

 

数据卷:

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

数据卷 可以在容器之间共享和重用;

对 数据卷 的修改会立马生效;

对 数据卷 的更新,不会影响镜像;

数据卷 默认会一直存在,即使容器被删除。

注意:数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷。

  • 选择 -v 还是 -–mount 参数:

Docker 新用户应该选择 --mount 参数,经验丰富的 Docker 使用者对 -v 或者 --volume 已经很熟悉了,但是推荐使用 --mount 参数。

  • 创建一个数据卷:
$ docker volume create my-vol
  • 查看所有的数据卷:
$ docker volume lslocal             my-vol
  • 在主机里使用以下命令可以查看指定的数据卷信息:
$ docker volume inspect my-vol
[{"Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/my-vol/_data","Name": "my-vol","Options": {},"Scope": "local"}
]
  • 启动一个挂载数据卷的容器:

在用 docker run 命令的时候,使用 --mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中可以挂载多个 数据卷

创建一个名为 web 的容器,并加载一个 数据卷 到容器的 /webapp 目录:

$ docker run -d -P \--name web \# -v my-vol:/wepapp \--mount source=my-vol,target=/webapp \training/webapp \python app.py
  • 查看数据卷的具体信息:

在主机里使用以下命令可以查看 web 容器的信息:

$ docker inspect web
  • 数据卷 信息在 "Mounts" Key 下面:
"Mounts": [{"Type": "volume","Name": "my-vol","Source": "/var/lib/docker/volumes/my-vol/_data","Destination": "/app","Driver": "local","Mode": "","RW": true,"Propagation": ""}
],
  • 删除数据卷:
$ docker volume rm my-vol

数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。

无主的数据卷可能会占据很多空间,要清理请使用以下命令:

$ docker volume prune

 

YAML:

YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。

YAML 语言的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。它的基本语法规则如下:

1、大小写敏感;

2、使用缩进表示层级关系;

3、缩进时不允许使用Tab键,只允许使用空格。

缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

# 表示注释,从这个字符一直到行尾,都会被解析器忽略。

  • YAML 支持的数据结构有三种:

对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

纯量(scalars):单个的、不可再分的值

  • 对象

对象的一组键值对,使用冒号结构表示:

animal: pets
  • 数组:

一组连词线开头的行,构成一个数组:

- Cat
- Dog
- Goldfish

数据结构的子成员是一个数组,则可以在该项下面缩进一个空格:

- Array- Cat- Dog- Goldfish
  • 复合结构:

对象和数组可以结合使用,形成复合结构:

languages:- Ruby- Perl- Python 
websites:YAML: yaml.org Ruby: ruby-lang.org Python: python.org Perl: use.perl.org 
  •  纯量:

纯量是最基本的、不可再分的值。以下数据类型都属于 JavaScript 的纯量:

字符串、布尔值、整数、浮点数、Null、时间、日期

 

Dockerfile:

我们可以把刚才的对容器的所有操作命令都记录到一个文件里,就像写脚本程序,之后用 docker build 命令以此文件为基础制作一个镜像,并会自动提交到本地仓库。这样的话镜像的构建会变的透明化,维护也更加简单,只修改这个文件即可,同时分享也更加简单快捷,因为只要分享这个文件即可。 

FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]

 

Docker Compose:

Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。其代码目前在 https://github.com/docker/compose 上开源。

Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。

使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷的生命周期管理。

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

Compose 支持 Linux、macOS、Windows 10 三大平台。

Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。

前两种方式是传统方式,适合本地环境下安装使用;最后一种方式则不破坏系统环境,更适合云计算场景。

Docker for MacDocker for Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用。

$ docker-compose --versiondocker-compose version 1.25.0-rc1, build 8552e8e2

 Linux 系统请使用以下介绍的方法安装:

  • 二进制包:

在 Linux 上的安装也十分简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。

例如,在 Linux 64 位系统上直接下载对应的二进制包。

$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
  • PIP 安装:

注: x86_64 架构的 Linux 建议按照上边的方法下载二进制包进行安装,如果您计算机的架构是 ARM (例如,树莓派),再使用 pip 安装。这种方式是将 Compose 当作一个 Python 应用来从 pip 源中安装。执行安装命令:

$ sudo pip install -U docker-compose

可以看到类似如下输出,说明安装成功:

Collecting docker-composeDownloading docker-compose-1.17.1.tar.gz (149kB): 149kB downloaded
...
Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress
  •  容器中执行(安装):
$ curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

它其实是下载了 docker/compose 镜像并运行 。

  • 卸载:
如果是二进制包方式安装的,删除二进制文件即可。
$ sudo rm /usr/local/bin/docker-compose
如果是通过 `pip` 安装的,则执行如下命令即可删除。
$ sudo pip uninstall docker-compose
  • 使用:
前台运行:
docker-compose up
后台运行:
docker-compose up -d启动:
docker-compose start停止:
docker-compose stop停止并移除容器:
docker-compose down

 

基于 Docker 安装 Tomcat:

version: '3.1'
services:tomcat:restart: alwaysimage: tomcatcontainer_name: tomcatports:- 8080:8080volumes:- /usr/local/docker/tomcat/webapps/test:/usr/local/tomcat/webapps/testenvironment:TZ: Asia/Shanghai

 

基于 Docker 安装 MySQL:

  • MySQL5:
version: '3.1'
services:mysql:restart: alwaysimage: mysql:5.7.22container_name: mysqlports:- 3306:3306environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123456command:--character-set-server=utf8mb4--collation-server=utf8mb4_general_ci--explicit_defaults_for_timestamp=true--lower_case_table_names=1--max_allowed_packet=128M--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"volumes:- mysql-data:/var/lib/mysql
  • MySQL8:
version: '3.1'
services:db:image: mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: 123456command:--default-authentication-plugin=mysql_native_password--character-set-server=utf8mb4--collation-server=utf8mb4_general_ci--explicit_defaults_for_timestamp=true--lower_case_table_names=1ports:- 3306:3306volumes:- ./data:/var/lib/mysqladminer:image: adminerrestart: alwaysports:- 8080:8080

 

基于 Docker 安装 Nexus:

  • Maven:

版本策略(Version Policy):1、Release:正式版本             2、Snapshot:快照版本             3、Mixed:混合模式

宿主仓库(Hosted Repository):存储本地上传的组件和资源,如:maven-releases、maven-snapshots、nuget-hosted

仓库组(Repository Group):通常包含了多个代理仓库和宿主仓库,在项目中只要引入仓库组就可以下载到代理仓库和宿主仓库中的包

  • 安装:
version: '3.1'
services:nexus:restart: alwaysimage: nexus3:latestcontainer_name: nexusports:- 8081:8081volumes:- /usr/local/docker/nexus/data:/nexus/data
  • 启动时如果出现权限问题可以使用:
chmod 777 /usr/local/docker/nexus/data赋予数据卷目录可读可写的权限 
  • 登录控制台验证安装:
地址:http://ip:port/
用户名:admin
密码:admin123

 

  相关解决方案