Docker 基础

Posted by Beyonderwei on 2020-01-20
Words 3.6k and Reading Time 14 Minutes
Viewed Times

一、Docker概述

1. 简介

基于Go语言实现的云开源项目。理念:Build,Ship and Run Any App Anywhere缩小版的Linux系统。

2. 为什么使用Docker

解决了运行环境和配置问题的软件容器,方便做持续的集成并有助于整体发布的容器虚拟化技术。

  • Docker用来解决开发和运维之间配置环境、运行环境、操作系统、运行依赖包等不同导致的项目部署后无法运行的问题,因此将工程与工程运行所需的配置等一起打包成一个镜像。
  • 解决集群项目中,如果同一个项目需要再多台机器上部署时需要反复配置的问题。
  • 一次构建,处处运行。(类似于Java虚拟机的概念)

2. 与虚拟机对比

  • 虚拟机:虚拟出一套硬件以后,在其上运行一套完整的操作系统(在宿主机OS上运行虚拟机OS),在该系统上运行所需的应用进程。(资源占用多,启动慢,冗余步骤多)
  • Docker:容器内的应用使用的是宿主机的内核,没有硬件虚拟,容器之间相互隔离,每个容器有自己的文件系统,容器间不会相互影响。

3. Docker的三大特征(重要)

4. 理解Docker

  • 蓝色的海:宿主机系统
  • 鲸鱼:Docker
  • 集装箱:容器实例 (实例来自于镜像)

二、Ubuntu安装Docker

  1. 安装必要的系统工具
1
sudo apt install apt-transport-https ca-certificates curl software-properties-common
  1. 将Docker存储库添加到APT源:

①. 官方的源

1
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

②. 阿里的源

1
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  1. 将官方Docker存储库的GPG密钥添加到系统:

①. 官方的GPG证书

1
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

②. 阿里的GPG证书

1
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  1. 确保从Docker repo 安装docker
1
apt-cache policy docker-ce
  1. 安装Docker(社区版)
1
sudo apt-get install -y docker-ce
  1. 查看docker版本
1
docker -v
  1. 启动Docker
1
sudo systemctl status docker
  1. 由于从国外的网站拉镜像比较慢,因此国内如阿里云提供了容器镜像服务(如果不使用国内的镜像服务也没关系)。注册阿里云账号后,一般进入控制台/产品与服务/容器镜像服务/镜像加速器(第一次进入会让你设置一个Rigistry密码)。然后就可以看到你的专属加速器地址和配置使用方法(根据系统按照操作文档中的命令运行即可)。

  1. 查看Docker所使用的源##
1
docker info|grep Mirrors -A 1

三、Docker常用命令

docker [OPTION] COMMAND

帮助命令

  1. docker version 查看docker版本
  2. docker info docker的详细信息
  3. docker —help 查看Docker的帮助信息

镜像命令

  1. docker images 列出本地所有的镜像
    • -a 列出本地所有的镜像,(含中间层)
    • -q 只显示镜像的ID
    • -qa 所有镜像的ID
    • —digests 列出所有镜像,带有镜像的摘要信息
    • —no-trunc 没有截取显示所有信息(如查看完整ID)
  2. docker search 镜像名字(是从docker hub上查询的)
    • -s 查询出点赞数超过50的镜像(docker search -s 50 tomcat)
    • —no-trunc 没有截取显示所有信息(可以看到完整的Description)
  3. docker pull 镜像名字 (下载镜像,默认最新版本 :latest )
    • :5.6 拉取相应版本的镜像(docker pull :5.6)
  4. docker rmi 镜像名(删除镜像remove images)
    • -f 强制删除镜像
    • 镜像名 镜像名 删除多个镜像(docker rmi hello-word tomcat)
    • $(docker images -qa) 删除所有镜像 docker rmi -f $(docker images -qa)

容器命令

  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG…] 启动容器

    • -i: 以交互模式运行容器,通常与 -t 同时使用

    • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用(-it)

    • —name=”容器新名字”: 为容器指定一个名称;

    • -d: 后台运行容器,并返回容器ID,也即启动守护式容器;

    • -P: 随机端口映射;

    • -p: 指定端口映射

      例如:docker run -it -p 8090:8080 tomcat Docker运行tomcat tomcat的8080端口映射到8090,实际向外暴露的8090端口。

  2. docker ps 正在运行的容器

    • -l 上一个运行的容器
    • -a 运行过的所有容器
    • -n n是一个数字,列出最近运行出的n个容器
    • -q 只显示容器的编号(ID)用于批量删除容器
  3. exit 退出容器(容器停止运行)

  4. Ctrl + P +Q 退出容器,容器仍在运行

  5. docker start 容器ID 启动已经停止了的容器

  6. docker restart 容器ID 重启某个容器

  7. docker stop 容器ID 停止容器运行

  8. docekr kill 容器ID 强制停止容器(马上停止)

  9. docker rm 容器ID 删除某个容器(已经停止了的)

    • -f 强制删除
  10. docker ps -d 容器ID 运行容器,运行后就停止了(Docker机制:Docker 后台运行,必须有一个前台进程

  11. docker attach 容器ID 进入正在运行的容器

  12. docker exec -it 容器ID /bin/bash 进入到容器中打开终端

    或者直接运行bash: docker exec -it 容器ID bash

    或者使用容器的名字来替换容器ID

  13. docker logs 容器ID

    • -t 加入时间戳
    • -f 跟随最新日志打印
    • —tail 数字 显示最后多少条
  14. docker top 容器ID 查看容器中运行的进程

  15. docker inspect 容器ID 查看容器的内部细节

  16. docker cp 容器ID:/tmp/test.txt /root 将容器中的文件拷贝到宿主机(命令在宿主机中执行,冒号前后没有空格)

提交命令

  1. docker commit 提交容器副本使之成为新的镜像
    • docker commit -m=”提交信息” -a=”作者” 容器ID 要创建的镜像名:版本号
    • eg:docker commit -m=”tomcat of me” -a=”xuwei” fq48903bfd beyonderwei/mytomcat:1.2

四、镜像(UnionFS)

概念

镜像: 轻量级的可执行的独立软件包,用来打包运行环境和基于运行环境开发的软件。

  • UnionFS:联合文件系统,是一种分层、轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层叠加。
  • bootFS:包含bootloader 和 kernel ,bootloader 用来引导和加载kernel,Docker镜像的最底层也是bootFS
  • rootFS:在bootFS之上,包含的是典型的Linux系统中的/dev /bin等目录文件,root就是各种不同linux系统的发行版如:Ubuntu,CentOS等。Docker的镜像共用了内核,只是rootFS不同,因此很小。
  • 分层结构:为了共享资源,多个镜像用到相同的base镜像时,宿主机只需要保存一份base镜像。

五、容器数据卷

简介: Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来的话,当我们删除容器后,数据就消失了,而容器数据卷实现了数据的持久化

用途

容器与主机之间的数据共享。

特点:

  1. 数据卷可以在容器之间共享或重用数据
  2. 卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新当中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

命令

  1. docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 运行镜像的过程中添加数据卷

    eg:docker run -it -v /dataVolume:/dataVolumeContainer 镜像名

  2. docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 添加权限(容器内只读read only)

    注:

    • 容器停止以后,主机修改数据,当再次启动容器时,数据会同步。
  3. 可通过 docker inspect 容器ID 来查看容器数据卷与宿主机之间的绑定关系

生命周期

注:容器之间的配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。

  1. docker run -it —name doc2 —volumes-from 已有容器ID beyonderwei/ubuntu 运行容器beyonderwei/ubuntu 名为doc2 继承自 已有容器ID,这样就有父容器的所有数据卷

六、DockerFile添加容器卷

简介:

DockerFile 是镜像模板的描述文件,用来构建Docker镜像的构建文件,由一系列命令和参数构成的脚本。(有自己的一套语法规则)。

DockerFile形式添加数据卷

可在Docker中使用VOLUME指令来给镜像添加一个或者多个数据卷

  1. 宿主机根目录下新建mydocker文件夹并进入

  2. File构建(脚本文件)

    vim DockerFile 并输入以下内容

1
2
3
4
5
# volume test
RROM ubuntu
VOLUME ["/dataVolumeContainer"]
CMD echo "success!"
CMD /bin/bash
  1. docker build -f /mydocker/DockerFile -t beyonderwei/ubuntu . 构建一个新的镜像文件(命令最后有一个点,表示执行所有指令
  2. docker images 查看自己刚构建好的镜像
  3. 运行自己构建的容器,这样就会自动构建容器数据卷

七、DockerFile

构建docker镜像的步骤

  1. 编写Dockerfile文件

  2. docker build Dockerfile文件

    命令:docker build -f dockerfile文件 -t 镜像名:版本号 .

    命令最后的点表示输出镜像到当前路径

  3. docker run 运行镜像文件

注:每条指令都会创建一个镜像层,并对镜像进行提交。

在我们得到镜像以后,就可以定制自己的镜像,然后完善自己的工具库。

Docker 执行DockerFile的大致流程

  1. Docker 从基础镜像运行一个容器
  2. 执行一条指令,并对容器做出修改
  3. 执行类似 docker commit的操作提交一个新的镜像
  4. Dcoker再基于刚提交的镜像运行一个新的容器
  5. 执行DockerFile的下一条指令直到所有的指令都执行完成。
  6. 最终形成一个我们自定义的镜像。

最终目的:服务器只需要安装Docker镜像后,直接运行我们自己弄好的镜像就完成部署。

Docker 关键字

  1. FROM:基础镜像,当前镜像是基于哪个镜像的

  2. MAINTAINER:镜像维护者的姓名和邮箱

  3. RUN:构建时需要运行的额外的命令

  4. EXPOSE:当前容器对外暴露的端口(这也就解释了为什么Docker内的Redis只能用6379端口的原因)

  5. WORKDIR:指在创建容器后,终端默认登录进来的工作目录。

  6. ENV:用来在构建镜像的过程中设置环境变量,键值对,其他内容可引用

  7. ADD:将宿主机目录下的文件拷贝进镜像,ADD命令会自动处理URL和解压tar压缩包

  8. COPY:类似ADD,拷贝问价和目录到镜像中,

    将从构建上下文目录中<源路径>的文件 / 目录复制到新的一层的镜像内的<目标路径>位置

    语法: COPY src dest 或 COPY [“src”,”dest”]

  9. VOLUME:容器的数据卷,用来数据保存和持久化工作

  10. CMD:指定一个容器启动时要运行的命令

    注:Dockerfile中可以有多个CMD指令,但是只有最后一个会生效,CMD会被Docker run之后的参数替换,即会被在终端执行的命令所覆盖。

  11. ENTRYPOINT:指定一个容器启动时要运行的命令

    注:和CMD一样,都是指定容器启动程序及参数,但不会被我们在终端执行的命令带的参数所覆盖,而是将终端的命令加到 ENTRYPOINT 中。

  12. ONBUILD:当构建一个被集成的Dockerfile时运行的命令,父镜像在被子镜像继承后,父镜像的onbuild会被触发。

八、Docker安装mysql

直接执行下面命令的话,没有相关的配置文件,按照配置文件启动还没有测试。

  • 原配置文件位置(8.0.12版本):进入容器后,/etc/mysql/ 下my.cnf
  1. docker search mysql

  2. docker pull mysql

  3. docker run -p 3306:3306 —name 容器名

    -v /xuwei/mysql/conf:/etc/mysql/conf.d 配置文件数据卷

    -v /xuwei/mysql/logs:/logs 日志数据卷

    -v /xuwei/mysql/data:/var/lib/mysql 数据的数据卷

    -e MYSQL_ROOT_PASSWORD=123456 数据库密码

    -d mysql 后台运行mysql,默认latest版本

    1
    docker run -p 3307:3306 --name learnmysql -v /xuwei/mysql/conf:/etc/mysql/conf.d -v /xuwei/mysql/logs:/logs -v /xuwei/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
  1. docker exec -it 容器ID /bin/bash 进入到容器中打开mysql终端

  2. mysql -V 查看MySQL版本

  3. mysql -uroot -p 登录mysql

  4. mysql> show variables like ‘character%’; 查看数据库的字符设置

  5. exit 退出mysql

  6. exit 退出容器

九、Docker安装Redis

  1. docker search redis

  2. docker pull redis

  3. vim /xuwei/myredis/conf/redis.conf 配置redis,通过数据卷实现在本机操作配置

    配置文件地址:redis.conf

  4. docker run -p 6379:6379

    —name myredis 容器名字

    -v /xuwei/myredis/data:/data redis数据与本地绑定

    -v /xuwei/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf 通过数据卷映射配置文件到宿主机,默认:Docker中的redis无配置文件

    -d redis redis-server /usr/local/etc/redis/redis.conf 后台启动,按照配置文件启动

    —appendonly yes 开启AOF持久化

    1
    docker run -p 6380:6379 --name myredis01 -v /xuwei/myredis/data:/data -v  /xuwei/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf --port 6380 --appendonly yes
  1. docker exec -it redis容器ID redis-cli 开启一个redis客户端,连接redis

  2. docker exec -it redis容器ID bash 进入到redis容器

    • redis-server —version 查看redis版本
  3. exit 退出redis容器

  4. shutdown 退出redis 并停止

注意: docker 启动redis,redis只能以6379启动,但是可以通过docker 映射到主机的其他端口。

十、本地镜像push到阿里云

  1. 运行镜像得到一个容器实例(进行定制化修改)

  2. 提交(commit):提交容器,得到新的定制化的镜像(可以提交已有的镜像素材)

    docker commit -a beyonderwei -m “my test ubuntu image” 容器ID 新的镜像名:镜像版本

  3. 去阿里云创建镜像仓库

    • 命名空间:即beyonderwei/myubuntu 中的beyonderwei
    • 选择本地仓库
  4. 创建好后点击管理,可以看到操作指南。

    • 登录时使用的密码就是最开始注册容器服务时输入的那个密码
    1
    2
    3
    4
    5
    6
    # 登录到Registry
    $ sudo docker login --username=tb896628372 registry.cn-shanghai.aliyuncs.com
    # 给镜像打版本(tag)
    $ sudo docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/beyonderwei/myubuntu:[镜像版本号]
    # 推送到Registry 要求版本号与上一步的相同
    $ sudo docker push registry.cn-shanghai.aliyuncs.com/beyonderwei/myubuntu:[镜像版本号]

本文为作者原创文章,未经作者允许不得转载。

...

...

00:00
00:00