Docker入门实践一

字数 1638阅读 69

Docker出来的时间也不算短了,自己用了一段时间,主要是在开发环境搭建一些需要的组件,这篇文章只会是一个对于Java开发人员的入门Docker教程,主要目的是为了方便开发做自己想做的事情,不要在一些环境问题或者是软件安装问题上浪费过多的时间,专注于开发。

目录

  • 什么是Docker
  • Docker有什么用
  • Docker基础概念
  • Docker基础应用
    • Docker安装及配置
    • Docker容器
    • Docker镜像
    • Docker网路配置
    • DockerFile
  • Docker实践
    • Docker构建服务
    • Docker打包应用
  • Docker-compose

什么是Docker

  • Docker官网是这么解释的:Docker is the world’s leading software containerization platform.
  • 我的理解:
    • Docker是容器的封装(这里的指的是Linux容器)
    • Docker提供了简单易用的接口
  • 可以将Docker横向对比虚拟机

Docker有什么用

还是对比虚拟机,在没有Docker之前,系统运维大多是基于虚拟机,需要做一些步骤:
1. 虚拟机安装操作系统
2. 配置运行环境
3. 配置网络
4.打包应用,部署应用
5. 启动服务

有了Docker之后,可以这样:

  • 将应用和运行环境打包为镜像,通过镜像,运行容器

Docker的优点

  • 轻量级(通常在百M)
  • 容器启动快,比虚拟机要快很多
  • 需要的系统资源少(一台主机可运行成白上千容器)
  • 灵活的创建和部署

Docker基础概念

基础概念(3大核心概念)

  • 镜像
  • 容器
  • 仓库

镜像

镜像可以类比为元数据,例如虚拟机的第一台机器,或者是编程语言中的类
说到镜像,必须得说下容器,如果镜像时类(Class),那么容器就是对象实例,这样对于开发人员理解起来就好多了。

镜像的元数据:

镜像元数据
  • 镜像来自哪个仓库
  • 镜像的标签信息(版本)
  • 镜像的唯一ID
  • 创建时间
  • 镜像大小

容器

容器是镜像的运行实例,镜像是模板,实际执行或者运行的是容器,容器是真正干活的

仓库

如果用过Maven的同学,很容易理解仓库的概念,Docker仓库指的是存放镜像的地方。

Docker基础应用

出于篇幅,只讲解常用的一些应用
前提:需要了解一些Linux命令
下文中出现image-name指的是镜像名称,container-name指的是容器名称

安装Docker

以CentOS7为例(其他提供官网地址)
CentOS地址:Get Docker CE for CentOS | Docker Documentation

  • 确保安装了yum
  • 执行sudo yum install -y docker即可
  • 验证:
    • sudo docker -v
    • sudo docker info

备注:
1. 不要用root用户安装Docker
2. Docker需要sudo权限,为了避免每次执行sudo,可以将用户加入Docker组(Post-installation steps for Linux | Docker Documentation

sudo延伸阅读:第8章 Linux系统用户及用户组管理 — Linux入门教程_linux电子书 - 跟阿铭学linux(第2版)

镜像的基本操作

  • 搜索镜像:sudo docker search image-name

    搜索镜像

  • 获取镜像:sudo docker pull image-name

  • 查看本地镜像:sudo docker images

  • 删除镜像:sudo docker rmi image-name

    • 删除镜像可以根据image-name:[tag]
    • 或者是根据ID删除

备注:如果要删除镜像,最好先删除容器

容器的基本操作(常用,重要)

  • 新建并启动容器:sudo dokcer run X1 X2 X3 image-name
    • run命令会启动容器
    • X1,X2,X3表示一些参数,稍等详细说
    • 如果使用-p指定了宿主机端口,那么再次启动端口号不变,如果不指定端口号会改变
  • 常用参数
    • -d:守护态运行(-d-it在同一条命令中不能同时存在)
    • -i:让容器的标准输出打开
    • -t:让Docker分配一个伪终端,一般-t-i一块使用为-it
    • --name:给容器分配一个名称(在本地需要唯一)
    • -p:指定端口
      • 用法:-p [native-port]:[container-port],native-port是指宿主机端口号,container-port指容器端口,这里会建立一层映射,二者必须有一个
    • -P:会自动匹配端口(但是每次启动容器端口都会变化)
    • -v:挂载宿主机目录作为数据卷(后面有案例)
    • -e:指定环境参数,例如安装MYSQL是指定用户名和密码
    • --link:连接到指定容器
  • 终止容器:sudo docker stop container-name
  • 启动容器:sudo docker start container-name
  • 重新进入容器:
    • sudo dockr exec container-name
    • sudo docker attach container-name
  • 删除容器:sudo docker rm [-f] container-name
  • 查看运行中的容器:sudo docker ps
  • 查看所有容器:sudo docker ps -a
  • 查看某个容器的配置信息:sudo docker inspect container-name
配置信息

以一个命令说明下:

  • sudo docker run -d -p 3306:3306 -e MYSQL_PASS="root" -v /opt/mysqldb:/var/lib/mysql--name sail-mysql mysql
  • 启动一个mysql容器
  • 以守护状态启动
  • 宿主机端口是3306,容器端口是3306
  • 指定密码是root
  • 将mysql中/var/lib/mysql的数据挂载到宿主机路径下

数据卷

数据卷可以在容器之间共享和重用
对数据卷的修改会立马生效
对数据卷的更新不会影响镜像
卷会一直存在,直到没有容器使用

网络配置

流程
  • 用户访问宿主机IP+PORT
  • 宿主机根据启动容器时的容器映射寻找容器的端口

容器互联:在很多场景中数据库是共享的,多个Web容器都会连接到数据库容器,这样就需要容器间的互相连接

  • --link container-name:连接到容器

网络是Docker最核心也是最复杂的部分,对于开发人员来说,可以先简单的了解端口映射和容器互联即可,端口映射对于初学者来说理解上还是会有一点难度,但是理解了模型,就会好很多。

总结

这里涉及的是Docker容器的一些理论知识和基础,篇幅原因,将Dockerfile和实战放在第二部分

推荐阅读更多精彩内容