Docker从入门到掉坑(一):Docker从入门到掉坑

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Docker从入门到掉坑(一):Docker从入门到掉坑

Docker 介绍


简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器。但是docker本身和虚拟机还是有较为明显的出入的。我大致归纳了一下,可以总结为以下几点:


网络异常,图片无法展示
|


docker自身也有着很多的优点,关于它的优点,可以总结为以下几项:


网络异常,图片无法展示
|


安装docker


从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。


Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。

首先我们需要移除旧的docker版本:


$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
复制代码


接着我们需要安装一些必要的系统工具:


sudo yum install -y yum-utils device-mapper-persistent-data lvm2
复制代码


接下来我们需要添加软件源信息:


sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
复制代码


更新 yum 缓存:


sudo yum makecache fast
复制代码


验证容器


上边的操作都是一些准备操作,如果步骤过程中没有出现什么异常的话,后边就可以安装docker了


sudo yum -y install docker-ce
复制代码


安装完毕之后便是开启docker后台服务步骤:


sudo systemctl start docker
复制代码


当我们的docker镜像下载完毕之后,默认会有个helloworld的镜像用于测试:


测试运行 hello-world


[root@runoob ~]# docker run hello-world
复制代码


由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。


关于docker的镜像和容器介绍


容器的本质就是进程,不同的容器有着自己独立的root文件系统,网络配置,一个隔离的空间。容器一旦消失,则里面包含的数据也会发生丢失。容器里面所有的存储信息都应该使用数据卷或者其他形式。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。


Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。


docker安装nginx


初步安装完了docker之后便开始进入一些实战环节吧


首先我们需要在docker里面pull相关的nginx镜像:


一开始宿主机并没有启动docker容器,需要启动docker服务


service docker start
复制代码


然后pull镜像下来,并且启动


docker run -d -p 80:80 --restart=always nginx:latest
复制代码


参数讲解:-d 后台启动 -p 宿主机的80端口映射容器的80端口。测试一下相关页面,成功则如下图:


网络异常,图片无法展示
|


接下来我们可以查看一下镜像标签


docker images
复制代码


这个命令查询出来的知识镜像的id,但是我们无法根据镜像id进入容器中,进入容器需要有容器的id才可以:


于是可以通过这个命令来查看容器的id:


docker ps
复制代码


然后进入容器修改信息


进入容器的命令有很多种,这里推荐可以使用这种类型:


docker exec -it 999318c7d567 /bin/bash
复制代码


通过选择相应的tag-id进入容器,进入到容器里面之后,会发现里面仿佛就是一个新的linux操作系统:


网络异常,图片无法展示
|


如何关闭docker容器?


比较简单,这里不多说,自己操作就懂了


docker kill 4591552a4185
复制代码


文件拷贝


懂得了基本的docker容器操作之后,我们来试试如何上传文件到docker容器中,这个需要和宿主机进行文件交换才可以。


首先我们需要拿到容器id的全称:


[root@localhost html]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
0d4173ecf31f        nginx:latest        "nginx -g 'daemon of…"   9 minutes ago       Up 9 minutes        0.0.0.0:80->80/tcp   sleepy_gould
[root@localhost html]# docker inspect -f '{{.Id}}' 0d4173ecf31f
0d4173ecf31f894e234ae9eb3d9eddd1b9d10b7af5c46608679fe11918af9644
复制代码


然后将文件拷贝进入docker容器中:


[root@localhost html]# docker cp /opt/html/user_login.html 0d4173ecf31f894e234ae9eb3d9eddd1b9d10b7af5c46608679fe11918af9644:/root/user_login.html
[root@localhost html]#
复制代码


接下来的操作就比较简单了,查看到移动的页面即可:


root@0d4173ecf31f:/usr/share/nginx/html# ls
50x.html  index.html  user_login.html
root@0d4173ecf31f:/usr/share/nginx/html#
复制代码


接下来的基本都是常规操作了,进入我们的nginx配置中:


root@0d4173ecf31f:/etc/nginx# vi nginx.conf 
bash: vi: command not found
root@0d4173ecf31f:/etc/nginx#
复制代码


发现没有vi命令,需要下载安装


在使用docker容器时,有时候里边没有安装vi,敲vi命令时提示说:vi: command not found,这个时候就需要安装vi,可是当你敲apt-get install vi命令时,提示:


Reading package lists... Done  
Building dependency tree         
Reading state information... Done  
E: Unable to locate package vi
复制代码


这时候需要敲:apt-get update,这个命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。等更新完毕以后再敲命令:apt-get install vi命令即可。


现在docker有了,nginx镜像也开启了,就可以对nginx的配置做修改了。


docker里面安装redis


首先还是老规矩,pull镜像


[root@izwz9ic9ggky8kub9x1ptuz docker]# docker pull redis:4.0
复制代码


拉取镜像结束之后,内容如下:


[root@izwz9ic9ggky8kub9x1ptuz docker]# docker pull redis:4.0
4.0: Pulling from library/redis
b8f262c62ec6: Pull complete 
93789b5343a5: Pull complete 
49cdbb315637: Pull complete 
e244975d5eb1: Pull complete 
25dca704d939: Pull complete 
db11ecc9cf34: Pull complete 
Digest: sha256:615b872e3af387206b62ffe66c1052f1653ed31b3afcfaa292a9244c92f2007a
Status: Downloaded newer image for redis:4.0
docker.io/library/redis:4.0
复制代码


ok,基本镜像有了,那么就直接开启容器吧


这里我们修改了宿主机的端口号为8879映射容器里面的6379哈。


[root@izwz9ic9ggky8kub9x1ptuz /]# 
docker run -p 8879:6379 
-v $PWD/data:/data  
-v $PWD/conf/redis.conf:/etc/redis/redis.conf  
--privileged=true
--name myredis 
-d redis:4.0 redis-server /etc/redis/redis.conf
复制代码


参数解释


-p 8879:8879: 将容器的8879端口映射到主机的6379端口

-v $PWD/data:/data : 将主机中当前目录下的data挂载到容器的/data

redis-server —appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置


启动完毕之后,一切都开始正常运行了。


进入容器,开始检测redis是否正常:


这里建议开启redis的时候最好在宿主机做一份redis配置文件,映射到容器里面,不然进入容器中根本找不到相应的redis配置文件,很痛苦。


docker里面安装MySQL


这部分的内容比较简单,只需要将镜像拉去下来即可:


docker run --name 【容器名】 -e MYSQL_ROOT_PASSWORD=【mysql密码】 -d -i -p 3309:3306 mysql:5.7.24
复制代码


然后等待一段时间:


终于我们的MySQL容器安装好了:


网络异常,图片无法展示
|


容器的内存资源消耗情况


由于我购买的是一台小型的服务器,相关的配置如下所示,所以在给各个运行的容器进

行资源分配的时候需要考虑到每个docker容器占用的资源情况。


网络异常,图片无法展示
|


目前已经搭建了mysql容器,redis容器,还有一个nginx容器,如果再添加一个java应用的话,目测跑java容器需要至少500m左右的内存大小来支撑。


通过使用docker stats命令来看当前服务器的内存,由于平日的访问量并不高,可以给当前的mysql,redis分配小一些内存资源:


网络异常,图片无法展示
|


这时候可以采用docker的update命令来对内存大小进行管理分配:


docker update -m 350m  --memory-swap -1  mysqlserver
复制代码


–memory-swap -1 参数是指不让容器和宿主机进行内存交换,如果需要则需要额外调整,


设置下内存的限制之后结果如下:

网络异常,图片无法展示
|


docker容器启动失败分析实战


在配置docker新容器的时候,例如说给mysql配置my.cnf文件的某些属性,需要重启容器才能生效。但是有时候可能因为手误,导致配置出现异常,容器重启失败,这个时候该怎么办呢?


这个时候最简单粗暴的方式就是,将该容器先rm掉,然后重新安装,但是这样的操作过于暴力化,万一容器里面还有其他重要数据,直接rm操作不可取。


其实docker本质也是安装在宿主机里面的,所以相应的配置文件在宿主机里面也能找到痕迹,这里记录了之前我掉坑的一些补救方式:


docker inspect [容器名称]
复制代码


通过该命令可以查看到容器的内部配置属性信息:


网络异常,图片无法展示
|


这时候我们可以查看到一个叫做MergedDir的目录文件夹,进入该文件夹的上一级目录,


cd /var/lib/docker/overlay2/f4ab9eff7a18f20f977595af38f5eb273127e0de8845a42fe71fa9b8850a988b
复制代码


接着我们查看该目录下结构,会发现一个叫做diff的文件夹


网络异常,图片无法展示
|


带着好奇心,一步一步地进入到文件夹的内部,就会找到之前在docker容器中配置的mysql文件了,手动将原先的配置修改回来,容器便重启成功了。


网络异常,图片无法展示
|

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