Post

认识微服务

Docker

环境配置与基本了解

Docker方面自己以前在部署AutoBangumi这个项目的时候接触过,也是在文档和朋友的帮助下成功的跑了起来,只知道按照他给的配置文件和命令一顿操作,对其是知其然而不知其所以然,为此需要进行更加系统的学习。
首先是了解了Docker最基本的三元素——镜像、容器、仓库,Docker本身只是一个容器的运行载体,而镜像是容器的模板,容器示例由Docker通过镜像文件创建,一个容器运行一种服务,一个镜像可以包含多个容器,仓库则是存放各种镜像的地方。
我在WSL上配置了阿里云镜像站的stable仓库,安装好了docker-ce,在docker run hello-world时遇到了context deadline exceeded报错的问题,总之就是镜像拉不下来,想起来早在去年六七月份国内的docker容器镜像站停用曾引起过一阵讨论,包括阿里云容器仓库的加速器也已经只对云服务器用户开放使用了,我打算用在WSL中配置网络代理的方式来解决。得知Clash For Windows也可以在Linux上运行,我尝试了在WSL上装CFW,配完后发现图形界面并不像Windows上的有系统代理按钮,改用Clash的Linux版本,发现还是不行,进网上搜索相关经验发现WSL和主机网络是互通的,但由于NAT代理IP配127.0.0.1是不会有效果的,直接配置本机IP即可,最后成功连上代理后却发现命令行仍然是走不了代理的,在/etc/docker/daemon.json中配置代理IP后终于成功拉取下来了run hello-world所需的镜像。

容器常用命令

  1. docker run [OPTIONS] IMAGE [COMMAND][ARG…]
    运行创建新容器,常用OPTIONS包括–name(为容器指定一个名称)、-i(交互模式运行容器),-t(为容器重新分配一个伪输入终端),这两者通常一并使用,所谓交互就是等待用户命令、-P(随机分配端口映射),-p(指定端口映射),以-p 8080:80为例,就是把容器内服务应用程序端口80映射到宿主机端口8080,两者进行映射才能实现容器与外界进行通信。
  2. docker ps
    列出所有容器,常用OPTIONS有-a(列出当前正在运行的和历史上运行过的容器)、-l(显示最近创建的容器)、-n(显示最近n个创建的容器)、 -q(只显示容器编号)。
  3. 容器启停相关
    容器有两种退出方式,exit以及ctrl+p+q,前者容器停止,后者容器不停止。启动已停止的容器docker start 容器ID或容器名、重启容器docker restart 容器ID或容器名、停止容器docker stop 容器ID或容器名、强制停止容器docker kill 容器ID或容器名、删除已停止的容器docker rm 容器ID
  4. 容器重要命令
    启动守护式容器(后台服务器),我们可以通过-d指定容器的后台运行模式,诸如Redis、Mysql,都应该是这种方式。需要注意的是Docker容器后台运行,必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命令,是会自动退出的,比如对于ubuntu、centos、nginx这些容器,他们后台启动的话会认为自己没事可做于是就自杀了,只能以-it来运行。
    对于容器进行监测管理还有查看容器日志docker logs 容器ID或容器名、查看容器内运行进程docker top 容器ID或容器名、查看容器内部细节docker inspect 容器ID或容器名
    想要重新进入正在运行的容器,可以通过docker exec -it 容器ID bashShell命令和docker attach 容器ID两种命令,attach直接进入容器启动命令的终端,不会启动新的进程,exit会导致容器的停止;而exec是在容器中打开新的终端,并且可以启动新的进程,exit不会导致容器的停止。更为推荐使用exec命令。
  5. 容器文件拷贝和导入导出
    容器文件拷贝docker cp 容器ID:容器内路径 目的主机路径,容器导出docker export 容器ID > tar文件名,容器导入cat tar文件 | docker import - 自定义镜像用户/自定义镜像名:自定义镜像版本号

镜像进阶

镜像:
Docker中镜像是从base镜像一层一层叠加生成的。当容器启动时,一个新的可写层将被加载到镜像的顶部,这一层通常被称为容器层,容器层之下的都叫镜像层,所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。
Docker Hub中拉取的Ubuntu镜像是轻量级的,只包含了必要核心功能,以vim为例,是不支持该命令的。我们在拉取的镜像中安装vim,再通过docker commit -m=”提交的描述信息” -a=”作者” 容器ID 要创建的目标镜像名:[tag]命令生成新的镜像,那么这个镜像就相当于是升级版的Ubuntu了。
镜像上传阿里云在阿里云官网有一套完整的命令和说明,后续个人项目的环境就打算配置一套在阿里云上,对于私有库的搭建主要是了解相关的使用方法和常规配置仓库有没有什么区别,因为后续在工作中接触的Docker相关大概也是自建私有库进行存储的。

数据卷:
卷就是目录或者文件,容器数据卷就是将容器目录和主机目录做映射,将容器中的重要数据备份+持久化到本地主机目录。数据卷能够绕过Union File System提供一些持续存储或共享数据的特性,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
要给运行的容器挂载数据卷,需要通过–privileged=true -v 宿主机绝对路径目录:容器内目录[rw | ro] 镜像名这样的OPTIONS来挂载。加上ro的话容器自己只能读不能写,但宿主机的修改可以同步到容器。
Docker中服务安装基本就是拉取镜像并运行容器的过程,但之中会出现例如tomcat目录下webapps为空,而运行所需实际内容变更到了webapps.list文件夹这中问题,需要我们手动进行修改。
而Mysql安装出现的问题就是Docker上默认字符集编码不支持我们对中文数据进行操作,且若是要对Mysql容器进行删除,我们在实际运行容器时要挂载/log、/data、/conf的容器数据卷以保证数据不丢失。挂载好后在/conf下创建my.cnf配置UTF8字符集后即可正常处理中文数据。Redis容器同样也面临着这样的问题,因此要挂载数据卷后配置redis.conf。

This post is licensed under CC BY 4.0 by the author.

Trending Tags