Docker权威指南

下一篇:Kubernetes (K8s)【可点击连接跳转】

 

1、安装说明

 

官网:https://docs.docker.com/html

 

1.1 安装要求

  1. Linux内核要3.10,CentOS7(CentOS6不知足要求)
  2. 内存、硬盘大小

1.2 安装方式

    1)CentOS7提供私有库(centos-extras),默认是启动状态,若是是禁用状态,则须要启用,大都用户采用yum安装之后续更新。java

    2)部分用户下载RPM包安装及维护,主要缘由无互联内网服务器。node

https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/

    3)少部分用户于开发测试,选择便利脚本安装。python

1.3 Docker版本

    1)CE:免费版linux

    2)EE:企业版,收费版。web

1.4 安装步聚

 

【注】集群中全部节点基础配置docker

  配置主机名与IP映射:shell

$>vim /etc/hosts <IP> <hostname>

关闭selinux:json

$>vim /etc/sysconfig/selinux SELINUX=disabled

关闭防火墙:vim

$systemctl stop firewalld.service 中止firewall 
$>systemctl disable firewalld.service 禁止开机启动
[root@bigdata ~]# sudo firewall-cmd --state 查看防火墙状态 not running

 

1.4.1 启用Centos-extras

    启用Centos-extras

    检查/etc/yum.repos.d/CentOS-Base.repos

 

    禁用enabled=0;启动enabled=1

1.4.2 安装仓库

 

    1)增长国内镜像库阿里

vim /etc/yum.repos.d/centos-extras.repo
[extras] name=CentOS-$release-Extras baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64 gpgcheck=0

    2)安装依赖包(可选)

yum install -y yum-utils device-mapper-persistent-data lvm2

    3)配置稳定库

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

执行在/etc/yum.repos.d下生成文件docker-ce.repo

  1. 可选配置项,启用边缘库和测试库

 配置都在docker-ce.repo中,默认都是禁用状态。

yum-config-manager --enable docker-ce-edge yum-config-manager --enable docker-ce-test

禁用使用标记--disable

 

1.4.3 安装Docker CE

yum install docker-ce或者yum install docker

 

若是启用多个Docker库,经过yum安装或更新时须要指定版本,默认状况安装的都是最新版,不符合稳定需求。

生产系统你需指定安装版,代替安装最新版,经过sort -r命令将版本从高到低排列。

yum list docker-ce --showduplicates | sort -r

 

Docker安装后未启动,建立了docker组,但组内无成员。

下图所示,只启动了docker-ce-stable

指定版本安装:yum install <FULLY-QUALIFIED-PACKAGE-NAME>

启动Docker:

systemctl start docker

systemctl restart docker ==>重启

systemctl status docker ==>状态

 

验证安装是否成功:

docker run hello-world

 

1.4.4 镜像加速器

使用加速器能够提高获取Docker官方镜像的速度。针对Docker客户端版本大于 1.10.0 的用户,您能够经过修改daemon配置文件/etc/docker/daemon.json来使用加速器:

{        
    "registry-mirrors": ["https://lvsmpvsi.mirror.aliyuncs.com"] 
}

重启生效:

$>sudo systemctl daemon-reload

$>sudo systemctl restart docker

查看环境:

 

1.5 经常使用命令

1.5.1 命令汇总

格式:docker COMMAND

 

## List Docker CLI commands

docker 

docker container --help

## Display Docker version and info

docker --version 

docker version 

docker info

## Excecute Docker image

docker run hello-world

## List Docker images

docker image ls

## List Docker containers (running, all, all in quiet mode)

docker container ls 

docker container ls --all 

docker container ls -a -q

 

1.5.2 镜像搜索

    default registry endpoint:

    https://index.docker.io/v1/

    https://hub.docker.com/explore/

执行:docker search tomcat

1.5.2 拉取镜像

从Repositry拉取镜像:

docker pull library/tomcat

 

2、容器

 

2.1 容器管理

2.1.1 定义Dockerfile

建立新的空目录,在此目录下建立Dockerfile空文件,定义Dockerfile文件内容。

 

DockerFile分为四部分组成:

      基础镜像信息、维护者信息、镜像操做指令和容器启动时执行指令。

 

# Use an official Python runtime as a parent image
FROM python:2.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
 
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]

2.1.2 建立镜像

指定一个镜像名称,如“friendlyhello”,在包含Dockerfile文件的根目录下建立镜像:

docker build -t friendlyhello .

注意:后面有一个点表示当前路径

 

2.1.3 运行应用(运行容器)

 

运行一个web应用:

 

    咱们尝试使用 docker 构建一个 web 应用程序。

    咱们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。

 

docker pull training/webapp # 载入镜像 

docker run -d -P training/webapp python app.py       #注意:是大写的P

 

参数说明:

  • -d:后台运行容器,并返回容器ID;
  • -P:端口映射,格式为:主机(宿主)端口:容器端口
  • -i: 以交互模式运行容器,一般与 -t 同时使用;
  • -t: 为容器从新分配一个伪输入终端,一般与 -i 同时使用;
  • -c:后面跟待完成的内容
[root@bigdata ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
1a1ffa6b9f1a        training/webapp     "python app.py"     5 hours ago

这里多了端口信息。

 

PORTS 0.0.0.0:32768->5000/tcp

Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32768 上。

 

咱们也能够经过 -p 参数来设置不同的端口:

[root@bigdata ~]# docker run -d -p 5000:5000 training/webapp python app.py

 

docker ps查看正在运行的容器

[root@bigdata ~]# docker ps 
CONTAINER     ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES 
54319ebccdcd training/webapp "python app.py" 19 seconds ago Up 18 seconds 0.0.0.0:5000->5000/tcp wonderful_kirch 
3252d8e8fcb2 training/webapp "python app.py" 3 minutes ago Up 3 minutes 0.0.0.0:32768->5000/tcp gracious_chandrasekhar

  容器内部的 5000 端口映射到咱们本地主机的 5000 端口上。

  运行应用,经过参数-p,指定主机端口4000与容器端口80映射。

docker run -it --network bridge –name myt1 -p 4000:80 friendlyhello
[root@bigdata ~]# docker run -d -p 4000:80 friendlyhello 
dd64995754e887314b408eeabc7e226d1dabf9f63762ee7971c29cd82de6930b 

[root@bigdata ~]# docker container ls 
CONTAINER     ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES 
d66d79469a8f friendlyhello "catalina.sh run" 16 seconds ago Up 14 seconds 8080/tcp, 0.0.0.0:4000->80/tcp amazing_chandrasekhar

中止命令:

docker container stop <Container NAME or ID>

 

 

远程存储库拉取并运行镜像,若是本地库不存,则Docker从远程拉取,以下命令:

docker run --network bridge -p 4000:80 username/repository:tag

 

2.1.4 进入容器方法:

  1. Attach

attach 直接进入容器 启动命令 的终端,不会启动新的进程

docker attach <container>

 

  1. Exec

exec 则是在容器中打开新的终端,而且能够启动新的进程,

格式:

docker exec -it <container> bash|sh

docker exec -it myt1 /bin/sh ------>启动一个实例

 ls ----->查看实例环境

 

查看路由:【可见网关为:172.18.0.1】

查看最后一个镜像:

在container 中启动一个长久运行的进程,

不断向stdin输出 hello world ,模拟一个后台运行的服务:

[root@bigdata ~]# docker run -d training/webapp bash -c "while true;do echo hello world; sleep 1; done"
218365afd2c002394f37f337f27918069ebd15737bd79e28283f5ccd2baa6531
[root@bigdata ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@bigdata ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@bigdata ~]# vim /etc/sysctl.conf  #插入:net.ipv4.ip_forward=1   则开启动网络转发功能,默认开启
#再输入:sysctl -p  生效
[root@bigdata ~]# 
[root@bigdata ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
218365afd2c0        training/webapp     "bash -c 'while tr..."   2 minutes ago       Up 2 minutes        5000/tcp                         nifty_yonath
b75e47ab5579        training/webapp     "python app.py"          15 minutes ago      Up 15 minutes       0.0.0.0:32769->5000/tcp          goofy_swirles
d66d79469a8f        friendlyhello       "catalina.sh run"        22 minutes ago      Up 22 minutes       8080/tcp, 0.0.0.0:4000->80/tcp   amazing_chandrasekhar

# 从一个容器中取日志,查看输出的内容

[root@bigdata ~]# docker logs 218365afd2c0    #容器ID能够写全,也能够不写全
hello world
hello world
hello world
hello world
......
hello world
[root@bigdata ~]#

2.1.5 分享镜像

演示可移植性须要上传镜像、编译镜像、运行等。当你发布容器实例到生产环境,须要知道怎么上传镜像到仓库。

建立好的镜像如何在任务地方运行,须要将镜像发布到镜像库。

 

 

登陆docker hub

 

[root@bigdata dockerdir]# docker login 
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. 
Username (yangdockerrepos): monamengdocker 
Password:
Login Succeeded

标记镜像定义:

将本地镜像与注册表上的存储库关联,定义格式以下:

username/repository:tag

标记镜像名:

docker tag image username/repository:tag 例如:docker tag friendlyhello john/get-started:part2
[root@bigdata ~]# docker tag friendlyhello john/get-started:part2
[root@bigdata ~]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
<none>                               <none>              aaa37fbdc41a        8 months ago        649 MB
friendlyhello                        latest              5d6be3b09337        10 months ago       458 MB
john/get-started                     part2               5d6be3b09337        10 months ago       458 MB
yangdockerrepos/testrepos            friendlyhello-v1    5d6be3b09337        10 months ago       458 MB
例如:
[root@bigdata dockerdir]# 
docker tag friendlyhello monamengdocker/dockertest:test

[root@bigdata ~]# docker tag friendlyhello monamengmeng/dockertest:part3
[root@bigdata ~]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
dockerapp                            test                93e4de5579a7        8 months ago        1.08 GB
<none>                               <none>              aaa37fbdc41a        8 months ago        649 MB
mytomcat                             v1                  5d7f1500ece7        9 months ago        458 MB
yangdockerrepos/testrepos            friendlyhello-v1    5d6be3b09337        10 months ago       458 MB
friendlyhello                        latest              5d6be3b09337        10 months ago       458 MB
john/get-started                     part2               5d6be3b09337        10 months ago       458 MB
monamengmeng/dockertest              part3               5d6be3b09337        10 months ago       458 MB

2.1.6 发布镜像

  搭建私有库或在docker hub申请帐号用户远程库

 

  例如申请的帐号:yangdockerrepos/testrepos

  上传前须要从新标记镜像,不然没法上传(提示拒绝)

  即:

docker tag image username/repository:tag

 

  执行修改:

  将镜像发布到存储库:

格式:docker push username/repository:tag
执行:docker push yangdockerrepos/testrepos:friendlyhello-v1

再例如:

[root@bigdata dockerdir]# docker push monamengdocker/dockertest:test

 

[root@bigdata dockerdir]# docker run -p 3000:80 monamengdocker/dockertest:test

 

3、服务

那些端口被使用,现有容量下多个容器复本运行,须要衡量软件容器运行实例数量的变化,以此申请更多计算资源。

stack[堆] 是构成特定环境中的 service 集合, 它是自动部署多个相互关联的服务的简便方法,而无需单独定义每一个服务。

stack file 是一种 yaml 格式的文件,相似于 docker-compose.yml 文件,它定义了一个或多个服务,并定义了服务的环境变量、部署标签、容器数量以及相关的环境特定配置等。

3.1 服务定义

Docker-compose.yml定义Docker在生产环境的行为表现,具体能够定义以下所述:

1)image:能够从远程存储库拉取镜像。

2)定义运行实例数,及CPU、内存使用比例限制。

3)失败重启

4)端口映射

5)负载均衡

6)网络,部署后会建立相应网络

 

参考实例以下:

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag  //公有或私有镜像库
#配置   
 deploy:       
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "80:80"
    networks:
      - webnet  // 自定义网络名称,能够提早建立,提供网络名便可
networks:
  webnet: // 自定义网络名称,列举上述指定的网络列表;虚拟网络请参考本文档《虚拟网络(Docker前)》

 

...

【备注】

1)compose文件提供的网络名称(未提早建立),基于swarm上,建立的driver=overlay,scope=swarm。

2)提供已建立的网络名称,则容器加入到指定网络运行。

3)详细Docker虚拟网络,请参考本文档《虚拟网络(Docker前)》。

详细实例以下:

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: monamengdocker/dockertest:test
    deploy:
      replicas: 1
      resources:
        limits:
          cpus: "0.3"
          memory: 1024M
      restart_policy:
        condition: on-failure
    ports:
      - "9080:9080"
    networks:
      - webnet1
  visualizer:
    image: docker.io/dockersamples/visualizer:stable
    ports:
      - "80:80"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet2
networks:
  webnet1:
  webnet2:

3.2 服务部署

3.2.1 部署使用

格式:docker stack deploy <options>

 

参数列表:

简写 参数 说明
-c --compose-file compose file路径
  --with-registry-auth 向Swarm代理发送Registry认证详细信息

 

 

 

3.2.2 初始化

运行负载集群应用,在执行部署命令docker stack deploy前,先执行初始化

(使执行命令的节点变为管理节点),

):

[root@bigdata dockerdir]# docker swarm init

 

[root@bigdata dockerdir]# docker swarm leave

[root@bigdata dockerdir]# docker swarm leave --force

[root@bigdata dockerdir]# docker swarm init

[root@bigdata dockerdir]# docker swarm join-token manager

3.2.3 部署

配置stack名称,如“test”:

docker stack deploy -c docker-compose.yml test

(建立service,若没有这个命令,则下面的docker service ls则为空)【当前路径下执行:/opt/dockerdir】

 

PS:若出现以下错误:

能够执行:

[root@bigdata dockerdir]# systemctl restart docker 
Error response from daemon: rpc error: code = 4 desc = context deadline exceeded

docker container ls查看容器实例(5个实例):

接~

另外的镜像实例:

docker service ls

 

经过docker service inspect --pretty 服务名或ID方式查看服务的详细信息

在不带--pretty参数下,能够查看到Json格式的详细信息

3.2.4 Stack列表

能够查看stack对应配置或启动多少个相关服务

docker stack ls

执行效果:

 

3.2.5 Stack服务分布

查看stack配置的服务,在集群中分布状况。

docker stack services [options] STACK

执行效果:

 

3.2.6 Stack任务(container)列表

docker stack ps [options] STACK

执行效果:

 

 

3.2.7 卸载Stack

卸载stack:

docker stack rm test

卸载swarm节点:

docker swarm leave --force

执行效果,若是该节点已是管理节点,须要先执行卸载,从新初始化并添加工做节点:

 

更新节点信息:

修改Docker-compose.yml实例复本配置,不用停机或杀掉应用,只需从新执行便可:

docker stack deploy -c docker-compose.yml test

 

3.2.8 Stack网络

部署后建立与stack对应的网络,stack名称“test”对应的网络名称“test_webnet”

 

3.2.9建立bridge网络

 

查看一下当前 host 的网络结构变化:

新增了一个网桥 br-eaed97dc9a77,这里 eaed97dc9a77 正好新建 bridge 网络 my_net 的短 id。

执行 docker network inspect 查看一下 my_net 的配置信息:

 

这里172.19.0.0/16是 Docker 自动分配的 IP 网段。

 

[root@bigdata ~]# netstat -ntlp

 

4、集群

 

4.1 集群配置[另外一台机器==>虚拟机克隆

 

Docker容器与容器云之Docker单机集群部署案例

https://www.cnblogs.com/wcwen1990/p/7128651.html

 

1)首先启动集群模式且使当前节点成为集群管理器,执行:

docker swarm init

2)在其它节点执行下述命令,使其加入集群作为工做节点。

docker swarm join --token <TOKEN> HOST:PORT

查看加入工做节点:

docker swarm join-token worker

docker swarm join \
    --token SWMTKN-1-3j9k88bimw9p9fkwch9grsbxuebf5rvp65ns24u71ul7a3g5br-74dtk2kcd0ss9p6t1izsms5ln \
    192.168.121.200:2377

查看加入管理节点:

docker swarm join-token manager

 

=====下面暂时不看(第三点)

 

3)建立集群==========>能够手工建立集群,远程控制的!!!!!!

使用docker-machine建立virtual machines (VMs),例如建立2个虚拟机:

docker-machine create --driver virtualbox myvm1

docker-machine create --driver virtualbox myvm2

列举已建立的VMs(上述的myvm一、myvm2):

docker-machine ls

 

4) 初始化集群并添加节点

第1个节点充当集群管理角色,负责执行管理命令及受权工做节点加入集群,其它节点充当工做节点。

主节点:发送命令docker-machine ssh给VMs

$ docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"

 

添加工做节点:

$ docker-machine ssh myvm2 "docker swarm join \

--token <token> \

<ip>:2377"

【备注】以上都是经过docker-machine ssh 与集群VMs交互。

5)集群服务管理

docker service 命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行

6)扩容服务

test为stack名称,作为前缀,若是是web服务则加上后缀“_web”,经过docker stack ps test查看任务名称定义。

 

docker service scale test_web=3

扩容后的结果,注意“unable to pin image …”,由于没有工做节点(待验证)

 

 

4.2 应用部署至集群

 

 

 

 

 

6、问题汇总

6.1 构建镜像

执行:docker build -t tomcatdemo .

unable to prepare context: unable to evaluate symlinks in Dockerfile path: 
lstat /opt/dockerdir/Dockerfile: no such file or directory

 

解决办法:DockerFile—> Dockerfile

6.2 镜像拉取

镜像拉取常常超时

 

 

解决办法:

1)国内镜像(网易)

docker pull hub.c.163.com/library/tomcat

 

2)手动配置 Docker 加速器(daocloud)

适用于各类 Linux 发行版,Docker 版本在 1.12 或更高,建立或修改 /etc/docker/daemon.json 文件,修改成以下形式:

 

{
    "registry-mirrors": [
        "加速地址"
    ],
    "insecure-registries": []
}

镜像导出:

docker save -o  kube-proxy-amd64-v1.11.2.tar(自定义名称)
k8s.gcr.io/kube-proxy-amd64:v1.11.2  // 本地镜像

 

6.3 启动问题

启动问题

 

仔细分析,发现“unable to configure the Docker daemon with file /etc/do…EOF”

 

缘由:前期增长自定义配置文件/etc/docker/daemon.json,文件内容为空,就是由于

           文件内容为空因此启动不了。

 

删除daemon.jso*或者修改daemon.json,添加如下信息:(注意英文输入!)

{ 
    "debug":true 
}

 

6.4 stack task

部署服务后,查看任务运行异常:"task: non-zero exit (137)"

官网给出与Java application有关,参考《https://success.docker.com/article/what-causes-a-container-to-exit-with-code-137》

 

本地由于compose文件配置的内存过小,调整内存后,启动运行正常。

6.5 Swarm stack

直接使用docker swarm集群(未安装docker-machine),部署应用服务至swarm集群,启动集群时,worker节点拉取不到镜像。

(1)集群信息以下:

bigdata:master

bigdata1:worker

(2)docker-compose.yml配置文件以下:

 

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: yangdockerrepos/testrepos:dkapptest_1.0
    deploy:
      replicas: 2
      resources:
        limits:
          cpus: "0.3"
          memory: 1024M
      restart_policy:
        condition: on-failure
    ports:
      - "4000:8888"
    networks:
      - webnet1
  visualizer:
    image: docker.io/dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet2
networks:
  webnet1:
  webnet2:

执行启动:docker stack deploy -c docker-compose3.yml dtest

bigdata1拉取不到镜像启动容器实例失败,致使2个容器实例都在bigdata启动。

(3)解决办法:暂未解决

 

7、Docker存储驱动

 

OverlayFS

It is highly recommended that you use the overlay2 driver if possible, rather than the overlay driver. The overlay driver is not supported for Docker EE.

To configure Docker to use the overlay storage driver your Docker host must be running version 3.18 of the Linux kernel (preferably newer) with the overlay kernel module loaded. For the overlay2 driver, the version of your kernel must be 4.0 or newer.

 

 

7.1 overlay

 

 

 

 

7.2 overlay2

 

 

 

8、Rancher

 

 

 

 

9、负载均衡

docker stop 中止,集群不会启动实例

如下方式会启动新实例:

1)kill容器

2)docker service update test_web

 

 

10、配置管理

 

10.1日志配置

默认状况docker配置文件于/etc/docker/daemon.json,docker默认日志级别info,日志输出位置/var/log/messages,修改日志级别2种方式:

1)启动时指定

dockerd –log-level debug

2)修改配置文件daemon.json

{       
    “log-level”:true 
}

备注:其它安装信息,执行docker info查看

 

10.2 私有镜像仓库搭建

查询镜像:

docker search registry 

[root@bigdata ~]# yum list docker-ce --showduplicates | sort -r

 

拉取镜像到本地(默认tag=latest):

docker pull docker.io/registry

查看本地

启动容器实例:

docker run -d -p 5000:5000 --restart=always --name=registry-server -v /var/local/registry:/var/lib/registry registry

查看容器是否启动成功:docker ps

请求查看私有镜像列表:curl -X GET http://127.0.0.1:5000/v2/_catalog

 

配置私有镜像库:

docker 默认使用https上传镜像至仓库;如下修改使用http且配置本地私有镜像库:

vim /etc/docker/daemon.json
{ 
    "insecure-registries": [“192.168.2.33:5000”] 
}

 

若本地存在1个镜像:

 

从新作标记:

[root@bigdata ~]# docker tag docker.io/registry:latest 192.168.2.32:5000/registry:latest

上传私有目标镜像仓库:

 

 

11、虚拟网络(Docker前)

 

 11.1 网络类型

     装完Docker后,它会自动建立三个network(bridge/host/none),这个bridge network 表明全部安装了Docker的主机的docker0 network。

     除非使用docker run --set=<NETWORK>选项指定一个其它的network,不然Docker daemon会默认使用这个network链接contrainer,你可使用如下命令查询网络列表:

docker network ls

ifconfig命令查看主机的network stack中的docker0:

查看网络详细,给定的network回显的这个network已链接的容器和它的一些网络资源,执行以下命令:

docker network inspect

链接或加入这个容器并查看它的stack

docker attach <CONTAINER ID>

 

11.1.1 None

Docker容器拥有本身的Network Namespace,可是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。

须要咱们本身为Docker容器添加网卡、配置IP等。使用此种网络的容器会彻底隔离。

 

11.1.2 Host

若是启动容器的时候使用host模式,那么这个容器将不会得到一个个独立的Network Namespace,而是和宿主机共用一个Network Namespace。

容器将不会虚拟出本身的网卡,配置本身的IP等。而是使用宿主机的IP和端口。

可是,容器的其余方面,如文件系统、进程列表等仍是和宿主机隔离的。

只有这种网络的容器会使用主机的网络,这种网络对外界是彻底开放的,可以访问到主机,就能访问到容器。

 

11.1.3 Bridge

在不指定--network参数  或者 --network=bridge 的状况下建立的容器其网络类型都是bridge。

Docker在安装时会在宿主机上建立名为docker0的网桥,所谓网桥至关于一个虚拟交换机,若是使用上述两种方式run的容器都会挂到docker0上。

容器和docker0之间经过veth进行链接,veth至关于一根虚拟网线,链接容器和虚拟交换机,这样就使docker0与容器连通了.

有点像主机与容器之间的一座桥,对容器有一点隔离做用。实际是在iptables作了NAT规则,实现端口转发功能。可使用 iptables -t nat -vnL 查看。

 

[root@bigdata ~]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 311 packets, 24638 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   104 DOCKER-INGRESS  all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL
  763 58912 PREROUTING_direct  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  763 58912 PREROUTING_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  763 58912 PREROUTING_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
   75  3932 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 2 packets, 104 bytes)
 ......

 

11.2 自定义网络

 

11.2.1 建立网络

Docker提供三种user-defined网络驱动:bridge,overlay和macvlan。overlay和macvlan用于建立跨主机的网络,建立网络命令以下:

docker network create -d bridge --subnet 172.10.0.0/24 --gateway 172.10.0.1 my_net

-d bridge表示自定义网络的驱动为bridge

--subnet 172.10.0.0/24 --gateway 172.10.0.1分别指定网段和网关。

 

11.2.2 使用网络

为容器指定自定义网络:

docker run -it --network my_net --ip 172.10.0.3 busybox

 

 

11.3 容器通讯

11.3.1 IP

IP通讯就是直接用IP地址来进行通讯,根据上面的分析须要保证两个容器处于同一个网络,那么若是不在同一个网络如何处理。

若是是实体机咱们很容易理解,只须要为其中一台服务器添加一块网卡链接到另外一个网络就能够了。容器同理,只须要为其中一个容器添加另一个容器的网络就能够了。使用以下命令:

docker network connect my_net httpd

connect命令可以为httpd容器再添加一个my_net网络(假设httpd原来只有默认的bridge网络)。这样上面建立的busybox容器就能与这次connect的httpd容器进行通讯。

 

11.3.2 DNS

 

 

 

11.3.3 Joined

 

 

11.3.4 端口映射

iptables -t nat -nL

 

 

12、资源连接

 

https://docs.docker.com/storage/storagedriver/overlayfs-driver/

https://www.cnrancher.com/

SNAT/DNAT:

https://blog.csdn.net/windeal3203/article/details/51111543

国内/外镜像:

http://www.javashuo.com/article/p-zcplkfah-hb.html

 

十3、手动构建微服务镜像

 

13.1 准备安装文件

Dockerfile(镜像描述文件,文件内容请参考下述)、SpringBootTestApplication(微服务应用)

 

SpringBootTestApplication目录结构:

 

dockerApp:应用文件,包括配置、依赖包、业务开发类库

startService-linux.sh:linux 启动微服务脚本

startService-linux.sh:windows启动微服务脚本

dockerApp目录结构:

config:微服务配置文件

dockerApp-1.0.0-20180831.jar:业务开发逻辑类库

lib:微服务依赖第三方类库

 

13.2 下载JDK基础镜像到本地

 

$>docker pull java:8

 

13.3 制作镜像描述文件

 

Dockerfile文件内容,第1行必须是From,继承其它基础镜像(如操做系统等),此处构建应用级别能够把JDK做为基础镜像。

       COPY SpringBootTestApplication /usr/local/SpringBootTestApplication 将Dockerfile文件所在目录下的文件夹SpringBootTestApplication拷备至容器(能够看做集成微操做系统)指定目录下/usr/local/SpringBootTestApplication

       与COPY相似的命令为ADD,ADD支持能够从url下载,支持解压等操做,其它操做与COPY相同,从本地操做系统拷备文件至容器。

       EXPOSE:暴露容器端口

       WORKDIR:设置工做目录(切换工做目录,后续的RUN、CMD、ENTRYPOINT 都是相对此目录操做)。

       ENTRYPOINT:执行脚本文件,容器启动时启动微服务

 

FROM java:8
# Copying jdk from OS directory which DockerFile file directory to image directory 
#COPY jdk1.8.0_144 /usr/local/jdk1.8.0_144
# Configure jdk enviroment
#ENV JAVA_HOME /usr/local/jdk1.8.0_144
#ENV PATH $PATH:$JAVA_HOME/bin:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/jre/lib/rt.jar
 
# Copy application package include start application shell script
COPY SpringBootTestApplication /usr/local/SpringBootTestApplication
 
EXPOSE 8888
 
WORKDIR /usr/local/SpringBootTestApplication
 
RUN pwd
 
ENTRYPOINT ["./startService-linux.sh"]

13.4 编译镜像

docker build -t dockerapp:test . -f Dockerfile

错误:Please provide a source image with `from` prior to commit 缘由:Dockerfile第1行必须是from 基础镜像

 

13.5 运行镜像

启动容器实例:

docker run -d -it --name dtest -p 4000:8888 dockerapp:test

 

13.6 查看日志

查看及分析容器实例运行的日志(包括应用程序log4j日志)

docker container logs -f <container>

 

13.7 进入容器

查看容器运行所处环境及目录结构

docker exec -it <container> /bin/bash

 

13.8 测试接口

测试微服务是否启动正常

http://ip:4000/dockerApp/test/log

注意:4000端口加入防火墙过滤端口

firewall-cmd --zone=public --add-port=4000/tcp –permanent //添加端口过滤

firewall-cmd –reload //从新加载

 附件:

 

1.查看CPU信息

[root@bigdata ~]# top 

 

 2.进行压力测试

 

 


 查看CPU内核:

[root@bigdata proc]# cat /proc/cpuinfo

 [root@bigdata proc]# docker run -it --rm stress --cpu 1

【--rm:建立完镜像即删除】

 查看cpu占用状况【再开一个终端】

  [root@bigdata proc]# top

若开两个终端执行:

 [root@bigdata proc]# docker run -it --rm stress --cpu 1

 

十4、Docker Volume

 

依赖第13节微服务镜像,本节增长本机数据目录与容器数据目录映射、容器之间共享同一数据目录。

 

1)容器中的数据会随着容器的中止运行而消失, 并且当其余的进程须要这些数据时,很难将这些数据从容器中提取出来。

2)容器的数据写入层是紧密地对应着他的宿主操做系统的,数据不能容易的被迁移到其余地方。

3)要将数据写入到容器的数据写入层,须要一个特定的存储驱动,利用linux内核构建一个统一的文件系统,来管理宿主和容器的文件系统。这层额外的虚拟化显然会下降性能。为了不性能降低,docker使用data volumes的方式,直接对宿主文件系统进行写操做。

/var/lib/docker/graph 存放本地iamge的分层信息 
/var/lib/docker/devicemapper/devicemapper/data存储了image与Container的二进制文件 
/var/lib/docker/devicemapper/devicemapper/metadata 存储了相关元数据

[root@bigdata proc]#mkdir -p /var/run/netns

[root@bigdata proc]# ln -s /proc/30046/ns/net /var/run/netns/30046

[root@bigdata proc]# ip netns exec 30046 Iethtool -S ens33

在本空间执行 ip a

 

(一)Data Volume

1)Dockerfile文件定义,如:volume /data

 

2)docker run指定参数-v,如:

docker run -d -it -p 4000:8888 -v /data:/usr/local/webapp dockerapp:test(主机与容器映射) 

docker run -d -it -p 4000:8888 -v /usr/local/webapp dockerapp:test(容器目录)

 

3)--volumes-from(数据共享)

相关的容器部署到同一个主机上,这时候但愿这些容器之间能够共享一些数据。

这时,咱们能够建立一个数据卷容器,而后就能够供多个容器挂载使用了。

 

 

(二)Data Container

容器之间共享数据,最好是使用 data container。这种 container 中不会跑应用,而只是挂载一个卷。

建立Data Container:

docker create -v /dbdata --name dbstore training/webapp /bin/true

启动一个应用,引用Data Container

docker run -d -P --name web3 --volumes-from dbstore training/webapp python app.py

查看数据目录挂载:

docker inspect <container name>

 能够看到已经挂载成功,而且容器对这个目录具备读写权限

测试:

 

解决方法:

未解决!!

 

 

小小实例:

[root@bigdata dockerfiletest]# docker run -d docker.io/centos:latest /bin/sh -c "while true;do echo hello world;sleep 1;done"
843073ddc58beb128f0b76bed533cc37e715de50c138655bf3fd1bed09808231
[root@bigdata dockerfiletest]#

从一个容器中取出id,查看输出的内容

[root@bigdata dockerfiletest]# docker logs 843073ddc58b

hello world 
hello world 
hello world 
hello world 
hello world 
hello world
......

Dockerfile

FROM docker.io/centos:latest
MAINTAINER <monamengdocker>
RUN yum -y install httpd 
ADD start.sh /usr/local/bin/start.sh 
ADD index.html /var/www/html/index.html 
#CMD echo hello world
[root@bigdata dockerfiletest]# echo "/usr/sbin/httpd - DFOREGROUND" > start.sh
[root@bigdata dockerfiletest]# chmod a+x start.sh
[root@bigdata dockerfiletest]# echo "docker image build test" > index.html
[root@bigdata dockerfiletest]# ls
Dockerfile  index.html  start.sh
[root@bigdata dockerfiletest]# docker build -t docker.io/centos:httpd ./
Sending build context to Docker daemon 4.096 kB
Step 1/6 : FROM docker.io/centos:latest
 ---> 9f38484d220f
Step 2/6 : MAINTAINER <1975772722@qq.com>
 ---> Using cache
 ---> 8f39f24f9c0c
Step 3/6 : RUN yum -y install httpd
 ---> Running in 37cea7021025
......
[root@bigdata dockerfiletest]# docker run -d -p 80:80 docker.io/centos:httpd /bin/bash -c /usr/local/bin/start.sh
c0e3edf0613e9b44eee0012728009b57890765e9339e1d43ba7a133981e6f240
[root@bigdata dockerfiletest]# 
[root@bigdata dockerfiletest]# docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                     NAMES
843073ddc58b        docker.io/centos:latest   "/bin/sh -c 'while..."   12 minutes ago      Up 12 minutes  
......
[root@bigdata dockerfiletest]# vim Dockerfile 
[root@bigdata dockerfiletest]# docker run -d -p 80:80 docker.io/centos:httpd /bin/bash -c /usr/local/bin/start.sh
1f39060ddf49e37ab0aabb848673b9415d144e3f4dec6b59a835094f0b6bea5e
[root@bigdata dockerfiletest]# netstat -antup | grep 80
[root@bigdata dockerfiletest]# ll docker.io-centos-httpd-docker-image.tar 
-rw------- 1 root root 337563136 5月  25 10:22 docker.io-centos-httpd-docker-image.tar
[root@bigdata dockerfiletest]#

 

一直不能取到80端口,未解决----------------------