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

 

一、安装说明

 

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

 

1.1 安装要求

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

1.2 安装方式

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

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

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

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

1.3 Docker版本

    1)CE:免费版

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

1.4 安装步聚

 

【注】集群中所有节点基础配置

  配置主机名与IP映射:

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

关闭selinux:

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

关闭防火墙:

$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.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

 

三、服务

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

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-filecompose 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.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(上述的myvm1、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.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)解决办法:暂未解决

 

七、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

 

 

 

八、Rancher

 

 

 

 

九、负载均衡

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

以下方式会启动新实例:

1)kill容器

2)docker service update test_web

 

 

十、配置管理

 

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

上传私有目标镜像仓库:

 

 

十一、虚拟网络(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

 

 

十二、资源链接

 

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

https://www.cnrancher.com/

SNAT/DNAT:

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

国内/外镜像:

https://blog.csdn.net/nklinsirui/article/details/80581286

 

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

 

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

 

十四、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端口,未解决----------------------

 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐