docker
2020-10-24 23:11:01 0 举报
AI智能生成
docker
作者其他创作
大纲/内容
一、应用场景
Web应用的自动化打包和发布
自动化测试和持续集成、发布
在服务型环境中部署和调整数据库或其他的后台应用
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建Paas环境
二、基本概念
镜像Image
Docker镜像,相当于是一个root文件系统
容器Container
镜像与容器的关系,就像是面向对象程序设计中的类与实例一样,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等
仓库Repository
仓库可以看成一个代码控制中心,用来保存镜像
客户端Client
Docker客户端通过命令行或者其他工具使用Docker SDK与Docker的守护进程通信
主机Host
一个物理或者虚拟的机器用于执行Doker守护进程和容器
Docker Machine
Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker
Docker使用客户端与服务器(C/S)架构模式,使用远程API来管理和创建Docker容器,Docker容器通过Docker镜像来创建
三、安装
CentOS Docker安装
1、卸载旧版本
$ sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
2、设置
安装所需软件包
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
设置稳定仓库
$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装版本
最新版本
$ sudo yum install -y docker-ce docker-ce-cli containerd.io
安装特定版本
列出可用版本
$ yum list docker-ce --showduplicates | sort -r
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
4、启动
$ sudo systemctl start docker
$ sudo service docker start
5、验证
$ sudo docker run hello-world
6、Docker需要用户具有sudo权限,为了避免每次命令都输入sudo,可以把用户加入Docker用户组
$ sudo usermod -aG docker $USER
7、设置docker开机自启动如下
systemctl enable docker
四、使用
Hello World
1、Hello World
$ docker run ubuntu:15.10 /bin/echo "Hello world"
参数解析
docker:Docker的二进制执行文件
run:与docker组合来运行一个容器
ubuntu:15.10:指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker就从Hub下载公共镜像
/bin/echo "Hello world":在启动的容器里执行的命令
2、运行交互式的容器
$ docker run -i -t ubuntu:15.10 /bin/bash
参数解析
-t : 在新容器内指定一个伪终端或终端
-i: 允许对容器内的标准输入进行交互
使用exit命令或者CTRL+D来退出容器
3、启动容器(后台模式)
$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
查看容器是否运行
$ docker ps
CONTAINER ID IMAGE COMMAND ...
5917eac21c36 ubuntu:15.10 "/bin/sh -c 'while t…" ...
CONTAINER ID IMAGE COMMAND ...
5917eac21c36 ubuntu:15.10 "/bin/sh -c 'while t…" ...
参数解析
CONTAINER ID: 容器 ID
IMAGE: 使用的镜像
COMMAND: 启动容器时运行的命令
CREATED: 容器的创建时间
STATUS: 容器状态
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)
NAMES: 自动分配的容器名称
查看容器内的标准输出
$ docker logs 2b1b7a428627
4、停止容器
$ docker stop 7a428627
容器使用
简介
image文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件:image文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已
Docker客户端
通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法
# docker stats --help
获取镜像
$ docker pull ubuntu
启动容器
$ docker run -it ubuntu /bin/bash
从image文件,生成一个正在运行的容器实例
$ docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash
-p参数:容器的 3000 端口映射到本机的 8000 端口
-it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器
koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)
/bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell
$ docker container start [containerID]
run命令是新建容器,每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件
希望重复使用容器,就要使用docker container start命令,它用来启动已经生成、已经停止运行的容器文件
查看所有的容器
$ docker ps -a
查看 docker 容器的输出
$ docker container logs [containerID]
后台运行
$ docker run -itd --name ubuntu-test ubuntu /bin/bash
-d :指定容器的运行模式
-name : 设置容器名
从正在运行的 Docker 容器里面,将文件拷贝到本机
$ docker container cp [containID]:[/path/to/file]
查看容器的IP地址
$ docker container inspect 容器名
找到IPAddress字段即可
停止容器
$ docker stop <容器 ID>
进入容器
docker attach 1e560fca3906
注:从容器退出,会导致容器的停止
docker exec -it 243c32535da7 /bin/bash
推荐使用,退出容器不会导致容器的停止
导入和导出容器
导出容器
$ docker export 1e560fca3906 > ubuntu.tar
容器 1e560fca3906 快照到本地文件 ubuntu.tar
导入容器
$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1
快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1
删除容器
$ docker rm -f 1e560fca3906
批量删除容器
$ docker rm -f $(docker ps -a -q)
镜像使用
简介
Docker把应用程序及其依赖,打包在image文件里面,只有通过这个文件,才能生成Docker容器。image文件可以看作是容器的模板。Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例
image是二进制文件,一个image文件往往通过继承另一个image文件,加上一些个性设置而生成。
为了方便共享,image文件制作完成后,可以上传到网上的仓库
目的
管理和使用本地Docker主机镜像
创建镜像
列出镜像列表
$ docker images
参数说明
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
获取新镜像
$ docker pull ubuntu:13.10
$ docker image pull library/hello-world
docker image pull : 抓取 image 文件的命令
library/hello-world : image 文件在仓库里面的位置
library : image 文件所在的组
hello-world : image 文件的名字
查找镜像
Docker Hub 网址为: https://hub.docker.com/
$ docker search httpd
参数说明
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star
AUTOMATED: 自动构建
创建镜像
二种方式对镜像进行更改
从已经创建的容器中更新镜像,并且提交这个镜像
使用 Dockerfile 指令来创建一个新的镜像
更新镜像
1、更新镜像之前,需要使用镜像来创建一个容器
$ docker run -t -i ubuntu:15.10 /bin/bash
2、在运行的容器内使用 apt-get update 命令进行更新,完成操作之后,输入 exit 命令来退出容器
3、通过命令 docker commit 来提交容器副本
$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
参数说明
-m: 提交的描述信息
-a: 指定镜像作者
e218edb10161:容器 ID
runoob/ubuntu:v2: 指定要创建的目标镜像名
构建镜像
使用命令 docker build , 从零开始来创建一个新的镜像。需要创建一个 Dockerfile 文件,其中包含一组指令来告诉Docker 如何构建镜像,每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写
$ docker build -t runoob/centos:6.7 .
参数说明
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
Dockerfile见下
设置镜像标签
$ docker tag 860c279d2fec runoob/centos:dev
docker tag 镜像ID(860c279d2fec)用户名称/镜像源名(repository name)/新的标签名(tag)
删除镜像
$ docker rmi hello-world
批量删除镜像
docker rmi -f $(docker images -a -q)
容器连接
容器中运行网络应用,能让外部可以访问应用,通过-P或者-p参数指定端口映射
网络端口映射
$ docker run -d -P training/webapp python app.py
$ docker run -d -p 5000:5000 training/webapp python app.py
区别
-P :是容器内部端口随机映射到主机的高端口
-p : 是容器内部端口绑定到指定的主机端口
查看端口绑定
$ docker port adoring_stonebraker 5000
容器互联
端口映射并不是唯一把 docker 连接到另一个容器的方法
docker 有一个连接系统允许将多个容器连接在一起,共享连接信息
docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息
docker 有一个连接系统允许将多个容器连接在一起,共享连接信息
docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息
容器命名
$ docker run -d -P --name runoob training/webapp python app.py
--name 标识来命名容器
新建网络
$ docker network create -d bridge test-net
-d:参数指定 Docker 网络类型,有 bridge、overlay。
连接容器
运行一个容器并连接到新建的 test-net 网络
$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
打开新的终端,再运行一个容器并加入到 test-net 网络
$ docker run -itd --name test2 --network test-net ubuntu /bin/bash
ping 来证明 test1 容器和 test2 容器建立了互联关系
如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping(即学即用:可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)
apt-get update
apt install iputils-ping
apt install iputils-ping
Dockerfile
简介
Dockerfile是一个用来构建镜像文件的文本文件,文本内容包含了一条条构建镜像所需的指令和说明
Dockerfile文件,它是一个文本文件,用来配置image,Docker根据该文件生成二进制的image文件
FROM:定制的镜像都是基于 FROM 的镜像
FROM <image> [AS <name>] 指定从一个镜像构建起一个新的镜像名字
FROM <image>[:<tag>] [AS <name>] 指定镜像的版本 Tag
示例:FROM mysql:5.0 AS database
MAINTAINER:镜像创建者
MAINTAINER <name>
示例:MAINTAINER taotao 1769974308@qq.com
ENV:声明环境变量
ENV <key> <value> 一次设置一个环境变量
ENV <key>=<value> <key>=<value> <key>=<value> 设置多个环境变量
示例:ENV JAVA_HOME /usr/java1.8/
RUN:用于执行后面跟着的命令行命令
RUN <command>
示例:RUN ["executable", "param1", "param2"]
ADD:将本地的文件添加复制到容器中去,压缩包会解压,可以访问网络上的文件,会自动下载
ADD <src> <dest>
ADD *.js /app 添加 js 文件到容器中的 app 目录下
COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径,不会解压或者下载文件
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
源路径:源文件或者源目录
目标路径:容器内的指定路径
WORKDIR:工作目录
WORKDIR <path>
示例:WORKDIR /app/test
EXPOSE:暴露对外的端口(容器内部程序的端口,虽然会和宿主机的一样,但是其实是两个端口)
EXPOSE <port>
示例:EXPOSE 80
容器运行时,需要用 -p 映射外部端口才能访问到容器内的端口
CMD:容器启动后所执行的程序,如果执行 docker run 后面跟启动命令会被覆盖掉
ENTRYPOINT:与 CMD 功能相同,但需 docker run 不会覆盖,如果需要覆盖可增加参数 -entrypoint 来覆盖
VOLUME: 指定数据持久化的目录,官方语言叫做挂载,将宿主机的目录映射到容器中的目录
VOLUME ["/var/log","/var/test".....] 指定容器中多个需要被挂载的目录,会把这些目录映射到宿主机的多个随机目录上,实现数据的持久化和同步
VOLUME /var/data var/log 指定容器中的 var/log 目录挂载到宿主机上的 /var/data 目录,这种形式可以手动指定宿主机上的目录
LABEL:为镜像添加元数据,key-value 形式
LABEL <key>=<value> <key>=<value> ...
示例:LABEL version="1.0" description="这是一个web应用"
ARG:设置构建镜像需要传递的参数
ARG <name>[=<value>]
ARG name=sss
构建镜像:在Dockerfile文件的存放目录下,执行构建动作
$ docker build -t nginx:test .
参数说明
-t:镜像命名
. :是基于当前目录的Dockerfile文件所在的路径来构建镜像
发布image文件
容器运行成功后,就确认了image文件的有效性,可以把image文件分享,让其他人使用
首先,去hub.docker.com或cloud.docker.com注册一个账户,然后,用命令登录
$ docker login
接着,为本地的image标注用户名和版本
$ docker image tag [imageName] [username]/[repository]:[tag]
$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1
发布image文件
$ docker image push [username]/[repository]:[tag]
Compose
用于定义和运行多容器Docker应用程序的工具,通过Compose,可以使用YML文件来配置应用程序需要的所有服务,然后,使用一个命令,就可以从YML文件配置中创建并启动所有服务,Docker Compose将所管理的容器分为三层,工程、服务及容器。docker-compose.yml中定义所有服务组成了一个工程,services节点下即为服务,服务之下为容器。容器与容器直之间可以以服务名称为域名进行访问,比如可以通过jdbc:mysql://db:3306这个地址来访问db这个mysql服务。
步骤
1、使用Dockerfile定义应用程序的环境
2、使用docker-compose.yml定义构成应用程序的服务,它们可以在隔离环境中一起运行
3、最后,执行docker-compose up命令来启动并运行整个应用程序
安装
发行版本地址:https://github.com/docker/compose/releases
下载稳定版本:$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
可执行权限应用于二进制:$ sudo chmod +x /usr/local/bin/docker-compose
创建软链接:$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试:$ docker-compose --version
命令
创建并启动配置的容器
docker-compose -f xxx.yaml up
指定服务名称来启动
docker-compose -f xxx.yaml up 服务名1 服务名2
后台全部启动
docker-compose -f xxx.yaml up -d
build dockerfile更新,重新构建,生成新的镜像
docker-compose up build
服务除了可以基于指定的镜像,还可以基于一份dockerfile,在使用up启动之时执行构建任务,这个构建标签就是build,它可以指定dockerfile所在文件夹的路径,compose将会利用它自动构建这个镜像,然后使用这个镜像启动服务器容器
停止并删除容器、网络、数据卷
docker-compose -f xxx.yaml down
启动、停止、重启服务
docker-compose -f xxx.yaml stop 服务名
docker-compose -f xxx.yaml start 服务名
docker-compose -f xxx.yaml restart 服务名
列出所有容器
docker-compose -f xxx.yaml ps
拉取服务依赖镜像
docker-compsoe -f xxx.yaml pull
设置指定服务运行的容器个数。通过 service=num 的参数来设置数量
docker-compose scale web=3 db=2
yml配置指令参考
version
指定本yml依从的compose哪个版本制定的
build
指定为构建镜像上下文路径
context:上下文路径
dockerfile:指定构建镜像的Dockerfile文件名
args: 添加构建参数,只能在构建过程中访问的环境变量
labels: 设置构建镜像的标签
target : 多层构建,可以指定构建那一层
对于每个服务,build告诉docker-compose怎么为每个服务构建镜像
command
覆盖容器启动的默认命令
container_name
指定自定义容器名称,而不是生成的默认名称
depends_on
设置依赖关系
以依赖性顺序启动服务,如下,先启动db和redis,再启动
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
env_file
从文件添加环境变量,可以是单个值或列表的多个值
单个值 :env_file: .env
列表格式:
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
- ./common.env
- ./apps/web.env
- /opt/secrets.env
environment
添加环境变量,可以使用数组或字典。布尔值,布尔值需要用引号引起来,以确保yml解析器不会将其转换为True或False
expose: 暴露端口,但不映射到宿主机,只被连接的服务访问
ports
暴露端口,映射到宿主机
expose与ports控制服务与network bridge、宿主机交互的方式
extra_hosts :
添加主机名映射
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:
162.242.195.82 somehost
50.31.209.229 otherhost
162.242.195.82 somehost
50.31.209.229 otherhost
指令用于主机名映射,定义宿主机在容器内别名,类比与在我们的电脑上hosts文件中增加一行主机名映射关系
image
指定容器运行的镜像
logging
服务的日志记录配置
driver:指定服务容器的日志记录驱动程序,默认值:json-file,其他选项syslog,none
network_mode
设置网络模式
restart
no : 是默认的重启策略,在任何情况下都不会重启容器
always : 容器总是重新启动
on-failure : 在容器非正常退出时,退出状态非0,才会重启容器
unless-stopped : 在容器退出时总是重启容器,但是不考虑在docker守护进程启动时就已经停止了的容器
secrets
存储敏感数据
volumes
将主机的数据卷或者文件挂载到容器里
例如
volumes:
- type: bind
source: /mnt/eqidmanager/eqidlogs
target: /app/eqidlogs
- type: bind
source: /mnt/eqidmanager/eqidlogs
target: /app/eqidlogs
type
source
target
使用volumes来映射 宿主机路径到容器内路径,注意容器挂在的源目录必须使用绝对路径
links
使用links可以将其他容器的IP记录到该容器中,再通过连接 服务名:端口 可以访问
连接其他容器的服务(SERVICE:ALIAS)
# 可以以database为域名访问服务名称为db的容器
links:
- db: database
links:
- db: database
表明链接另外的容器,意味着启动的时会去启动db服务
healthcheck
例如
healthcheck:
test: ['CMD','curl','-f','http://localhost/healthcheck']
interval: 1m30s
timeout: 10s
retries: 3
start_period: 6s
test: ['CMD','curl','-f','http://localhost/healthcheck']
interval: 1m30s
timeout: 10s
retries: 3
start_period: 6s
Swarm
Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口管理这些Docker主机上的各种Docker资源,swarm集群提供给用户管理集群内所有容器的操作接口与使用一台Docker主机基本相同
版本
V1
master-slave架构,需要通过服务发现来选举出管理节点,其他各个节点通过运行agent来接受管理节点的统一管理
V2
是自动通过Raft协议分布式选举出管理节点,不需要配置发现服务,从而避免发现服务的单点故障问题,且它自带了DNS负载均衡和对外负载均衡机制的支持
概念
Swarm
使用swarmkit嵌入docker engine中的集群管理和编排功能,docker容器初始化启动的一种模式
Node
节点,是一个已加入到Docker swarm集群中的一个容器实例
Service
服务主要是在工作节点上执行任务,创建服务时,需要指定容器的镜像
Task
任务是在容器中执行的命令
工作方式
节点
服务、任务、容器
任务与调度
服务副本与全局服务
调度策略
swarm在scheduler节点(leader节点)运行容器时,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略:spread,binpack,random
Random
是随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU,RAM以及正在运行的容器的数量来计算应该运行容器的节点
Spread
在同等条件下,spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点,使用spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器
Binpack
最大化的为避免容器碎片化,就是说Binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在一个节点上面
Cluster模式的特性
批量创建服务
建立容器之前先创建一个overlay的网络,用来保证在不同主机上的容器网络互通的网络模式
强大的集群的容错性
当容器副本中的其中某一个或某几个节点宕机后,cluster会根据自己的服务注册发现机制,在集群中剩下的空闲节点上,重新拉起容器副本,无需人工干预
服务节点的可扩展性
通过scale参数即可复制出新的副本出来,扩展出来的容器副本都run在原来的节点下面,若需要在每台节点上都run一个相同的副本,只需要将“-replicas n”更换成“-mode=global”
调度机制
主要功能是Cluster的server端去选择在那个服务器节点上创建并启动一个容器实例的动作,它是由一个装箱算法和过滤器组合而成,每次通过过滤器(constraint)启动容器时,swarm cluster都会调用调度机制筛选出匹配约束条件的服务器,并在上面运行容器
命令行说明
docker swarm:集群管理
init : 初始化集群
join : 将节点加入集群
join-token : 管理加入令牌
leave : 从集群中删除某个节点,强制删除加参数 --force
update : 更新集群
unlock : 解锁集群
docker node:节点管理
demote : 将集群中一个或多个节点降级
inspect : 显示一个或多个节点的详细信息
ls : 列出集群中的节点
promote : 将一个或多个节点提升为管理节点
rm : 从集群中删除停止的节点,--force强制删除参数
ps : 列出一个或多个节点上运行的任务
update : 更新节点
docker service: 服务管理
create : 创建一个新的服务
inspect : 列出一个或多个服务的详细信息
ps : 列出一个或者多个服务中的任务信息
ls : 列出服务
rm : 删除一个或多个服务
scale : 扩展一个或多个服务
update : 更新服务
docker stack/deploy
试验特性,用于多应用部署
volume
查看:$ docker volume ls
删除:$ docker volume prune
查看指定容器挂载信息 : $docker inspect redis-master | grep Mounts -A 10
registry
一、下载镜像registry
$docker pull registry
二、运行registry容器
$docker run -itd -v /mydata/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
-itd: 在容器中打开一个伪终端进行交互操作,并在后台运行
-v : 把宿主机的/mydata/registry目录绑定到 容器/var/lib/registry目录(容器中存放镜像文件的目录),来实现数据的持久化
-p : 映射端口,访问宿主机的5000端口就可以访问registry容器的服务
--restart=always : 重启策略
--name registry : 创建容器命名为registry
registry:latest : pull下来的镜像
三、测试镜像仓库
$ curl http://127.0.0.1:5000/v2/_catalog
四、更新docker daemon.json
vim /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"],
"insecure-registries": [ "192.168.10.77:5000"]
}
"registry-mirrors": [ "https://registry.docker-cn.com"],
"insecure-registries": [ "192.168.10.77:5000"]
}
如果遇到镜像下载不下来,添加上registry-mirrors键值
Docker支持http上传镜像,添加上insecure-registries
五、下载测试镜像文件
$ docker pull busybox
六、为镜像打标签
docker tag busybox:latest 192.168.10.77:5000/busybox:v1
七、上传到镜像仓库服务器
$ docker push 192.168.10.77:5000/busybox:v1
八、测试从仓库下载镜像
$ docker rmi -f $(docker images -aq)
$ docker pull 192.168.10.77:5000/busybox:v1
九、列出所有镜像
http://192.168.10.77:5000/v2/_catalog
{
repositories: [
"busybox"
]
}
repositories: [
"busybox"
]
}
十、列出镜像tag
http://192.168.10.77:5000/v2/busybox/tags/list
{
name: "busybox",
tags: [
"v1"
]
}
name: "busybox",
tags: [
"v1"
]
}
十一、Docker开启远程API
编辑修改docker.service文件
vi /usr/lib/systemd/system/docker.service
修改的部分:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改后的部分:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改后的部分:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
重新启动Docker服务
systemctl stop docker
systemctl start docker
systemctl start docker
开启防火墙的Docker构建端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload
firewall-cmd --reload
使用Maven插件构建Docker镜像
在应用的pom.xml文件中添加docker-maven-plugin的依赖
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>mall/${project.artifactId}:${project.version}</imageName>
<dockerHost>http://192.168.10.77:2375</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>mall/${project.artifactId}:${project.version}</imageName>
<dockerHost>http://192.168.10.77:2375</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
配置说明
executions.execution.phase:此处配置在maven打包应用时构建docker镜像
imageName: 用于指定镜像名称,mall是仓库名称,${project.artifactid}为镜像名称,${project.version}为镜像版本号
dockerHost:打包后上传到的docker服务器地址
baseImage:该应用所依赖的基础的基础镜像
entryPoint: docker容器启动时执行的命令
resources.resource.targetPath: 将打包后的资源文件复制到该目录
resources.resource.directory:需要复制的文件所在目录,maven打包的应用jar包保存在target目录下面
resources.resource.include :需要复制的文件,打包好的应用jar包
注意:依赖的基础镜像需要先下载,否则会出现构建镜像超时情况,比如本地没有java8的镜像,先把镜像pull下来,再用maveen插件进行构建
五、网络模式
查看网络
docker network ls
查看宿主机在网桥上的映射IP
docker inspect [network_id]
network_id可以通过命令:docker network ls查看
Docker通过使用linux桥接提供容器之间的通信,Docker的网络模式分为四种
host模式:使用--net=host指定
host模式
如果容器使用host模式,那么容器将不会获得一个独立的Network nameSpace,而是和宿主机共用一个Network Namespace.容器将不会虚拟出自己的网卡与配置IP等,而是使用宿主机的IP和端口,就和直接跑在宿主机中一样,但是容器的文件系统,进程列表等还是和宿主机隔离的
container模式:使用--net=container:NAMEorID指定
container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个Network namespace,而不是和宿主机共享,新创建的容器不会创建自己的网卡与配置IP,而是和一个指定的容器共享IP,端口范围等,同样,两个容器除了网络方面,其他方面是隔离的
none模式:使用--net=none指定
none模式:不同于前两种,Docker容器有自己的Network Namespace,但是,Docker容器没有任何网络配置,需要手动添加网卡,配置ip
bridge模式:使用--net=bridge指定,默认配置
bridge模式
默认的网络配置,此模式为每一个容器分配Network Namespace,并将一个主机上的Docker容器连接到一个虚拟网桥上
查看网络中的容器
查看容器详情信息
docker inspect 容器名
docker inspect rmqconsole
通过网络别名与其他容器通信
可以看出在rmqconsole容器中可以通过网络别名与之通信
以connect的方式来指定网络别名
docker network connect --alias c1-alias test-net c1
使用docker network connect来使容器加入指定网络,通过--alias来指定该容器在指定网络中的别名
六、数据存储
Docker管理数据的方式有两种
数据卷
数据卷容器
数据卷
是一个或多个容器专门指定绕过union file system的目录,为持续性或共享数据提供一些有用的功能
数据卷可以在容器间共享和重用
数据卷数据改变是直接修改的
数据卷数据改变不会被包括在容器中
数据卷是持续性的,直到没有容器使用它们
参数说明
-v /data
直接将数据目录挂载到容器/data目录
-v src:dst
将物理机目录挂载到容器目录
数据卷容器
--volumes-from
使用其它容器的目录
虚拟机与容器
虚拟机
指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,在实体计算机中能够完成的工作在虚拟机中都能够实现
在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量,每个虚拟机都是独立的cmos,硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作
容器
将操作系统层虚拟化,是一个标准的软件单元
随处运行:容器可以将代码与配置文件和相关依赖库进行打包,从而确保在任何环境下的运行都是一致的
高资源利用率:容器提供进程级的隔离,因此可以更加精细地设置CPU和内存的使用率,进而更好地利用服务器的计算资源
快速扩展:每个容器都可作为单独的进程运行,并且可以共享底层操作系统的系统资源
区别与联系
虚拟机
隔离级别:操作系统级
隔离策略:Hypervisor(虚拟机监控器)
系统资源:5-15%
启动时间:分钟级
镜像存储:GB-TB
集群规模:上百
高可用策略:备份、容灾、迁移
容器
隔离级别:进程
隔离策略:Cgroups(控制组群)
系统资源:0-5%
启动时间:秒级
镜像存储:KB-MB
集群规模:上万
高可用策略:弹性、负载、动态
0 条评论
下一页