Docker

安装

操作系统:CentOS 7
阿里镜像:https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.526c1b11MCdpwT
按照阿里的镜像步骤安装即可:

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

systemctl enable docker

# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ee.repo
#   将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

安装校验:

root@iZbp12adskpuoxodbkqzjfZ:$ docker version
Client:
 Version:      17.03.0-ce
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 07:52:04 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.0-ce
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 07:52:04 2017
 OS/Arch:      linux/amd64
 Experimental: false

默认情况下docker命令连接的是本机的服务器。

在这里插入图片描述

配置阿里加速

进入阿里云首页之后搜索 容器镜像服务,然后点进去开通,会进入此页面:

在这里插入图片描述
按照提示进行操作:

针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://j2n2rp9s.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

配置好之后进行测试,执行命令:

docker pull tomcat:8.5

能够感受到,下载镜像的速度已经起飞!!

Dorcker的基本概念

Docker是一个容器化平台,提供了应用打包,部署与运行应用等功能,它分为三层:

在这里插入图片描述

其中Docker引擎又分为三层:

在这里插入图片描述

Docker引擎又分为三层:

  1. 其中最底层是Docker Server的守护线程
  2. 中间层是基于Rest的API ,说明是HTTP协议的。可以把中间层看成是一个小的Tomcat。
  3. 最外层是Docker的客户端,之前使用的docker pull tomcat:8.5 命令中的docker就是客户端提供的一个可执行文件。

也就是说,Docker Client 会通过HTTP协议 向 Docker Server发送请求和指令。 也正是基于web的http协议,所以docker的兼容性与扩展性是非常好的。

镜像: 镜像是文件,是只读的,提供了运行程序完整的软硬件资源,是应用程序的“集装箱”。
容器: 是镜像的实例。由Doker创建,容器之间彼此隔离

个人理解:通过镜像创建容器(准确的说应该是把镜像拿到docker容器里运行,镜像更像是一个安装文件)。容器具有可移植性。所有的容器都会被docker统一管理。

Docker的执行流程

在这里插入图片描述

  1. 由客户端发送指令给服务端发送命令(服务端就是上图中间那部分)。
  2. 服务端分为三块内容,分别是Docker deamon(守护进程),Images(镜像),Containers(容器)。其中 镜像 和 容器 是被 守护进程 管理的。
  3. 图中最右边的是Registry(注册中心,又称:远程仓库),远程仓库保存了我们所需要的各种各样的镜像文件。

比如现在需要用Docker快速部署一台redis,部署redis的时候,只需要从客户端发送命令docker pull redis, 这个命令就会发给服务端的Docker Deamon,Docker Deamon会在Docker主机的Images中查找是否存在这个镜像,如果不存在,Docker Deamon就会从Registry(远程仓库)下载官方提供好的镜像,这个镜像是一个会读的,相当与一个安装文件。
如果想让redis对外提供服务的话,还需要使用客户端执行一个docker run redis的命令发送给Docker Deamon,Docker Deamon发现在Images里面已经存在这个镜像,Docker Deamon就会根据这个镜像创建响应的容器,由这个服务对外暴露接口,从而被外界锁访问。
如果一个redis容器不够用怎么办? 那就由客户端再次执行docker run redis,会再次创建一个容器,和之前的容器都提供redis的服务,但是两个redis又都是独立个体,彼此之间是隔离的,任何一个停掉,不会影响另外一方。

Docker的常用命令

docker pull 镜像名<:tags>								 		- 从远程仓库抽取镜像 ,其中 -tags 表示参数版本号
docker images											 		- 查看本地镜像
docker run <-p> 宿主机端口:容器内部端口 <-d> 镜像名<:tags> 	 	- 创建容器,启动应用,-p参数表示端口映射,-d参数表示后台运行
docker ps <-a>												 	- 默认查看正在运行中的容器,-a表示查看所有容器(包括已关闭的容器)
docker stop 容器id												- 关闭正在运行的容器
docker start 容器id												- 启动停止的容器
docker rm <-f> 容器id 									 		- 删除容器, -f表示强制删除
docker rmi <-f> 镜像名:<tags> 							 		- 删除镜像, 其中-f表示强制删除
docker exec <-it> 容器id 命令									- 在容器中执行命令,it表示采用交互的方式执行命令
docker build -t 机构/镜像名<:tags> Dockerfile目录 				- 通过dockerfile构建镜像

Docker快速部署

Docker的中央仓库地址:https://hub.docker.com/
里面保存了所有的docker镜像。

  1. 进入网站内直接在搜索框内搜索自己想要的工具,在下方有对应工具的各个版本,我们把这个版本复制下来,然后在Linux的页面执行命令docker pull 工具名称:复制的版本,就可以把这个镜像从中央仓库上面拉取下来了。
  2. 通过docker run 工具名称:复制的版本 可以生成对应的容器并且运行。

但是会发现访问服务,并不是当前 宿主机IP:端口就可以访问的。需要用当前宿主机端口和容器服务端口做一个映射绑定,然后通过访问宿主机端口映射到容器对应的端口进行服务的访问。

这样做的好处就是 物理机对外暴露的端口是固定的,但是容器的端口号以及服务都可以改变,大大增加了可移植性,可以对服务进行无缝的迁移。

执行如下命令:

[root@zxj ~]# docker run -p 8000:8080 -d tomcat:8.5 

执行完成之后会返回一个容器的编号。
然后访问http://192.168.116.142:8000/

在这里插入图片描述
虽然报了404,但是已经可以看到通过8000端口能够访问到容器8080端口的tomact服务。

关闭、删除Docker容器 以及 删除 镜像

首先查看正在运行的容器,查看容器id 以及 容器名称:

[root@zxj ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
ab2d76a8e233        tomcat:8.5          "catalina.sh run"   9 seconds ago       Up 8 seconds        0.0.0.0:8000->8080/tcp   heuristic_grothendieck

然后停止正在运行的容器:

[root@zxj ~]# docker stop ab2d76a8e233
ab2d76a8e233

最后删除容器:

[root@zxj ~]# docker rm -f ab2d76a8e233
ab2d76a8e233

也可以直接使用docker rm -f ab2d76a8e233 直接强制停止删除,不需要中间的stop操作。

删除镜像,首先要查看有哪些镜像,然后根据镜像TAG 或者 ID进行删除:

[root@zxj ~]# docker images            
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              8.5                 8204722e9772        3 days ago          533MB
hello-world         latest              bf756fb1ae65        10 months ago       13.3kB
[root@zxj ~]# docker rmi bf756fb1ae65
Untagged: hello-world:latest
Untagged: hello-world@sha256:8c5aeeb6a5f3ba4883347d3747a7249f491766ca1caa47e5da5dfcf6b9b717c0
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc973ba3b1686355f221c38a36978ac63
[root@zxj ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              8.5                 8204722e9772        3 days ago          533MB

进入Docker容器内部执行命令

[root@zxj ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
3c2e218d1137        tomcat:8.5          "catalina.sh run"   2 hours ago         Exited (130) 2 hours ago                       keen_blackwell
[root@zxj ~]# docker start 3c2e218d1137
3c2e218d1137
[root@zxj ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
3c2e218d1137        tomcat:8.5          "catalina.sh run"   2 hours ago         Up 3 seconds        0.0.0.0:8000->8080/tcp   keen_blackwell
[root@zxj ~]# docker exec -it 3c2e218d1137 /bin/bash
root@3c2e218d1137:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
root@3c2e218d1137:/usr/local/tomcat# cat /proc/version 
Linux version 3.10.0-1062.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Wed Aug 7 18:08:02 UTC 2019
root@3c2e218d1137:/usr/local/tomcat# java -version
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
root@3c2e218d1137:/usr/local/tomcat# 

通过docker exec -it 3c2e218d1137 /bin/bash 进入容器内部,使用ls命令能够看见这是一个迷你Linux系统,并且可以查看Linux版本,以及JDK的版本。

在容器内部执行

root@3c2e218d1137:/usr/local/tomcat# exit

就可以退回到宿主机。

Docker镜像和容器存储位置

pull的镜像和生成的容器,默认都存储在/var/lib/docker/目录下:

在这里插入图片描述

容器的生命周期

在这里插入图片描述
其中docker run命令和docker create命令的区别就是在创建容器之后是否运行。
docker killdocker stop的区别是在停止运行状态后启动,kill会从新创建线程,stop会使用曾经的线程。
docker pause使容器暂停,可以使用docker unpause进行恢复。
容器在运行时,出现了OOM的异常,进入die状态,根据docker是否重启的策略决定是否重启。

大致分为四大状态: stopped 、running、pause、以及delete。
其中stopped又分为两个子状态,分别为已被创建和已退出。

镜像的创建

镜像的创建可以分为两种方式:

  1. 镜像提交,docker commit的方式。docker commit命令可以把容器打包成一个镜像,还可以把容器内的数据也打包到镜像中。

在这里插入图片描述

  1. 镜像构建,Dockerfile文件+docker build的方式。根据自己的需要(需求)自定义一个镜像。

Dockerfile镜像描述文件

Dockerfile是一个包含用于组合镜像的命令的文本文档,Docker通过读取Dockerfile中的指令按步自动生成镜像。

手动创建一个tomcat镜像,即能访问到自定义的html页面:

  1. 创建一个mytest目录,在mytest目录下创建文件夹docker-web,用于存放html页面,页面内容自定义就好。
  2. 在mytest目录下创建Dockerfile文件,注意Dockfile文件不能有注释。
  3. 使用命令docker build -t zhangxujie.com/nuwebapp:1.0 /root/dockerfileTest/mytest/生成镜像文件
[root@zxj mytest]# docker build -t zhangxujie.com/muwebapp:1.0 /root/dockerfileTest/mytest/
Sending build context to Docker daemon  3.584kB
Step 1/4 : FROM tomcat:8.5
 ---> 8204722e9772
Step 2/4 : MAINTAINER zhangxujie.com
 ---> Running in f8a796c99fe6
Removing intermediate container f8a796c99fe6
 ---> a78c67b59613
Step 3/4 : WORKDIR /usr/local/tomcat/webapps
 ---> Running in dd31728054cd
Removing intermediate container dd31728054cd
 ---> d4521ecadb30
Step 4/4 : ADD docker-web ./docker-web
 ---> 5d3ed0992671
Successfully built 5d3ed0992671
Successfully tagged zhangxujie.com/muwebapp:1.0

目录结构:

-mytest
--docker-web
---index.html
--Dockerfile

Dockerfile文件内容:

FROM tomcat:8.5      					#FROM 设置基准镜像
MAINTAINER zhangxujie.com				#MAINTAINER 描述性指令,表明作者
WORKDIR /usr/local/tomcat/webapps		#WORKDIR 切换容器内工作目录,目录不存在会被创建。web页面只有放在webapps目录下才能被访问
ADD docker-web ./docker-web				#ADD 把第一个下的文件复制到容器工作目录下的/docker-web目录

查看生成的镜像:

[root@zxj mytest]# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
zhangxujie.com/muwebapp   1.0                 5d3ed0992671        12 minutes ago      533MB
tomcat                    8.5                 8204722e9772        3 days ago          533MB

可以看到生成的镜像,然后运行它生成容器:

[root@zxj mytest]# docker run -p 8800:8080 -d zhangxujie.com/muwebapp:1.0
f47ffbe13ab2f913e15857baf7756adb295074ff0961d5a4ed0409b137abd5fe
[root@zxj mytest]# docker ps -a
CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS              PORTS                    NAMES
f47ffbe13ab2        zhangxujie.com/muwebapp:1.0   "catalina.sh run"   47 seconds ago      Up 46 seconds       0.0.0.0:8800->8080/tcp   elastic_lamarr
3c2e218d1137        tomcat:8.5                    "catalina.sh run"   5 hours ago         Up 3 hours          0.0.0.0:8000->8080/tcp   keen_blackwell

能看到,生成的镜像已经运行成功了。
然后访问http://192.168.116.142:8800/docker-web/index.html

在这里插入图片描述
虽然有乱码,但是已经不影响效果了。
进入到容器内部:
在这里插入图片描述

镜像分层

之前Dockerfile在构建镜像的时候,会根据Dockerfile文件内的指令,在创建的时候分为几个步骤,如之前的在构建tomcat:

[root@zxj mytest]# docker build -t zhangxujie.com/muwebapp:1.0 /root/dockerfileTest/mytest/
Sending build context to Docker daemon  3.584kB
Step 1/4 : FROM tomcat:8.5
 ---> 8204722e9772
Step 2/4 : MAINTAINER zhangxujie.com
 ---> Running in f8a796c99fe6
Removing intermediate container f8a796c99fe6
 ---> a78c67b59613
Step 3/4 : WORKDIR /usr/local/tomcat/webapps
 ---> Running in dd31728054cd
Removing intermediate container dd31728054cd
 ---> d4521ecadb30
Step 4/4 : ADD docker-web ./docker-web
 ---> 5d3ed0992671
Successfully built 5d3ed0992671
Successfully tagged zhangxujie.com/muwebapp:1.0

分为四步,分别和Dockerfile的指令意义对应,每个步骤都对应了一个id号容器,这个id是临时id容器,只能用于构建镜像,每一个临时id容器都是一层,就像做汉堡一样,一层面包一层蔬菜一层肉的往上盖,这些层会被缓存起来,在构建其他镜像时,如果Dockerfile中的指令相同,在构建时会直接把曾经缓存的临时id容器拿来复用。

查看一个镜像的详情也可以看到镜像的层级:
命令 -> docker inspect image_name

那么docker是如何把多个镜像层组合成一个可以运行的容器?
docker采用了联合挂载技术:可以把多个目录挂载到同一目录上(甚至也可以对应不同的文件系统)

Dockerfile的基础指令

FROM - 基于基准镜像

FROM centos  									#制作基准镜像(基于centos:lastest)
FROM scratch   									#不依赖任何基准镜像base image
FROM tomcat: 9.0.22-jdk8-openjdk
												#尽量使用官方提供的Base Image

LABEL & MAINTAINER - 说明信息

MAINTAINER mashibing.com						#标明机构、作者
LABEL version = "1.0"							#LABEL 描述信息
LABEL description = "马士兵教育"

WORKDIR - 设置工作目录

WORKDIR /usr/local								
WORKDIR /usr/local/newdir 						#进入容器操作后的初始目录,类似于linux的cd命令,没有就自动创建
												#尽量使用绝对路径

ADD & COPY - 复制文件

ADD hello / 									#复制到根路径
ADD test.tar.gz / 								#添加根目录并解压
ADD 											#除了复制,还具备添加远程文件功能

ENV - 设置环境常量

ENV JAVA_HOME /usr/local/openjdk8				#类似于安装JDK或者MAVEN设置环境变量,之后可以使用${}进行引用
RUN ${JAVA_HOME}/bin/java -jar test.jar
												#尽量使用环境常量,可提高程序维护性

关于harbor

标记镜像规范

语法:
docker tag local_image_name:tag remote_IP_repository/harbor_project/image_name:tag

示例:
docker tag niginx:latest 120.92.33.10/test/nginx:v1

登录

语法:
docker login remote_IP_repository

示例:
docker login 120.92.33.10

推送镜像到harbor库

语法:
docker push 之前标记镜像的名称:tag

示例:
docker push 120.92.33.10/test/nginx:v1

拉取镜像

语法:
docker pull 之前标记镜像的名称:tag

示例:
docker pull 120.92.33.10/test/nginx:v1

整体架构图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值