Docker快速入门(下)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 本文主要讲述了docker的数据卷管理,网络设置以及docker-compose的简单使用

简介

从上一篇Docker快速入门(上),我们学习和了解了docker的安装和常用的命令,也尝试了如何通过一个dockerfile文件,可以快速创建一个docker镜像文件.也了解了docker镜像的结构.

在本小节中,我们将学习到docker如何管理自己的数据和如何让外部网络访问到docker容器以及如何快速构建多个docker镜像关联.

docker的数据管理

数据卷

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

1. **数据卷**可以在容器之间共享和重用
2. 对**数据卷**的修改会立马生效
3. 对**数据卷**的更新,不会影响镜像
4. **数据卷**默认会一直存在,即使容器被删除

创建数据卷

命令 : docker volume create 自定义数据卷名称

示例 : docker volume create my-vol

查看数据卷

命令 : docker volume ls

删除数据卷

命令 : docker volume rm 数据卷名称

示例 : docker volume rm my-vol

将数据卷挂在到容器上

第一种(官方的)
命令 : docker run -itd -P --name 自定义容器名称 --mount source=数据卷名称(如:my-vol),target=/容器内部的文件夹中(如:/webapp) 镜像名:标签
示例 : docker run -d -P --name web --mount source=my-vol,target=/webapp training/webapp python app.py

第二种命令方式(常用)
命令 : docker run -itd --name 自定义容器名称 -v=数据卷名称(如:my-vol):/容器内部的文件夹中(如:/webapp) 镜像名:标签
示例 : docker run -d -P --name web -v my-vol:/wepapp python app.py

查看数据卷的具体信息

命令 : docker inspect 自定义的容器名称(如:web)

示例 : docker inspect web

docker容器数据管理

在生产环境中,关于数据卷一般采用的宿主机的文件路径,作为数据卷.用来挂载到容器上.这样做的好处是,便于更新和修改应用程序

示例 : -v 宿主机文件(/data/redis5):/容器(/var)

dockerfile共享数据卷指令

docker的网络管理

docker开放端口

对于docker里面的容器来说(也就是系统),

从系统来看是会独立的网络,同时也会有独立的ip,而如果说外部想要访问的话就需要暴露端口;

可以通过dockerfile中EXPOSE参数或者 docker run -p 的方式,如下示意图

docker开放端口命令

命令 : docker run -it -p 宿主机端口(如:81):容器端口(如:80) --name 容器名 镜像名:标签

示例 : docker run -itd -p 6379:6379 --name redis5 redis5:latest

dockerfile开放网络端口指令

指令 : EXPOSE 端口号(如:6379)
示例 : EXPOSE 6379

二者的区别

expose指令只是开放端口

用来指明容器内进程对外开放的端口,多个端口之间使用空替隔力。

运行容器通过参数-P(大写)即可将EXPOSE里所指定的端口映射到主机上另外的随机端口,容器或主机就可以通过映射后的端口与此容器通信。

同时,我们也可以通过-p (小写)参数将dockerfile中EXPOSE中没有列出的端口设置成公开的。

docker的网络模式

docker安装后,默认会创建下面三种网络类型

bridge(桥接网络)

默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变.如下图

从上面的网络模型可以看出,容器从原理上是可以与宿主机乃至外界的其他机器通信的。

同一宿主机上,容器之间都是连接掉docker0这个网桥上的,它可以作为虚拟交换机使容器可以相互通信。

然而,由于宿主机的IP地址与容器的IP地址均不在同一个网段,不足以使宿主机以外的网络主动发现容器的存在。

为了使外 界可以方位容器中的进程,docker采用了端口绑定的方式,也就是通过iptables的NAT,将宿主机上的端口端口流量转发到容器内的端口上

在宿主机上,可以通过iptables -t nat -L -n,查到一条DNAT规则:

bridge模式的容器与外界通信时,必定会占用宿主机上的端口,从而与宿主机竞争端口资源,对宿主机端口的管理会是一个比较大的问题。

同时,由于容 器与外界通信是基于三层上iptables NAT,性能和效率上的损耗是可以预见的

none

无指定网络 使用 --network=none ,docker 容器就不会分配局域网的IP

host

主机网络 使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。

例如,在容器中运行一个Web服务,监听8080端口,则主 机的8080端口就会自动映射到容器中

缺点:

1)最明显的就是容器不再拥有隔离、独立的网络栈。容器会与宿主机竞争网络栈的使用,并且容器的崩溃就可能导致宿主机崩溃,在生产环境中,这种问题可能是不被允许的。

2)容器内部将不再拥有所有的端口资源,因为一些端口已经被宿主机服务、bridge模式的容器端口绑定等其他服务占用掉了

指定自定义网络(常用)

因为默认的网络不能制定固定的地址,所以我们将创建自定义网络,并指定网段:192.168.1.0/24 并命名为mynetwork

注意:这个网络段不要和宿主机的网络端冲突,不然会容易对宿主机产生影响

命令: docker network create --subnet=网络地址端(如:192.168.1.0/24) 自定义网络名称(如: mynetwork)

示例 : docker network create --subnet=192.160.1.0/24 mynetwork

docker-compose的使用

这个工具是做什么呢?可以帮助我们快速的构建和对容器的启动以及停止等操作

介绍

Compose是 Docker 的服务编排工具,诞生主要是来帮助开发或运维人员很好地管理docker容器;减少繁琐的单个容器创建、删除等操作,比较适合组合使用多个容器进行开发的场景。

对于需要多个容器的操作,传统的方式是一个个的创建及运行,而composer则只需要通过一次性把这些命令写在docker-composer.yml文件中,以后每次启动这一整个环境的时候,只需要你只要敲一个 docker-composer up命令就ok了。

相关命令

docker-compose up -d # 启动命令
docker-compose stop
docker-compose down

具体请参考这篇文章(https://www.cnblogs.com/minseo/p/11548177.html)

安装

#下载安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#修改权限
chmod +x /usr/local/bin/docker-compose
#安装完成后可以查看版本
docker-compose --version

使用

docker-compose的默认模版文件为: docker-compose.yml。

和Dockerfile一样,它也是有自己的语法命令的。

其中定义的每个服务都必须通过image指令指定镜像或build指令(需要Dockerfile)来自动构建。

其它大部分指令都跟docker run中的类似。

需要注意的是docker-composer运用的时候一定要注意版本的问题,如下图显示

示例

每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。 image 指定镜像tag或者ID

# 编排php,redis,nginx容器
version: "3.6" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
  nginx: # 这个表示服务的名称,课自定义; 注意不是容器名称
    build: # 根据dockerfile构建镜像及构建为容器
      context: ./nginx
    image: nginx # 指定容器的镜像文件
    container_name: nginx_compose # 这是容器的名称
    ports: # 配置容器与宿主机的端口
      - "82:80"
    networks: ## 引入外部预先定义的网段
      lrnp:
        ipv4_address: 172.100.100.110 #设置ip地址
    privileged: true # 执行特殊权限的命令
    volumes: # 配置数据挂载
      - /www/wwwroot/2007_SRM/00-1/lrnp/nginx/conf:/conf
    working_dir: /conf #工作目录
  php: # 这个表示服务的名称,课自定义; 注意不是容器名称
    build: # 根据dockerfile构建镜像及构建为容器
      context: ./php
    image: php7 # 指定容器的镜像文件
    container_name: php_compose # 这是容器的名称
    ports: # 配置容器与宿主机的端口
      - "9002:9000"
    networks: ## 引入外部预先定义的网段
      lrnp:
        ipv4_address: 172.100.100.120 #设置ip地址
    volumes: # 配置数据挂载
      - /www/wwwroot/2007_SRM/00-1/lrnp/php/www:/www
  redis: # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: redis5asm # 指定容器的镜像文件
    networks: ## 引入外部预先定义的网段
      lrnp:
        ipv4_address: 172.100.100.130 #设置ip地址
    container_name: redis_compose # 这是容器的名称
    ports: # 配置容器与宿主机的端口
      - "6380:6379"
    volumes: # 配置数据挂载
      - /www/wwwroot/2007_SRM/00-1/lrnp/redis:/redis
    # command: top

# 设置网络模块
networks:
  # 使用之前定义的网络
  lrnp:
    external:
      name: lrnp
# 自定义网络
# nginx_net:
# driver: bridge
# ipam: #定义网段
# config:
# - subnet: "172.15.22.0/24"

小结

在本小节中,我们学习了docker如何管理它自己的数据.即通过创建数据卷或者跟宿主机文件夹进行挂在关联.

也知道了如何让外部网络访问到docker,即通过开放端口.

也明白了如何让各个容器进行互联互通,是通过自定义网络段来进行内部互通.

最后,为了能更快速的管理多个docker镜像/容器,我们也学习docker-compose,用来管理

参考资料

<<docker从入门到实践>>

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
13天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
55 2
|
1月前
|
Kubernetes Cloud Native 云计算
云原生入门:从Docker到Kubernetes的旅程
【10月更文挑战第2天】本文将带你走进云原生的世界,从基础的Docker容器技术开始,逐步深入到Kubernetes集群管理。我们将通过实际代码示例,探索如何利用这些工具构建、部署和管理现代云应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和技能,让你在云原生领域迈出坚实的一步。
87 5
|
1月前
|
Linux 持续交付 Docker
掌握Docker:从入门到实践
Docker 是一个开源容器引擎,允许开发者将应用及其依赖打包成可移植的容器,在任意 Linux 机器上运行。本文从基本概念入手,详细介绍 Docker 的安装、基本操作、镜像构建及 Docker Compose 的使用,并通过实战案例展示如何部署 Web 应用、构建微服务架构及实现 CI/CD。通过学习,你将掌握 Docker 的核心功能,提升应用开发和部署效率。
|
7天前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
15天前
|
Cloud Native 持续交付 Docker
Docker容器化技术:从入门到实践
Docker容器化技术:从入门到实践
|
21天前
|
运维 持续交付 虚拟化
docker入门详解!!!
本文介绍了容器技术的发展历程,从物理机到虚拟化再到容器化,重点讲解了Docker的诞生及其优势。Docker通过轻量级的容器技术,实现了资源的高效利用、快速启动、环境一致性、持续交付和部署等优点。文章还详细解析了Docker的架构和工作原理,包括Docker Daemon、REST接口、Docker Client等组件,以及容器与虚拟机的差异。
57 2
|
28天前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
42 3
|
1月前
|
Ubuntu Shell 开发者
Docker入门:轻松开始容器化之旅
【10月更文挑战第17天】Docker 是一种开源的应用容器引擎,它让开发者能够“一次构建、到处运行”。Docker 通过容器化技术将应用程序及其依赖打包在一起,从而确保应用在任何环境中都能一致地运行。本文将为新手用户提供一个全面的Docker入门指南,包括基本概念、优势、安装配置以及如何创建和管理容器。
46 2
|
1月前
|
存储 运维 云计算
探索Docker容器化:从入门到实践
在这个快速发展的云计算时代,Docker容器化技术正在改变应用的开发、部署和管理方式。本文旨在为初学者提供一个关于Docker的全面入门指南,并通过实践案例展示Docker在实际开发中的应用。我们将一起了解Docker的核心概念、基本操作、网络和存储,以及如何构建和部署一个简单的Web应用。无论你是开发者还是运维人员,本文都会帮助你快速掌握Docker的核心技能。
|
1月前
|
Kubernetes Cloud Native Docker
云原生入门:Kubernetes和Docker的协同之旅
【10月更文挑战第4天】在这篇文章中,我们将通过一次虚拟的旅行来探索云原生技术的核心——Kubernetes和Docker。就像乘坐一艘由Docker驱动的小船启航,随着波浪(代码示例)起伏,最终抵达由Kubernetes指挥的宏伟舰队。这不仅是一段技术上的旅程,也是理解现代云架构如何支撑数字世界的冒险。让我们扬帆起航,一探究竟!
下一篇
无影云桌面