操作系统: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
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# 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
能够感受到,下载镜像的速度已经起飞!!
Docker是一个容器化平台,提供了应用打包,部署与运行应用等功能,它分为三层:
其中Docker引擎又分为三层:
Docker引擎又分为三层:
docker pull tomcat:8.5
命令中的docker就是客户端提供的一个可执行文件。也就是说,Docker Client 会通过HTTP协议 向 Docker Server发送请求和指令。 也正是基于web的http协议,所以docker的兼容性与扩展性是非常好的。
镜像: 镜像是文件,是只读的,提供了运行程序完整的软硬件资源,是应用程序的“集装箱”。
容器: 是镜像的实例。由Doker创建,容器之间彼此隔离。
个人理解:通过镜像创建容器(准确的说应该是把镜像拿到docker容器里运行,镜像更像是一个安装文件)。容器具有可移植性。所有的容器都会被docker统一管理。
比如现在需要用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 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的中央仓库地址:https://hub.docker.com/
里面保存了所有的docker镜像。
docker pull 工具名称:复制的版本
,就可以把这个镜像从中央仓库上面拉取下来了。docker run 工具名称:复制的版本
可以生成对应的容器并且运行。但是会发现访问服务,并不是当前 宿主机IP:端口就可以访问的。需要用当前宿主机端口和容器服务端口做一个映射绑定,然后通过访问宿主机端口映射到容器对应的端口进行服务的访问。
这样做的好处就是 物理机对外暴露的端口是固定的,但是容器的端口号以及服务都可以改变,大大增加了可移植性,可以对服务进行无缝的迁移。
执行如下命令:
[root@zxj ~]# docker run -p 8000:8080 -d tomcat:8.5
执行完成之后会返回一个容器的编号。
然后访问http://192.168.116.142:8000/
虽然报了404,但是已经可以看到通过8000端口能够访问到容器8080端口的tomact服务。
首先查看正在运行的容器,查看容器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
[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
就可以退回到宿主机。
pull的镜像和生成的容器,默认都存储在/var/lib/docker/
目录下:
其中docker run
命令和docker create
命令的区别就是在创建容器之后是否运行。
而 docker kill
和docker stop
的区别是在停止运行状态后启动,kill
会从新创建线程,stop
会使用曾经的线程。
docker pause
使容器暂停,可以使用docker unpause
进行恢复。
容器在运行时,出现了OOM的异常,进入die状态,根据docker是否重启的策略决定是否重启。
大致分为四大状态: stopped 、running、pause、以及delete。
其中stopped又分为两个子状态,分别为已被创建和已退出。
镜像的创建可以分为两种方式:
Dockerfile是一个包含用于组合镜像的命令的文本文档,Docker通过读取Dockerfile中的指令按步自动生成镜像。
手动创建一个tomcat镜像,即能访问到自定义的html页面:
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采用了联合挂载技术:可以把多个目录挂载到同一目录上(甚至也可以对应不同的文件系统)
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
#尽量使用环境常量,可提高程序维护性
标记镜像规范
语法:
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